😷

Segment Anything Modelで自分で撮影してきた写真のセグメンテーション画像を生成して傾向を見る

2023/04/10に公開

自分で撮影した画像をSegment Anything Model(SAM)に適用した結果を共有します。今回は開発元のMeta社が公開しているデモサイトを使用しました。
https://segment-anything.com/

Segment Anything Model

Meta AI Researchから1100万枚の画像で学習したセグメンテーションモデルSegment Anything Model(SAM)が2023年4月5日に発表されました。1画像に複数枚マスクが存在するため、マスク単位では約11億マスクが学習データに含まれているとの報告です。
https://ai.facebook.com/research/publications/segment-anything/

従来のセグメンテーションタスクとは異なり、セグメンテーション対象上の1点、バウンディングボックス、セグメンテーション対象を塗りつぶした領域、セグメンテーション対象を表現した文章、の4種類の情報を入力にセグメンテーションマスクを出力する「promptable segmentation」を提案しています。該当論文のappendixに、タスクの詳細な説明やモデル構造、各入力のエンコード方法について記載されているのでご確認ください。
https://arxiv.org/abs/2304.02643

こちらの記事でも紹介されていますのでぜひご参照ください。
https://zenn.dev/fusic/articles/ml-segment-anything-meta

セグメンテーション結果

論文には非常によくセグメントされた画像が掲載されています。これらの画像を見て思うのは、自分で撮った画像に対してどの程度機能するのか、という点です。そこで、今日は天気も良かったので、友人と出掛けてきてセグメンテーション用の画像をいくつか撮影してきました。
 今回は自分で撮ってきた画像に対してSAMを適用した結果を共有します。上記のデモサイトから自身で撮った画像をアップロードしセグメンテーションしました。今回は特定のオブジェクトに絞らず、オプションは「Everything」を選択しました。セグメンテーション画像はスマホからスクリーンショットを撮った都合で上下が切り取られています。解像度が異なる点はご容赦ください。

道路、屋外



20~30m程離れると人の検出が不安定になることが見て取れます。車道上のパイロンはほとんど検出されていますが、道路に書かれた文字はセグメントできないようです。車線は手前5m程は影が重なっていても領域を区別できていますが、一定以上離れると検出ができなくなるようです。

食品のディスプレイ、屋内



画像下部のお菓子は上手くセグメントされています。また、お菓子の説明書きの紙は非常に上手くセグメントされているのが見て取れます。一方で、画像中央の効率よく陳列された月餅はほぼオクルージョンして隠れているので、取れないのも無理はないですね。
 こういった画像は出掛けてみて画像を撮影するとよくある光景なので、こういった状況にはまだ対応できない、というのは勉強になりました。よく見ると画像下部のエッグタルトの油もセグメントされています。SAMは検出対象をプロンプトを使って絞れるため、こちらは後段処理で除く必要がありそうです。

橋と広間、屋外



全体的に上手くセグメントされている例かと思いますが、橋の一部の白い補修跡まで過剰にセグメントされている箇所があることが見て取れます。今回は距離の条件がほぼ同じでも、過剰にセグメントされる箇所とされない箇所があり不安定な検出結果となるため、消し込むなどの後段処理が必要なことがわかります。また、タイルも過剰に分割されていることが見て取れますので、こちらも後段処理による統合が必要なことがわかります。柱の間から見える木々も、この程度のオクルージョンでは未検出となることも分かりました。人の検出についても、やはり30m程離れると不安定になるようです。

人だかりと広間、屋外




出力結果をスマホからスクショしたため画像が2分割されています。ご容赦ください。。
 立っている人は30m先までは行かないまでも20m程先までは区別されているように見えます。一方で座っている人については、20mより手前でも区別できていないことが、2枚目の画像から見て取れます。密集した人混みでは基本的に人が重なり合いオクルージョンが常時発生する状況になりますので、遠くから人混みの人数まで正確に検出することは困難なことが分かります。
 それでも今の時点でかなり高い精度でのセグメントが達成できていると考えられますので、工夫すれば応用時の初期段階でも十分使えるのでは無いかと思います。例えば人混みの中を進んでいくロボットを考えて、その眼として使う場合は、「この先は人混みがあるので減速して走る」という粒度まで落とせば機械に知識として取り込めるのではないかと思います。建物のセグメントは十分できていますので、画像からどんな構造の場所にいるのかまでは後段処理で知識として落とし込めるのではないでしょうか。

交差点、屋外



橋の上から撮影した画像ですが、白線、未検出もありますが車両のパーツ、手前の標識、奥の街路樹はセグメントされていることが見て取れます。やはり距離が20~30m以上離れると未検出になる傾向があると感じました。
 「promptable segmentation」タスクでは、画像と文章表現を紐付けられるようにアノテーションタスクが設計されているので、理論上学習データに無い画像も区別できるように意図されていますが、今回は上手く区別されませんでした。あとは、単純にオブジェクトを表現する画素数が少なくなるため、セグメントに使える情報が限られ未検出につながっているのだと考えます。

おまけ

居酒屋、屋内




屋外と比べ構造が単純になる、かつ、オブジェクトとの距離が近いのでオブジェクトごとに十分な画素数が確保できるため、しっかりとセグメントされています。喫緊で使うのであれば、被写体が近い距離に収まる屋内で撮影した画像の方が効果を発揮してくれると思いました。また、デモサイトではセグメント毎に透過pngで自動的に切り抜いてくれ、選択したセグメントの画像が保存できます。

まとめ

入力した画像をセグメントしてくれるSegment Anything Model(SAM)を使って、自身で撮影した画像をSAMに適用した結果を共有しました。月並な感想ですが、セグメントの精度は高い、かつ、細かいと感じました。自然言語処理を中心とした基盤モデルが大量の学習データを収集して学習し成果を出したように、セグメンテーションモデルでも同じように大量の学習データを収集して学習し成果を出した例だと思います。分野問わず基盤モデルの整備が進んでいる印象を受けました。個人的な本音としては、11億マスクを学習してこのくらいの成果だとすると、もう少しデータを増やす以外に学習手法を考える方向に舵を切ってもよいのではと感じました。プロンプトを上手に使いこなせれば解決する課題なのかも知れませんので、論文やリポジトリを含め引き続き調べていきます。
https://github.com/facebookresearch/segment-anything
 実際に使用した感想としては、遠くの被写体まで映る屋外の画像では、どうしても未検出の物体が残りますが、それは当然として、後段処理で消し込みや統合を行うことで、特定のシナリオ下では有効に機能するのではないかと感じました。ただし、マスク毎の出力もクラス名ではなくプロンプトですので、後段処理でだいぶ苦労すると思いました。
 一方で、屋内で撮影した、単純な構造かつ被写体との距離が比較的近い画像に関しては、高精度なセグメントが行えていたので、こちらはPoCレベルなら自身で作成にチャレンジしてみることができるのではと感じました。現在はデモサイトではなくgithubのリポジトリからローカルで環境構築して動作確認していますので、より詳細な情報を引き続き確認して、できることとできないことを区別していきたいと思います。

Discussion