この記事ではComfyUIとその拡張機能Impact Packを使用して、画像から自動でマスク生成を行う方法について紹介します。簡単のため画像から人物を抽出して処理を行う方法にフォーカスを置いて説明しますが、使用するモデルを変えれば、人物の抽出以外にも使える方法のため、そういったタスクに興味がある方はぜひ読んでいってください。
例えば以下のような用途で使えます。
- 画像の一部や背景のみトリミングして他で使いたい
- 背景のみinpaintで入れ替えたい
- 画像の一部のみinpaintで描き換えたい(消したい)
使用する拡張
ワークフロー
以下の流れで処理します。
- 物体検出モデル(YOLO)で画像内の人物すべてを抽出
- 確信度の最も高い(画像内でメインとなる)人物のみ抜き出す
- Segment Anythingでセマンティックセグメンテーション
- 最も面積が大きいマスクのみ抜き出す(小さいドットを除く)
マスクを生成したい画像の性質によってフィルタリング方法は変わるかもしれませんが、人物が一人の場合は以下で問題なく生成できるはずです。複数人いたりする場合はSEGS Filterなどの値を調整します。
マスク生成結果
(左から)元画像、検出された物体、一番確信度の高い物体(画像の中でメインとして映っている人物)、セグメンテーションで得られたマスク、元画像とマスクを重ねた画像
少しぼやけがありますが、最近Metaから発表されたSAM2に入れ替えたらもう少し精度が良くなるかもしれません。
背景をinpaintする
このマスクを使って実際に背景を書き換えてみます。現状人物が描き換え対象になっている状態なのでマスクの反転をしてからinpaintします。
※左上はマスク生成のワークフローにつながっています
人物をinpaintする
人物をinpaintする場合は人物以外が生成されることを防ぐためにControlNetを組み込むのがおすすめです(なくても問題ないが、失敗を減らすため)。
※左上はマスク生成のワークフローにつながっています
ControlNetの前処理でよく使用されるControlNet Auxiliary Preprocessorsを使用したい場合は以下のようにcontrol_imageに入力すれば使用可能です。
最後に
いかがだったでしょうか?人物だけでなく顔/手/服/肌など別の物体をターゲットとして検出できるモデルなどもあるため、人物に限らず物体を抽出したい場合はこの方法を検討してみると良いでしょう。
ComfyUI Managerをインストール済の場合は以下のようにModel Managerから学習済モデルをダウンロード可能です。