茨城エンジニアのPython開発日記

茨城のITベンチャー企業ではたらく2年目エンジニア。Pythonで色々なものを作成中。

論文読んでAIつくるぞ会(第3回) ~Pascal VOC 2012の画像でSemantic Segmentationに挑戦~

ブログから記事を見つけたい場合はこちら

ブログ地図 - 茨城エンジニアのPython開発日記

こんにちは、開発メンバーのYです。


今回も朝7:20から勉強会でした。
普段は正午過ぎまで寝てるので休日を有効活用できている気がします。

 

さて、前回TensorFlowのひながたが完成したので、


今回は↓の記事を参考にSemantic Segmentation の勉強をしました。
qiita.com


とりあえず学習データセットPascal VOC 2012」をロードするところまではたどり着きました。

ソースコードについては、内容を拡充した後にアップロードする予定です。

というわけで今回はモジュール作成の過程で得た知識をまとめていこうと思います。

1.学習データセットについて

セマンティックセグメンテーションのデータセットは沢山あるようでしたが、
上記ブログの解説が非常に分かりやすかったので、「Pascal VOC 2012」を採用しました。

Pascal VOC 2012のデータセットの中身はこんな感じ

f:id:tottorisnow33:20201211234535p:plain
データセットの中身(入力データ)
f:id:tottorisnow33:20201211234631p:plain
データセットの中身(教師データ)


↑入力データはJPEG、教師データはPNGファイルになっています。


JPEGファイルは色情報を1ドットにつき、赤、青、緑でそれぞれ8ビット(=1バイト。256通り)で表現しているのに対して、

PNGファイルの色情報はパレットというヘッダ部で定義され、データ本体はそれを参照するインデックスを持つことで色を表現しているらしいです。(こっちは知らなかった)


Pascal VOC 2012」の教師データの色はインデックスカラーになっていて、
このインデックスがクラスインデックスに対応してるみたいです。

↓の記事にて「Pascal VOC 2012」のカラーマップについてわかりやすく解説されていました!
qiita.com


2.出力行列について

ソースコード解析中に気になる部分を見つけました。

identity = np.identity(len(CATEGORY), dtype=np.uint8)
images_segmented = identity[images_segmented]

images_segmentedは教師データ、identityは単位行列を表しています。


最初はわけわかめだったのですが、

どうやらクラス数分の単位行列を生成し、カラーインデクスで表現された画像配列をかけることで、クラス別のone_hotを生成しているようでした。

デバッグ機構を作り、生成されたimages_segmented の中身を確認してみました。

f:id:tottorisnow33:20201212014816p:plain
デバッグ出力

ch0: 背景、ch1: 飛行機 といった具合で、クラス別のone_hotが確認できてますね。


デバッグ出力ができるということは、データセットが読み込めているということなので、今回の目標はクリアです。



とうわけで、少なめですが第3回報告は以上になります。

次回は学習したモデルで評価した結果を確認するところまでやってみます!



(次回もみんなで早起きする予定)

 

それではまた次回!