こんにちは。
今回は、開発途中のブログ内容となります。2カ月ほど前にPython、OpenCVを使った車の物体検出を開発試行してました。現在、諸事情のため保留中ではありますが、せっかくなので経過を報告したいとおもいます。
目次
その前にラオスの事を少しだけ紹介します。ラオスの認知度が低いというか、どこにあるのか知らない人が多いので、実は私も行く前までにどこにあるのか知らなかったのですが。。。
ラオスは東南アジアに位置しASEAN唯一の内陸国です。北は中国、ミャンマー、東はベトナム、西はタイ、南はカンボジアに囲まれています。ASEAN唯一の内陸国で海はありません。タイとの国境沿いにメコン川が流れており、生活の一部となっており、ラオス人にとても親しまれています。主な輸出産業は電力で輸出額の30%も占めます。メコン川を利用した水力発電によって、隣国タイなどに売電をしています。
そんなラオスも経済成長著しく日本の若者と同じくスマホをもち日本と変わらない光景を目にします。もちろん通話やゲームもしますが、PayPayのような電子決済サービスOnePayというものがあり路上にある屋台とかでも使えます。Uber Eatsのような宅配サービスFood PandaやUberのような配車サービスLocaなど、日本と同じか規制がない場合はビジネス展開されています。個人的には配車サービスよりはトゥクトゥクという乗り物の運転手に行き先や値段を交渉して、ぼったくられていない金額で行く方が楽しいです
では、本題へ戻ります。
今回挑戦したのは、車の物体検出のためにOpenCVを使ったカスケード分類器というものを試みました。巷によくある顔認識を車におき換えたものと思ってだければとおもいます。
おおまかな流れとして機械学習させるための画像集め→機械学習→分類器を作成するという工程です。精度を上げるためどのくらいの写真を読ませるか肝になる感じです。出来た分類器を確認しながら繰り返していきます。
PythonとOpenCVのインストール手順は省きますが、使ったPythonバージョンは3.8.3になります。
1.処理の流れ
- 5分おきにオフィス前の道路(車)の写真をとる。(Python)
- 画像の中から取得したい物体画像と不要な画像を振り分ける。(目視)
- 取得したい物体画像をX,Y座標をテキストにする(NeoTrainingAssistant)
- OpenCVを使って分類器を作成する。
- 実際に判断させて、問題があれば1から始めて写真を追加する。
2.画像取得(Python)
Pythonを使って定期的に画像を取得します。
import cv2
import os
import datetime
def save_camera(device_num, dir_path, basename, cycle, ext='jpg', delay=1, window_name='frame'):
cap = cv2.VideoCapture(device_num)
if not cap.isOpened():
return
os.makedirs(dir_path, exist_ok=True)
base_path = os.path.join(dir_path, basename)
n = 0
while True:
ret, frame = cap.read()
cv2.imshow(window_name, frame)
if cv2.waitKey(delay) & 0xFF == ord('q'):
break
if n == cycle:
n = 0
cv2.imwrite('{}_{}.{}'.format(base_path, datetime.datetime.now().strftime('%Y%m%d%H%M%S'), ext), frame)
n += 1
cv2.destroyWindow(window_name)
save_camera (0, 'data/temp', 'camera_capture_cycle', 250)
<要点説明>
・if cv2.waitKey(delay) & 0xFF == ord('q'):はqキーを押すと処理中断
・ファイル名は、年月日時分秒
・save_camera (0, 'data/temp', 'camera_capture_cycle', 250)
このファイルと同じ場所にdataフォルダを作りその配下のtempフォルダに写真が保存されます
250はだいたいカメラフレームのタイミングのようなので、秒ではないようです。
各自のPCについているカメラで調整となります。
画像がこのような形で、10秒程度ごとに保存されます。
次回は取得した画像を振り分けと実際の分類器処理までお伝えできればと思います。