オブジェクト検出及び料理検出デモを試す vision kit part5

2019年2月25日

part1 で vision kit を組み立てpart2 で顔検出と笑顔検出、写真撮影実施のデモpart3 ではオブジェクト認識と顔検出のデモ、さらに、part4 で2つの顔検出(自動写真撮影と顔検出表示)のデモを実施してきました。

今回は、オブジェクト検出デモを実行します。

スポンサーリンク

オブジェクト検出デモ実行

まだまだデモプログラムはあります。

オブジェクト検出デモは画像を取得し、その中から、猫、犬、または人物をチェックするものです。

このデモを実行する前に画像を準備する必要があります。カメラで写真を撮るか、SDカードに写真を保存します。

写真の準備

これだけの写真を用意しました。

次に、次のコマンドを入力してEnterキーを押し、image.jpgを使用するファイルに置き換えます。

./object_detection.py --input .jpg 

さて、その結果はどうなっているか見てみましょう。


エラー発生!

pi@raspberrypi:~/AIY-projects-python/src/examples/vision $ ./object_detection.py --input /home/pi/inu_1.jpg
 Traceback (most recent call last):
   File "./object_detection.py", line 59, in 
     main()
   File "./object_detection.py", line 49, in main
     result = inference.run(image_center)
   File "/opt/aiy/projects-python/src/aiy/vision/inference.py", line 152, in run
     return self._engine.image_inference(self._key, image, params)
   File "/opt/aiy/projects-python/src/aiy/vision/inference.py", line 347, in image_inference
     params=_get_params(params)))).inference_result
   File "/opt/aiy/projects-python/src/aiy/vision/inference.py", line 240, in _communicate
     return self._communicate_bytes(request.SerializeToString())
   File "/opt/aiy/projects-python/src/aiy/vision/inference.py", line 246, in _communicate_bytes
     raise InferenceException(response.status.message)
 aiy.vision.inference.InferenceException: ImageInference: Input image must not be smaller than 256 x 256

あれれ、何かエラーが発生しました。最後のエラーを見ると、写真が小さすぎたのでしょうか?

pi@raspberrypi:~/AIY-projects-python/src/examples/vision $ ./object_detection.py --input 3.jpeg

Object #0: kind=PERSON(1), score=0.500732, bbox=(160, 237, 223, 190)

こちらの写真でやると、何ら問題が起こりません。

pi@raspberrypi:~/AIY-projects-python/src/examples/vision $ ls -l /home/pi/inu_1.jpg

-rw-r--r-- 1 pi pi 15734 Dec  5 10:11 /home/pi/inu_1.jpg

pi@raspberrypi:~/AIY-projects-python/src/examples/vision $ ls -l 3.jpeg

-rw-r--r-- 1 pi pi 246154 Aug  4 00:28 3.jpeg

写真の大きさを見てみると、エラー発生の写真が小さすぎるように見えますね。

試しに、neko2.jpgでもやってみましたが、同じエラーが発生します。

pi@raspberrypi:~/AIY-projects-python/src/examples/vision $ ./object_detection.py --input /home/pi/neko2.jpg
 Traceback (most recent call last):
 ・
 ・
 aiy.vision.inference.InferenceException: ImageInference: Input image must not be smaller than 256 x 256

写真を大きくして再挑戦

写真を大きくして再挑戦してみます。今度は、ソフト「縮小専用」で 320 × 320 にして再実行しました。

ワンちゃんがたくさん

今度は、実行時に –output オプションを付けて、結果をファイル出力してみます。まずは、この写真から実行してみます。

pi@raspberrypi:~/AIY-projects-python/src/examples/vision $ ./object_detection.py --input /home/pi/inu_1.jpg --output /home/pi/inu_1_cp.jpg
pi@raspberrypi:~/AIY-projects-python/src/examples/vision $

実行後、出力結果が出されません。即ち、この写真からは、人間、犬、猫はいなかったと判断されたようです。

左がインプット、右がアウトプットの写真です。全く同じですね。

少女と犬

それでは、少女と犬の後ろ姿の写真を使用してデモしてみましょう。

pi@raspberrypi:~/AIY-projects-python/src/examples/vision $ ./object_detection.py --input /home/pi/inu_hito.jpg --output /home/pi/inu_hito_cp.jpg
Object #0: kind=PERSON(1), score=0.948442, bbox=(61, 197, 152, 335)
pi@raspberrypi:~/AIY-projects-python/src/examples/vision $

kindは検出されたオブジェクトのタイプで、スコアはモデルが与えた結果に関する信頼度です。 bboxは、そのオブジェクトがイメージ内にある場所です。

これを見ると、人間がひとりいて、スコアが 94.8% ですので、ほぼ間違いないですと言ってますね。しかし、犬を認識できていません。

出力の写真を見ると、少女が資格で囲われており、これを認識しましたということでしょう!しかし、犬の後ろ姿を「犬」と認識できなかったようです。

3人の人間と犬1匹

今度は、キャンプ場で安らぐ人3名と、くつろいだ犬1匹でやってみます。

pi@raspberrypi:~/AIY-projects-python/src/examples/vision $ ./object_detection.py --input /home/pi/inu_hito3.jpg --output /home/pi/inu_hito3_cp.jpg
 Object #0: kind=PERSON(1), score=0.878627, bbox=(340, 183, 100, 185)
 Object #1: kind=PERSON(1), score=0.784649, bbox=(140, 202, 147, 178)

オブジェクトを2つ見つけて、スコアは87.8%と78.5%で人間と判断しています。人間一人と犬が見落とされました。アウトプットの写真を見ると、寝そべった犬と座った少女が判定できていません。

たくさんの猫ちゃんたち

犬の写真が尽きたので、今度は猫の写真にトライしてみます。

先程の犬と同様、たくさんの猫たちがいますが、犬の時とは違って、皆寝転がっています。

pi@raspberrypi:~/AIY-projects-python/src/examples/vision $ ./object_detection.py --input /home/pi/neko.jpg --output /home/pi/neko_cp.jpg
pi@raspberrypi:~/AIY-projects-python/src/examples/vision $

犬の時と同様、object_detection.py は、猫を判定できません。ですので、アウトプット写真は、インプットと同じなので割愛させていただきます。

猫と人

それでは、猫を抱く女性を題材にして実行してみます。

pi@raspberrypi:~/AIY-projects-python/src/examples/vision $ ./object_detection.py --input /home/pi/neko_hito.jpg --output /home/pi/neko_hito_cp.jpg
 Object #0: kind=PERSON(1), score=0.928149, bbox=(28, 166, 287, 367)

またしても、抱かれた猫ちゃんを判定できません。抱いている女性に対しては、92.8% という高い確率でヒトと判断しました。アウトプットを見ると、女性を確認した枠がついています。

猫2匹

手持ち最後の写真として、猫2匹をどう判定するかやってみます。

pi@raspberrypi:~/AIY-projects-python/src/examples/vision $ ./object_detection.py --input /home/pi/neko2.jpg --output /home/pi/neko2_cp.jpg
 Object #0: kind=CAT(2), score=0.901401, bbox=(110, 39, 404, 362)

すばらしい!猫2匹を判定しました。しかも、90.1% の確率です。アウトプットはこれです。

料理識別器デモ実行

料理識別器モデルは、画像から食品を識別することができるそうです。

写真の準備

こちらのデモにおいても、まず、画像を準備する必要があります。そこで、次の写真を用意しました。

ステーキ、おにぎり、オムライス、ナポリタン、トンカツと5つの料理の写真です。それぞれを入力にして結果がどう出るか見てみましょう。

コマンドは、以下になります。image.jpgを使用するファイルに置き換えます。

./dish_classification.py --input image.jpg

結果を確認する

ステーキ

上記のステーキの写真を入力にして実行しました。

pi@raspberrypi:~/AIY-projects-python/src/examples/vision $ ./dish_classification.py --input /home/pi/jpg_181230/steak.jpg
 Result 0: Yakiniku (prob=0.409912)
 Result 1: Salisbury steak (prob=0.106201)

処理が完了するのに、少々時間がかかります。
処理完了後、結果のリストと、識別された食品 のタイプと、そのモデルがその回答の信頼度(1つのうちのどれ)を示す確率スコアが表 示されます。

これを見ると、焼き肉が 41.0%、ソールズベリーステーキ? 10.6% と出ました。明らかに、ステーキだと思うんですが、うまく判定しませんね。

おにぎり

次は、おにぎりで試してみます。

pi@raspberrypi:~/AIY-projects-python/src/examples/vision $ ./dish_classification.py --input /home/pi/jpg_181230/onigiri.jpg
 Result 0: Onigiri (prob=0.998047)

20秒近く待たされましたが、すばらしい結果が出ました!99.8%の確率で、おにぎりと判定しました。見事です。

オムライス

次は、オムライスです。

pi@raspberrypi:~/AIY-projects-python/src/examples/vision $ ./dish_classification.py --input /home/pi/jpg_181230/omuraisu.jpg
 Result 0: Omurice (prob=0.915039)

すばらしい!こちらも 91.5%と、おにぎりの確率からは落ちましたが、オムライスと判定しました。

ナポリタン

今度は、スパゲティ・ナポリタンです。英語でも、ナポリタンというのでしょうか?

pi@raspberrypi:~/AIY-projects-python/src/examples/vision $ ./dish_classification.py --input /home/pi/jpg_181230/naporitan.jpg
 Result 0: Spaghetti (prob=0.535156)
 Result 1: Spaghetti aglio e olio (prob=0.139648) 

フムフム、ナポリタンと言わないまでも、スパゲティと判断しました。53.5% と 14.0% の二つの候補で、約70%です。まあ、よくやったというべきですかね。

トンカツ

さて、最後はトンカツです。日本の洋食の代表作です。見事、判定してくれるでしょうか?

projects-python/src/examples/vision $ ./dish_classification.py --input /home/pi/jpg_181230/tonkatu.jpg
 Result 0: Tonkatsu (prob=0.993164)

スゲェ!見事に、トンカツを判定しました。確率99.3% ですから、ほぼ断定したと言ってます。恐れ入りました!

スポンサーリンク

最後に

今回は、オブジェクト検出デモと料理識別器デモを実施しました。

オブジェクト検出デモでは、写真から人間や動物を認識できるか検証しました。なかなかの結果が出せましたね。

料理識別器デモでは、写真から何の料理かを認識させましたが、さすがの結果が出ました。

皆さんも確認してみてください。

以下の記事もご覧ください。

デモを継続/顔検出デモ(写真撮影と顔検出)実行 vision kit part4

スポンサーリンク

AI Vision

Posted by mizutan