我正在使用更快的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、分数和 bbox 生成为包含 80000 个元素的数组 - 只有前 ~10 个是有用的,其余的得分为 -1。我后来尝试使用 asnumpy(( 将这些数组转换为 numpy 数组,但是,mxnet 使用异步引擎,此函数必须等待计算结束才能执行。80000 个元素的计算需要更长的时间(5 秒 +(,因此我正在尝试减小数组大小(SSD 模型输出大约 6000 个元素并且速度更快(。
如果您有关于如何使 .asnumpy(( 更快的其他解决方案,这些也受到欢迎 - 基本上,一次图像需要 5 秒,这似乎不合理,所以我正在寻找它减少到 ~0.2s(这似乎更合适吧?
谢谢!
您可以通过更改非最大抑制参数来减少检测到的对象的最大数量。请参阅post_nms
和set_nms
。当您减少此值时,您将获得更少的对象填充(即 -1s(,但您也可能错过包含大量对象的图像中的对象。
net.set_nms(nms_thresh=0.5, nms_topk=50)
我不认为这会增加整体吞吐量,因为绝大多数计算都是在 NMS 之前执行的。如果需要低延迟和高吞吐量,我建议您查看其他架构。 就mAP而言,与FasterRCNN相比,yolo3_darknet53_coco 3 (608x608)
并不远,但吞吐量要好得多(~10倍(。