目次
車両の属性認識は、コンピューター ビジョンの分野における重要なアプリケーション シナリオです。インテリジェント交通、セキュリティ監視などの分野では、車両の色とモデルの属性の認識は、車両の追跡やデータ分析などのタスクに役立ちます。この記事では、PaddleClas ライブラリの特性モデル PP-LCNet に基づいて車両の色とモデル属性の認識を実現する方法を紹介します。まず車両の検出と傍受に YOLOv5 モデルを使用し、次に車両の色とモデル属性の認識に PP-LCNet を使用します。
1. 環境の準備
まず、必要なライブラリと依存関係をインストールする必要があります。
pip install paddlepaddle paddleclas yolov5
2. データの準備
車両の色とモデルの属性認識モデルをトレーニングするには、さまざまな色とモデルの車両の画像のデータセットが必要です。この記事では、5 色 (赤、青、緑、白、黒) と 3 つのモデル (セダン、SUV、トラック) の車両の画像を含むサンプル データセットを使用します。データセットのディレクトリ構造は次のとおりです。
vehicle_dataset/
├── train/
│ ├── red_sedan/
│ ├── red_suv/
│ ├── red_truck/
│ ├── ...
├── val/
│ ├── red_sedan/
│ ├── red_suv/
│ ├── red_truck/
│ ├── ...
各サブディレクトリには、対応する色とモデルの車両の画像が含まれています。実際のアプリケーションでは、より大きなデータセットを使用して認識パフォーマンスを向上させることができます。
3. 車両検知
車両の属性認識に進む前に、まず画像内の車両を検出する必要があります。この記事では、車両検出に YOLOv5 モデルを使用します。まず、必要なライブラリとモジュールをインポートします。
import cv2
import numpy as np
from yolov5 import YOLOv5
yolov5 = YOLOv5("yolov5s.pt", device="cuda")
detect_vehicles
次に、入力画像内の車両を検出し、車両の境界ボックスのリストを返す関数を定義します。
def detect_vehicles(image, conf_thres=0.5, iou_thres=0.5):
results = yolov5.predict(image, conf_thres=conf_thres, iou_thres=iou_thres)
bboxes = []
for result in results.xyxy[0]:
bbox = result[:4].cpu().numpy().astype(np.int)
label = int(result[-1])
if label == 2: # "2" is the class index for "car" in the COCO dataset
bboxes.append(bbox)
return bboxes
4. 車両属性認識
次に、車両の色とモデル属性の認識に、PaddleClas ライブラリの注目モデル PP-LCNet を使用します。まず、必要なライブラリとモジュールをインポートします。
import paddle
from paddleclas import PaddleClas
# Initialize the PaddleClas model for vehicle attribute recognition
paddleclas = PaddleClas("pp-lcnet", num_classes=15, device="cuda")
上記のコードでは、PP-LCNet モデルを初期化し、カテゴリの数を 15 (5 色 * 3 モデル) に設定しました。recognize_vehicle_attributes
次に、入力車両画像の色とモデル属性を識別する関数を定義します。
def recognize_vehicle_attributes(vehicle_image):
input_tensor = paddle.to_tensor(vehicle_image, dtype="float32")
logits = paddleclas(input_tensor)
pred_class = paddle.argmax(logits, axis=1).numpy()[0]
color_classes =["red", "blue", "green", "white", "black"]
vehicle_classes = ["sedan", "suv", "truck"]
color_index = pred_class // len(vehicle_classes)
vehicle_index = pred_class % len(vehicle_classes)
return color_classes[color_index], vehicle_classes[vehicle_index]
5. 検出および識別プロセスを統合する
車両検出と属性認識を組み合わせられるようになりました。まず、車両を含むテスト イメージを読み取ります。
image = cv2.imread("test_image.jpg")
次に、detect_vehicles
関数を使用して画像内の車両を検出し、車両の境界ボックスのリストを取得します。
bboxes = detect_vehicles(image)
次に、境界ボックスのリストを走査し、車両の画像をキャプチャし、recognize_vehicle_attributes
関数を呼び出して車両の属性を識別します。
def crop_image(image, bbox):
x1, y1, x2, y2 = bbox
return image[y1:y2, x1:x2]
for bbox in bboxes:
vehicle_image = crop_image(image, bbox)
color, vehicle_type = recognize_vehicle_attributes(vehicle_image)
print(f"车辆颜色: {color}, 车型: {vehicle_type}")
最後に、検出された車両の境界ボックスと認識結果を元の画像上に描画し、結果を表示できます。
def draw_bbox(image, bbox, color, vehicle_type):
x1, y1, x2, y2 = bbox
cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.putText(image, f"{color} {vehicle_type}", (x1, y1 - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
for bbox, (color, vehicle_type) in zip(bboxes, recognized_vehicles):
draw_bbox(image, bbox, color, vehicle_type)
cv2.imshow("结果", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
6 結論
この記事では、PaddleClas が提供する特性モデル PP-LCNet を使用して、車両の色とモデル属性の認識を実現する方法を詳しく紹介します。プロセス全体には、車両検出、車両傍受、車両属性認識の 3 つのステップが含まれます。まず、車両検出に YOLOv5 モデルを使用し、次に元の画像から車両領域をキャプチャし、最後に PP-LCNet を使用して車両の色とモデルの属性を識別します。
この論文の方法は、YOLOv5 モデル (COCO) および PP-LCNet モデルの事前トレーニング データセットのパフォーマンスによって制限される可能性があることに注意してください。より良い検出結果を得るには、特定のシナリオや地域向けにトレーニングされたモデルを使用するか、他のより高度な車両検出および属性認識アルゴリズムを使用してみてください。さらに、実際のアプリケーションでは、要件に応じてパラメータを調整して、検出パフォーマンスを向上させることができます。