
OpenCVを使った物体検出
こんにちは。
AI coordinatorの清水秀樹です。
映像からただ単に物体検出を試してみたいだけなら、すぐにでも試せる方法を紹介します。
SSD_kerasを使った物体検出は環境準備が大変であるのに対して、OpenCVインストール時に初めから準備されているカスケードファイルを使えば、すぐにでも物体検出が始められます。
手軽に始めてみたい方は、ぜひ当記事を参考にしてください。
テスト環境
macOS Sierra
Anaconda3-4.2.0-MacOSX-x86_64
opencv3 3.1.0
物体検出を試してみる
まず手始めに、胴体を検出できるカスケードファイル(haarcascades/haarcascade_fullbody.xml)を使用して試してみます。
成功するとこんな感じで動画が見れるはずです。

# -*- coding: UTF-8 -*-
#http://qiita.com/Algebra_nobu/items/a488fdf8c41277432ff3
import cv2
import os
#人の認識
f_cascade = cv2.CascadeClassifier('./haarcascades/haarcascade_fullbody.xml')
# カメラの起動
cap = cv2.VideoCapture('適当な動画のパスを指定してください')
while(True):
# 動画ストリームからフレームを取得
ret, frame = cap.read()
#物体認識(人)の実行
facerect = f_cascade.detectMultiScale(frame, scaleFactor=1.2, minNeighbors=2, minSize=(1, 1))
#検出した人を囲む矩形の作成
for rect in facerect:
cv2.rectangle(frame, tuple(rect[0:2]),tuple(rect[0:2] + rect[2:4]), (255, 255, 255), thickness=2)
text = 'p'
font = cv2.FONT_HERSHEY_PLAIN
cv2.putText(frame,text,(rect[0],rect[1]-10),font, 2, (255, 255, 255), 2, cv2.LINE_AA)
# 表示
cv2.imshow("Show FLAME Image", frame)
# qを押したら終了。
k = cv2.waitKey(1)
if k == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
四角枠の上に”p”を表示しています。
cv2.putText()メソッドを使用すると、画面上に表示できるようです。
この方法については「Raspberry Pi 深層学習でリアルタイム顔認識(Keras・Open CV)」の記事で紹介されていたものをそのまま活用しました。
続いて、人の顔(haarcascades/haarcascade_frontalface_alt.xml)と目(haarcascade_eye.xml)の物体検出を試してみました。

# -*- coding: UTF-8 -*-
#http://qiita.com/Algebra_nobu/items/a488fdf8c41277432ff3
import cv2
import os
#顔の認識
f_cascade = cv2.CascadeClassifier('./haarcascades/haarcascade_frontalface_alt.xml')
#目の認識
e_cascade = cv2.CascadeClassifier('./haarcascades/haarcascade_eye.xml')
# カメラの起動
cap = cv2.VideoCapture('適当な動画を指定してください')
while(True):
# 動画ストリームからフレームを取得
ret, frame = cap.read()
#物体認識(顔認識)の実行
facerect = f_cascade.detectMultiScale(frame, scaleFactor=1.2, minNeighbors=2, minSize=(10, 10))
#物体認識(目認識)の実行
eyerect = e_cascade.detectMultiScale(frame, scaleFactor=1.2, minNeighbors=2, minSize=(10, 10))
#検出した顔を囲む矩形の作成
for rect in facerect:
cv2.rectangle(frame, tuple(rect[0:2]),tuple(rect[0:2] + rect[2:4]), (255, 255, 255), thickness=2)
text = 'face'
font = cv2.FONT_HERSHEY_PLAIN
cv2.putText(frame,text,(rect[0],rect[1]-10),font, 2, (255, 255, 255), 2, cv2.LINE_AA)
#検出した目を囲む矩形の作成
for rect in eyerect:
cv2.rectangle(frame, tuple(rect[0:2]),tuple(rect[0:2] + rect[2:4]), (0, 255, 0), thickness=2)
text = 'eye'
font = cv2.FONT_HERSHEY_PLAIN
cv2.putText(frame,text,(rect[0],rect[1]-10),font, 2, (0, 255, 0), 2, cv2.LINE_AA)
# 表示
cv2.imshow("Show FLAME Image", frame)
# qを押したら終了。
k = cv2.waitKey(1)
if k == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
顔はそれなりに検出できるようですが、目はイマイチな感じですね。
精度を上げたければ、自分でカスケードファイルを作成するしかなそうです。
anacondaインストール後にOpenCVをインストールすれば、直ぐにでも映像からの物体検出ができますので、ぜひチャレンジしてみてください。
それではまた。
コメントはまだありません。