cedro-blog

PSPNetで、画像をピクセル単位でカテゴリ分類する

1.はじめに

 今まで、画像のセグメンテーションは、YolactEdgeMask R-CNN のような物体を検出して形を推定するものをご紹介しましたが、今回ご紹介するのはセマンティック・セグメンテーションと呼ばれるタスクで、画像をピクセル単位でカテゴリを分類する PSPNet です。

*この論文は、2017.4に提出されました。

2.PSPNetとは?

 下記に、PSPNetの概要を示します。

 まず、Input Image(入力画像)を CNN に入力し Feature Map(特徴マップ)を取得します。次に、プーリングを通して Pyramid Pooling Module で、様々なスケールでの領域表現を収集したものを、先程の Feature MapCONCAT(連結)させます。最後に、畳み込み層を通して Final Prediction(最終的なピクセル毎の予測を)取得します。

 早速、コードを動かしてみましょう。

3.コード

 コードはGoogle Colabで動かす形にしてGithubに上げてありますので、それに沿って説明して行きます。自分で動かしてみたい方は、この「リンク」をクリックし表示されたノートブックの先頭にある「Colab on Web」ボタンをクリックすると動かせます。

 まず、セットアップを行います。

 

 次に、サンプル画像を読み込みます。自分の画像を使用したい場合は、カレントディレクトリに自分の画像をドラッグ&ドロップでアップロードし、pil_image = PIL.Image.open(‘***.jpg’).convert(‘RGB’)の’***.jpg’の部分を変更して下さい。

 

 読み込んだ画像にセマンティック・セグメンテーションを掛けて、表示させます。

 画像を構成するピクセル毎に色分けされ、カテゴリ分類されているのが分かります。

 それでは、カテゴリー分類した結果のTOP15を1つづつ表示させます。

wall
sofa
ceiling
door
shelf
floor
fireplace
coffe

——————————————– 以下略 ———————————————-

 

 それでは、今度は動画でやってみましょう。まず、サンプルビデオをダウンロードします。

 

 サンプルビデオから静止画を切り出し、連番のjpg画像として images フォルダーに保存します。設定は、3フレーム毎に切り出す形(interval = 3)にしています。

 ご自分のビデオを使う場合は、自分のPCからカレントディレクトリへビデオをドラッグ&ドロップでアップロードし、video_file = の部分を変更して下さい。

 

  images フォルダーにある連番のjpg画像をセマンティック・セグメンテーションしたものに置き換えます。ファイル名は変更しません。

 

 ffmpeg を使って、images フォルダーにある連番の jpg 画像を動画(output.mp4)に変換します。

では、また。

(オリジナルgithub)https://github.com/CSAILVision/semantic-segmentation-pytorch