YOLOを使ってオブジェクト検出と座標取得をしてみる
初めまして!
なるおと申します!
初めてのZenn記事です!
今回はYOLOというライブラリを使って、画像内のオブジェクト検出と座標取得をしてみたいと思います!
↓こんなの
YOLOって?
画像や映像ストリーム内のオブジェクト検出アルゴリズムです。
You Only Look Onceの頭文字をとっており、人間と同じく、一目見たら物体検出できるという意味らしいです。
YOLOには複数のバージョンがあり、2023/04/23現在で v8となっています。
本記事の前提
YOLO CLIもpipを使ってインストールするため、Pythonのインストールは必須ですね。
Pythonのインストールについては、他のサイトを参考にお願いします。
YOLO CLIの使用
YOLO CLIは、ノーコーディングでYOLOのタスクを簡単に実行できるので、YOLOでどんなことをできるのか試したり、訓練したりなどがおこなえます。
YOLO CLI環境の構築
まずは以下のコマンドを叩いてuntralyticsのモジュールをダウンロードします。
pip install ultralytics
ターミナルに次のコマンドを入力します。
yolo version
バージョン番号が表示されていれば、正しくインストールされていますよ!
YOLO CLIを使ってみましょう!
YOLO CLIを使用すると、コーディングを必要とせずに単一行コマンドを実行することで検出を実行できます。
例:
yolo task=detect mode=predict model=yolov8n.pt conf=0.25 source=0
※
source=0を使用すると、実行環境のウェブカメラのストリームを利用します。
ただし、macでは初回実行時にターミナルがカメラを使用を許可するかどうかのダイアログが表示されるため、実行に失敗してしまいます。
表示されたダイアログで、カメラの使用を許可して再実行する必要があることに注意が必要です!
上記のコマンドだけで、映像を解析し、コンソール上には次の様に認識されたオブジェクトが次々と表示されていきますね。
0: 384x640 1 person, 41.3ms
0: 384x640 1 person, 39.3ms
0: 384x640 1 person, 44.7ms
0: 384x640 1 person, 44.3ms
0: 384x640 1 person, 1 chair, 42.7ms
停止はコンソールでcontrol+Cで!
また、コマンドを実行したカレントディレクトリにrunsフォルダが出力されます。
runs/predict内に解析済みの動画ファイルが保存されます。
この動画ファイルには、バウンディングボックスとラベルが付与され、解析結果を確認できます。
Pythonで実行する
YOLOの準備
適当なフォルダを作成し、そのフォルダ内に移動してから以下の手順で準備します。
git clone https://github.com/ultralytics/ultralytics
requirements.txtに指定された必要な依存をインストールします。
cd ./ultralytics
pip install -r requirements.txt
コーディング
今回の目的はPC本体に内蔵しているウェブカメラで簡単に解析してみることです。
また、解析ついでに座標も取得しちゃいましょう。
detect.pyというファイル名でファイルを作成し、以下の内容を記述します。
import cv2
from ultralytics import YOLO
model = YOLO('yolov8n.pt')
video_path = 0 # 本体に付属のカメラを指定
cap = cv2.VideoCapture(video_path)
while cap.isOpened():
success, frame = cap.read()
if success:
# 推論を実行
results = model(frame)
# キャプチャした画像サイズを取得
imageWidth = results[0].orig_shape[0]
imageHeight = results[0].orig_shape[1]
# 後のオブジェクト名出力などのため
names = results[0].names
classes = results[0].boxes.cls
boxes = results[0].boxes
annotatedFrame = results[0].plot()
# 検出したオブジェクトのバウンディングボックス座標とオブジェクト名を取得し、ターミナルに出力
for box, cls in zip(boxes, classes):
name = names[int(cls)]
x1, y1, x2, y2 = [int(i) for i in box.xyxy[0]]
print(f"Object: {name} Coordinates: StartX={x1}, StartY={y1}, EndX={x2}, EndY={y2}")
# バウンディングBOXの座標情報を書き込む
cv2.putText(annotatedFrame, f"{x1} {y1} {x2} {y2}", (x1, y1 - 40), cv2.FONT_HERSHEY_PLAIN, 2.0, (0, 255, 0), 2, cv2.LINE_AA)
# プレビューウィンドウに画像出力
cv2.imshow("YOLOv8 Inference", annotatedFrame)
# アプリケーション終了
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
# キャプチャに失敗したら終了
break
# 終了処理
cap.release()
cv2.destroyAllWindows()
実行
次のコマンドを入力して実行します。
cd ../
python detect.py
カメラに写った人や物が即座に分析されているかと思います。
簡単なコードでいろんなことに使えそうですね!
皆様も良き画像解析ライフを!
それでは!
Discussion