blog

十分なデータがないデータセットをトレーニングした経験は?

まえがき少し前に、私たちはユーザーから寄せられたいくつかの質問に遭遇しました。そして、多くの人が非常に少ないデータセットでトレーニングを行っていること、中には1クラスに5枚の画像しか持っていない人もい...

Jan 24, 2021 · 6 min. read

**概要:** ラベル付きデータセットを拡張する手法の一つを紹介します。

序文

modelartsプラットフォームはトレーニング用に1クラスあたり5枚という制限を与えていますが、この制限は産業スケールのアプリケーションシナリオには十分でないことがよくあります。そこで、私たちはユーザーに連絡を取り、トレーニングのためにもう少し写真を追加し、数千枚の写真を追加することを希望しました。しかし、後にユーザーから、アノテーションの作業負荷が大きすぎるというフィードバックがありました。私はしばらく考え、彼のアプリケーションシナリオを分析し、戦略的な変更を加えました。これが、ラベル付きデータセットを拡張する方法の一つです。

データセットの状況

このデータセットはユーザーデータに属するので、気軽に見せることはできません。まず、これは分類の問題で、工業部品の表面の欠陥を検出し、欠陥かどうかを判断する必要があります:

左側は正常で、右側は残留現象と欠陥現象があります。どのソーラーパネルに問題があるかを特定するために、この2種類の写真を区別するモデルが必要です。左側には754の正常なサンプル、右側には358の欠陥のあるサンプルがあり、検証セットも同じで、754の正常なサンプルと357の欠陥のあるサンプルです。総サンプル数は約2,000であり、95%以上の精度のモデルを必要とする一般的な産業要件にとっては非常に少ないサンプルです。まず、このデータセットを直接Pytorchに読み込ませたimagenet resnet50モデルで学習させると、全体の精度はACCで86.06%程度、正常クラスの想起率は97.3%ですが、非正常クラスは62.9%で、まだユーザーの期待に応えられません。

ユーザーは、少なくとも1万レベルのデータセットに拡大するために、より多くのデータを収集するように頼まれたとき、ユーザーは、データの収集が処理されることを提案したが、また、ラベル付けされ、それは非常に面倒で、作業負荷の一部を保存する他の方法があるかどうかを尋ねました。これは私にとって難しいですが、データは深層学習の訓練の魂であり、どのようにこれを行うことができます。

まずデータセットを観察すると、すべて300*300のグレイスケールイメージで、ソーラーパネル表面の正面上面図から全体イメージとして撮影されたものです。これは前処理済みのイメージです。このようなイメージの場合、フリップイメージはイメージ全体の構造にほとんど影響を与えないので、まずフリップ操作を行い、データの多様性を高めることができます。フリップ効果は以下の通りです:

これでデータセットが1100から2200に広がりました。これは大したことではありませんが、データセットを直接見て拡大してもあまり良いことはありません。この時点で、Modelartsのモデル評価機能を使って、モデルのデータ汎化能力を評価することを考えました。ここでは、提供されているSDK: deep_moxing.model_analysisをanalyseインターフェイスで呼び出します。

def validate(val_loader, model, criterion, args):
 batch_time = AverageMeter('Time', ':6.3f')
 losses = AverageMeter('Loss', ':.4e')
 top1 = AverageMeter('Acc@1', ':6.2f')
 top5 = AverageMeter('Acc@5', ':6.2f')
 progress = ProgressMeter(
 len(val_loader),
 [batch_time, losses, top1, top5],
 prefix='Test: ')
 pred_list = []
 target_list = []
 # switch to evaluate mode
 model.eval()
 with torch.no_grad():
 end = time.time()
 for i, (images, target) in enumerate(val_loader):
 if args.gpu is not None:
 images = images.cuda(args.gpu, non_blocking=True)
 target = target.cuda(args.gpu, non_blocking=True)
 # compute output
 output = model(images)
 loss = criterion(output, target)
 # ロジットの出力predと実際のターゲット結果を取得する。
 pred_list += output.cpu().numpy()[:, :2].tolist()
 target_list += target.cpu().numpy().tolist()
 # measure accuracy and record loss
 acc1, acc5 = accuracy(output, target, topk=(1, 5), i=i)
 losses.update(loss.item(), images.size(0))
 top1.update(acc1[0], images.size(0))
 top5.update(acc5[0], images.size(0))
 # measure elapsed time
 batch_time.update(time.time() - end)
 end = time.time()
 if i % args.print_freq == 0:
 progress.display(i)
 # TODO: this should also be done with the ProgressMeter
 print(' * Acc@1 {top1.avg:.3f} Acc@5 {top5.avg:.3f}'
 .format(top1=top1, top5=top5))
 # イメージ名の保存パスを取得する
 name_list = val_loader.dataset.samples
 for idx in range(len(name_list)):
 name_list[idx] = name_list[idx][0]
 analyse(task_type='image_classification', save_path='/home/image_labeled/',
 pred_list=pred_list, label_list=target_list, name_list=name_list)
 return top1.avg

上記のコードのほとんどはPytorch training ImageNetのコードの検証部分で、モデルpred direct result logits、ピクチャ actual category target、ピクチャ storage path nameの3つのリストを取得する必要があります。save_pathディレクトリにjsonファイルを生成し、Modelartsのトレーニング出力ディレクトリに置くと、評価結果でモデルの分析結果を見ることができます。ここでは、オフラインでjsonファイルを生成し、それをオンラインにアップロードして可視化結果を確認しています。感度分析の結果は以下の通りです:

この図の意味は、異なる固有値範囲のイメージを個別にテストした場合の精度がどの程度かということです。例えば、明るさの感度分析の最初の項目、0%-20%は、クラス0と他の明るさの条件の写真に比べて、イメージが明るくないシナリオで精度がはるかに低いことを意味すると解釈することができます。全体的に、主な目的は、クラス1を検出することです、2つの明るさと透明度の写真のクラス1は非常に敏感であるように見える、つまり、モデルがうまく写真の変化のこれらの2つの特性の写真に対処することはできません。だから、これは私が拡張データセットで行きたい方向ではないでしょうか?

そこで、全データセットに対して直接オーグメンテーションを行ってみたところ、2210の正常クラスと1174の欠陥クラスが得られました。

データセットのスライスをpytorchに投入し、同じ戦略で学習させた結果と、得られた結果:

どうしたんですか?

データセットの再分析、私は突然思った、この工業クラスのデータセットは、多くの場合、サンプルの不均一な問題があり、ここでは2:1に近いものの、より高いの欠陥クラスの検出要件は、モデルが学習する欠陥クラスに傾向があるようにする必要があり、1クラスの結果を参照してください、つまり、より敏感な結果の欠陥クラスは、実際には、まだサンプルの不均衡な状況があります。したがって、2つの後の強化方法は、1クラスのみ、つまり、行うには、壊れたクラスの問題があり、最終的に約3000、1508正常なクラスの写真、1432欠陥クラスの写真を取得するので、サンプルは比較的バランスが取れています。同じ戦略を使用して、トレーニングのためにresnet50を投入します。最終的に得られた精度情報:

その後、この実験の結果とデータセットに基づいています。ユーザーを助けるためにいくつかの訓練戦略を変更するために与えた、より強力なネットワークを変更し、それはユーザーの要件に達し、もちろん、これはカスタマイズされた分析のすべての結果であり、ここで詳細に展開しないか、または将来のブログで更新されます。

引用元のデータセット

Buerhop-Lutz, C.; Deitsch, S.; Maier, A.; Gallwitz, F.; Berger, S.; Doll, B.; Hauch, J.; Camus, C. & Brabec, C. J. A Benchmark for Visual Identification of Defective Solar Cell of Electroluminesence Imagery.European PV Solar Energy Conference and Exhibition , 2018. DOI: 10.4229/35thEUPVSEC20182018-.5CV.3.15

Read next

Androidチュートリアル - UIコントロール_AlertDialog

プロンプトボックスの形式で情報を表示するUIコントロールです。

Jan 23, 2021 · 2 min read