使用 Fast/Faster-RCNN 在 C++ 上制作对象检测器的最简单方法是啥?

Posted

技术标签:

【中文标题】使用 Fast/Faster-RCNN 在 C++ 上制作对象检测器的最简单方法是啥?【英文标题】:What is the simplest way to make object detector on C++ with Fast/Faster-RCNN?使用 Fast/Faster-RCNN 在 C++ 上制作对象检测器的最简单方法是什么? 【发布时间】:2016-08-09 06:28:40 【问题描述】:

在 C++ 上使用 Fast/Faster-RCNN 和 Caffe 制作对象检测器的最简单方法是什么?

众所周知,我们可以在 Caffe 中使用 follow RCNN(基于区域的卷积神经网络):

RCNN:https://github.com/BVLC/caffe/blob/be163be0ea5befada208dbf0db29e6fa5811dc86/python/caffe/detector.py#L174

快速 RCNN:https://github.com/rbgirshick/fast-rcnn/blob/master/tools/demo.py#L89

scores, boxes = im_detect(net, im, obj_proposals) 调用def im_detect(net, im, boxes):

为此使用了rbgirshick/caffe-fast-rcnn,ROIPooling-layers 和输出bbox_pred

更快的 RCNN:https://github.com/rbgirshick/py-faster-rcnn/blob/master/tools/demo.py#L82

scores, boxes = im_detect(net, im) 调用def im_detect(net, im, boxes=None):

为此使用了rbgirshick/caffe-fast-rcnn,ROIPooling-layers 和输出bbox_pred

所有这些都使用 Python 和 Caffe,但是如何在 C++ 和 Caffe 上实现呢?

只有 C++ 示例用于分类(说明图像上的内容),但没有用于检测(说明图像上的内容和位置):https://github.com/BVLC/caffe/tree/master/examples/cpp_classification

简单地克隆rbgirshick/py-faster-rcnn 存储库是否足够 rbgirshick/caffe-fast-rcnn,下载pre-tained模型./data/scripts/fetch_faster_rcnn_models.sh,使用这个coco/VGG16/faster_rcnn_end2end/test.prototxt并在CaffeNet C++ Classification example做一个小改动?

我如何从bbox_pred 和cls_score 两层获取输出数据?

我会将所有 (bbox_pred & cls_score) 放在一个数组中吗:

const vector<Blob<float>*>& output_blobs = net_->ForwardPrefilled();
Blob<float>* output_layer = output_blobs[0];
  const float* begin = output_layer->cpu_data();
  const float* end = begin + output_layer->channels();
  std::vector<float> bbox_and_score_array(begin, end);

还是在两个数组中?

const vector<Blob<float>*>& output_blobs = net_->ForwardPrefilled();

Blob<float>* bbox_output_layer = output_blobs[0];
  const float* begin_b = bbox_output_layer ->cpu_data();
  const float* end_b = begin_b + bbox_output_layer ->channels();
  std::vector<float> bbox_array(begin_b, end_b);

Blob<float>* score_output_layer = output_blobs[1];
  const float* begin_c = score_output_layer ->cpu_data();
  const float* end_c = begin_c + score_output_layer ->channels();
  std::vector<float> score_array(begin_c, end_c);

【问题讨论】:

我也有同样的问题。如果您有答案和其他见解,您会感兴趣吗?作为最终目标,我希望将 Faster R-CNN 作为服务,并在 CPU 上运行 RESTful API。谢谢。 @David Khosid 还没有。我的目标是最大精度,我想将 FASTER RCNN 与在 ImageNet 上获胜的 ResNet MSRA 结合使用。将 CPU 用于 DNN 并不是一个好主意,但为了获得最大速度,您可以查看基于 darknet.conv.weights 的 Darknet Yolo Tiny 模型。或者可能是SSD300:github.com/weiliu89/caffe/tree/ssd 嘿@Alex 你找到答案了吗?我也对你的话题感兴趣:)谢谢! @lilouch Linux 上最简单的 Darknet-Yolo:pjreddie.com/darknet/yolo 你可以在 GitHub 上找到最新的 fork yolo-windows,如果我们选择:Darknet-Yolo、Caffe-SSD、Caffe-FasterRCNN -ResNet。 1. Yolo DNN 将结果作为检测到的对象,无需许多附加代码。 2. Yolo 有 3 种类型的神经网络:默认 (4 GB)、小型 (2 GB)、微型(需要 1 GB GPU RAM) - 您可以在任何 nVidia GPU 上运行它。 3. DNN 框架 Darknet 仅使用 C/C++/CUDA C 及其示例,与使用 C/CUDA C/Python/Matlab 的 Caffe forks SSD 或 FasterRCNN 不同,这仅适用于研发。 谢谢@Alex,太好了! 【参考方案1】:

对于那些仍在寻找它的人,project 中有一个 C++ 版本的 fast-RCNN 和 caffe。您甚至可以找到一个 c++ api 将其包含在您的项目中。我已经测试成功了。

【讨论】:

以上是关于使用 Fast/Faster-RCNN 在 C++ 上制作对象检测器的最简单方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

深度学习目标检测网络结构SPP FAST-RCNN FASTER-RCNN

11月深度学习班第5课图像物体检测:rcnn/fast-rcnn/faster-rcnn

paper-list

『Caffe』图像检测程序(待续)

从0开始的CNN学习之路

从0开始的CNN学习之路