物体検出は、画像や動画の中に存在する物体を特定し、その種類と位置を識別する技術です。自動運転、ロボティクス、医療画像分析、セキュリティ監視など、幅広い分野で活用されています。深層学習の進化により、物体検出の精度と速度は飛躍的に向上し、リアルタイムでの高度な物体検出が実現可能になりました。ここでは、Pythonを用いて、最新のYOLOモデルを使った物体検出の実装方法を具体的に解説します。
物体検出の応用分野
物体検出技術は、具体的には以下のような多様な分野で活用されています。
- 自動運転: 車両、歩行者、交通標識などを正確に検出し、安全な自動運転を実現します。
- ロボティクス: ロボットが周囲の環境を認識し、物体を操作するための基盤技術として利用されます。
- 医療画像分析: X線、CT、MRI画像から、病変や異常を検出する精度を高め、診断を支援します。
- セキュリティ監視: 不審な人物や行動を検出し、異常事態の早期発見に貢献します。
- スマート農業: 作物の生育状況や病害虫の発生を検出し、効率的な農業管理を支援します。
- 小売: 来店客の行動分析、商品棚の欠品検知などに活用され、店舗運営の最適化に貢献します。
医療AIとディープラーニングシリーズ Pythonによる医用画像処理入門【電子書籍】[ 藤田広志 ]
YOLO (You Only Look Once) とは
YOLOは、物体検出のための代表的な深層学習アルゴリズムの一つです。その最大の特徴は、画像全体を一度だけネットワークに通すことで、高速かつ高精度な物体検出を実現している点です。
YOLOの特徴
- 高速性: 画像全体を一度に処理するため、他の物体検出アルゴリズムに比べて非常に高速です。
- 高精度: 高速でありながら、高い検出精度を維持しています。
- リアルタイム処理: 高速性により、リアルタイムでの物体検出が可能です。
- 汎用性: さまざまな物体クラスに対応でき、カスタマイズも容易です。
YOLOの進化
YOLOは、最初のバージョン(YOLOv1)が2016年に発表されて以来、継続的に改良が加えられ、性能が向上してきました。YOLOv2、YOLOv3、YOLOv4、YOLOv5、YOLOv6、YOLOv7、YOLOv8、YOLOXなど、多くのバージョンが存在します。各バージョンで、速度と精度のバランス、新しいアーキテクチャの導入、学習済みモデルの提供など、さまざまな改善が行われています。
PythonによるYOLO物体検出の実装
ここでは、ultralyticsライブラリを使用し、YOLOv8を用いた物体検出の実装手順を解説します。ultralyticsは、YOLOv5やYOLOv8などの最新モデルを簡単に利用できるPythonライブラリです。
1. ライブラリのインストール
まず、必要なライブラリをインストールします。
pip install ultralytics
2. 物体検出の実行
以下のPythonコードで、物体検出を実行します。以下は、画像内の物体が何であるかを識別し、その位置を四角い枠で囲んで表示するコードです。
from ultralytics import YOLO import cv2 # モデルのロード (YOLOv8nを使用) model = YOLO('yolov8n.pt') # 画像の読み込み image = cv2.imread('test.jpg') # 'test.jpg' は任意の画像ファイル名 # 物体検出の実行 results = model(image) # 結果の描画 for *xyxy, conf, cls in results.pred[0]: # bounding box, confidence, class if conf > 0.25: # 信頼度の閾値 x1, y1, x2, y2 = map(int, xyxy) label = f'{results.names[int(cls)]} {conf:.2f}' cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(image, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2) # 結果の表示 cv2.imshow('YOLOv8 Object Detection', image) cv2.waitKey(0) cv2.destroyAllWindows()
YOLO('yolov8n.pt'): YOLOv8の学習済みモデル(yolov8n.pt)をロードします。他のモデル (例:yolov8s.pt,yolov8m.pt) も利用可能です。model(image): 画像に対して物体検出を実行します。results.pred[0]: 検出結果(バウンディングボックス、信頼度、クラスID)にアクセスします。- 信頼度(
conf)が閾値(ここでは0.25)を超えるものだけ描画します。 -
results.names[int(cls)]: クラスIDをクラス名に変換 cv2.rectangle(): 検出された物体を矩形で囲みます。cv2.putText(): 物体クラス名と信頼度を画像に描画します。- 検出結果は
resultsオブジェクトに格納され、バウンディングボックスの座標、信頼度スコア、クラスIDなどが含まれます。
3. 学習済みモデルの利用
ultralyticsは、COCOデータセットで学習済みのモデルを提供しています。yolov8n.pt (nano), yolov8s.pt (small), yolov8m.pt (medium), yolov8l.pt (large), yolov8x.pt (extra large) など、速度と精度のトレードオフが異なる複数のモデルが用意されています。これらの学習済みモデルを使えば、自分で大量のデータを用意して学習させる手間を省くことができます。
学習済みモデルの利用例: ローンや監視カメラの映像分析
ドローンや監視カメラの映像分析を行う際に学習済みモデルを利用できます。要件に応じて選択。リアルタイム性が求められる場合はyolov8n.ptやyolov8s.pt、高精度な検出が必要な場合はyolov8m.pt, yolov8l.pt, yolov8x.ptなどを利用します。
実装例(動画ファイル)
from ultralytics import YOLO import cv2 # モデルのロード (要件に応じて選択) model = YOLO('yolov8m.pt') # 動画ファイルの読み込み cap = cv2.VideoCapture('video.mp4') while cap.isOpened(): success, frame = cap.read() if not success: break # 物体検出 results = model(frame) # 結果の描画と表示 annotated_frame = results[0].plot() cv2.imshow("YOLOv8 Inference", annotated_frame) if cv2.waitKey(1) & 0xFF == ord("q"): break cap.release() cv2.destroyAllWindows()
4. カスタムデータセットでの学習 (転移学習)
特定の物体を検出したい場合は、カスタムデータセットを用いてYOLOモデルをファインチューニング(転移学習)することができます。例えば、工場で特定の部品だけを検出したい場合や、医療画像から特定の種類の細胞だけを検出したい場合などに有効です。
実装例
from ultralytics import YOLO # モデルのロード (学習済みモデル) model = YOLO('yolov8n.pt') # 学習の実行 model.train(data='custom_dataset.yaml', epochs=100, imgsz=640) #yamlファイルに学習の設定を記述
custom_dataset.yamlの記述例
# COCO8 example, custom dataset for 8-class object detection # Ultralytics, https://ultralytics.com, 2023 updated # Train/val/test sets path: ../datasets/custom # dataset root dir train: images/train # train images val: images/val # val images test: # test images (optional) # Classes names: 0: dog 1: cat 2: bird 3: fish 4: horse 5: cow 6: sheep 7: elephant
5. その他の機能
ultralyticsライブラリは、物体検出に加えて、以下のような機能も提供しています。
- 物体追跡: 検出された物体を動画内で追跡します。
- 姿勢推定: 人間の関節点などを検出します。
- セグメンテーション: 物体領域をピクセルレベルで特定します。
まとめ
本記事では、Pythonとultralyticsライブラリを用いて、最新のYOLOモデルによる物体検出を実装する方法を解説しました。ultralyticsを使うことで、非常に簡単に高性能な物体検出モデルを利用できます。さらに、カスタムデータセットでの学習や、物体追跡などの応用機能も提供されており、幅広い用途に対応可能です。物体検出技術は、今後もさまざまな分野でその重要性を増していくと考えられます。
最後にPythonでの画像処理の学習に利用できるUdemy
のサイトを紹介します。ぜひ活用ください。
[PR]