- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在设置新的 Tensorflow Object Detection API在大面积的卫星图像中寻找小物体。它工作得很好 - 它找到了我想要的所有 10 个对象,但我也得到了 50-100 个误报 [看起来有点像目标对象,但事实并非如此]。
我正在使用sample config来自'pets' tutorial ,微调他们提供的 faster_rcnn_resnet101_coco
模型。我从小规模开始,只有 100 个对象的训练示例(仅 1 个类)。我的验证集中有 50 个示例。每个示例都是一个 200x200 像素图像,中心有一个标记对象 (~40x40)。我训练直到我的精度和损失曲线达到稳定水平。
我对使用深度学习进行对象检测还比较陌生。提高精确度的最佳策略是什么?例如硬负挖矿?增加我的训练数据集大小?我还没有尝试过他们提供的最准确的模型 faster_rcnn_inception_resnet_v2_atrous_coco
,因为我想保持一定的速度,但如果需要的话我会这样做。
硬阴性挖掘似乎是一个合乎逻辑的步骤。如果您同意,我如何实现它并为我的训练数据集设置 tfrecord 文件?假设我为 50-100 个误报中的每一个制作了 200x200 的图像:
最佳答案
我最近在工作中重新审视了这个主题,并认为我会为将来访问的任何人更新我当前的学习内容。
该主题出现在 Tensorflow's Models repo issue tracker 。 SSD 允许您设置要挖掘的负例与正例的比例 (max_males_per_positive: 3
),但您也可以为没有正例的图像设置最小数量 (min_males_per_image: 3
)。这两个都在 model-ssd-loss 配置部分中定义。
也就是说,我在 Faster-RCNN 的模型配置中没有看到相同的选项。问题中提到 models/research/object_detection/core/balanced_positive_negative_sampler.py
包含用于 Faster-RCNN 的代码。
本期讨论的另一个选项是专门为相似者创建第二个类。在训练期间,模型将尝试学习类别差异,这将有助于实现您的目的。
最后,我发现了这个article关于滤波器放大器网络 (FAN) 的信息可能会为您的航空图像工作提供信息。
================================================== ===================
以下论文描述了与您描述的相同目的的硬负挖掘: Training Region-based Object Detectors with Online Hard Example Mining
在第 3.1 节中,他们描述了使用前台和后台类:
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.
事实上这篇论文被引用,其思想被用在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 中即可。
关于machine-learning - 减少误报的最佳策略 : Google's new Object Detection API on Satellite Imagery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45666499/
我知道它们是匿名类型,但我不明白 Razor 语法。在一些文档中,我找到了这样的示例: @Html.Label("Hello", new { htmlAtributes = new { id = "h
关于:new Object(new Array()) 有一个相当基本的问题,我自己确实无法给出答案,我正在寻求建议: 在js中实例化对象时使用如下方法: var obj = new Object();
在eclipse中右击项目时,“新建文件夹”、“新建源文件夹”和“新建包”有什么区别?他们似乎都在做同样的事情,引用文献并没有说太多。 谢谢 最佳答案 新建文件夹 在项目中创建一个新文件夹。 新建源文
几天来我一直在测试 bolt-cms,我试图了解它是如何工作的。 我想知道新页面、新条目和新展示柜之间有什么区别。 我已阅读 this它并没有填补空白。 最佳答案 Pages、Entries 和 Sh
更新:感谢所有的回答。我发现的最干净的解决方案是这个: if ( k(Arrays.asList(new LinkedList<>())); 我有一个递归方法,可以从列表中生成所有“n 选 k”组合。
我现在想知道这些指令是如何分配内存的。 例如,如果我得到代码怎么办: x = new int[5]; y = new int[5]; 如果分配了这些,它在 RAM 中的实际情况如何?是为每个变量保留整
我希望将其写入output.txt而不清除它 - 只是附加到末尾。但是,当我使用以下两种方法时: public void addEmails(ArrayList emails){ for (i
我正在分配内存,稍后将用于构造具有放置 new 的对象。我应该使用 operator new(n),还是应该使用 new unsigned char[n]?为什么? 最佳答案 因素: new[] 必须
基本上,我的问题是以下代码是否有效。 void* mem = operator new(sizeof(T)); T* instance = new(mem) T; delete instance; 如
很抱歉,如果之前有人问过这个问题,但我想就以下两种用法之间的区别提供一个简明的答案。 VS 似乎将它们都接受为有效代码。 private static void doSomeWork() { /
请告诉我这段代码在做什么,它是否创建多维数组(我认为不是)? 代码片段.. var hanoi_peg = new Array( new Array( 5, 4, 3, 2, 1,
这个问题在这里已经有了答案: String intern() behaviour (4 个答案) When should we use intern method of String on Stri
许多人说您应该避免使用 new Object、new Array(),而是使用 {}。 [] 和真/假。 使用字面量构造来获取对象或数组的新实例而不是使用 new 有什么好处?我知道 Crockfor
我正在开发一个存在内存泄漏的开源库。该库是围绕 boost::asio 构建的数据流服务。服务器端使用堆内存管理系统,该系统提供内存以容纳有限数量的 samples,同时它们等待通过 tcp 连接被推
我从以下函数中得到内存泄漏: int ReadWrite(int socket, char *readfile) { FILE *rf = NULL; rf = fopen(readfile,
在考虑类似的事情时 auto x = new T; 标准是否强制要求内存必须来自operator new——类特定的还是全局的?也就是说,如果缺少特定于类的 operator new,则没有办法从除全
只是出于好奇:为什么 C++ 选择 a = new A 而不是 a = A.new 作为实例化对象的方式?后者不是更像是面向对象的吗? 最佳答案 Just out of curiosity: Why
考虑以下代码: typedef SomeType type_t[2]; SomeType * arr1 = new type_t; //new or new[] ??? type_t * arr2
这个问题在这里已经有了答案: Difference between 'new operator' and 'operator new'? (8 个答案) 关闭 8 年前。 面试题:"new"运算符和
我正在为一个应用程序设计界面,以在 TableLayout 中显示从数据库中提取的一些数据。现在,默认 View 是纵向的,它由一个下拉菜单和一个三列的表格组成。当用户切换到横向时,微调器及其选项可以
我是一名优秀的程序员,十分优秀!