Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Best strategy to reduce false positives: Google's new Object Detection API on Satellite Imagery

Tags:

I'm setting up the new Tensorflow Object Detection API to find small objects in large areas of satellite imagery. It works quite well - it finds all 10 objects I want, but I also get 50-100 false positives [things that look a little like the target object, but aren't].

I'm using the sample config from the 'pets' tutorial, to fine-tune the faster_rcnn_resnet101_coco model they offer. I've started small, with only 100 training examples of my objects (just 1 class). 50 examples in my validation set. Each example is a 200x200 pixel image with a labeled object (~40x40) in the center. I train until my precision & loss curves plateau.

I'm relatively new to using deep learning for object detection. What is the best strategy to increase my precision? e.g. Hard-negative mining? Increase my training dataset size? I've yet to try the most accurate model they offer faster_rcnn_inception_resnet_v2_atrous_coco as i'd like to maintain some speed, but will do so if needed.

Hard-negative mining seems to be a logical step. If you agree, how do I implement it w.r.t setting up the tfrecord file for my training dataset? Let's say I make 200x200 images for each of the 50-100 false positives:

  • Do I create 'annotation' xml files for each, with no 'object' element?
  • ...or do I label these hard negatives as a second class?
  • If I then have 100 negatives to 100 positives in my training set - is that a healthy ratio? How many negatives can I include?
like image 620
christian Avatar asked Aug 14 '17 01:08

christian


People also ask

How do you reduce false positive in object detection?

False Positive is reduced by training on weakly labelled negative samples. Negative examples are also used in Contrastive Learning type unsupervised methods. Where distance between positive and negative images are increased in the latent space [12].

How do you reduce false positive in YOLOv5?

To achieve a robust YOLOv5 model, it is recommended to train with over 1500 images per class, and more then 10,000 instances per class. It is also recommended to add up to 10% background images, to reduce false-positives errors.

How can we reduce false positives in deep learning?

Machine learning systems help to reduce false positive rates in the following ways: Structuring data: False positive remediation involves the analysis of vast amounts of unstructured data, drawn from external sources such as media outlets, social networks, and other public and private records.

What is object detection API?

The TensorFlow object detection API is the framework for creating a deep learning network that solves object detection problems. There are already pretrained models in their framework which they refer to as Model Zoo.


1 Answers

I've revisited this topic recently in my work and thought I'd update with my current learnings for any who visit in the future.

The topic appeared on Tensorflow's Models repo issue tracker. SSD allows you to set the ratio of how many negative:postive examples to mine (max_negatives_per_positive: 3), but you can also set a minimum number for images with no postives (min_negatives_per_image: 3). Both of these are defined in the model-ssd-loss config section.

That said, I don't see the same option in Faster-RCNN's model configuration. It's mentioned in the issue that models/research/object_detection/core/balanced_positive_negative_sampler.py contains the code used for Faster-RCNN.

One other option discussed in the issue is creating a second class specifically for lookalikes. During training, the model will attempt to learn class differences which should help serve your purpose.

Lastly, I came across this article on Filter Amplifier Networks (FAN) that may be informative for your work on aerial imagery.

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

The following paper describes hard negative mining for the same purpose you describe: Training Region-based Object Detectors with Online Hard Example Mining

In section 3.1 they describe using a foreground and background class:

Background RoIs. A region is labeled background (bg) if its maximum IoU with ground truth is in the interval [bg lo, 0.5). A lower threshold of bg lo = 0.1 is used by both FRCN and SPPnet, and is hypothesized in [14] to crudely approximate hard negative mining; the assumption is that regions with some overlap with the ground truth are more likely to be the confusing or hard ones. We show in Section 5.4 that although this heuristic helps convergence and detection accuracy, it is suboptimal because it ignores some infrequent, but important, difficult background regions. Our method removes the bg lo threshold.

In fact this paper is referenced and its ideas are used in Tensorflow's object detection losses.py code for hard mining:

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. """ 

Based on your model config file, the HardMinerObject is returned by losses_builder.py in this bit of code:

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 

which is returned by model_builder.py and called by train.py. So basically, it seems to me that simply generating your true positive labels (with a tool like LabelImg or RectLabel) should be enough for the train algorithm to find hard negatives within the same images. The related question gives an excellent walkthrough.

In the event you want to feed in data that has no true positives (i.e. nothing should be classified in the image), just add the negative image to your tfrecord with no bounding boxes.

like image 63
Tyler Avatar answered Oct 21 '22 00:10

Tyler