見出し画像

Pythonで画像処理:背景の削除

はじめて、目次を載せてみる。
とても便利で、とくに何も考えなくて、リンクができてほんとありがたい。


今日は、画像処理のお試し回。
Twitterでみた面白いものを試したかったの備忘録がてらの記録。
画像から背景を消すものだ。
機械学習したものぽいが詳細は知らない。

画像の準備

それほど難しくないが、まずはともあれ、画像が必要である。
ということで、画像を集める。
ここでは、icrawlerを利用させてもらう。

from icrawler.builtin import BingImageCrawler

word = "pikmin"
word = "フェットチーネ"

crawler = BingImageCrawler(storage = {'root_dir' : f'./{word}'})

try: 
    crawler.crawl(keyword = word, max_num = 10)
except Exception as e: 
    print(e)

思いつく単語で、画像を集めてみた。
筆者の小技であるのだけど、
変数wordに対して、代入した文字列の履歴をのこしている。
この場合、最初に「pikmin」を試したのだと、後からもわかる。
もちろん、配列にして単語を羅列してもよい。

背景除去

続いて、肝心の背景を除去するコードだ。
先の収集したフォルダを指定して、画像を読み出して、
remove( )に渡すだけと至ってシンプルに実行できる。

from rembg import remove
from PIL import Image

import glob

folder   = 'pikmin'
folder   = 'フェットチーネ'

target   = f'{folder}/*.jpg'
candidate = glob.glob(target)

print(candidate)

for item in candidate:

    print(item)
    input_path = item   # 入力画像のパス
    output_path = f'{item[:-4]}_remove.png' # 出力画像のパス
    print(output_path)

    input  = Image.open(input_path) # 入力画像を開く
    output = remove(input)          # 背景を除去
    output.save(output_path)        # 出力画像を保存

特に、問題ないと思うが、先ほど集めた画像が出力されたフォルダを
指定して、画像ファイルのリストをループで順に処理している。

環境の整備

VisualStuioの再配布のランタイムが必要になる。
2024/12/1 現在、VS2022が出ているので、ダウンロードが必要だった。

【ダウンロード」
Visual Studio Tools のダウンロード - Windows、Mac、Linux 用の無料インストール

これが少し、紛らわしいのだけど、
スクロールして下のほうに移動してほしい。
すると、「その他のTools、・・・・」があるので、
そこを開いてみてほしい。

その他を開ける

自身の環境に応じて、
ダウンロードすると以下の実行ファイルが保存される。
Windows11ユーザの場合、通常、「x64」でいいはずだ。

当該ファイル: VC_redist.x64.exe

ここに至るまでに、Pythonで実行すると、ランタイムを入れるように
警告がでるので、わかると思うが、
そこには、2019 Visual C++ runtime のメッセージが表示される。
しかし、2022のもので、下位互換があるようで問題なく動作している。

pipするもの:必要なライブラリ

あと、参照したサイト等には言及がなかったが、
pipするべきは、二つあった。
当然、背景を削除するためのライブラリである「rembg」だけでいいと
考えてたけど、違った。
これだけでは、動かず、「onnxruntime」も必要になった。

pip install rembg
pip install onnxruntime

注意点

これは環境依存なのか、検証はしてないが、
なぜか、実行するとフリーズする現象に見舞われた。
このrembgのモデルファイルのフリーズは、他の人はどうなんだろうか・・・

20%を超えたくらいでフリーズ

数回ためすもかわらないので、結局、止まる前の出力をキャプチャして
ダウンロード先を特定した。
その後、ブラウザで直接ダウンロードして、
キャプチャから参照したパス(ユーザディレクトリ)にファイルを配置した。

 GitHubhttps://github.com/danielgatis/rembg/releases/download/v0.0.0/u2net.onnx

機械学習系のモデルは、初回は自動でダウンロードされて、
以降は、そのファイルがないかをチェックして、ダウンロードがスキップされる。お馴染みの便利処理である。今回は、176MBと大したサイズでないので、なぜ、フリーズするのかは検討がつかない。
LLMのモデルファイルは数ギガにおよぶので、途中でとまると難儀だ。

お試しの結果

ちょっと横着して、エクスプローラーの画像をそのままで失礼する。
仕事だと、ちゃんとHTMLファイルに出力するんだけど、ご愛敬。
マスク画像で学習したのか、なかなかうまく背景が削除できている。


考察

少し前にメタ社が出して、
話題になったSAMを利用したのかもしれないと推測している。
これは領域検出、いわゆるセグメンテーションしてくれる。
とても精度が高く、関心したのを覚えている。
マスク画像も出力できて、学習画像にもなりえる。

ちょっと選んだ素材が微妙で、簡単そうな写真が多いが、
サラダぽいフィットチーネの画像はさすがに苦戦して、
パプリカしか抜けてないな。
とはいえ、これはこれですごくいい。
いろいろ使えそうだ。

適用事例

よくCMとかであるエフェクトで、画面全体を白黒にして、
商品だけをカラーにするものがある。
そんな合成画像も、この背景削除を使えば簡単に作成できる。

いいなと思ったら応援しよう!