Pyhon は、YOLOV に基づいて車両ブランドおよびモデル検出プロジェクトのソース コード + モデル + プロジェクト ドキュメントを実装します。

  1. プロジェクトの背景:

車両の検出とモデルの識別は、資産管理や輸送などの管理シナリオで広く使用されています。駐車場出入り口や交差点、高速道路の検問所などで収集した画像データから車両の台数や車種を特定し、車両の車種や数量情報などを効率よく収集できます。収集されたデータは、さまざまなシナリオでのさまざまなビジネス開発に役立ちます。ショッピングモールの駐車スペース計画、道路状況計画、事故車両を追跡する公安システムなど。

  1. プロジェクトの要件:
  • スリムなフレームワークを使用して画像を分類および識別します。
  • オブジェクトの検出と認識のためのスリムなオブジェクト検出フレームワークの使用をマスターします。
  • 画像を渡して上記の 2 つの関数を実装し、最終結果を表示します。
  • プロジェクト計画の分析と計画の決定
  1. プロジェクトが提供する資料:
  • 車両分類用のデータセット。これは単なる機密データであり、中に位置情報はありません。合計 48856 枚の写真があり、そのうち 43971 枚がトレーニング セットとして使用され、4885 枚が検証セットとして使用されます。データは tfrecord 形式にパッケージ化されています。データ形式は、コースの分類モデルで使用されるデータ形式と同じです。主要なパッケージ化コードについては、「download_and_convert_flowers.py」を参照してください。

データセット分類ファイルlabels.txt

  1. プロジェクト要件を満たすための要素が不足している
  1. 具体的な画像が表示されません。画像は tfrecord 形式でパッケージ化されていますが、どのような画像なのかわかりません。
  2. プロジェクトによって提供されるマテリアルには検出ラベルが含まれていません。これは、指定されたマテリアルでは検出ネットワークのトレーニングを完了できないことを意味します。
  1. 各種オプションの実現可能性比較とオプションの決定

したがって、議論の結果、最初のタスクは tfrecord データを復元し、検出機能を実装する適切な方法を見つけることです。

考えられる解決策は次のとおりです。

  1. label-image を使用して独自の検出データ セットを作成し、元の画像にラベルを付けて、分類ラベルと検出ラベルを取得すると、エンドツーエンド モデルをトレーニングできます。ただし、写真が多すぎるのが難点で、プロジェクト期間は1ヶ月と短いため、完成は不可能と予想される。
  2. YOLO、faster-rcnn、ssd_mobilenet_v1_coco などの既存の事前トレーニング済み検出モデルを使用して、車を含む一部のオブジェクトの検出機能がすでに実装されているため、このネットワークを使用して検出機能を完了できます。画像がネットワークに一度入力され、検出用のキャリブレーション データが生成され、その後 tfrecord ファイルが再パッケージ化され、最後にエンドツーエンドの検出および分類モデルをトレーニングできます。この方法も実現可能性は比較的高く、作業負荷も大きくありませんが、コードが少し難しい(以下の解決策と比べて)点だけが難点で、途中で行き詰まってしまうと時間制限が発生する可能性があります。 。しかし、全体的な感覚としては、それはまだ実現可能な解決策であるということです。
  3. 前のステップと同様に、既製の検出モデルを見つけて入力画像を検出し、その検出結果をトレーニングした分類ネットワークに入力することで、プロジェクトの要件を達成でき、他のソリューションと比較して最も難易度が低くなります。おそらくこの任務を達成できるでしょう。しかし問題は、プロセス全体が 2 つの実行ステップを経ており、1 つのステップほど効率的ではないように感じられることです。

比較した結果、最終的に 3 番目のオプションを選択しました。

  • プログラムの実施と計画

最終的なプログラムのプロセスは次のとおりです。

図 3-1 ソリューションのフローチャート

プロジェクトの実施計画は以下のとおりです。

最初の週:

  • データ探索、元の画像コンテンツの復元、データ探索と分析の実施。
  • 使用する最終的な検出モデルを決定します。

2週目:

  • 検出モデルの効果をテストし、呼び出しインターフェイスを作成します。
  • 85% を超えるトップ 5 の精度を達成するには、分類トレーニングに使用Inception_v4 します。

3 週目:

  • 分類モデル プロジェクト インターフェイスを完成させます。
  • 検出モデルのインターフェースと統合します。
  • 機能を Web サービス関数に統合します。

4週目:

  • ドキュメントの作成とコードの改善。
  1. データ探索
  1. 元のイメージを復元する

プロジェクトのプロンプトによると、画像のパッケージ化プロセスは花の例を参照しており、ソース コードのパッケージ化と解凍のプロセスを検討した後、画像の復元作業を完了しました。写真をカテゴリーごとにそれぞれのフォルダーに入れます。

      • 3-2 元画像データの取得
  1. 図 3-2 の左側は、画像復元プロセスの出力です。画像のサイズはすべて4xx *320、3 チャンネルの jpg 画像、高さと絵の横幅は同じですが若干異なります。この入力はトレーニングに送信される前に、いくつかの画像前処理操作を受けます。トレーニング中に、図 3-3 に示すように、画像のサイズが統一され、一部のトリミング、ランダムな反転、色の歪みなどが実行されます。
    • 3-3 画像前処理部
  1. 最終的に復元された画像トレイン セットには 43972 個の画像が含まれており、764 個のフォルダーは、labels.txt の 764 個のカテゴリに対応しています。トレーニング セット内の画像の数は、プロジェクトの説明より 1 つ多くなっています。おそらく、43971 個の画像が4 つに分割 データセットの丸めの問題により、最終的な復元には重複が 1 つ存在する可能性がありますが、これはあまり問題ではありません。
  1. トレーニング セット内の車の各カテゴリには、異なる視野角、色、背景の写真が含まれていることがわかります。 /span> ので、異なる視野角からの車の分類機能を実現することができます。 データの被写体は比較的鮮明に撮影されており、画面の中央にある。ただし、自動車モデルの識別に影響を与える要因は多数あります
  1. 発見された問題: トレーニング セットにはまだ間違った画像がいくつかあります。たとえば、ヒュンダイ車は他のモデルのラベルの下に何度も配置されており、同じ画像が複数回配置されています。ただし、そのようなエラーの割合を考えると、は高くないため、トレーニング中に一時的に処理されません。まずはトレーニング用にネットワークに入れてみてください。
  1. 検出ネットワークとして Yolo を選択します

まず、Yolo は回帰検出のパイオニアであり、検出効果は mAP ~ 0.58 と優れており、実行速度は非常に速く、毎秒 45 ~ 150 フレームに達します。もう 1 つの理由は、私たちのチームのメンバーであるリーが以前にこのモデルを研究したことがあり、このモデルに自信を持っていることです。

  1. 機密データセットのみの場合、マンパワーが限られているため、エンドツーエンドのトレーニングに YOLO モデルを直接使用することはできません。時間とコストを節約するために、オープンソースの YOLO モデルをオンラインでダウンロードし、YOLO モデルと呼びます。 VOC でトレーニングする セット上でトレーニングして得られたトレーニング前パラメータを設定し、検出プログラムを作成します。

次に、検出機能をテストしました。

図 3-4 YOLO 検出車テスト

図 3-5 YOLO はテスト用にさらに多くの車を検出します

YOLO が複数の車両を検出するタスクを正常に完了でき、選択された位置が非常に正確であることがわかります。車をトラック、乗用車、バス、その他のカテゴリに分類するだけで、後で処理するだけで、すべて車として扱うことができます。

  1. Inception_v4 を使用して分類ネットワークをトレーニングする

次のステップは、分類ネットワークをトレーニングすることです。このプロジェクトでは、Inception_v4 モデルを使用する必要があります。そこで、Inception_v4 の論文を読み、スリム分類トレーニングでコードを研究しました。

  1. インセプション_v4 ペーパー

この論文では、Inception_v4 のネットワーク構造を紹介し、残差を追加した Inception_v4 の別の構造も紹介します。同時に、Inception_v3 と残差のある inception_v3 が比較され、いくつかの結論が導き出されています。

Inception_v4 は、Inception_v3 のネットワーク構造に構造的な微調整を加えました。最終的な実験結果は次のとおりです。

図 3-6 4 つのモデルの学習結果

Inception_v3 シリーズと比較すると、Inception_v4 シリーズは精度の点で優れており、トップ 5 エラーが 1 以上減少しています。さらに、残差を追加した V3 または V4 は、それを使用しないモデル トレーニングよりも速く収束しますが、正確さ、これ以上の貢献はありません。

  1. 分類機能を実装するための Inception_v4 のトレーニング

トレーニングのアイデアは、まずスリムの github から事前トレーニングされたモデルをダウンロードすることです。

図 3-7 インセプション_v4

次に、このモデルを微調整します。プロセスは次のとおりです。

図 3-8 Inception_v4 が微調整を実行する

ここでは Train_dir と dataset_dir を指定し、model_name は incption_v4、checkpoint_path はダウンロードしたチェックポイントです。そこで重要となるのがcheckpoint_exclude_scopesパラメータの指定ですが、ここではInceptionV4/LogitsとInceptionV4/AuxLogitsの2層を除外していますが、slimではこの2層が存在しない場合は_NUM_CLASSESパラメータに基づいて判断されます。 dataset.py で提供されます。分類レイヤーを構成します。前のレイヤーは今のところ変更されていません。特に、ここで追加の trainable_scopes パラメーターを指定する必要はないことに注意してください。指定しないと、トレーニングはここで指定されたレイヤーのみをトレーニングします。ここですべてのレイヤーをトレーニングする必要があります。このようにして、前の特徴抽出層はトレーニング中に微調整され、後続の分類層はバックプロパゲーションの調整に焦点を当てます。

トレーニング プロセス中にテンソルボードを開くと、表示プロセスは次のようになります。

total_loss が着実に減少し、最終的に 1 付近で安定したことがわかります。

モデルのスパース性も調整され、減少しています。これは、モデルの適合能力が向上していることを意味します。

最初に学習率を 0.001 に設定し、途中でトレーニングを停止して減衰モードに変更してトレーニングを継続すると、学習率が一定期間低下した後、学習率が 0.001 に留まることがわかります。私たちが設定した最小値。最小値により、モデルがバックプロパゲーションの勢いを失うのを防ぐことができ、トレーニングの進行に応じて学習率を下げると、モデルの振動が減少し、モデルができるだけ早く最適な点に調整できるようになります。

スリムトレーニングにはデータを前処理する機能があり、画像のトリミングや反転を行うことでトレーニングデータを強化し、モデルのフィッティング性を高めることができます。

各レイヤーのパラメータがトレーニングによって調整されていることがわかります。

トレーニングはほぼ完了しました。検証を行ってみましょう。

検証セットの精度は 88.7% に達し、上位 5 つは 94.59% に達し、所定の要件を満たしました。

  1. コードの統合

コードの統合では、2 つのモデルの検出プログラムを接続し、YOLO ネットワークを通じて Car、Bus、および Truck クラスの座標を検出し、その座標に従って元の画像をトリミングし、トリミングされたデータを inceptionV4 分類ネットワークに送信します。最後に、取得したカテゴリと座標情報を元画像上にマーキングして表示します。

  1. モデルのエクスポート、関数とのドッキング
  • 検出されたキャリブレーション フレームをクロップします (トラック、自動車、バス カテゴリにキャリブレーションされています)
  • カットした写真を分類ネットワークに送信します
  • ターゲットと分類結果を画像上にマークします

単一ターゲットの認識結果は非常に良好です

1 つの目標に対する結果1

単一ターゲットの検出結果 2

複数のターゲットの状況は、画質と車両のオクルージョンの影響を受けます。

複数のターゲットの場合、前の車の結果は正しいですが、後ろの 2 台の車の結果は明らかに間違っています。

この状況はさらに悪化しています

理由:

  1. 画質が非常に悪いため、人間でも車種をはっきりと見ることができません。
  2. 車両が遮蔽されているため、スクリーンショットを撮って分類ネットワークに送信した後、さまざまなタイプの車両の特徴が混在します。
  3. 学習が不十分、学習データの量が少ない
  • 発生した問題と解決策
  1. tfrecord を読み取るとき、最初にエクスポートされた画像は花でした。その後、画像の列と行がそれぞれ幅と高さに対応していることが判明したため、画像、データの取得を間違えました。これを修正すれば大丈夫です。

図 4-1 画像の幅と高さは列と行の問題に対応します

  1. Inception_v4 モデルをトレーニングするとき、InceptionV4/Logits と InceptionV4/AuxLogits の 2 つのレイヤーを除外するには、checkpoint_exclude_scopes パラメーターを指定する必要があります。Slim は、これら 2 つのレイヤーが存在しないと判断します。 . . を指定すると、分類層は dataset.py で指定された _NUM_CLASSES パラメーターに従って再構成されます。前のレイヤーは今のところ変更されていません。 特に、ここで追加の trainable_scopes パラメーターを指定する必要はありません。指定しない場合、トレーニングはここで指定されたレイヤーのみをトレーニングします。まず、次のように指定しました。

trainable_scopes=InceptionV4/Logits,InceptionV4/AuxLogits

このようにして、モデルがトレーニングされるとき、最後の分類の 2 つのレイヤーのみがトレーニングされます。これにより、次の問題が発生しました。

6 ~ 8 時間のトレーニング後でも、検証セットではトップ 1 の 80% の精度に達しませんでした。

530,000 歩トレーニングした後でも、まだ 4 と 5 の間で揺れています。

Tensorboard の関連データ:

正規期間の損失が横ばいになる傾向があり、モデル パラメーターが引き続き適合していないようであることがわかります。

微調整プロセス中に学習率を数回変更しましたが、モデルにはほとんど影響がないようです。

この 2 つのパラメータは tensorboard では変更されていませんが、デモを見ると、この 2 つのノードは除外されているようです。

分析した結果、トレーニングに問題があると感じたので答えを探したところ、slim に与えられている微調整モードは次のようなものであることがわかりました。

つまり、最初のステップでは線形分類の 2 つの層のみをトレーニングし、2 番目のステップではすべてのパラメーターを一緒にトレーニングします。つまり、この API でこれら 2 つのパラメーターを変更します。最終的に、前回のトレーニングに基づいて、トレーニング用のすべてのパラメーターを追加し続け、前のセクションで達成した効果を達成しました。

  1. 車両情報が識別されると、識別された車両データが傍受され、識別のために分類ネットワークに送信されます。車の位置が重なったり、同じ車が2つの検出枠を取得する場合があります。次の 2 つのオプションがあります。
  1. 表示および識別する最も信頼性の高いボックスを直接選択します。
  2. IOU の計算により、重なり具合が異なるフレームがマージされます。

ソリューションをマージする

  • 改善できる領域
  1. トレーニング セットには間違った画像が多数含まれているため、認識の精度を向上させるためにデータ スクリーニングを実行する必要があります。状況が許せば、トレーニングセットを増やし、より多くのトレーニングを実施します。
  2. モデルの実行速度を最適化し、パラメータを抽出して読み取り、画像を渡した後、計算ステップに直接入力します。車両認識のステップは複数のセッションを経由するようになり、プログラムの速度を向上させるために 1 つのセッションに結合できるようになりました。
  3. 分類データセットと検出データセットを同時にトレーニングするモデルも試してみたいのですが、結果はどうなるかわかりません。
  4. 推測: 2 つのネットワークを 1 つのネットワークに接続できますか? 2 つのネットワーク間で共有できるパラメータがいくつかあるはずですが、これらのパラメータを共有することは可能ですか?共有後は重複するパラメータを減らすことができ、ネットワークの検出速度を向上させることができます。
  5. バッチ認識機能は、バッチを追加することで複数の画像を一度に検出できます。
  6. 映像検出機能も追加可能です。

完全なコードのダウンロード アドレス:YOLOV に基づいて Pyhon によって実装された車両ブランドおよびモデル検出プロジェクト

おすすめ

転載: blog.csdn.net/2301_76484015/article/details/134919735