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をインストールすれば、直ぐにでも映像からの物体検出ができますので、ぜひチャレンジしてみてください。
それではまた。
トップページへ
この記事へのコメントはありません。