实现MaskRCNN NMS部分

时间:2017-10-30 16:47:14

标签: halide

我是Halide的首发,我正在尝试用它来加速maskrcnn。

到目前为止,与c版相比,性能非常出色。然后,我遇到了困扰我几天的问题:   非最大抑制(nms),这是一个经典的算法,但我没有在卤化物中找到任何类似的例子,摘要是:

首先对数组框进行排序,然后对于每个i框,从i + 1到此数组的末尾,用box [i]计算重叠,然后保留或根据重叠删除它。   是否有可能在卤化物中实现它?我必须使用define :: extern吗?   如果有人可以回复,那就很多了。

更新

很抱歉,我没有很好地解释这个问题。 MaskRcnn中的非最大抑制与Canny边缘检测器中的非最大抑制略有不同,您可以参考:

https://www.pyimagesearch.com/2015/02/16/faster-non-maximum-suppression-python/

其中python代码是这种算法的实现。

如果时间太长,请考虑一下这个简单的问题:

对于数组a [10] = {1,2,3,4,5,6,7,8,9,10},我们需要计算a [i]和[j]之间的乘积( i + 1< = j< 10),如果该乘积值小于6(例如),则我们删除a [j],对范围[0,9]中的所有i迭代该操作。 谢谢。

1 个答案:

答案 0 :(得分:0)

WRT非最大抑制:快速浏览一下维基百科和这个演示文稿(http://www.inf.u-szeged.hu/ssip/2003/lectures/chetverikov/edge_detection.pdf)让我对算法的作用有了一些了解。我不知道如何确定边缘方向,但我认为这可能会有所帮助:

假设一个简单的滤波器(x +/- 1,y +/- 1),Halide可以使用RDom找到该组值的最大值。调用结果MAX。使用MAX创建系数过滤器 - 过滤器为1和0。将系数乘以原始矩阵,您应该具有非最小抑制。

系数滤波器可以使用max((signed)(像素 - (MAX - 1)),0)创建,其中像素值是无符号的。基本上,使用无符号减法和饱和从原始值中减去MAX-1。过滤器的结果是1和0的数组。

正如您所看到的,在Halide中创建此类算法并不是特别困难;实际上,更难以理清像"重叠"这样的术语的含义。希望这会让你知道如何继续。

祝你好运, -Phil