Machine learning 减少误报的最佳策略:谷歌&x27;s新的卫星图像目标检测API

Machine learning 减少误报的最佳策略:谷歌&x27;s新的卫星图像目标检测API,machine-learning,tensorflow,computer-vision,deep-learning,object-detection,Machine Learning,Tensorflow,Computer Vision,Deep Learning,Object Detection,我正在建立一个新的系统,在大面积的卫星图像中寻找小物体。它工作得很好-它找到了我想要的所有10个对象,但我也得到了50-100个误报(看起来有点像目标对象,但不是) 我使用的是,来微调他们提供的更快的\u rcnn\u resnet101\u coco模型。我一开始很小,只有100个对象的训练示例(只有一个类)。我的验证集中有50个示例。每个示例都是一个200x200像素的图像,中间有一个标记对象(~40x40)。我训练直到我的精度和损耗曲线稳定 我对使用深度学习进行目标检测还比较陌生。提高精度

我正在建立一个新的系统,在大面积的卫星图像中寻找小物体。它工作得很好-它找到了我想要的所有10个对象,但我也得到了50-100个误报(看起来有点像目标对象,但不是)

我使用的是,来微调他们提供的
更快的\u rcnn\u resnet101\u coco
模型。我一开始很小,只有100个对象的训练示例(只有一个类)。我的验证集中有50个示例。每个示例都是一个200x200像素的图像,中间有一个标记对象(~40x40)。我训练直到我的精度和损耗曲线稳定

我对使用深度学习进行目标检测还比较陌生。提高精度的最佳策略是什么?e、 g.硬负开采?增加我的训练数据集大小?我还没有尝试过他们提供的最精确的模型,因为我想保持一定的速度,但如果需要,我会这样做

硬负开采似乎是一个合乎逻辑的步骤。如果您同意,我如何实现它w.r.t为我的培训数据集设置tfrecord文件?假设我为50-100个误报中的每一个生成200x200个图像:

  • 我是否为每个对象创建“注释”xml文件,而不使用“对象”元素
  • …还是我把这些硬底片列为第二类
  • 如果我的训练集中有100对100的否定-这是一个健康的比率吗?我可以包括多少张底片

最近,我在工作中重新探讨了这个话题,并认为我将为将来访问的任何人更新我当前的学习内容。

这个话题出现在电视上。SSD允许您设置负面:正面示例与我的比例(
max\u negatives\u per\u positive:3
),但您也可以为没有帖子的图像设置最小数量(
min\u negatives\u per\u image:3
)。这两个都在型号ssd丢失配置部分中定义

也就是说,我在Faster RCNN的模型配置中看不到相同的选项。本期中提到,
models/research/object\u detection/core/balanced\u positive\u negative\u sampler.py
包含用于更快RCNN的代码

本期讨论的另一个选项是专门为lookalikes创建第二个类。在培训期间,该模型将尝试学习班级差异,这将有助于达到您的目的

最后,我在滤波放大器网络(FAN)上遇到了这个问题,它可能会为您的航空图像工作提供信息

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

以下文件描述了硬负开采,目的与您描述的相同:

在第3.1节中,它们描述了使用前景和背景类:

背景ROI。如果某个区域的最大值为,则该区域被标记为背景(bg) 带地面真相的借据在区间[bg lo,0.5]。较低 FRCN和SPPnet均使用bg lo=0.1的阈值,并且 在[14]中假设为粗略近似硬负开采 假设与地面真相有一些重叠的区域是 更可能是令人困惑或难以理解的问题。我们将在第5.4节中介绍 虽然这种启发式有助于收敛和检测精度, 它是次优的,因为它忽略了一些不常见但重要的, 困难的背景区域。我们的方法去除了bg lo阈值

事实上,这篇论文被引用,其思想被用于Tensorflow的硬采矿的object detection 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之类的工具)就足以让train算法在相同的图像中找到硬负片。相关的问题给出了一个极好的答案


如果您想输入没有真实正面信息的数据(即图像中不应分类),只需将负面图像添加到您的tfrecord中,而不使用边界框。

我想我正在经历相同或相近的场景,值得与您分享

我通过向培训师传递没有注释的图像来解决这个问题

在我的场景中,我正在构建一个项目来实时检测客户产品中的装配故障。 我成功地实现了非常稳健的结果(对于生产环境),方法是对具有明显负面模式的组件(例如,有拧上/拧下的螺钉(仅孔))使用检测+分类,并且仅检测没有负面模式的东西(例如,可以放在任何地方的胶带)

在系统上,用户必须录制2个视频,一个包含正面场景,另一个包含负面场景(或者n个视频,包含n个正面和负面模式,以便算法可以推广)

经过一段时间的测试,我发现,如果我只注册检测磁带,检测器会对磁带进行非常有把握的(0.999)假阳性检测。它是在学习磁带插入的模式,而不是磁带本身。当我有另一个组件时(像螺丝钉一样,它的负片格式)我在传递磁带的负模式时没有明确意识到,所以FPs没有发生

所以我发现,在这个场景中,我必须在没有磁带的情况下传递图像,这样才能区分磁带和没有磁带

我考虑了两种实验选择,并试图解决这种行为:

  • 火车经过大量没有任何注释的图像(占我所有负片样本的10%)以及所有有真实注释的图像
  • 在我没有注释的图像上