减少fasterRCNN数组输出的大小,使用Gluon、python

Posted

技术标签:

【中文标题】减少fasterRCNN数组输出的大小,使用Gluon、python【英文标题】:Reduce the size of fasterRCNN array output, using Gluon, python 【发布时间】:2019-12-27 23:19:09 【问题描述】:

我正在使用更快的 rcnn 模型来运行一些对象检测。我使用的包装器是胶子,代码如下:

net = model_zoo.get_model('faster_rcnn_resnet50_v1b_coco', pretrained=True)

im_fname = utils.download('https://github.com/dmlc/web-data/blob/master/' +
                      'gluoncv/detection/biking.jpg?raw=true',
                      path='biking.jpg')
x, orig_img = data.transforms.presets.rcnn.load_test(im_fname)

box_ids, scores, bboxes = net(x)

我的问题是,是否可以减小 net(x) 返回的数组的大小,从而有效地加快计算速度?

问题在于模型将 box_ids、scores 和 bboxes 生成为具有 80000 个元素的数组 - 只有前 10 个元素有用,其余的得分为 -1。我稍后尝试使用 asnumpy() 将这些数组转换为 numpy 数组,但是,mxnet 使用异步引擎,并且该函数必须等待计算结束才能执行。 80000 个元素的计算需要更长的时间(5 秒 +),因此我试图减小数组大小(SSD 模型输出大约 6000 个元素并且速度更快)。

如果您有其他关于如何使 .asnumpy() 更快的解决方案,也欢迎使用这些解决方案 - 基本上,一张图像的传递需要 5 秒,这似乎不合理,所以我正在寻找将它减少到 ~0.2s (这似乎更合适吧?)

谢谢!

【问题讨论】:

您能否分析此代码以查看瓶颈发生在哪里?如果可能的话,只需索引输出以获取顶部并使用压缩格式(如bcolz)保存到磁盘 【参考方案1】:

您可以通过更改非最大抑制参数来减少检测到的对象的最大数量。请参阅 post_nmsset_nms。当您减少此值时,您将获得更少的对象填充(即 -1s),但您也可能会错过具有大量对象的图像中的对象。

net.set_nms(nms_thresh=0.5, nms_topk=50)

我认为这不会增加整体吞吐量,因为绝大多数计算都是在 NMS 之前执行的。如果需要低延迟和高吞吐量,我建议您查看其他架构。 yolo3_darknet53_coco 3 (608x608) 在 mAP 方面与 FasterRCNN 相比相差不远,但吞吐量要好得多(~10 倍)。

【讨论】:

以上是关于减少fasterRCNN数组输出的大小,使用Gluon、python的主要内容,如果未能解决你的问题,请参考以下文章

PyTorch 和 TorchVision FasterRCNN 解释 C++ GenericDict 中的输出

implode 多维数组转一维数组并字符串输出

fasterrcnn病灶识别

减少包含用于前端的 numpy 数组的编码 Python dict 的大小

减少 Java 堆大小

c++ 使用数组减少内存