web-dev-qa-db-ja.com

誤検知を減らすための最善の戦略:衛星画像に関するGoogleの新しいオブジェクト検出API

新しい Tensorflow Object Detection API を設定して、衛星画像の広い領域で小さなオブジェクトを見つけています。それは非常にうまく機能します-必要な10個のオブジェクトをすべて検出しますが、50〜100個の誤検出も発生します[ターゲットオブジェクトに少し似ているが、そうではないもの]。

'pets' tutorialsample config を使用して、faster_rcnn_resnet101_coco彼らが提供するモデル。私は小さなものから始めました。私のオブジェクトのトレーニング例はたった100個(1クラスのみ)です。検証セットの50の例。それぞれの例は、中央にラベル付きオブジェクト(〜40x40)が付いた200x200ピクセルの画像です。精度と損失曲線がプラトーになるまでトレーニングします。

オブジェクト検出にディープラーニングを使用するのは比較的新しいです。精度を上げるための最良の戦略は何ですか?例えばハードネガティブマイニング?トレーニングデータセットのサイズを増やしますか?私はまだ彼らが提供する最も正確なモデルを試していないfaster_rcnn_inception_resnet_v2_atrous_coco私はある程度の速度を維持したいのですが、必要に応じてそうします。

ハードネガティブマイニングは論理的なステップのようです。同意する場合、トレーニングデータセットのtfrecordファイルを設定してw.r.tを実装するにはどうすればよいですか? 50〜100個の誤検出ごとに200x200の画像を作成するとします。

  • 「object」要素なしで、それぞれに「注釈」xmlファイルを作成しますか?
  • ...またはこれらのハードネガを2番目のクラスとしてラベル付けしますか?
  • その後、トレーニングセットに100のネガと100のポジティブがあれば、それは健全な比率ですか?いくつのネガを含めることができますか?
18
christian

仕事で最近このトピックを再訪し、将来訪問する人のために現在の学習で更新すると思いました。

このトピックは Tensorflowのモデルリポジトリの問題追跡ツール に登場しました。 SSDを使用すると、マイニングするネガティブ:ポジティブなサンプルの数の比率を設定できます(max_negatives_per_positive: 3)。ただし、ポジティブな画像のない最小数を設定することもできます(min_negatives_per_image: 3)。これらは両方とも、model-ssd-loss configセクションで定義されています。

とは言っても、Faster-RCNNのモデル構成には同じオプションがありません。この問題では、models/research/object_detection/core/balanced_positive_negative_sampler.pyには、Faster-RCNNに使用されるコードが含まれています。

この問題で説明されている他のオプションの1つは、lookalikes専用の2番目のクラスを作成することです。トレーニング中、モデルは目的に役立つクラスの違いを学習しようとします。

最後に、私はこれに遭遇しました 記事 フィルターアンプネットワーク(FAN)で、航空写真の作業に役立つかもしれません。

================================================= =================

次のペーパーでは、説明したのと同じ目的でのハードネガティブマイニングについて説明します。 オンラインハードサンプルマイニングによる地域ベースのオブジェクト検出器のトレーニング

セクション3.1では、フォアグラウンドクラスとバックグラウンドクラスの使用について説明します。

バックグラウンドRoI。グラウンドトゥルースの最大IoUが区間[bg lo、0.5)にある場合、領域は背景(bg)とラベル付けされます。下限しきい値bg lo = 0.1はFRCNとSPPnetの両方で使用され、[14]でハードネガティブマイニングを大まかに近似すると仮定されています。前提は、グラウンドトゥルースと一部重複している領域は、混乱または困難な領域である可能性が高いということです。セクション5.4では、このヒューリスティックは収束と検出の精度に役立ちますが、まれではあるが重要な困難な背景領域を無視するため、最適ではないことを示します。このメソッドは、bg loしきい値を削除します。

実際、このペーパーは参照され、そのアイデアはハードマイニング用のTensorflowのオブジェクト検出loss.pyコードで使用されています。

class HardExampleMiner(object):
"""Hard example mining for regions in a list of images.
Implements hard example mining to select a subset of regions to be
back-propagated. For each image, selects the regions with highest losses,
subject to the condition that a newly selected region cannot have
an IOU > iou_threshold with any of the previously selected regions.
This can be achieved by re-using a greedy non-maximum suppression algorithm.
A constraint on the number of negatives mined per positive region can also be
enforced.
Reference papers: "Training Region-based Object Detectors with Online
Hard Example Mining" (CVPR 2016) by Srivastava et al., and
"SSD: Single Shot MultiBox Detector" (ECCV 2016) by Liu et al.
"""

モデル構成ファイルに基づいて、HardMinerObjectは次のコードでloss_builder.pyによって返されます。

def build_hard_example_miner(config,
                            classification_weight,
                            localization_weight):
"""Builds hard example miner based on the config.
Args:
    config: A losses_pb2.HardExampleMiner object.
    classification_weight: Classification loss weight.
    localization_weight: Localization loss weight.
Returns:
    Hard example miner.
"""
loss_type = None
if config.loss_type == losses_pb2.HardExampleMiner.BOTH:
    loss_type = 'both'
if config.loss_type == losses_pb2.HardExampleMiner.CLASSIFICATION:
    loss_type = 'cls'
if config.loss_type == losses_pb2.HardExampleMiner.LOCALIZATION:
    loss_type = 'loc'

max_negatives_per_positive = None
num_hard_examples = None
if config.max_negatives_per_positive > 0:
    max_negatives_per_positive = config.max_negatives_per_positive
if config.num_hard_examples > 0:
    num_hard_examples = config.num_hard_examples
hard_example_miner = losses.HardExampleMiner(
    num_hard_examples=num_hard_examples,
    iou_threshold=config.iou_threshold,
    loss_type=loss_type,
    cls_loss_weight=classification_weight,
    loc_loss_weight=localization_weight,
    max_negatives_per_positive=max_negatives_per_positive,
    min_negatives_per_image=config.min_negatives_per_image)
return hard_example_miner

model_builder.pyによって返され、train.pyによって呼び出されます。したがって、基本的には、LabelImgやRectLabelなどのツールを使用して真のポジティブラベルを生成するだけで、同じ画像内でハードネガを見つけるのに十分なはずです。関連する質問は、優れた walkthrough を提供します。

真のポジティブを持たない(つまり、画像に何も分類されるべきではない)データをフィードする場合は、境界ボックスなしでネガティブイメージをtfrecordに追加するだけです。

12
Tyler