MacBookAir(M2)とDockerでLanguage Segment-Anythingを動かす
課題
CPUベースのMacBookAirでセグメンテーションをしないといけなくなった。
スペック
system_profiler SPHardwareDataType
Model Name: MacBook Air
Chip: Apple M2
Total Number of Cores: 8 (4 performance and 4 efficiency)
Memory: 8 GB
概要
- Language Segment-Anythingを導入
- Docker上で立ち上げる
- ブラウザで動かす
Language Segment-Anything
META社が開発したセグメンテーション「Segment-Anything」と、物体検出の「GroundingDINO」を融合したツールです。
テスト①
元画像
セグメンテーション
検出したいものを「perfume. lipstick(香水, 口紅)」にしました。コスメがそれぞれ似ている画像のため、かなりいじわるかもしれません。
モデルサイズはsmallで弱くして、テキストスレッショルド(自信度・テキスト一致度)を0.15にして、プロンプトに対して広く一致しているかもと思われるものがレイヤーになるようにしました。じぶんのMBAのスペックだと3〜5分程度かかります。
ボックススレッショルドというのは、境界線の信頼度です。
サーバーは「Gradio」という、AUTOMATIC1111(Stable Diffusion web UI)とおなじものが使われているので見慣れているかと思います。
テスト②
元画像
セグメンテーション
モデルサイズはさらにちいさいtinyにして、スレッショルドは0.25で広範囲。「notebook」を指示し、靴とのエッジが検出できました。うれしくなります。
テスト③
元画像
「clothes」を頼みましたが、失敗しました。むずかしそうですね。
テスト④
セグメンテーション
テスト⑤
元画像
# Stable Diffusionで適当なプロンプトで生成しました
a cozy cluttered indoor scene filled with many small items, books, plants, food, electronics, a girl sitting on a sofa, retro appliances, colorful decorations, a balcony full of potted plants, cute cats, warm lighting, anime style, highly detailed, isometric perspective, Studio Ghibli style
セグメンテーション
「person. photo frame」で確度ひくめでいれています。ごちゃごちゃしていてもとれるものはとれるようです。
Language Segment-Anythingを導入
リポジトリを持ってきます。
git pull git@github.com:luca-medeiros/lang-segment-anything.git
Docker上で立ち上げる
Docker Desktopでラクします。
いちおう公式リポジトリにDockerによるインストールの案内があったのですが、今回はdocker-compose.yamlで設定します。
クローンしたリポジトリのルートディレクトリにdocker-compose.yaml
をつくってください。
services:
lang-sam:
build: .
ports:
- "8000:8000"
platform: linux/amd64
volumes:
- ./assets:/app/assets
リポジトリ内にDockerfile
がすでにあるため、ビルドについて書く必要はありません。
動かします。ここからかなり長いです。
docker-compose build --progress plain
docker-compose up
ビルドが長すぎて不安だったのでプログレスを表示させています。ビルドは初回のみ、あるいはDockerfileを変更したときのみで大丈夫です。放置していたので覚えていないですが、アニメ2-3話分ぐらいかかりました。ちょっとでもメモリあけるためにスマートフォンでアニメみればよかったです。
ブラウザで動かす
http://localhost:8000/gradio/をブラウザのロケーションバーに入力してもいいですが、コマンドでやっていたので以下で開きました。どっちでも大丈夫です。
open http://localhost:8000/gradio/
あとは好きな画像で試してみてください。おおきすぎる画像は処理しきれないことがあるっぽいです。Webカメラから直接画像をとると、BytesIOの都合なのか私はエラーになりました。
まとめ
M2チップのMBAでも動きますが、できればGPUのある環境やGoogle ColabでGPUを拝借してやるのがよいかと思います。
Discussion