Machine learning 减少误报的最佳策略:谷歌&x27;s新的卫星图像目标检测API
我正在建立一个新的系统,在大面积的卫星图像中寻找小物体。它工作得很好-它找到了我想要的所有10个对象,但我也得到了50-100个误报(看起来有点像目标对象,但不是) 我使用的是,来微调他们提供的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)。我训练直到我的精度和损耗曲线稳定 我对使用深度学习进行目标检测还比较陌生。提高精度
更快的\u rcnn\u resnet101\u coco
模型。我一开始很小,只有100个对象的训练示例(只有一个类)。我的验证集中有50个示例。每个示例都是一个200x200像素的图像,中间有一个标记对象(~40x40)。我训练直到我的精度和损耗曲线稳定
我对使用深度学习进行目标检测还比较陌生。提高精度的最佳策略是什么?e、 g.硬负开采?增加我的训练数据集大小?我还没有尝试过他们提供的最精确的模型,因为我想保持一定的速度,但如果需要,我会这样做
硬负开采似乎是一个合乎逻辑的步骤。如果您同意,我如何实现它w.r.t为我的培训数据集设置tfrecord文件?假设我为50-100个误报中的每一个生成200x200个图像:
- 我是否为每个对象创建“注释”xml文件,而不使用“对象”元素
- …还是我把这些硬底片列为第二类
- 如果我的训练集中有100对100的否定-这是一个健康的比率吗?我可以包括多少张底片
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没有发生 所以我发现,在这个场景中,我必须在没有磁带的情况下传递图像,这样才能区分磁带和没有磁带 我考虑了两种实验选择,并试图解决这种行为: