Pepperのカメラ映像からリアルタイムで物体検出する方法

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のカスケードファイルを使った物体検出方法については、以下の記事を参考にしてください。

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アプリ記事はこちらから

 

それではまた

あなたにオススメの記事

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

PAGE TOP