问题标签 [non-maximum-suppression]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
597 浏览

tensorflow - 形状必须为 2 级,但 NonMaxSuppressionV3 为 3 级:错误

我在视频对象检测时尝试使用 tf.image.non_max_suppression 时遇到此错误。TensorFlow 版本为 1.10.0

ValueError:形状必须是等级 2,但对于输入形状为 [1,500,4]、[1,500]、[]、[]、[] 的“non_max_suppression/NonMaxSuppressionV3”(操作:“NonMaxSuppressionV3”)是等级 3。

0 投票
0 回答
598 浏览

c - C中的非最大抑制

我试图在 C 中实现一个非最大抑制函数。

非最大值抑制是一种非线性滤波器,它抑制窗口中不是最大值的所有值。考虑具有以下值的 5 元素序列 w[n]:w[n] = [25 10 31 50 19]。窗口中的最大值为 50。应用非极大值抑制将产生以下输出:w'[n] = [0 0 0 50 0]。以下是我到目前为止的代码:

int height, width:它们是保存图像数据的双 *输入矩阵的高度和宽度。double *output 存储新值并显示新图像。H 和 W 是我要应用非最大抑制的窗口。

我在 HxW 窗口中找到最大值并将其分配给 r_max。但假设开始时 r_max 为 0。它在第一个索引中找到值,例如 4,在第二个索引中找到值,例如 6。现在我正在更新 r_max 但我如何使先前的索引(其值为 4)等于 0?我对如何跟踪以前的索引感到困惑。

如果需要,请要求任何澄清。谢谢你们!

0 投票
2 回答
306 浏览

python - 圆上的非最大值抑制

我已经使用边界圆检测到对象。如何对它们执行非最大抑制?我有矩形和圆形,我想以某种方式将圆形与圆形和矩形与矩形分开。我已经尝试过对矩形使用非最大抑制,但我不明白如何对圆形做同样的事情。

0 投票
1 回答
1616 浏览

python - 快速 NMS 算法抑制没有重叠的框

我正在测试Malisiewicz 等人的 Fast NMS 算法。我在运行示例时注意到,在一种情况下,如果我输入两个没有重叠的特定框,并且 IoU 阈值低于大约 0.75,则无论如何都会抑制一个框。

我误解了 NMS 吗?我认为如果它们之间的重叠为零,则不应丢弃任何框,无论 IoU 阈值设置在何处。

例子:

0 投票
0 回答
133 浏览

python - 在 Tensorflow 对象检测 API 中使用 core.post_processing.multiclass_non_max_suppression 的问题

我正在将 TensorFlow 对象检测 API 用于对象检测类。我在 core/post_processing.py 中找到了一个用于非最大抑制的函数,当我尝试使用它时,我会遇到以下错误。

文件“C:/tensorflow/models/research/object_detection/object_detection_image.py”,第 62 行,box_selection = post_processing.multiclass_non_max_suppression(detection_boxes, detection_scores, score_thresh=.8, iou_thresh=.5, max_size_per_class=0)

文件“C:\tensorflow\models\research\object_detection\core\post_processing.py”,第 92 行,在 multiclass_non_max_suppression raise ValueError('scores field must be of rank 2')

ValueError:分数字段必须为 2 级

如果我注释掉非最大抑制行,一切都会正常工作。这是代码:

可悲的是,我无法弄清楚如何解决这个问题。我使用了错误的输入吗?谁能帮我?

0 投票
0 回答
2042 浏览

python - 如何在 tensorflow 1.14 中对一批图像应用非最大抑制?

我有一批来自原始图像的裁剪图像,我必须在这些图像上执行对象检测,我正在尝试应用 tensorflow NMS 操作。

我查看了 tensorflow api docs,发现了tf.image.combined_non_max_suppression(),但我无法正确理解它。

我的管道中的流程分为两步。

  1. 我得到一些图像并应用对象检测来获得所需的感兴趣区域。
  2. 在这些 ROI 中的每一个上,我都必须再次应用对象检测,所以我将它作为批处理传递。

第一步,我使用 simpletf.image.non_max_suppression()后跟tf.gather(),但我不明白,如何进行第二步。

请参考以下代码片段:

但是当我尝试在上面运行时出现以下错误:

如何解决它并将 NMS 应用于 tensorflow 中的批量图像?

0 投票
0 回答
477 浏览

ios - Coremltools:不能在后续层中使用来自非最大抑制层的一些输出

编辑:似乎这是 Coremltools 中的一个错误。见这里: https ://github.com/apple/coremltools/issues/691#event-3295066804


一句话总结:非最大抑制层输出四个值,但我只能使用这四个值中的两个作为后续层的输入。

我正在使用 Apple 的 Core ML Tools 包构建神经网络模型,并且添加了一个非最大抑制 (NMS) 层。根据文档,该层有四个输出:

  • 输出1:box坐标,对应幸存的box。
  • 输出2:box scores,对应于幸存的boxes。
  • 输出 3:幸存框的索引。[这是我想在后续层中使用的输出]
  • 输出4:NMS算法后选中的框数

我用一些简单的输入建立了一个测试模型,NMS 层正确地返回了上面列出的四个输出中的每一个的预期值。如果我随后在后续层中使用 output#1 或 output#2,那么我这样做没有问题。但是,如果我尝试在后续层中使用 output#3 或 output#4,我会收到一条错误消息,指出输入“在前面层的任何输出中都找不到”。

Jupyter 笔记本

复制此问题的最简单方法是下载并浏览此Jupyter Notebook

或者,下面的示例代码也解决了我遇到的问题。

示例代码

我设置了一些示例输入数据,如下所示:

我已经建立了如下测试模型:

此时,当我调用

一切都按预期工作。

例如,如果我调用print(output['surviving_indices'],结果是[[ 0. 2. -1.]](如预期的那样)。

但是,我无法使用surviving_indicesbox_count输出作为后续层的输入。例如,如果我添加一个线性激活层(通过取消注释上面的块),我会得到以下错误:

如果我使用box_count输出(即通过input_name="box_count"add_activation图层中设置),我也会遇到同样的问题。

我知道 NMS 层正确返回了名为surviving_indicesand的输出box_count,因为当我调用时,print(builder.spec.neuralNetwork.layers[0])我得到以下结果:

此外,如果我使用nms_coordsnms_scores输出作为线性激活层的输入,我没有任何问题。它将正确输出 NMS 层输出中未修改的nms_coordsnms_scores值。

我对为什么 NMS 层正确输出我想要的内容感到困惑,但是我无法在后续层中使用这些输出。

0 投票
0 回答
374 浏览

python - OpenVino 模型在加载网络后崩溃

我使用将 onnx 模型转换为 IR

这一步工作正常,但是当我尝试加载网络时,它给了我以下错误。

File "ie_api.pyx", line 1170, in openvino.inference_engine.ie_api.IENetwork.layers.__get__ ValueError: get_shape was called on a descriptor::Tensor with dynamic shape

我能够成功运行相同的模型减去最后一个 NMS 层。不知道为什么这会失败。在 netron 上查看 IR xml 文件并没有显示任何内容。

导致麻烦的整个层描述:

从 IR 中移除输出层会使事情正常工作。

0 投票
1 回答
52 浏览

python - 计算矩形面积加一

以上是在下面两个不同的链接中计算非最大抑制的矩形面积的用途,为什么需要加一?

https://github.com/amusi/Non-Maximum-Suppression/blob/master/nms.py https://www.pyimagesearch.com/2014/11/17/non-maximum-suppression-object-detection-python /

0 投票
2 回答
414 浏览

tensorflow2.0 - Yolov3 到 Tensorrt:tf-keras Lambda 层的自定义插件

我使用这个 repo 在 Tensorflow 2.0 中训练了一个 yolov3-tiny 模型:https ://github.com/zzh8829/yolov3-tf2

在推理时,该模型使用两个包裹在 tf-keras lambda 层中的函数进行后处理,它们是:

  • yolo_boxes :根据模型输出的偏移量计算实际的盒子坐标
  • yolo_nms :使用 tf.image.combined_non_max_suppression 进行非最大抑制

boxes_0 = Lambda(lambda x: yolo_boxes(x, anchors[masks[0]], classes),name='yolo_boxes_0')(output_0)

boxes_1 = Lambda(lambda x: yolo_boxes(x, anchors[masks[1]], classes),name='yolo_boxes_1')(output_1)

outputs = Lambda(lambda x: yolo_nms(x, anchors, masks, classes),name='yolo_nms')((boxes_0[:3], boxes_1[:3]))

我已经创建了这个推理模型的冻结 pb,并将其转换为 ONNX。但我无法弄清楚如何进行。如何为 yolo_boxes 创建 python Tensorrt 插件?我在网上找不到任何 Lambda 层插件的材料,并且如果没有 yolo_boxes 插件,我无法测试 tensorrts 自定义 NMS 插件。