Raspberry Piで、オリジナルの学習モデルを使った物体検出(Google Colabを用いたモデルの学習編)[2/4]

スマートホーム
スポンサーリンク
このエントリーをはてなブックマークに追加

はじめに

オリジナルモデルを使った物体検出をRaspberry Piで行うべく、以下を実現しようとしています。

これを実現するために4回に分けて記事を記載予定で、今回は2つ目の記事です。

 第1回:IBM Cloud Annotationsを用いたアノテーション
 第2回:Google Colabを用いたモデルの学習 ←この記事
 第3回:Raspberry Piの環境構築
 第4回:オリジナルモデルを用いた物体検出

第2回:Google Colabを用いたモデルの学習

前回は、IBM Cloud Annotationsを使って学習データを作成(アノテーション)することをやりました。今回は、Google Colabを用いて、TensorFlowのモデルを学習させていきます。この学習処理には膨大な浮動小数点演算が必要なのですが、Google Colabを使うことで、無料のGPUを使って高速に実行できます‼️

Google Colab環境の準備

まずは、Google Colabの環境を整えていきます。

①Jupiter notebookのダウンロード

初めに、私がカスタマイズしたJupiter notebookをダウンロードして下さい。このnotebookは、基本的には公式のobject-detection.ipynbの通りですが、以下の8点変更を加えています。

 ①エラーが出て進まない部分の解決
 ②SSD mobile net v2 coco quantizedの利用
 ③Google Driveのマウント
 ④Google Driveに格納されたテスト画像を使ったテスト
 ⑤TensorFlow Liteモデルの生成
 ⑥学習済モデルのダウンロード機能
 ⑦ステップ事に確認しながら進める確認ステップの追加
 ⑧日本語による記載

②Google Driveの準備

次に、お使いのGoogleアカウントでGoogle Driveにアクセスし、左上の「新規」のボタンをクリックします。

③フォルダの作成

出てきたメニューから「フォルダ」を選択し、「ObjectDetection」とフォルダ名を入力し「作成」ボタンをクリックします。※違う名前でも大丈夫ですが、nodebook上のパスを書き換える必要があります。

④ファイルのアップロード

作成した「ObjetcDetection」フォルダを開き、上でダウンロードしたZIPファイルの中にある「物体検出モデルの作成forラズパイ.ipynb」と、第1回目でテスト用に撮影したjpg画像をアップロードします。

⑤Google Colabを開く

アップロードした「物体検出モデルの作成forラズパイ.ipynb」をダブルクリックして開きます。

notebookを開くと、以下のようなGoogle Colabの画面が表示されます。

⑥GPUの確認

画面左上の「編集」から「ノートブックの設定」を選択します。

この画面で、ハードウェアアクセラレータが「GPU」になっている事を確認し「保存」をクリックします。

以上で、Google Colab環境の準備は完了です。

サーバの環境設定

ここからはnodebookに記載の「1.環境設定」の内容に従って、上から順にコードを実行していきます。Google Colabのサーバ環境は、必要最低限のパッケージしかインストールされていない状態ですので、TensorFlowのモデル学習に必要なモジュールをインストールしていきます。

①numpyのインストール

まずは、numpyをインストールします。具体的には、コードの左側にある再生ボタンをクリックします。

インストールが完了すると「Successfully installed numpy・・・」と表示されます。numpyのインストール後にはインスタンスの再起動が必要との事で「RESTART RUNTIME」のボタンをクリックします。

②tf_slimのインストール

次に、tf_slimをインストールします。

③cloud-annotationsのインストール

IBM Cloud Annotationと接続するためのcloud-annotationsをインストールします。「Successfully installed cloud-annotations・・・」と表示されればOKです。

④学習ステップ数の設定

学習のステップ数を変更したい場合には、ここで「num_steps」の値を変更します。初期設定は500にしていますが、物体検出の精度を出すためには最低でも5000ぐらいにしたほうが良いです。設定ができたら再生ボタンを押して実行します。特に結果は表示されません。

⑤ObjectDetectionDemoのクローン

SSD Mobilenet v2 を使った学習を行うために「object_detection_demo_flow」をクローンします。「Already up to date」と表示されればOKです。

⑥Object Detection APIのクローン

次に、TensorflowのObject Detection APIをクローンし、必要な関連モジュールをインストールします。

インストールが完了すると、環境テスト用の「model_builer_test.py」が実行され、必要なモジュールがインストールされているかテストされます。以下のように、エラーが出ていなければOKです。

⑦Mobilenet SSD v2 quantizedのダウンロード

次に、学習モデルのベースとなるSSD Mobilenet v2 quantizedをダウンロードします。以下のように「tflite_graph.pb」などのファイルが見えていればOKです。

⑧チェックポイントの設定

最後にダウンロードしたSSD Mobilenet v2 quantizedに含まれるcheckpointを変数に設定します。以下のように「model.ckpt」のパスが表示されればOKです。

以上で、サーバの環境設定は完了です。

学習データの用意

ここからは、第1回でIBM Cloud Annotationsを使って作成した学習データをTensorFlowが扱えるTFRecord形式のファイルに変換し、学習データを用意します。基本的には「2.学習データの用意」の上からコードを実行していくだけです。

①Googleドライブのマウント

後で利用するので、自分のGoogleDriveをマウントします。再生ボタンを押してコードを実行すると、以下のようにURLが表示されるので、これをクリックして開きます。

すると、Googleアカウントの選択画面が表示されるので、Googleアカウントを選択します。

次に、Google Drive File Systemよりアクセスの許可を求められるので「許可」ボタンをクリックします。

許可すると、画面にコードが表示されるので「コピー」ボタンを押して、クリップボードにコピーします。

コピーしたら、Google Colabのタブに戻り、コピーしたコードを赤枠の中にペーストしてエンターを押します。

コードが認証されると「Mounted at /content/gdrive」と表示され、Google Colab上のサーバ上に自分のGoogle Driveがマウントされます。

②IBM Cloudのマウント

前回アノテーションしたデータにアクセスするために、IBM Cloudのストレージをマウントします。再生ボタンを押す前に「credentials」の部分を前回メモしたものに書き換えます。書き換えたら再生ボタンを押してコードを実行します。「○○ mounted」と表示されたらマウント完了です。

③アノテーションデータの確認

次のブロックの再生ボタンを押すと、前回アノテーションした画像ファイルやjsonファイルが表示されます。これでIBM CloudとGoogle Colabが接続されたことが確認できます。

④ラベルマップの作成

次にラベルマップを作成します。ラベルの情報も_annotations.jsonに含まれているので、これを読み込んで作成してくれます。

作成が終わると作成されたラベルマップが表示され、アノテーション時に入力したラベル名が確認できます。

⑤TFRecordsの作成

それではモデル学習のインプットとなるTFRecordを作成しましょう。アノテーションしたデータの量にもよりますが、少し時間がかかります。

TFRecordの作成が完了すると、以下のように2つのレコードファイルが作成されます。1つ目のtrain.recordは学習用のレコードで、val.recordが検証用として使われるレコードです。

⑥学習用データのパスの設定

作成したラベルファイルとTFRecordのパスを変数に設定します。

⑦パイプラインの設定

最後に、モデル学習用の設定ファイル(パイプラインファイル)を作成します。

2つ目のブロックも実行します。

2つ目のブロックを実行するとパイプラインファイルの内容が表示されます。上で設定した学習ステップ数、チェックポイント、ラベルファイル、レコードファイルのパスが設定されていることを確認しましょう。

以上で学習データの用意は完了です。

モデルの学習

ここからは、いよいよTensorFlow用の学習モデルを学習させていきます。

①Tensorboardの設定

500回の学習では5分程度で学習が完了してしまうので必要ありませんが、5000回を超える学習を行う場合には、時間がかかるので現在の学習状況が気になるところです。そこで、学習状況を可視化できるTensorboardを利用できるようにします。

操作は簡単、再生ボタンを押すだけです。ただし、以下のようにエラーになってしまう場合には、再実行しましょう!再実行の時には、上書きを確認されるので「A」と入力してエンターを押しましょう。うまく行くと以下のように「https://xxxxxx.ngrok.io」とURLが表示されます。また、このタイミングでURLにアクセスしてもエラーになってしまいますので、次のステップで学習を開始したらアクセスしましょう。

②学習のスタート

それでは、今回の本題のTensorFlowのモデルの学習を行いましょう‼️

学習が開始されるとログが沢山表示されますが、Step=100という表示が500になったら完了です。500の場合で大体5〜10分かかります。途中経過を見るために、上で作成したTensorbordのURLにアクセスしましょう。

以下がTensorboadの画面です。500ステップの場合には、途中経過を確認するまでもなく、すぐに終わってしまいますが、5000回での実行では、Lossの値が段々と下がっている様子が確認できます。

Google clabの画面でStepの値が500になり、最後にログがだらだら流れると学習は完了です‼️

③チェックポイントの表示

学習が完了したら次のブロックを実行して、チェックポイントの情報を確認してみましょう。model.ckpt.500というものが確認できると思います。

④グラフのエクスポート

学習したばかりのTensorflowのモデルは、学習させたマシンでしか利用できないので、エクスポート処理を行います。この処理にも少し時間がかかります。

⑤エクスポートモデルの確認

エクスポートが完了したら次のブロックを実行して、エクスポートされたモデルを確認します。以下のようにsaved_modelやfrozen_inference_graph.pbが表示されていればOKです。

⑥テスト用画像の読み込み

次のステップでモデルのテストを行うために、テスト用画像を読み込みます。コードを実行して、GoogleDriveに格納したテスト用画像のファイル名が表示されればOKです。

⑦学習モデルのテスト

それでは、学習したモデルを使って物体検出ができるかテストしてみましょう‼️テストのところのコードを実行します。すると、テスト用画像に対して物体検出が実行され、うまく行けば以下のように物体が検出されて表示されます‼️ちなみに、ファイル名の下の数字がラベルファイルで設定した検出物体のIndex番号、その下が確率です。

なお、実行しても画像が表示されない場合がありますが、その時はもう一度再生ボタンを押しましょう。

また、画像は表示されるものの、物体が検出されない場合は、学習のステップ数を増加させたり、アノテーションのデータ数を増やしたりしましょう。

⑧TensorFlow Lite用モデルの作成

Raspberry Piで利用できるようにTensorFlow Lite用のモデルを作成します。

以下のように「tflite_graph.pb」が作成されていればOKです。

⑨tflite形式への変換

pbファイルをTensorFlow Lite用のtflite形式へ変換します。

以下のように「detect.tflite」のファイルが作成されていればOKです。

⑩学習済モデルのダウンロード

最後に、学習済みのモデルをPCにダウンロードします。ダウンロードには少し時間がかかるので、気長に待ちましょう。

ダウンロードの準備が完了すると、ZIPファイルがダウンロードされます。

【参考】モデルファイルの内容確認

ダウンロードした学習済モデルのZIPファイルを解凍すると以下のファイルが含まれている事が確認できます。このファイルのうち「detect.tflite」と「labelmap.txt」が次のステップで使うファイルになります。

以上でGoogle Colabを使ったTensorFlowモデルの作成は完了です。

おわりに

今回は、Raspberry Piで物体検出を行う連載記事の第2回目として、Google Colabを使ってTensorFlowの学習モデルを作成することをやってみました。次回は、RaspberryにTensorFlow Liteなどをインストールして、物体検出を行う環境準備を行います。

 第1回:IBM Cloud Annotationsを用いたアノテーション
 第2回:Google Colabを用いたモデルの学習
 第3回:Raspberry Piの環境構築 ←次の記事
 第4回:オリジナルモデルを用いた物体検出

関連記事

Raspberry Piで最強の防犯カメラを作ってみる(動画記録・配信、動体検知・Line通知、顔検知・顔認証、Alexa搭載)[1/6]
はじめに6ヶ月間の育児休業を取って、育児&家事に専念しているnaka-kazzです。我が家では、防犯のために玄関に防犯カメラを置いています。しかし、この防犯カメラ、スマホアプリを通じて動画を見たり動体検知をすることはできるのですが...
Raspberry PiとNode-redで、リビングに飾れる美しい「スマートホームコントローラ」を作ってみた
うちの子供達はリモコンが大好きで、すぐにどこかに持っていってしまいます。今回はスマートリモコン、Raspberry Pi、Node-redを使って、家中のリモコンを一つにまとめ、家電を一括操作できるスマートホームコントローラを作ってみたいと思います。
Raspberry Pi 4Bで4Kカメラは扱えるか?エンコード性能を徹底検証
Raspberry Pi 4Bで4K動画がどこまで扱えるかの情報がネットに無かったので、実機を使って検証してみました。4KとフルHD動画について、h264、mjpeg、非圧縮の6パターンについて検証しています
Raspberry PiとNode-redで、Hueブリッジ(Zigbee Hub)を作ってみた(スマホ&Alexa操作対応)[1/3]
最近は、スマート電球の「Hue」や「TRADFRI」、Aqaraの温度センサーなど、様々なzigbee機器が出てきています。しかし、これらを使用するにはHueブリッジなどのZigbee Hubの購入が必要で、しかもメーカを跨って相互に接続できません。そこで、Raspberry PiとNode-redを使って、メーカに関係なくZigbee機器を接続できるZigbee Hubを作ってみました。
Raspberry PiにAlexaをインストールしてみる(ウェイクワードエンジン変更・感度調整・systemd設定)
この記事は古くなっています。以下の2023年版の記事を参照ください。やりたいことAmazon Alexaを利用したければ、Amazon Echoを購入するのが手取り早いのですが、Alexaの機能をいろいろカスタ...
Jetson nanoで、オリジナルの学習モデルを使った物体検出[1/5]  〜IBM Cloud Annotationsを使ったアノテーション編〜
オリジナルの学習データを使って、Jetson nanoで物体検出を行う方法を全5回でまとめます。連載の1回目は、学習モデルを作成するための準備として、教師データをIBM Cloud Annotationsを使って作成していきます。
記事が参考になったら、ブログランキングに協力(クリック)して貰えると嬉しいです。

昼間はIT企業に勤めてますが、プライベートでは「育児×家事×IoT」をテーマに家のスマートホーム化に取り組んでいます。Androidアプリも作っているので使って下さい。質問・コメントは、↓のコメント蘭でもFacebookメッセンジャーでもどちらでも大丈夫です。
E-mail:naka.kazz.d@gmail.com

naka-kazzをフォローする
スマートホーム開発者向け
スポンサーリンク
naka-kazzをフォローする
スマートホーム×DIY

コメント

タイトルとURLをコピーしました