代表通信~ラボメンの人の良さ、OpenCV
こんばんは。代表の草場です。
ラボメンの村口さん、山本さん、越さんと進めているYoutube企画に、他のラボメンの方々に協力を仰いだところ、大変協力的でした。いいコミュニティーだ。協力ができること、連携ができること、実行ができること、当たり前ではないので大事にしたいです。コミュニテイー立ち上げの時に宮澤さんとも話した「主体的で自立した個人が集まる場所にしたい」という想いが形になっているな、と実感します。日々やることが多いにも関わらず、「これ面白そう」という企画にすぐに乗ってくれる皆様、ありがとうございます。形にしよう。
さて、Reactからよそ見して、そういえばOpenCVとか真面目に触ってなかったなーということで、OpenCVで遊んでみました。Clever ProgrammerさんとTutorial動画があるので、それを見ながら歩行者と車を認識するAI(?)を作成。動画自体はジョークなども多数含んでいるので、2倍速で観れば30分くらいで実装できます。使うのは、「Haar cascade」です。これは機械学習に基づいたアプローチで、多数の正負画像からカスケード関数を学習させ、それが他の画像に含まれる物体を検出するために使用されます。
例えば顔認識の場合、通常は分類器を訓練するために、正の画像(顔の画像)と負の画像(顔のない画像)を大量に用意し、そこから特徴量を抽出すします。これを実行するために、下の画像に示すようなHaar特徴を使用します。それぞれの特徴は、黒い矩形の下の画素の合計から白い矩形の下の画素の合計を差し引いた値です(以下の画像はOpenCV公式より引用)。
この訓練にとても時間がかかるのですが、車、歩行者は、すでに訓練済みのモデルを公開してくれている人がいます(もちろん他のも)。そのため、基本は以下でOK。用意するのは解析したい動画のみ。
import cv2
video = cv2.VideoCapture(‘動画’) #mp4形式
# 事前訓練された分類器
car_tracker_file = “車の認識を事前訓練したxmlファイル”
pedestrian_tracker_file = “歩行者の認識を事前訓練したxmlファイル”
#事前訓練された分類器の読み込み
car_tracker = cv2.CascadeClassifier(car_tracker_file)
pedestrian_tracker = cv2.CascadeClassifier(pedestrian_tracker_file)
while True:
#動画の現在のフレームの読み込み
(read_suscessful, frame) = video.read();
#うまく読み込みできたら、
if read_suscessful:
#グレースケールに変換する
grayscaled_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
else:
break
#変換したものを、分類器に入れる
cars = car_tracker.detectMultiScale(grayscaled_frame)
pedestrians = pedestrian_tracker.detectMultiScale(grayscaled_frame)
# 車、歩行者、と認識したものを四角い箱でくくる
for (x, y, w, h) in cars:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 0, 255), 2)
for (x, y, w, h) in pedestrians:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 255), 2)
#実際に表示させる
cv2.imshow(‘Car_Pedestrain_Detector’, frame)
#勝手に閉じないように
key = cv2.waitKey(1)
#キーボードのqを押すと停止
if key==81 or key==113:
break
video.release()
一部切り出したのが以下です。Haar特徴として、上が白、下が黒のEdge Feature使っているので、横断歩道を一部車として認識していますね。
明日もOpenCV。
EVENTS