YOLOv3 に基づく車両のナンバー プレートの位置

01 OCR原理分析

      本稿で使用する車両ナンバープレート認識部はCNN+LSTM+CTCで構成されており、全体のネットワーク部分は3つの部分に分けることができ、1つ目はバックボーンネットワークCNNを使用して文字の特徴情報を抽出し、2つ目は文字の特徴情報を抽出する。深い双方向LSTMネットワークを使用し、畳み込み特徴に基づいてテキストまたは文字のシーケンス特徴を抽出し、最後にCTC構造を導入して、学習中に文字が整列できない問題を解決します。詳細な組み合わせ構造を図 1 に示します。

図1 OCRアルゴリズムの構造図

      (1) バックボーンネットワーク CNN が特徴を抽出します。ネットワークはナンバープレートの文字を認識するためにナンバープレートの特徴情報全体を畳み込みの形で抽出するだけであるため、アルゴリズムの入力はナンバープレート画像全体です。

      (2) LSTM は配列情報を抽出します。長短期記憶ネットワークとしての LSTM は、長期依存の問題を回避できる特殊な RNN 構造です。巡回畳み込みニューラル ネットワーク (RNN) とは異なり、RNN は異なる時点で状態を保存でき、LSTM の独自のネットワーク構造は 4 つの異なる状態の特性を保存できます。LSTM ネットワーク構造ユニットは主に 3 つのタイプで構成されます。フォーゲット ゲート、インプット ゲート、アウトプット ゲートを組み合わせたユニット構造図は、以下の図 2 に示されています。

図2 LSTMネットワークユニット

     フォーゲット ゲートは主に、ネットワークから一部の特徴を破棄して保持することを決定します。実装プロセスは、ネットワーク入力パラメータ Xt と前の層の出力状態 ht-1 を読み取り、シグモイドを通じて 0 ~ 1 に正規化します。 function 範囲間隔では、0 は破棄された特徴を意味し、1 は保持する必要がある特徴を意味します。フォーゲット ゲートの実装式を式 1 に示します。

       入力ゲートの構造は、忘却ゲートの構造とは異なります。この部分は 2 つの部分に分かれており、1 つの部分は忘却ゲートに類似しており、もう 1 つの部分は忘却ゲートに基づいています。特徴は次の間にマッピングされます。式 2 と 3 に示すように、tanh 関数を使用して 1 と 1 を計算します。式 2 と 3 に示すように、-1 はさまざまな更新された部分を表し、1 は更新する必要がある機能部分を表します。

      出力ゲートのシグモイド関数は、関数のどの部分を出力する必要があるかを決定し、出力部分の特性はtanh関数を通過し、シグモイド関数の出力と乗算して最終的に出力部分の特性を決定します。式の実現部分を式 4 と 5 に示します。

     (3) CTC構造。CTC 構造は、音声認識における自動位置合わせの解決策であり、CTC ネットワーク構造を文字認識に適用することで、人為的に文字を切り取る問題が解決され、アルゴリズム全体の精度が向上します。

02 ナンバープレート番号データセットの作成

この章のこの部分で使用されるデータ セットは、データ セットの最初の部分に基づいて画像のナンバー プレートをインターセプトすることによって取得されます。Python 環境を備えたマシン上でデータ セットを読み取るための Python スクリプトを作成し、マークされた XML ファイルから解析して、ナンバー プレートが配置されている画像の位置を取得します。切り出した画像の整合性を確保するため、ピクセル値を拡大する方法も採用しており、XMLファイルに保存されたナンバープレートの位置は、左上隅の座標点をそれぞれ5ピクセルずつ減算し、右下隅の座標点がそれぞれ 5 ピクセルずつ増加します。ターゲット検出とは異なり、データ画像に加えて、ナンバープレートの文字もナンバープレートの文字に合わせて変更する必要があります。図 3 は、処理されたトレーニング可能なナンバー プレート データ セットを示しています。

図 3 ナンバープレートのデータセット

      前処理後のデータは特定のナンバープレートの画像のみであり、画像にはまだマークが付けられていないため、OCR アルゴリズムをトレーニングするためのデータセットとして直接使用することはできません。この部分は主にテキストの認識を実現します。 YOLOv3 は、この章のセクション 3.2 で渡されています。このアルゴリズムは、すべてのブロックされたナンバー プレート、ぶら下がっていないナンバー プレート、およびその他のタイプのナンバー プレートの位置決めと分類を実現します。ターゲット検出アルゴリズムに基づいて、他のタイプのナンバー プレート認識結果内の画像の数は、さらなる処理のために選択されます。画像の注釈の品質に加えて、画像の数も、最終モデルの一般化能力がより優れているかどうかに直接影響します。通常のナンバー プレートに加えて、車両データ セット内のナンバー プレートの写真には、半分隠れたナンバー プレートもあります。トレーニングの前に、画像を処理する必要があります。その実装プロセスを図 4 に示します。

図4 トレーニングセットデータ処理のフローチャート

      (1) ナンバープレートの文字として画像名を変更します。ターゲット検出のタグ付け方法とは異なり、ナンバープレートのタグ付けは、実際の画像内のテキストに従って画像の名前に変更する必要があり、画像のサフィックスは変更されません。完了したら、実際のプロジェクトで必要な形式に従ってデータ セットを変更する必要があります。Python スクリプト プログラムの使用に従って、画像を 6:1 の比率に従ってトレーニング セットとテスト セットに分割し、新しいデータ ディレクトリを作成します。プロジェクト内で、データ フォルダーに train/text と test/text の 2 つのパスをそれぞれ作成します。train /text は、処理されたトレーニング セット イメージを保存するために使用され、処理された train.pkl バイナリ ファイルは、train、test に保存されます。セットイメージはtest/textに保存され、テストセットのtest.pklバイナリファイルはtestに保存されます。

       (2) pklファイルを生成します。pkl ファイルは、バイナリ コンテンツを保存するためのファイル形式であり、トレーニング プロセス中に、ネットワークはトレーニングのために pkl ファイルからテキスト情報と対応する画像を読み取ります。トレーニング セットと検証セットのピクチャの名前を、train.pkl および test.pkl という名前の新しく作成された pkl ファイルに順番に保存し、対応するピクチャ名をシリアル番号として保存します。

03 プリウェイトファイルを変更する

      この章では、トレーニングは事前トレーニングされた重みに基づいて実行されます。事前トレーニングされた重みを使用する利点は、モデルの高速収束を保証し、モデルのトレーニング時間を短縮できるだけでなく、勾配爆発を回避できることです。ゼロからトレーニングすることによって生じるトレーニング プロセス中の勾配、消失が発生します。事前トレーニングの重みは、Python のサードパーティ モジュール Collections のサブクラス OrderedDict モジュールを介してデータを保存します。OrderedDict は、入力の順序で要素を保存し、順序が変わらないことを保証できる順序付けられた辞書です。したがって、OrderedDict Use は、次のことを保証できます。重みファイル内のパラメータは、トレーニングネットワーク構造のレベルと順序に従って保存されます重みファイル内のデータ保存のフォーマット順序を保証することに加えて、重みファイルの保存は機器、保存方法にも関連しますしたがって、事前トレーニングされた重みを使用するには、事前トレーニングされた重みの構造と、トレーニングを保存する方法を理解する必要があります。この章の事前トレーニング重みの変更には、事前トレーニング重みファイルを一緒に変更するという目的を達成するために、重みファイルの分析と重みファイルの寸法の変更が含まれます。具体的な実現方法を図5に示す。

図 5 重みファイルの実装の変更

     (1) 重量構造を分析します。事前トレーニング重みの保存方法は、トレーニング方法に応じて CPU トレーニング、シングル GPU トレーニング、マルチ GPU トレーニングに分類できます。CPU とシングル GPU の場合に保存されるモデル構造は同じです。 、モデルとトレーニング パラメータを重みファイルに保存するネットワーク構造と、トレーニング パラメータのみを重みファイルに保存するネットワーク構造に分けることができ、保存方法に応じて、トレーニング プロセスのトレーニング バッチを保存することに分けることができます。トレーニング パラメータ、ネットワーク構造の中間構造の重みファイル、および最終トレーニング パラメータのみの保存 重みファイルには 2 つの方法があり、ネットワーク構造に応じて、Python スクリプトを通じて重みファイルのネットワーク構造を出力できます、重みで変更する必要があるネットワーク パラメーターは、要件に応じて変更できます。

     (2) 事前にトレーニングされた重みの寸法を変更します。ネットワーク内のパラメータを変更すると、ネットワークが変更されるため、現在のネットワークに適応するように事前トレーニング重みファイルを変更するには、不適切なネットワークのノード トレーニング パラメータを削除するか、不適切なネットワークのノード トレーニング パラメータを変更する、という 2 つの解決策があります。トレーニングには適していないため、そのノードを埋めます。この章では、2 番目の方法を使用してネットワークを照合します。Python を使用して重みのノード名と次元情報を読み取り、重みファイルの最初の層のパラメータ次元と、タイプの数に対応するネットワーク ノード パラメータを変更します。変更された種類の数は終了します。変更したウェイト ファイルを新しいウェイト ファイルとして保存します。

04 モデルパラメータの設定と学習プロセス   

       OCR 認識のトレーニング プロセスの前に、トレーニング データ セットとハードウェア構成に従って特定のパラメーターを設定する必要があります。

     (1) ロードされたデータセットの場所はプロジェクトディレクトリ cnn+lstm の下にあり、trian_crnn.py ファイルを開き、クラス OCRIter の初期化ロード関数でピクチャと pkl ファイルの相対パスとパスを変更します。トレーニング セットの画像のパスは ./data/train/text 、トレーニング セットのラベル pkl ファイルは ./data/train、テスト セットのイメージ パスは ./data/test/text、テスト セットのラベル pkl ファイルは ./data/test 、パラメータ train_flag を True に設定し、エンジニアリング コードの pkl ファイル名での読み取りを変更します。データセットのコードは次のとおりです。

if train_flag:    self.data_path = os.path.join(os.getcwd(), "data", "train", "text")    self.label_path = os.path.join(os.getcwd(), "data", "train")else:    self.data_path = os.path.join(os.getcwd(), "data", "test", "text")    self.label_path = os.path.join(os.getcwd(), "data", "test")

       pkl ファイルを生成するコードは次のとおりです。

def _label_path_from_index(self):    label_file = os.path.join(self.label_path, "train_pkl")    assert os.path.exists(label_file, "path dose not exits:{}".format(label_file))    gt_file = open(label_file, "rb")    label_file = cPickle.load(gt_file)    gt_file.close()    return label_file

      注: Python コード内のアンダースコアで始まる Python 関数はプライベート関数を表します。先頭の 1 つのアンダースコア _ で始まるメソッドまたは変数は、クラスおよびサブクラス内でのみアクセスが許可され、クラスのインスタンスはこの属性およびメソッドにアクセスできません。先頭の 1 つのアンダースコアと同様に、先頭の 2 つのアンダースコア __ は、これで始まる変数とメソッドにはクラス内でのみアクセスが許可され、クラス インスタンスも派生クラスもこの属性とメソッドにアクセスできません。

     (1) 認識タグ数を変更します。認識される文字には、数字、文字、漢字が含まれます。OCR 認識原理は、多分類アルゴリズムと同等です。そのため、カテゴリ設定には、漢字の阿海や地域の略語である北京、天津、山西、などの数字 0 ~ 1 が含まれます。河北、モンゴル、遼、吉、黒、上海、江蘇、浙江、安徽、福建、山東、河南、湖北、湖南、広東、広西、瓊、四川、桂、ユン、チベット、陝西、甘粛、清、寧、ユ、江西、シンガポール、台湾、香港、マカオ。具体的な変更パラメータを図 6 に示します。

                          図6 データセットのコード構成

    (2) num_epoch=6000、BATCH_SIZE=64 を変更し、GPU-0 トレーニングを使用するように構成します。contexts = [mx.context.gpu(0)]、重みを生成および保存するデフォルトのパスはプロジェクト内のモデル フォルダーです。

05 閾値分析   

       実際のアプリケーションでは、汚れたり隠れたりしたナンバー プレートの認識は、アルゴリズムの認識率だけでなく、収集された車両画像の品質や実際のナンバー プレートの品質にも密接に関係しています。ナンバープレートは、最終的な認識性能に直接影響します 例えば、ナンバープレートは、車両のデッキ、ナンバープレートの詰まり、複数のナンバープレートなどの主観的要因の影響を受けますが、錆び、フォントの剥がれなどの客観的要因の影響も受けますペイント、ナンバープレートの傾きなど。また、撮影時の天候などのさまざまな要因にも影響され、これらの要因の違いも最終的な認識効果に多かれ少なかれ影響を与えます。

     OCR 認識アルゴリズムは、ナンバー プレート上のテキストを認識することで、通常のナンバー プレートと半隠蔽ナンバー プレートの分類を実現します。そのため、OCR アルゴリズムは、認識された文字ごとに信頼レベルを生成し、各文字は互いに独立しています。識別ナンバープレート全体の信頼度を記述することができ、ナンバープレートの信頼度は、認識された各文字の信頼度を乗算することで得られます。confi は i 番目の文字の信頼度を表し、conf は全体の信頼度を表しますナンバー プレートの信頼度。式は式 6 に示されています。

      この式から、認識された文字のうち信頼度が低い文字は、ナンバー プレート全体の信頼度を直接低下させることがわかります。そのため、ナンバー プレート全体の信頼度に応じて直接フィルターすることを選択できます。このようにして、通常のナンバープレートと半遮蔽されたナンバープレートとを区別するという目的を達成することができ、詳細な実装プロセスは図7に示されている。

図 7 閾値解析のフローチャート

      (1) データを準備します。透明ナンバープレートとぼかしまたは半隠れナンバープレートを 100 枚用意し、ナンバープレートの種類には、さまざまな色や種類のナンバープレートデータも含める必要があります。このうち、通常ナンバープレートは通常ナンバープレート+シリアルナンバー、シリアルナンバーは1から100、半閉塞ナンバープレートは半閉塞ナンバープレート+シリアルナンバー、そしてシリアルナンバーと呼ばれています。も 1 ~ 100 であり、処理されたデータはフォルダー データセット に配置されます。

      (2) コードを書きます。処理されたデータは、プログラムを通じてさまざまなしきい値の下で正解率を計算し、しきい値を変更するたびに計算された正解率を保存し、最終的に折れ線グラフを生成します。実装過程では、ナンバープレートの信頼度が設定した閾値よりも大きいかどうかを判定し、閾値よりも高く、正常ナンバープレートと判定された場合には、正常ナンバープレートとみなされる。閾値未満で半隠蔽ナンバープレートが含まれていると判定された場合 正認識と同様に、この2つの条件でナンバープレートの正解率を計算します。

      (3) 閾値を選択します。ナンバー プレート全体の信頼度は式 3-6 で取得できるため、ナンバー プレートの信頼度を使用してフィルタリングのしきい値を増やすと、分類の効果を得ることができます。さまざまなしきい値の下で設定された検証データの精度をカウントするスクリプトを作成します。設定されたしきい値を下回るナンバー プレートは半閉塞ナンバー プレートとみなされ、それ以外の場合は通常のナンバー プレートと見なされます。初期値を 0.5 に設定し、値を増やします。 0.02の速度でテストを行うと、正解率が最も高くなる場合に最適な閾値が求まります 図から閾値と正解率はほぼ比例することが分かります。 0.95 付近では安定する傾向があり、正解率 96% に達するため、適切なしきい値は 0.95 に選択され、実験部分の増加グラフが図 8 に示されています。

                             図 8 閾値マップ

06 実験結果

              

     モデル パラメーターを設定した後、モデルを起動してトレーニングを開始します。OCR モデルのトレーニングは、主に中間重みファイルの生成と実験結果の検証の 2 つの部分に分かれています。詳細なプロセスは次のとおりです。

      (1) ウェイトファイルを生成します。この章では、エポックごとにウェイト ファイルを生成するように設定し、ウェイト ファイルをプロジェクトのモデル パスに保存します。ウェイト ファイルの名前には、反復回数を記録するために使用されるエポック値が含まれます。勾配爆発がない場合、連続Inトレーニングでは、損失値が継続的に減少し、学習効果が向上します データ量が多く、収束速度が遅いため、設定時により大きな値に設定できます保存間隔。この記事で設定した間隔は 1000 回の反復です。ウェイト ファイルは 1 回保存します。

      (2) 機種を選択します。学習過程における損失値が低いほど、学習セットへのフィッティング効果は良好ですが、検証セットへの効果も良好であるとは限りません。トレーニング プロセスでは、検証セット テストのモデルが十分な特徴を学習し、より優れた汎化能力を維持できるようにするために、中間ファイルで生成された重みを保存することも必要です。エポックが4500の場合、正解率が高く、損失が少ないことが確認されています。いくつかのテスト画像の出力結果を図 9 に示します。

                                                 図9 OCR出力結果

      データから 200 個の検証セットを選択し、正解率を計算します。この中には、通常のナンバー プレート 100 枚と半閉塞のナンバー プレート 100 枚が含まれます。これには、ブルー カード、イエロー カード、新エネルギーなどのさまざまな状況のナンバー プレートが含まれます。OCR アルゴリズムを検証するためのメトリックは、オブジェクト検出のメトリックと同じです。

      この実験で使用した閾値は 0.95 で、検証セット内の正答率、再現率などの指標を計算します。指標を計算するためのデータは Accuracy (精度)、Recall (再現率)、Precision (精度) の 2 つの部分に分かれています。以下の表から、通常のナンバー プレートの識別精度は 94.90% と高く、ハーフ オクルージョンよりもはるかに高いと結論付けることができます。しかし、ハーフオクルージョンナンバープレートの精度率は91.61%の再現率に基づいて100%の認識に達することができ、F1スコアの最終計算から、ハーフオクルージョンナンバープレートの認識効果は通常のナンバープレートの認識効果よりも優れています。プレートも 計算結果を表 1 に示します。

       テスト プラットフォームの違いも動作効率に影響しますが、他の要因の影響を軽減し、比較効果の信頼性を高めるために、今回使用したオペレーティング システムは Ubuntu 16.04 です。GPU テスト プラットフォームは NVIDIA GeForce GTX 1080 Ti グラフィックス カード、使用された Cuda バージョンは 10.0、テストされた GPU プラットフォームには Cudnn アクセラレーション ライブラリがインストールされており、CPU プラットフォームは AMD 3550H プロセッサです。異なるプラットフォームでの速度テストを実現するには、異なるプラットフォーム上に環境を構築し、コードの実行テストでは、ハードウェア設備のニーズに応じて環境をインストールするだけでなく、コードを再コンパイルする必要があります。試験後の走行速度を表2に示す。

おすすめ

転載: blog.csdn.net/qq_41050642/article/details/128300182