はじめての電子工作超入門

第5回 ラズパイでAIカメラを自作しよう!顔や文字などを読み取って、自動でメールする

こんにちは、ヨシケンです!
前回までの記事では、風景や食べ物などを識別して、それをしゃべってくれるカメラになりました。
今回は、更にdocomo APIで識別できるものを増やして、顔や文字なども読み取れるようにします。
また、画像解析でよくある検出部分を赤枠で囲む処理をして、その写真を自動でメールなどに送る機能も付けます。
画像解析でよくある検出部分を赤枠で囲む処理をして、その写真を自動でメールなどに送る機能も付けます

今回の記事で必要な物一覧

Raspberry Pi 3 Model B

小型スピーカー

パイ・カメラ

LED付きタクト・スイッチ

小型バッテリー

今回の記事の流れ

1.物体検出APIで、写真の顔、お札を囲んでみる
2.文字認識APIを使って、文字を読み取る
3.撮った写真、メッセージをメールで自動送信
4.プッシュ回数に応じて、機能を変えるカメラにする
5.まとめ

 

1.物体検出APIを使って、写真の顔、お札を囲んでみる

既にカテゴリ認識として、食べ物、風景やファッションなどを検知できていると思いますが、それに追加して、顔やお札などを抜き出せる物体検出APIも付け加えます。
このAPIを使用できるようDocomo Developer Supportページから、機能を追加しておいて下さい。

物体検出API
この物体検出では、体の部位や日本の通貨を特定する事ができます。
また検出したものの画像中の位置も取れるので、どこに何が写っているかも写真中にマップする事もできます。
物体検出

 
これまでのプログラムに、物体APIのURLと、体を特定するbodyPart、お札のcurrencyというmodelを追加します。

“url”: “https://api.apigw.smt.docomo.ne.jp/imageRecognition/v1/objectDetection/detect/?APIKEY=”
“model”: “[‘currency’, ‘bodyPart’]”

 
また、この物体検出APIでは、検出した物の画像中の位置も補足できるので、その座標も取得します。

x = int(can[‘xMin’])
y = int(can[‘yMin’])
x2= int(can[‘xMax’])
y2= int(can[‘yMax’])

 
そしてcv2.rectangle()、cv2.putText()という関数を使って、検出物体の四角形の囲いと文字を写真に追加します。

cv2.rectangle(img, (x, y), (x2, y2), (0, 0, 255), thickness=2)

cv2.putText(img, message.encode(‘utf-8’), (10, 20), cv2.CV_AA, 0.6, (255, 0, 0), 1, cv2.CV_AA)

 
このプログラムによって、写真の中の顔を抽出した部分を枠で囲み、face(92.1%)のような検出率を入れる事ができるようになります。
写真の中の顔を抽出した部分を枠で囲み、検出率を入れる事ができる

全体のプログラムは一番最後にまとめて付けています。
引き続き、文字認識APIの方も見ていきます。

 

2.文字認識APIを使って、文字を読み取る

更に追加で、画像中に文字がある場合に、それを抜き出す文字認識APIを使っていきます。
文字認識

 
文字認識APIのURL、モデル名は以下のようなものです。

“url”: “https://api.apigw.smt.docomo.ne.jp/characterRecognition/v1/scene”
“model”: “[‘word’]”

文字認識に関しては、まず情景画像要求 getImage(fname, modelName, lang) を行い、そこで得られたidを次の結果取得 getWordList(img_id) に渡して、文字を取り出します。

 
先程と同様に、文字認識部分の位置もx, yで返してくれるので、それを取得します。

x = int(can[‘shape’][‘point’][0][‘@x’])
y = int(can[‘shape’][‘point’][0][‘@y’])
x2= int(can[‘shape’][‘point’][2][‘@x’])
y2= int(can[‘shape’][‘point’][2][‘@y’])
cv2.rectangle(img, (x, y), (x2, y2), (0, 0, 255), thickness=2)

そうすると、Device Plusの記事を読み取ったのですが、このように文字の部分を抜き出してくれます。
文字部分の認識
いくつか、不思議な文字を読み取ってしまっていますが、「電子工作」や「読み上げ」「おしゃべり」など正確に検出してくれています。
文字認識

 

3.撮った写真、メッセージをメールで自動送信

カメラで色々な解析写真を撮る事ができるようになりましたが、その画像をいちいちチェックするよりも、メールで自分のアドレスに送るようにしましょう。面白い写真が撮れたら、Twitterなどでシェアするのもいいかもしれません。
ラズパイにメール関連のライブラリを導入し、メッセージと画像をGmailで送れるような機能をつけていきます。この部分はプログラムを流す際パラメータにして、メールを送る、送らない、を指定できるようにしておきます。

 
まずラズパイに、シンプルなSMTPサーバーのsSMTPをインストールします。
設定は、ssmtp.confというファイルに自分のGmailアカウントなどを登録します。

sudo apt-get install ssmtp
sudo vi /etc/ssmtp/ssmtp.conf


root = xxx@gmail.com # 自分のGmailアカウント
mailhub = smtp.gmail.com:587 # Gmailのサーバー
AuthUser = xxx@gmail.com # 自分のGmailアカウント
AuthPass = pswd # Gmailパスワード
AuthLogin=YES # Gmailへのログイン許可
UseSTARTTLS = YES # メールの暗号化設定


ここでAuthPassには、Gmailそのもののパスワードでも可能ですが、このアプリ専用のパスワードを設定しておいた方が安心です。こちらのGoogleのページからアプリ用のパスワードの生成をし、それをAuthPassにセットできます。

アプリパスワード

次に、画像添付も含めたメールの送信に、Muttというメールクライアントを使います。これをラズパイにインストールし、sSMTPと共に使います。
以下コマンドでmuttをインストールします。その後ラズパイのホーム以下に.muttrcという設定ファイルを作り、そこにメールサーバーなどの情報を定義します。

sudo apt-get install mutt


sudo vi $HOME/.muttrc


set sendmail = “/usr/sbin/ssmtp” #先程のssmtpを指定
set realname = “Sender name” #送信者の名前
set from = xxx@gmail.com # 送信者メールアドレス


 
さあ、設定が終わったら、ラズパイからmuttコマンドでメールを送ってみましょう。
mutt -s “題名” “送信先メールアドレス” -c “CCメールアドレス” -a “添付ファイルの絶対パス” < “メール本文のテキストファイル” といった形でメールを送る事ができます。

mutt -s “Test subject” “abc@hotmail.com” -c “” -a “/home/pi/web/image/yyyymmdd/hhmmss_o.jpg” < "/home/pi/web/image/yyyymmdd/hhmmss_msg.txt"

 
テストで、これまで撮った写真を使って実行してみると、こんなメールが飛んできました。
送られてきたメール

カメラがメールを送ってくれるというのはちょっと面白いかもしれませんね。ちゃんと日本語にも対応してくれています。
それでは最後にこれらをまとめて、カメラから使えるようにします。

 

4.プッシュ回数に応じて、機能を変えるカメラにする

これまで追加した画像解析を、カメラのボタンを押した回数に応じて、切り替えるようにします。
シングル・プッシュなら1: カテゴリ認識(風景や料理など)、ダブル・プッシュなら2: 物体(人やお金)、そして三回連続押したら3: 文字認識を行うような形です。それぞれに対応したurl、モデル名を、jsonで定義しておきます。

また、前回使ったaplayでの発話機能をtalk(message) ファンクションにして、これから何の解析を行うのか、カメラ自身にしゃべってもらいます。

例えば、シャッターを二回連続で押すと、model_descが”物体検出”になるので、「物体検出をします!」としゃべってくれるはずです。

それでは、こちらが全体のサンプル・プログラムbutton_obj_speech_camera.pyになります。以前からの追加部分をそれぞれ、物体検出は黄色、文字認識は青、それ以外の部分は緑でハイライトしています。

 
それでは、通して流してみましょう。メールの宛先は–mail で自分のアドレスなどをセットしておきます。

python button_obj_speech_camera.py –mail abc@hotmail.com

Press 1 (category), 2 (body, ccy), 3 (word) times!

 
シャッターを一回だけ押すとカテゴリ解析、ダブル・プッシュで物体解析を行います。
また「(メールアドレス)にメールを送ります」と言って、プログラムを流すときに設定したアドレスに、メッセージと写真が届いたでしょうか?

 
メールを送ります

三回連続で押すと、文字解析をしてくれます。色々なものを撮ってみて下さいね。

文字解析をしてくれます

 

5.まとめ

今回はカメラに、物体検出API(顔、体、お札)と文字認識APIを追加しました。これで風景や料理などの他に、人の顔や看板の文字なども認識できるようになりました。

顔や文字を認識した部分を囲う事もできるようになったので、より画像認識の精度が見て取れると思います。
また、ラズパイにメールサーバー機能を付けて、メッセージと画像を添付して、Gmailを送信できるようにもしました。
カメラのシャッターを押した回数に応じて、写った文字や情景、人の存在などを、話したり、メールで送ったりしてくれます。かなり未来のカメラのようになって、面白く使えるのではないでしょうか?

では次回は、このカメラに耳も付けて、人の話を聞くことが出来るようにします。話しかけた内容に応じて、写真を撮る内容を変えてくれたら、もうAIカメラと呼んでもいいでしょう!

それでは、お楽しみに!

高専ロボコン2017解剖計画
ヨシケン(吉田 顕一)

普通の会社に勤めるサラリーマンですが、モノ作りが好きな週末メイカーで、電子書籍MESHBOOKを出したり、ブログを書いたりしています!

http://blog.ktrips.net