NMS和roi pooling的各种实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zjucor/article/details/88567065

NMS:

方法1:纯python语言实现:简介方便、速度慢

方法2:直接利用Cython模块编译

方法3:先将全部变量定义为静态类型,再利用Cython模块编译

方法4:在方法3的基础上再加入cuda加速模块, 再利用Cython模块编译,即利用gpu加速

ref:https://www.cnblogs.com/king-lps/p/9031568.html

roi pooling(以pytorch框架为例):

Faster-RCNN论文中在RoI-Head网络中,将128个RoI区域对应的feature map进行截取,而后利用RoI pooling层输出7*7大小的feature map。在pytorch中可以利用:

  • torch.nn.functional.adaptive_max_pool2d(input, output_size, return_indices=False)
  • torch.nn.AdaptiveMaxPool2d(output_size, return_indices=False)

这个函数很方便调用,但是这个实现有个缺点,就是慢。

所以有许多其他不同的实现方式,借鉴其他人的实现方法,这里借鉴github做一个更加丰富对比实验。总共有4种方法:

方法1. 利用cffi进行C扩展实现,然后利用Pytorch调用:需要单独的 C 和 CUDA 源文件,还需要事先进行编译,不但过程比较繁琐,代码结构也稍显凌乱。对于一些简单的 CUDA 扩展(代码量不大,没有复杂的库依赖),显得不够友好。

方法2.利用Cupy实现在线编译,直接为 pytorch 提供 CUDA 扩展(当然,也可以是纯 C 的扩展)。Cupy实现了在cuda上兼容numpy格式的多维数组。GPU加速的矩阵运算,而Numpy并没有利用GPU。Cupy目前已脱离chainer成为一个独立的库。

方法3.利用chainer实现,相较其他深度学习框架来说,chainer知名度不够高,但是是一款非常优秀的深度学习框架,纯python实现,设计思想简洁,语法简单。chainer中的GPU加速也是通过Cupy实现的。此外,chainer还有其他附加包,例如ChainerCV,其中便有对Faster-RCNN、SSD等网络的实现。

方法4.利用Pytorch实现,也就是文章伊始给出的两个函数

从方法1至方法4,实现过程越来越简单,所以速度越来越慢

ref:https://www.cnblogs.com/king-lps/p/9026798.html

猜你喜欢

转载自blog.csdn.net/zjucor/article/details/88567065