車両測距用のYOLOv5物体検出技術。高速で正確なターゲット検出アルゴリズムである YOLOv5 については、誰もが既に知っていると思います。次に、YOLOv5 による車間距離推定の実現方法について説明します。このプラクティスは、次のステップに分けられます。
- 必要なライブラリとツールをインストールする
- データ準備
- モデルトレーニング
- 距離推定
- 結果を視覚化する
- 最適化
1. 必要なライブラリとツールをインストールする
まず、YOLOv5 の依存ライブラリがインストールされていることを確認する必要があります。ここでは開発言語として Python を使用し、PyTorch、torchvision、OpenCV などのライブラリをインストールする必要があります。次のコマンドでインストールできます。
pip install torch torchvision opencv-python
次に、YOLOv5 の公式 GitHub リポジトリを複製し、プロジェクト ディレクトリに入る必要があります。
git clone https://github.com/ultralytics/yolov5.git
cd yolov5
2. データ準備
この演習では、車両の画像とそれに対応するラベルを含むデータセットを使用します。YOLOv5 をトレーニングするには、データセットを YOLOv5 トレーニングに適した形式に変換する必要があります。具体的には、各写真のラベル情報をYOLOv5で必要なtxtファイルに変換する必要があります。
データセットは、次の構造に従って編成する必要があります。
dataset/
├── images/
│ ├── train/
│ └── val/
└── labels/
├── train/
└── val/
適切なデータセットの準備ができていることを確認し、次のステップを開始してください。
3. モデルトレーニング
まず、YOLOv5 のトレーニング パラメータを設定する必要があります。プロジェクト ディレクトリでファイルを見つけyolov5s.yaml
、必要に応じて対応するパラメータを変更します。たとえば、カテゴリの数、トレーニング エポックの数などを調整します。
次に、YOLOv5 モデルのトレーニングを開始します。ターミナルで次のコマンドを実行します。
python train.py --img 640 --batch 16 --epochs 100 --data dataset.yaml --cfg yolov5s.yaml --weights yolov5s.pt --name yolov5s_vehicle
トレーニングが完了すると、トレーニングされたモデルの重みがruns/train/yolov5s_vehicle/weights/best.pt
パスの下に保存されます。
4.距離推定
次の式を使用して距離を推定します
距離 = (既知のオブジェクトの実際の幅 × 焦点距離) / 画像内のオブジェクトのピクセル幅
実際のアプリケーションでは、既知の距離のオブジェクトを介してカメラの焦点距離を取得する必要があります。カメラから他の車両までの距離を計算するために使用できるように、焦点距離は固定されています。
まず、トレーニング済みの YOLOv5 モデルをロードする必要があります。
import torch
from pathlib import Path
model = torch.hub.load('ultralytics/yolov5', 'custom', path=Path('runs/train/yolov5s_vehicle/weights/best.pt'))
model.conf = 0.25 # 置信度阈值
次に、距離を計算する関数を定義します。
import cv2
def estimate_distance(image_path, focal_length, known_width):
image = cv2.imread(image_path)
results = model(image) # YOLOv5检测
for *box, conf, cls in results.xyxy[0]:
x1, y1, x2, y2 = box
width = x2 - x1
distance = (known_width * focal_length) / width
print(f"距离估计:{distance:.2f}米")
focal_length
と の値はknown_width
事前に取得する必要があることに注意してください。オブジェクトの実際の幅と画像内のオブジェクトのピクセル幅がわかっている場合は、カメラからオブジェクトまでの実際の距離を測定することで、カメラの焦点距離を計算できます。
5. 結果を視覚化する
OpenCV を使用して結果を視覚化できます。これには、estimate_distance
関数を変更する必要があります。
def estimate_distance_viz(image_path, focal_length, known_width):
image = cv2.imread(image_path)
results = model(image) # YOLOv5检测
for *box, conf, cls in results.xyxy[0]:
x1, y1, x2, y2 = box
width = x2 - x1
distance = (known_width * focal_length) / width
cv2.rectangle(image, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2)
cv2.putText(image, f"{distance:.2f}米", (int(x1), int(y1) - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
cv2.imshow("Distance Estimation", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
これで、estimate_distance_viz
関数を使用して車両距離を計算し、結果を視覚化できます。
image_path = 'test.jpg'
focal_length = 700 # 示例值,需要根据实际情况进行调整
known_width = 1.8 # 示例值,车辆的实际宽度,根据实际情况进行调整
visualize_distance(image_path, focal_length, known_width)
最適化
実際のアプリケーションでは、アルゴリズムを最適化してパフォーマンスと精度を向上させることができます。以下にいくつかの提案を示します。
-
カメラのキャリブレーション: 現在の実装では、焦点距離をパラメーターとして直接使用します。より正確な結果を得るために、カメラ キャリブレーションを使用して、歪み係数などのより多くの内部カメラ パラメータを取得できます。これにより、距離推定の精度が向上します。カメラのキャリブレーションは、 OpenCV の関数を使用して
cv2.calibrateCamera()
実現できます。 -
マルチフレーム融合: 測距の安定性を向上させるために、マルチフレーム融合技術を使用できます。連続する複数フレームの画像の検出結果を収集することにより、車両距離の平均値または加重平均値が計算されます。これにより、エラーが減少し、安定性が向上します。
-
適応しきい値調整: さまざまなシーンや照明条件では、検出結果が影響を受ける場合があります。画像の明るさ、コントラスト、およびその他の特性に応じて信頼しきい値を適応的に調整して、検出の精度を向上させることができます。
-
結果の平滑化: 距離推定では、ノイズまたは急激な変化が発生する場合があります。フィルタリング アルゴリズム (カルマン フィルターや移動平均フィルターなど) を適用して結果を平滑化し、推定の安定性を向上させることができます。
visualize_distance
これらの推奨事項を実装するには、それに応じて関数を変更する必要があります。マルチフレーム フュージョン技術をオドメトリに適用する方法を示す変更例を次に示します。
import cv2
import numpy as np
def visualize_distance_multiframe(image_paths, focal_length, known_width, num_frames=5):
distances = []
for image_path in image_paths:
image = cv2.imread(image_path)
results = model(image)
for *box, conf, cls in results.xyxy[0]:
x1, y1, x2, y2 = box
width = x2 - x1
distance = (known_width * focal_length) / width
distances.append(distance)
if len(distances) > num_frames:
distances.pop(0)
avg_distance = np.mean(distances)
cv2.rectangle(image, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2)
cv2.putText(image, f"{avg_distance:.2f}米", (int(x1), int(y1) - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
cv2.imshow("Distance Estimation", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
これで、visualize_distance_multiframe
関数を呼び出して一連の連続した画像を提供し、車両の距離を計算して結果を視覚化できるようになりました。これにより、距離推定がより安定します。
image_paths = ['test1.jpg', 'test2.jpg', 'test3.jpg', 'test4.jpg', 'test5.jpg']
focal_length = 700 # 示例值,需要根据实际情况进行调整
known_width = 1.8 # 示例值,车辆的实际宽度,根据实际情况进行调整
visualize_distance_multiframe(image_paths, focal_length, known_width)
マルチフレーム フュージョン テクノロジーの実装後、アルゴリズムはライティングの変化、オクルージョン、その他の問題をより適切に処理できるようになります。同時に、この方法は、距離推定に対する単一フレーム ノイズの影響を軽減することもできます。
実際のアプリケーションでは、特定のシナリオや要件に応じて、アルゴリズムをさまざまな程度に最適化する必要がある場合があることに注意してください。たとえば、リアルタイムのビデオ ストリームを扱う場合は、連続するフレーム間にオプティカル フローを適用して、検出された車両を追跡し、オドメトリの安定性をさらに向上させることを検討してください。また、車種ごとに異なる既知幅を設定し、推定精度を向上させることも考えられる。
このようにして、車両の測距に YOLOv5 を使用する練習が完了しました。このブログがお役に立てば幸いです!ご質問やご提案がありましたら、お気軽にコメント欄にメッセージを残してください。またね!