====== Semantic Segmentation ====== 視覚障害支援用途の領域分割アノテーションを実施して、認識モデルに持っていくまでの馬場の忘備録。論文執筆用に引用などもメモしていきます。 令和5年3月15日現在、5000枚程度の画像アノテーションを済ませており、このvidvipデータセットを使い、推論用のモデル生成までの流れを以下にまとめます。 ===== vidvip segmentationデータセット ===== vidvipでは令和5年3月15日現在で、5698枚の画像に対して、99953箇所のセグメンテーションによるアノテーションが作成されています。この画像セットはvidvip object detectionと同様の画像セットや一部都立大中庭を利用したデータセットになっており、アノテーションの種類に偏りがあるunbalancedなデータセットです。本データセットの詳細は以下の通り。上から順にアノテーション数、各ラベルの登録頂点数に関する箱ひげ図、各ラベルの登録面積[pixel^2]の箱ひげ図となっている。 {{::barplot.png?original|}} {{::boxplot_total_points.png?original|}} {{::boxplot.png?original|}} ===== 学習データの準備 ===== すでにvidvip segmentation(以下 vidvips)はYOLOのtxt形式に倣った形でラベル番号と頂点数を記述したアノテーションファイルと画像ファイルの集合で構成されている。アノテーションファイルと画像ファイルは同名ファイルであり、拡張子はそれぞれ .txt, .jpgで決め打ちしている。.jpegや.JPG, .TXT等の大文字は利用できない(自前のデータチェックスクリプトでエラー処理にするようにしている)。これらデータをpascal vocデータセットの作成手順を流用して、tensorflowで学習可能なtfrecord形式まで進めます。手順としては以下のようになります。 - .jpg, .txtのファイルを全て all(ファイル名は任意)フォルダにコピーする - imagemagickのmogrifyコマンドを利用して全てのjpegファイルを一括して横幅600px(アスペクト比は固定)に変更する - .txtのアノテーション情報を labelmeのjson形式に変換 - labelme2voc.py を利用して、アノテーション情報を元に領域分割した画像ファイル(.jpg, .txtと対応したファイル名)を生成する - remove_gt_colormap.py (deeplabに含まれている)を利用して上記で生成した領域分割画像ファイルをグレースケール化する - jpgファイル及びグレースケール化したpngファイル群をdeeplabに同梱されているpythonスクリプトを利用してtfrecord化する 以下に各手順の詳細を記述します。 ==== .jpg, .txtのファイルを全て all(ファイル名は任意)フォルダにコピーする ==== vidvip object detection(以下vidvipo)のときも同様であるが、一括操作の場合ファイル数があまりに多いと通常のコマンド操作では対応できないため、findコマンドを利用して一つずつコピー処理をしていく。vidvipsのデータはSegmentation/timestamp_作業者名/ の形式でデータが保存されており、これらをallディレクトリに.jpgと.txtだけ全てallディレクトリにコピーするコマンドは以下の通り。 find ./Segmentation -name *.jpg | xargs -I hogehoge cp hogehoge ./all find ./Segmentation -name *.txt | xargs -I hogehoge cp hogehoge ./all これで少々時間はかかるが全ての画像、アノテーションファイルが ./all ディレクトリにコピーできる。 ==== imagemagickのmogrifyコマンドを利用して全てのjpegファイルを一括して横幅600px(アスペクト比は固定)に変更する ==== まずは imagemagick をinstall( https://imagemagick.org/script/download.php )しておく。vidvipsの画像サイズは1920x1080、1280x720等少しサイズがまちまちであるが比較的大きめの画像ファイルが多い。このまま学習に利用することもできるが、GPUメモリ無いに画像を展開する際に画像サイズが多いと、メモリが足りなくてエラーになったり、それを回避するためにバッチサイズを大きくする必要が生じる。バッチサイズを大きくすることで学習時間が長くなってしまうため、現実的なサイズで予め画像サイズを変更しておく必要がある。このページでは一律横幅600[px]に変更する。all ディレクトリに移動後、以下のコマンドにて一括で画像サイズが変更できる。 mogrify -resize 600x *.jpg ==== .txtのアノテーション情報を labelmeのxml形式に変換 ==== vidvipsのアノテーション形式はyolo形式を拡張したもので、馬場が勝手に定義したものです。このアノテーション情報から領域分割画像を各画像ごとに生成してしまえば良いわけです。生成プログラムを記述することも可能ですが、ここでは labelme を利用してlabelmeへのアノテーション情報変換を行うことで、領域分割画像生成を行います。このスクリプトはCSIの慎さんが作成してくれた、text2json.py を利用します。 ==== labelme2voc.py を利用して、アノテーション情報を元に領域分割した画像ファイル(.jpg, .txtと対応したファイル名)を生成する ==== ==== remove_gt_colormap.py (deeplabに含まれている)を利用して上記で生成した領域分割画像ファイルをグレースケール化する ==== ==== jpgファイル及びグレースケール化したpngファイル群をdeeplabに同梱されているpythonスクリプトを利用してtfrecord化する ==== tfrecordはtensorflowを利用して学習を行う際のデータセット形式です。deeplabやその他画像認識では必ずこのtfrecord化が必要になります。 ===== 参考文献 ===== * MIT_DriveSeg:https://ieee-dataport.org/open-access/mit-driveseg-manual-dataset * 論文にたいなドキュメンテーションがあってそれがすごい参考になる * いろいろ参考になるので論文からデータまでなめるように見ておく。ラベル数は12(vehicle, pedestrian, road, sidewalk, bicycle, motorcycle, building, terrian (horizontal vegetation), vegetation (verti- cal vegetation), pole, traffic light, traffic sign) * 最初は少人数グループでアノテーション作業を行い、1.5時間/画像 というとんでもない作業 * アノテーション作業にはlabelmeを利用している