ラズパイ上で訓練済みモデルを使って物体検出をしてみた

 

こんにちは。のっくんです。

 

今日はOpenCVのDNN(Deep Neural Network)を使って、物体検出をしてみようと思います。

 

なんか難しそうに聞こえますが、コードのコピペで動きますし、やっていることは単純です。

 

ニューラルネットワークというと、GPUが必要なんじゃない?って思う方もいるかも知れませんが、訓練済みモデルを使えば、CPUやラズパイでも動作させることが可能です。

 

この記事では、ラズパイ上で物体検出できるかどうか試してみます。

 

スポンサーリンク

Object-Detection-APIとは?

 

物体の検出には、TensorFlowのObject-Detection-APIを使います。

https://github.com/opencv/opencv/wiki/TensorFlow-Object-Detection-API

 

今回はTensorFlowを含んでいるOpenCVを使って動かします。Object Detection APIを使うには、OpenCVは3.4.1より新しいものが必要みたい。(最新のOpenCV 4.0.0でも動きました。)

 

上のリンクを見てもらえば分かりますが、訓練済みモデルは色々あります。

  • Mobile Net SSD v1
  • Mobile Net SSD v2
  • Inception SSD v2
  • Faster-RCNN Inception v2
  • Faster-RCNN ResNet-50
  • Mask-RCNN Inception v2

 

どれを動かしても面白そうですが、今回はMobileNet SSD v2を動かしてみます。

環境は以下の通り。

  • Python 3.5
  • OpenCV 3.4.4
  • MobileNet SSD v2

 

詳しくは以下のサイトを参考にしました。

https://heartbeat.fritz.ai/real-time-object-detection-on-raspberry-pi-using-opencv-dnn-98827255fa60

 

ソースコード、訓練済みモデル、設定ファイルは以下のサイトにあり、そのままクローンすれば動作確認できますよ!

https://github.com/rdeepc/ExploreOpencvDnn

 

コード

 

読みづらいコードだったので、私なりにリファクタリングしています。日本語のコメントも多めに記載してあります。

 

コードの説明をしていきます。

 

ダウンロードしておいた訓練済みモデルを読み込みます。cv2.dnn.readNetFromTensorflowを使います。

 

cv2.dnn.blobFromImageを使って、blobという形に変換します。300*300のサイズに変換して、OpenCVのBGRからRGBに変換してます。正規化も行なっているみたい。

 

outputには、モデルが予測した結果が入っています。outputの形式は(1,1,100,7)の形になっていて、3つ目にクラスID、4つ目にモデルが予測した確率が入っていますので、そこだけ取り出します。

 

モデルが予測した確率が0.5以上ある場合に、クラス名と座標を取得する感じです。取得した座標とクラス名は、画像に書き込んでいます。

 

実行結果

 

私のiPhoneで撮影した画像を使ってみます。

 

私の使っているMacとディスプレイ。

タイに行った時の飛行機。

タイにいたゾウ。

傘と人とゾウを検出しています。人の位置が少し違う感じですね。

 

とりあえず、物体検出APIは動いたので、今後はラズパイのカメラ+リアルタイム物体検出をやってみたいと思います。

 

前から思っていたのですが、海外のブログ記事は有用なものが多くて助かります。ヽ(・∀・)ノ

 

おわり。

 

参考

 

Real-Time Object Detection on Raspberry Pi Using OpenCV DNN and MobileNet-SSD:

https://heartbeat.fritz.ai/real-time-object-detection-on-raspberry-pi-using-opencv-dnn-98827255fa60

Github:

https://github.com/opencv/opencv/wiki/TensorFlow-Object-Detection-API

https://github.com/rdeepc/ExploreOpencvDnn