中国製EVの高精度車種識別を実現するYOLOv8ベースのマルチタスク学習フレームワーク

近年、中国国内で急速に普及している新エネルギー車は、従来の車両認識システムに大きな課題を突きつけている。既存の公開データセットは欧米や日本の内燃機関車が中心であり、中国メーカーの電気自動車をカバーする割合は15%未満にとどまる。さらに、単なるセダン・SUVといった大分類を超え、ブランド名や車種レベルでの細粒度認識が交通流分析やスマートパーキングにおいて求められるようになった。監視カメラ映像では、低照度、オクルージョン、モーションブラーといった実環境ノイズが避けられず、ラボ環境での高精度モデルをそのまま適用することは難しい。

本稿では、YOLOv8をベースにした中国製新エネルギー車の細粒度識別フレームワークを解説する。車両検出と同時にブランド・車種を分類するマルチタスクアーキテクチャを採用し、限られた計算リソースでも動作するよう最適化を施した。

アーキテクチャの全体像

YOLOv8のバックボーンとネックを共有し、その上に検出ヘッドと2つの分類ヘッドを並列に配置する。ブランド分類は22クラス(中国国内の主要新エネルギー車メーカーを含む)、車型分類はセダン、SUV、MPV、スポーツカー、ピックアップトラック、特殊車両の6クラスとした。以下にモデル構造の概略を示す。

class MultiTaskVehicleDetector(nn.Module):
    def __init__(self, num_brands=22, num_types=6):
        super().__init__()
        self.backbone = YOLOv8Backbone(weights='pretrained')
        self.neck = BiFPNNeck()  # マルチスケール特徴融合
        self.detect = YOLODetectHead()
        self.brand_cls = nn.Sequential(
            nn.AdaptiveAvgPool2d(1),
            nn.Flatten(),
            nn.Linear(256, num_brands)
        )
        self.type_cls = nn.Sequential(
            nn.AdaptiveAvgPool2d(1),
            nn.Flatten(),
            nn.Linear(256, num_types)
        )

    def forward(self, x):
        features = self.backbone(x)
        fused = self.neck(features)
        det = self.detect(fused)
        brand = self.brand_cls(fused[-1])
        vtype = self.type_cls(fused[-1])
        return det, brand, vtype

この設計では、Neck部にBiFPNを導入し、P3からP7までの異なるスケールの特徴マップを重み付きで融合している。特に小型のエンブレムやフロントグリルのような細部を捉えるために、3×3の深度分離畳み込みによる分岐を追加した。

データセットの構築とアノテーション

学習データは3つの経路から収集した。自動車情報サイトの公式画像(高画質だが背景が単調)、20都市の幹線道路に設置された監視カメラの映像(天候・時間帯のバリエーションを含む)、そしてクラウドソーシングで集めたオーナー撮影の日常写真である。総サンプル数は約28.7万枚で、ブランド別ではBYD(18.7%)、テスラ(15.2%)、理想到(12.4%)などが上位を占める。

アノテーションは多段階で行った。まず車両の位置をYOLO形式のバウンディングボックスで与え、次にブランド(サブブランドまで)と車型を中国の国家標準GB/T 3730.1-2001に基づいて付与し、さらにヘッドライトの点灯状態や窓の開閉といった属性情報を追加した。ツールはLabelImgを拡張し、ブランド・車型のクイック選択パネルを実装することで作業効率を約40%改善した。

学習戦略

訓練は3段階に分けて実施した。第1段階では入力サイズ640×640、AdamWオプティマイザ(lr=1e-3)、MosaicとMixUpによるデータ拡張を適用し、100エポックのベース学習を行った。第2段階では解像度を896×896に上げ、SGD(momentum=0.9)に切り替え、GridMaskによるオクルージョン拡張を重視して50エポックのファインチューニングを施した。最終段階ではFGSMを用いた adversarial training を20エポック行い、TRADES損失を導入してロバスト性を高めた。

損失関数は以下のように重み付けした。

total_loss = 0.4 * detection_loss + 0.35 * brand_ce + 0.25 * type_ce

学習率は5エポックのウォームアップ後、コサイン減衰を適用した。バッチサイズはGPUメモリに応じて16から64の間で動的に調整した。また、類似車種(例:理想L7とL8)に対しては、動的ラベルスムージングを導入し、ベースの平滑化係数に類似度スコアを乗じて混同を抑制した。

推論の高速化と軽量化

エッジデバイスへの展開を想定し、知識蒸留と量子化を組み合わせた。教師モデルにYOLOv8x、生徒モデルにYOLOv8sを用い、温度T=3で蒸留した後、TensorRTを用いてINT8へポストトレーニング量子化を行った。NVIDIA Jetson Xavier NX上での評価では、FP32版の推論時間45ms、モデルサイズ89MBに対して、INT8版は18ms、23MBまで低減され、mAP@0.5は86.2%から85.7%へとわずかな低下に留まった。

実運用では、同一車両の連続フレームに対する認識結果をカルマンフィルタで追跡・キャッシュし、低解像度の高速検出(320×320)と高解像度の詳細分類(896×896)を組み合わせた2段階推論を採用した。また、信頼度閾値を0.7/0.5/0.3の3段階に設定し、低信頼度のサンプルは人間による確認フローへ回す仕組みを組み込んだ。

実応用と課題

ある大型商業施設のスマートパーキングでは、新エネルギー車の比率が38%に達し、充電ポートの位置認識や特定ブランドの試乗車のVIP識別が求められた。そこで充電口の位置を追加属性として学習し、充電スタンド管理APIと連携させた。交通流分析では、ブランド別の時間帯別通行量(例:朝ラッシュ時のテスラ比率と夕方のBYD比率)や、SUVとセダンでの冠水路通過率の差(27%の差)といった実用的な指標を提供した。

頻出する誤認識としては、小鵬P7とBYDシールのようなフロントマスクの類似、俯瞰視点でのMPVとSUVの混同、ラッピングフィルムによる車体色変更が挙げられる。対策として、グリル領域へのアテンション機構、鳥瞰視点の合成データ追加、色不変性の正則化を導入した。学習時のクラス不均衡に対しては、希少ブランドのオーバーサンプリングとクラス別重み付けを行い、アノテーションノイズにはCo-teaching戦略を採用した。

今後の方向性として、夜間のハイビーム干渉下での認識精度向上、70%以上の重度オクルージョンへの対応、新発売車種へのゼロショット適応が残された課題である。現在、Vision TransformerとCNNのハイブリッド構造や、LiDAR点群との融合、CLIPベースのFew-Shot学習を検討している。

タグ: YOLOv8 物体検出 マルチタスク学習 新エネルギー車 モデル量子化

9月1日 17:17 投稿