Pepperのカメラからリアルタイムに物体検出してみる
こんにちは。
AI coordinatorの清水秀樹です。
以前からチャレンジしてみたかったPepperに搭載されているカメラ映像からの物体検出にチャレンジしてみたので、その内容の紹介になります。
物体を検出できるPepperができれば、その情報から次のアクションを起こすことが可能になるため、Pepperの使用用途が飛躍的に上がるのではないかと考えています。
さらに、リアルタイム映像をPCに映し出すことができればPepperの遠隔操作も可能になるので、さらに使用用途を広げることができるようになります。
Pepperからの映像取得に興味がある方はぜひチャレンジしてみてください。
開発環境
MacBook Pro(13-inch,2016)
プロセッサ 2.9 GHz intel Core i5
ubuntu 16.4 LTS
python 2.7.12
OpenCV 3.2.0
pynaoqi-python2.7-2.5.5.5-linux64
Pepper実機
今回はubuntuで開発しています。
これは単純にOpenCVがインストールし易かったからです。
macでanacondaなしにOpenCVをインストールすると、なぜかうまくインストールできなかったためです。
anaconda環境ですとPython SDK(pynaoqi-python2.7-2.5.5.5-linux64)が使えませんしね。
Pepperのカメラを使用しますので、バーチャルペッパーでは確認できません。
Pepper実機での確認になりますので、お持ちでない方はアトリエ秋葉原で試してみてください。
参考にさせて頂いたサイト
GitHubのソースコードを参考にさせて頂きました。
こちらのソースコードはPepperのカメラ映像をPCに出力するソースコードになっています。
物体検出するソースコード
今回はOpenCVのカスケードファイルを使って人の顔を検出してみました。
OpenCVのカスケードファイルを使った物体検出方法については、以下の記事を参考にしてください。
以下ソースコードです。
PepperのIPアドレスとカスケードファイルのパス指定を間違えないようにして頂ければ、以下のソースコードそのままで動くと思います。
# vim: set fileencoding=utf-8 : import sys import numpy as np import cv2 from naoqi import ALProxy # get NAOqi module proxy videoDevice = ALProxy('ALVideoDevice', "192.168.100.8", 9559) videoDevice.unsubscribe('test') # subscribe top camera AL_kTopCamera = 0 AL_kQVGA = 1 # {0 = kQQVGA, 1 = kQVGA, 2 = kVGA} AL_kBGRColorSpace = 13 # {0 = kYuv, 9 = kYUV422, 10 = kYUV, 11 = kRGB, 12 = kHSY, 13 = kBGR} fps = 10 # {5, 10, 15, 30} nameID = 'test' captureDevice = videoDevice.subscribeCamera( nameID, AL_kTopCamera, AL_kQVGA, AL_kBGRColorSpace, fps) # create image width = 320 height = 240 image = np.zeros((height, width, 3), np.uint8) while True: # get image result = videoDevice.getImageRemote(captureDevice); image = np.zeros((height, width, 3), np.uint8) if result == None: print 'cannot capture.' elif result[6] == None: print 'no image data string.' else: # translate value to mat values = map(ord, list(result[6])) i = 0 for y in range(0, height): for x in range(0, width): image.itemset((y, x, 0), values[i + 0]) image.itemset((y, x, 1), values[i + 1]) image.itemset((y, x, 2), values[i + 2]) i += 3 cascade = cv2.CascadeClassifier("./haarcascades/haarcascade_frontalface_alt.xml") #cascade = cv2.CascadeClassifier("./haarcascades/haarcascade_fullbody.xml") color = (255, 255, 0) #物体認識(顔認識)の実行 facerect = cascade.detectMultiScale(image, scaleFactor=1.2, minNeighbors=2, minSize=(10, 10)) for rect in facerect: #検出した顔を囲む矩形の作成 cv2.rectangle(image, tuple(rect[0:2]),tuple(rect[0:2] + rect[2:4]), color, thickness=2) # show image cv2.imshow("pepper-top-camera-320x240", image) k = cv2.waitKey(10); if k == ord('q'): break; videoDevice.unsubscribe(nameID)
成功すれば、以下の画像のようにPeperのカメラで顔を識別できるようになります。
注意点
何度か接続し直していると、カメラ映像を取得できなくなります。
おそらく、unsubscribeメソッドを実行せずにプログラムを終了させることで発生するような気がするのですが、videoDevice.unsubscribe(‘test’)メソッドでビデオモジュールの登録を解除してもエラーが出続けてしまうことがあります。
その場合は、Pepper実機を再起動してください。(これがまた時間がかかる・・・)
今後の目標
今回、PepperでOpenCVを使ったリアルタイム映像からの物体検出ができるようになったので、今後はDeepLearning(ディープラーニング)で作成した学習モデルで特定の物体を検出できるようにチャレンジしていきたいと思います。
それができるようになれば、例えば人探しをするPepperを作成することだって可能になります。
その他のPepperアプリ記事はこちらから
それではまた
この記事へのコメントはありません。