OCRカード認識


序文

最近、IDカードの識別が関係してきたので、識別結果の名前、ID番号、住所などの属性を照合するために、dbnetをベースにした分類ブランチを追加することを考えました。プロセス中に発生したバグを記録します。


1. DBNetの複数分類

このアイデアを思いついたとき、まず Du Niang を通じて実装事例があるかどうかを確認したところ、大手の方が既に実装していることがわかったので、大手のコードを直接参照して修正しました。 DBNet マルチカテゴリこのアイデアは、ID カード、銀行カード、その他の書類の識別に応用できます。

2 つのステップ

1. トレーニング、トレーニングモデル推論、モデル変換

上記のリンクに従ってコードを変更するか、PaddleOCR で PaddleOCR/アプリケーション/クイック ビルド カード OCR.md を作成するだけで、個人テストが実行可能です。

2. 推論モデルによる推論

ここに画像の説明を挿入
ここで直接実行すると、エラーは報告されませんが、以下の図に示すように、推論結果が満足のいくものではない可能性があります (図は自分で合成したものです。情報は無視してください)。 上の図から、次のことがわかります。ボックスの位置が間違っていて
ここに画像の説明を挿入
カテゴリが表示されないことを実現したいのですが、結果は以下の通りです。
ここに画像の説明を挿入

では、どうすれば私の目標を達成できるでしょうか?解決策は引き続き下を向いています。

3. 解決策

1. モデルを表示する

最初はモデルの変換が間違っているのかと思い、変換したモデルを netron で確認したところ、 netron の Web ページの URL が netron モデルを開く
と次のようになります
ここに画像の説明を挿入

つまり、モデルに問題があるということです。まず独自のトレーニング モデルを使用して推論し、結果が正しいかどうかを確認します。モデルが次のようであれば、
ここに画像の説明を挿入
モデル変換も正しいことを意味します。そのまま下に進んでください。

2. Tools/infer/predict_det.py の変更

まず、図に示すように、約 250 行で出力を出力します。
ここに画像の説明を挿入
出力結果は次のとおりです。
ここに画像の説明を挿入
実行結果から、出力が 2 つになり、半分の成功を意味します。最初の出力の型が int で、2.1 で変更したコードのクラス ブランチの出力が int 型であることから、最初の出力が分類され、2 番目の出力が dbnet であることが推測できます。構造図と組み合わせると、
ここに画像の説明を挿入
最初の出力をクラス ブランチとして設定し、2 番目の出力を dbent として設定できるため、次の変更が加えられます。

ここで変更が完了すると、後処理入力は先ほど変更した部分に相当しますので、後処理結果を取得した後は、上記の方法に従って表示部分を次のように変更するだけです。
ここに画像の説明を挿入
ここに画像の説明を挿入
( ) 関数や args.num_classes などは次のステップで説明します。

3. Utility.pyの修正

まず、次のように 2 つのパラメータを追加する必要があります。

ここに画像の説明を挿入
ここでカテゴリ数やカテゴリラベルファイルのパスは任意に変更できますが、カテゴリを表示したくない場合はnum_classesのデフォルト値をNoneに変更するだけです。次に、次のように、元の結果とは異なる結果を視覚化する関数を追加する必要があります。

def draw_det_res_and_label(dt_boxes, classes, label_file_path, img):
    label_list = label_file_path
    labels = []
    if label_list is not None:
        if isinstance(label_list, str):
            with open(label_list, "r+", encoding="utf-8") as f:
                for line in f.readlines():
                    labels.append(line.replace("\n", ""))
        else:
            labels = label_list
    if len(dt_boxes) > 0:
        import cv2
        index = 0
        src_im = img
        for box in dt_boxes:
            box = box.astype(np.int32).reshape((-1, 1, 2))
            cv2.polylines(src_im, [box], True, color=(255, 255, 0), thickness=2)

            font = cv2.FONT_HERSHEY_SIMPLEX
            src_im = cv2.putText(src_im, labels[classes[index]], (box[0][0][0], box[0][0][1]), font, 0.5, (255, 0, 0), 1)
            index += 1
        return src_im

ここは変更しても問題ありませんので、ご自身で練習してみてください。


要約する

これがこの記事の全内容です。誤解がある場合は、コメント欄で修正してください。最後に、ご貢献に改めて感謝いたします。 https://blog.csdn.net/YY007H/article/details/124491217

おすすめ

転載: blog.csdn.net/qq_55068938/article/details/130265458