AI coordinator

人工知能 & ロボティクス

© AI coordinator All rights reserved.

物体検出用SSD_Kerasで使える学習モデルの作成方法

学習モデルの作成

サンプルソースコードのSSD_kerasを使ってリアルタイム映像からの物体検出ができるようになると、自分で学習させたモデルで物体検出をやりたくなります。

そこでどうやったら学習モデルが作成できるのかネットサーフィンをしていたら、データ準備がとても大変かつ難易度が高いことを知りました。

中ば途方に暮れていたところ、実際に自分で準備した画像を画像データ準備用のツールを開発することで、独自の学習モデルを作成していたサイトを見つけました。

そのサイトを参考に、筆者でもその方法で試してみたところ、色々苦労しながらも無事に物体検出をすることができましたので、個人的な備忘録の意味も兼ねて、その内容の紹介をしたいと思います。

 

できるだけ分かりやすく説明していますので、挑戦してみたい方は当記事を参考に学習モデルを作成してみてください。

 

参考にさせて頂いたサイトの紹介

今回参考にさせて頂いたサイトは以下の2サイトです。

分かりやすく説明くださっているので、筆者のような素人でもなんとか実装できました。

物体検出アルゴリズム(SSD : Single Shot MultiBox Detector)を学習させてみる

物体認識用データセット作成支援ツール(Faster R-CNNとかSSDとか)

 

また、もしこれからDeep Learningの勉強をするなら、こちらで紹介する書籍も参考になりますので一読してみることをオススメします。

 

テスト環境

macOS Sierra

Anaconda3-4.2.0-MacOSX-x86_64

python 3.5.2

opencv3 3.1.0

tensorflow-1.0.0

keras 1.2.2

 

画像データセットの準備方法

まず大量の画像が必要であることはいうまでもないのですが、過去記事で紹介していたような学習データではなく、xml形式の学習データが必要となります。

これが筆者を途方に暮れさせた原因です。

どんなデータかというと、以下のような画像を、

xml形式に変換する必要があるわけです。

上記xmlには、学習させたい物体の位置情報を記述する必要があります。

この例では顔の部分を選択した位置情報が記述されています。

このxmlデータをアノテーションデータと呼ぶそうです。

 

そしてこの画像アノテーションデータを簡単に作成できるツールを紹介しているのが、参考にさせて頂いたサイトに公開されているわけです。

Processing3.3を使って画像アノテーションデータを作成するわけですが、筆者はこのProcessingを使ったことがなく、導入に四苦八苦しました。

そんな方のために、どうやって使うのか紹介したいと思います。(備忘録も兼ねて)

 

まず、公式サイトからProcessing3.3をダウンロードしましょう。

今回は最新バージョンではなく、説明通りProcessing3.3を使用しました。

続いてProcessingを動かすソースコードをgithubからダウンロードしましょう。

 

さてここからハマったわけですが、どうやってソースコードを起動するか悩みました。

ここで紹介する動かし方が正しいかは不明ですが、筆者ができたやり方を紹介します。

 

まず、Processing3を起動します。

すると以下のような新規作成用の画面が起動しますので、この画面は無視して、「ファイル」>「開く」の順で、ダウンロードしたmainGUI.pdeを開いてください

するとポップアップが表示されて、なにやら質問されますが、okをクリックしてください。

ソースコードが読み込まれれば、以下のような画面になるので、

この画面に残りのソースコード2つ(getImage.pde、processXML.pde)をドラッグ&ドロップしてください。

3つのソースコードが入りました。

このままではまだ動きません。

今現在のフォルダ構成は以下の画像のようになっているはずです。

mainGUIフォルダが作成されていて、その配下に3つのソースコードができています。

このmainGUIフォルダにダウンロード時に付属していたxmlフォルダをコピーすれば起動できます。

上記フォルダ構成になったら、Processing画面の左上の右矢印ボタンを押下しましょう。

起動できました。

筆者はここに行き着くまでに、数時間かかりました。

 

Processingが起動できたら実際の画像アノテーションデータの作り方については、参考元サイトのデモ動画を確認して頂ければ、使い方が分かると思います。

 

独自画像を学習させる前にまずは基本動作から

ここまで出来ると、自分で準備した画像で早速学習させてみたいのですが、まずはすでに準備されている学習データから学習してみましょう。

いきなり難しいことにチャレンジしてつまずくよりも、基本的な流れを把握してからチャレンジした方が、結果的に早くできます。

(筆者の場合ですが・・・)

 

学習データのダウンロード

The PASCAL Visual Object Classes Homepageに学習用データが準備されています。

今回は「The VOC2007 Challenge」を使用しましたので、「The VOC2007 Challenge」をクリックして次画面に進んでください。

 

次の画面に進んだら、真ん中あたりから学習用データをダウンロードできます。

450Mサイズなのでわりと量があります。

ダウンロードしたら、ファイルを展開しましょう。

 

ソースコードの準備

これがまた結構大変でした。

筆者の理解が足りないせいで時間がかかりましが、参考元サイトにも記載があるように、フォルダ構成や各ライブラリーのバージョンには注意が必要です。

これが出来ていなかったばっかりに苦労しました。

フォルダ構成は注意すれば良いのですが、各ライブラリーのバージョンについては、自分で修正する気が無いなら、上記で紹介しているテスト環境通りのバージョンに揃えておいた方がトラブルなくスムーズに学習できるかと思います。

 

学習のさせ方については参考元サイトをご覧ください。

 

ちなみに筆者の環境ではGPUを使用していないため、Epoch=2でやりました。(少な!!)

学習モデルを作成してみることが目的なので、学習精度よりもスピード重視で動かしました。

これでも数時間かかりました。(夜に実行して、翌朝完了していた。実際はもっと早いと思います。)

真面目に開発するなら、マシンパワーが必要になります。

 

学習データからの物体検出

無事に学習が完了したら、実際に自分が作成した学習モデルで物体検出をやってみましょう。

実行の仕方については、映像物体検出を簡単に実装する方法 for maxOSを参考にしてください。

これで動かすことが出来たら、次はいよいよ独自画像で学習モデルを作成していきます。

 

独自画像でのデータ準備開始

これは地道にやっていくしかありません。

Processingを起動して、デモ動画を参考にアノテーションデータを作成していきましょう。

今回は上戸彩さんの画像で試してみます。

画像アノテーションデータはこんな感じです。

 

pklファイルの作成

get_data_from_XML.pyのソースコードを変更しましょう。

42行目からラベル名の指定となっています。

今回はクラス数はそのままの20とし、独自画像だけでpklファイルを作成しました。

つまり、もともとあったデータは使用せず、準備したデータだけでpklファイルを作成しています。

画像アノテーションデータと実際の画像については、VOCdevkit/VOC2007内にあるAnnotationsフォルダ、JPEGImagesフォルダに入れてpklファイルを作成しています。

 

ソースコードの”num_classes”は、上戸彩さんの画像アノテーションデータしか準備していないので、num_classes=1にする方法が正しいと思うのですが、これだとなぜかうまく学習が終了しませんでした。

そのため、もともとあった20クラスの一番上に定義してある”aeroplane”を”aya ueto”に変更して試してみました。

おそらく正しいやり方では無いと思いますが(ていうか絶対正しく無い!)、これでもしっかり動きましたので一旦良しとしました。

 

独自画像の学習モデル作成

pklファイルが作成出来たら、tarin.pyを実行しましょう。

特に修正は必要ありません。

今回準備した画像は22枚で、Epoch = 10 で学習せさました。

なんせGPUで実行していないので、学習精度よりも学習モデルを作成することを優先しました。

 

学習が完了すると、1枚画像が表示されて物体検出の結果を出力してくれます。

 

中々良い感じで物体検出が出来たようです。

 

映像からの物体検出

学習モデルが作成出来たら、SSD_Kerasで早速試してみましょう。

無事に映像から物体検出が出来て入ればひとまず成功です。

学習したモデルは、checkpointsフォルダにEpochの数分作成されています。

一番新しい学習モデルを使用しましょう。

 

videotest_example.pyのソースコードも修正が必要です。

クラス名の変更が必要になりますので、”aeroplane”を”aya ueto”に変更してから実行してください。

 

実行した結果

ようやく出来た。

ん!?

学習精度が低いのは否めない感じです。

 


その他の物体検出記事はこちらから

 

それではまた。

関連記事

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

言葉を自動学習するSlackbotをマルコフ連鎖で実装

マルコフ連鎖とは 簡単に説明すると、マルコフ連鎖を使用すれば既存の文章を元にして自動で文章を生成することができるようになります。 ロ…

20178/12

監視カメラで撮影した画像を自動でSlackにアップロードする方法

画像確認はSlackが便利 前回紹介した動体撮影に特化した監視カメラの作成方法で、保存した写真をどうやって簡単に確認できるか模索していたと…

20177/15

SlackからPepperを発話させる超簡単な方法

SlackからPepperを喋らせてみる 久しぶりのPepperネタです。 最近、Slackbotを学習したので、今度はPepper…

20173/5

Pepper用Python 2.7 SDK(WIN)セットアップ方法

コレグラフを使用しなくてもPepperを動かせるPython 2.7 SDKセットアップ方法 Windows編 前回に続き、今回はWind…

wikipedia全文データからWord2Vecで類義語を抽出してみる

自然言語処理の入門、wikipedia全文データを使ってみる 自然言語処理について何から勉強を始めようかと色々模索していたところ、wiki…

20177/22

Pepperのカメラ映像からリアルタイムで物体検出する方法

Pepperのカメラからリアルタイムに物体検出してみる 以前からチャレンジしてみたかったPepperに搭載されているカメラ映像からの物体検…

畳み込みニューラルネットワークを使った画像検出モデルの作成方法

深層学習(ディープラーニング)で画像認識に挑戦 以前の記事でMNISTを使った数字画像認識の学習モデルを作成しました。 でも、やっぱ…

20178/8

動体撮影に特化した監視カメラの作成方法

動く物体を検知して写真撮影をする監視カメラ OpenCVを使えば動体撮影に特化した監視カメラを作成することができるのではないかと考え、実装…

20175/7

綺麗にAnacondaをアンイストールする方法 For macOS

Anacondaのアンインストールメモ macOSにインストールしたAnacondaのアンインストールに手こずったので、忘れないようにする…

20176/14

OpenCVで簡単リアルタイム物体検出

OpenCVを使った物体検出 映像からただ単に物体検出を試してみたいだけなら、すぐにでも試せる方法を紹介します。 SSD_keras…

ページ上部へ戻る