Tensorflowでライオンとネコを詳細に検出する

AI

はじめに

前回は、AIでライオンとネコを検出する!と題してTensorflowを使ってObject Detectionをやってみました。うまく識別はできたが今回はもう少し前に進んでみましょう!。ピクセル単位でライオンとネコを検出をしてみたいと思います。今回はSemantic Segmentationという技術を用います。

 

前提

下記のGCPのGPUインスタンスを使用します。CPUオンリーの環境でもやってみましたが手順はほとんど変わりませんので問題ないかと思います。ただし、Semantic Segumentationはトレーニングが終息するまで、かなりのステップ数が必要になるようなので、なるべく高速なGPUインスタンスをお使いになることをおススメします。

モデルのダウンロード

まずは、いつも通り、Githubからモデルをダウンロードしてきましょう。あわせて、今回ベースに用いるモデルもダウンロードしてきます。ベースとなるモデルはいくつかありますが、今回はmobilenetv2のtrainvalというものを用いました。

参考:deeplabのGithub

参考:モデルダウンロードページ

 

トレーニング用のデータを準備

Semantic Segmentationはデータの準備が大変です。準備方法はちょっと複雑なので、別途こちらのページで説明します。以下、学習用データが作成された前提で進めます。

データ格納用のフォルダを作成します。

画像データフォルダの中身はこのような感じ。トレーニングの際にcropサイズを指定できるので、この時点でサイズは特に意識しないでも大丈夫です。

ラベルデータフォルダの中身はこのような感じ。こちらもサイズは元の画像データに合わせておけばよいです。

画像リストフォルダの中身は次の二つで、それぞれの中身は下記のように拡張子抜きのファイル名を列挙します。

TFRecordの作成

データセットからおなじみのTFRecordを作成します。

 

トレーニングの設定

作成したデータセットを使用できるようにdatasets/data_generator.pyを編集します。DatasetDescriptorとして、トレーニングに使用するデータ数やクラス数などを指定してあげます。あとはこのDatasetDescriptorをエントリを_DATASETS_INFORMATIONに追加してあげればよいです。

 

トレーニングの開始

ではトレーニング開始です。datasetは先ほど編集したスクリプトに記載したデータセット名を指定します。実行してみてわかったのですが、以前少し触っていた時とスクリプトが変わったようで実行ログの表示が以前と違っていました。何となく、参考までに以前の出力も下記に示していますが、現在のステップ数とか表示されなくなってなんかわかりずらくなった気がします。処理時間も sec/stepから step/secにかわってるし。いずれにせよ、依然はCPUでやったので、1stepあたり1秒強かかっていたのがGPUのおかげで0.1秒くらいになっていそうです(step/secの逆数)。

 

■以前、CPUでやった時のログ

 

セグメンテーション実施

ある程度学習が進んだら、試しにセグメンテーションを実施してみましょう。下記のコマンドで実施できます。

 

以下、実行結果です。上から3万ステップ、4万ステップ、5万ステップ、7万ステップの結果です。最初のうちはネコとライオンを混同しているようですが、最後にはしっかりとネコを見分けられるようになっていますね。学習の効果が出ています。

 

 

まとめ

今回は、Semantic Segmentationを用いてライオンとネコをピクセル単位で検出してみました。ちょっと学習時間や学習データの準備でハードルが高いですが、結構な精度で検出ができます。いろいろと面白い活用ができそうなので、もう少し遊んでみたいと思います。

 

 

コメント