テキスト文字ベースのトランザクション検証コード認識0.98+ソリューション

コンテストの紹介

コンテストのタイトル:

テキスト文字ベースのキャプチャ認識コンテスト

質問ユニット:

興業銀行

コンテストの背景:

費用対効果の高いセキュリティ検証方法として、検証コードが多くの場面で広く使用されており、ロボットによるIDスプーフィングを効果的に防止しています。その中でも、テキスト文字に基づく静的検証コードが最も一般的です。使用が深まるにつれ、ノイズポイント、ノイズライン、オーバーラップ、変形、その他の干渉方法が無限の流れで出現し、セキュリティレベルは常に向上しています。企業のデジタルトランスフォーメーションの鍵として、RPAテクノロジは、その非侵入型の展開のために企業に支持されており、検証コードの認識率が低いため、RPAテクノロジの適用が制限されることがよくあります。複数の干渉を同時にフィルタリングできるCAPTCHAモデルには、関連する自動化テクノロジーの拡張と使用に一定の商業的価値があります。

コンテストのタスク:

このコンテストでは、文字情報がマークされた文字検証コード画像データの例をトレーニングサンプルとして使用します。参加者は、提供されたサンプルに基づいてモデルを構築し、テストセットで文字検証コード画像を識別し、有効な文字を抽出する必要があります。情報。トレーニングデータセットは、提供されたデータに限定されず、公開されているデータセットに追加できます。

データの紹介

このコンテストでは、15,000のトレーニングデータセットに注釈情報が提供されます。各トレーニングデータは、4桁のテキスト文字を含むキャプチャ画像であり、現在の画像のテキスト文字がマークされています。テストデータセットには、25,000のキャプチャ画像が含まれています。
写真1.png 写真2.png 写真3.png 写真4.png

苦情を言う

このゲームについて不満を言う人はたくさんいます!以下の点をまとめると:

1. AリストとBリストのデータ分布には大きなギャップがあり、多くの前列が後列に変化します。それは無数の専門家をお辞儀させました。

2.ゲームはほとんど意味がありません。これはゲームのためのゲームです。

解決

コンテストグループの大物のチャットを見て、誰もが使用する最高のスコアリング方法は、50倍の交差検証、CutOut、CutMix、MixUp、生成されたデータなどであることがわかりました。モデルは通常、EfficientNetV1およびV2を使用します。

また、上のサブセクションで上記のメソッドのいくつかを使用しました。私の解決策は、EfficientNetV1-B7 + MixUp+CutOutです。その後、CutMixが追加され、効果をテストする時間がありませんでした。検証コードの認識は、マルチラベル分類に従って行われます。

ソリューションリファレンスgithub:https://github.com/zyf-xtu/captcha_ocr

トレーニングスコア:0.9854、評価が終了したため、Aリストのスコアを知る方法はありません。

画像-20220329081235353

以下は私の計画の詳細な説明です。

データ

データセクションへの変更は、captcha_dataset.pyファイルにあります。geitemメソッドを変更しました:

    def __getitem__(self, index):
        img_path, target = self.samples[index]
        # #print('target', target)
               # #print('random_t', random_t)
        img = img_loader(img_path)
        if np.random.random() > 0.5 and self.train_type==True:
            img_arr = np.array(img)
            index_arr=np.random.permutation(img_arr.shape[2])
            img_arr=img_arr[:,:,index_arr]
            img = Image.fromarray(img_arr.astype('uint8')).convert('RGB')
        if np.random.random() > 0.5 and self.train_type==True:
            img_random_path, random_t = self.samples[np.random.randint(0, len(self.samples))]
            img_random = img_loader(img_random_path)
            img_arr = np.array(img)
            img_random_arr = np.array(img_random)
            img_arr[:, 50:100, :] = img_random_arr[:, 50:100, :]
            img = Image.fromarray(img_arr.astype('uint8')).convert('RGB')
            target = target[:124] + random_t[124:]
        if self.transform is not None:
            img = self.transform(img)
        if self.target_transform is not None:
            target = self.target_transform(target)

        return img, torch.Tensor(target)

この方法では、2つのデータ拡張機能を追加しました。1つはチャネルにランダム、つまりRGBのランダムです。もう1つはCutMixで、画像の前半と別の画像の後半をつなぎ合わせます。次に、Labelは対応するスプライシングも行います。

トレーニング

トレーニングは最も重要な部分です。これらの変更はtrain_1.pyにあります。変更した場所をリストします。

image_sizeh,image_sizew=240,600

画像のサイズ変更サイズを240×600に設定し、6倍に拡大します。

データ拡張私はCutOutを増やしました:

Cutoutはtorchtoolboxを使用します。torchtoolboxがない場合は、インストールする必要があります。

pip install torchtoolbox

インストール後にインポート:

from torchtoolbox.transform import Cutout

次に、それを変換で呼び出します。

 # transform = [, transforms.GaussianBlur(21, 10)]
    train_transform = transforms.Compose([
    	Cutout(),
        transforms.Resize((image_sizeh, image_sizew)),  # 图像放缩
        transforms.RandomRotation((-5, 5)),  # 随机旋转
        # transforms.RandomVerticalFlip(p=0.2),  # 随机旋转
        transforms.ToTensor(),  # 转化成张量
        transforms.Normalize(
            mean=train_mean,
            std=train_std
        )
    ])

データの読み込み部分を変更しました:

 # 加载训练数据集,转化成标准格式
    train_dataset = CaptchaData(train_paths,train_type=True, transform=train_transform)
    # 加载验证集,转化成标准格式
    val_dataset = CaptchaData(val_paths,train_type=False, transform=val_transform)

トレーニングであるかどうかを判断するためにtrain_typeフィールドが追加されます。トレーニングである場合はデータ拡張が実行され、そうでない場合はデータ拡張は実行されません。

# 如果是多个gpu,数据并行训练
    device_ids = [0, 1]
    model = torch.nn.DataParallel(model, device_ids=device_ids)

マルチGPUの並列処理を増やすために、私のローカル環境には2つの3090があるため、device_idsは0と1に設定されています。

    cosine_schedule = optim.lr_scheduler.CosineAnnealingLR(optimizer=optimizer, T_max=20, eta_min=1e-6)

レート調整の学習には、コサインアニーリングを使用します。学習率の初期値は1e-3で、最小設定は1e-6です。

 inputs, labels_a, labels_b, lam = mixup_data(inputs, labels, 0.2)
            # 预测输出
            outputs = model(inputs)
            # 计算MixUp loss
            loss = mixup_criterion(loss_func, outputs, labels_a, labels_b, lam)

ミックスアップを追加しても、ミックスアップスコアはまだ比較的明白です。

このコンテストの別の大物もオープンソースのgithubアドレスを作成しました:https://github.com/xiaoxiaokuaile/2022DCIC_OCR

要約する

この大会は完璧ではありませんが、大会で多くのことを学びました。これが一番大事なことだと思います。

完全なコード:https://download.csdn.net/download/hhhhhhhhhhwwwwwwwwwwww/85050647

おすすめ

転載: blog.csdn.net/hhhhhhhhhhwwwwwwwwww/article/details/123811558