R-CNN,Fast-R-CNN,Faster-R-CNN, YOLO, SSD系列,深度学习object detection梳理


闲的蛋疼,看了一下object detection的经典文章,简单总结一下(因为不做cv,说错了请指出):

0)object detection的任务:找到图片中的object(给出边框位置,regresion),以及给出object对应的是什么(classification)。一般步骤就是:候选框提取(regions proposal,经典方法是selective search),然后提取region中的特征(cnn),分类(svm、dnn);最后往往有non-max suppression处理重叠问题。

1)R-CNN按照上面的三个标准步骤依次进行,selective search for region proposals,cnn for features,svm for classification。

2)Fast-R-CNN将后两个步骤合并,selective search for region proposals,cnn对region proposal生成feature map,接着通过ROI(region of interest)层将feature map转换成fc layer,然后对fc layer进行softmax classification以及bounding box regression的多任务训练。

3)Faster-R-CNN将三个步骤合并,region proposal、classification、regression三者共享一个based cnn network。based network之上,接一个Region Proposal Network (RPN),最后一层产生一个W*H大小的conv feature map用来提取region proposal,具体方法是通过固定大小(3*3)的滑动窗口(就是卷积核)在conv feature map上扫描,对每一个窗口位置,生成一个256-d的intermediate layer,然后产生两个分支,分别对应2k个scores(probability of an object,但是具体哪个类别还不知道,所以需要后面的fast RCNN,为什么是2,因为这里设计的是2-class softmax)和4k个coordinates,其中k=9是每个窗口生成的proposal个数,这k个proposal(叫做anchor)的scale、aspect_ratio是提前确定的。有了预测的2k+4k个结果,就可以和真实的image情况对比,进行训练了,要考虑2k-4k的loss占比情况。从上面的情况看,整个W*H大小的conv feature map可以生成大约W*H*k个proposals。有了region proposals之后,再based network之上,接一个fast RCNN,对生成的proposal进行检测和识别(这里是具体的classification,要识别出是哪个类)。由于RPN和fast RCNN是一个整体,所以文章选择了迭代训练两者的方法。

4)YOLO是我见过的最elegant的方法(直接回归bounding boxes coordinates和all C class probabilities)。具体如下:先将图片resize成448*448(L*L)大小,将图片划分成S*S个grid(S=7,所以每个64*64大小的sub-image属于一个grid)。然后每个grid负责propose B个bounding box(B=2),每个bounding box对应4个coordinates、1个confidence(表示P(object)*对应的bounding box和any ground truth box的intersection of union(IOU)大小,即P(Object)*IOU^{truth}_{pred}),另外,每个grid还要生成C个conditional class probabilities(表示该grid内部的sub-image包含object时,这个object属于各个类别上的概率,即P(C_{i}|Object);因为总共有20个类别,所以C=20)。这样,一个image最终产生S*S*(B*5+C)个输出(7*7*(2*5+20)=1470个输出)。然后就是找ground truth进行训练,要考虑不同任务的权重。预测时,使用P(C_{i}|Object)*P(Object)*IOU^{truth}_{pred}找到最大的C_{i}即可。可以看到,YOLO模型非常简单,所以最大的好处是,时间快,做到了实时;另外,由于看到的context信息比较多,多以background很少分错。缺点是特征粒度太粗,small object容易分错,accuracy相对较低(主要错误在于localization,这个也是显而易见的)。===》本人查看并修改了YOLO的源码,确实很经典,而且实现起来很简单,效果也不错。===》据说YOLO-V2版本中,将每个grid生成C个conditional class probabilities(然后让该grid对应的所有bounding boxes共享这C个conditional class probabilities)改成了为每个bounding boxes生成各自独立的C个conditional class probabilities,此时效果有明显提升!!

5)SSD。有人说SSD相当于YOLO(直接回归bounding boxes coordinates和all C class probabilities) + RPN的anchor(每个feature map用一个小窗口扫描,对每个扫描位置生成k个default的bounding boxes) + multi-scale的prediction。个人感觉SSD最大的特点是multi-scale的prediction,从一个image中生成多个不同scale、spatial_ratio的feature maps(具体实现时,就是把网络的最后几层设计成不同的scale,全部作为feature maps),然后在每个feature map上生成需要的数据(bounding boxes、class probabilities等),然后联合训练。具体的,仍然用3*3的窗口对每个feature map进行扫描,在每个扫描位置生成k个不同大小的default bounding boxes,每个boxes对应4个coordinates和C个class probabilities(和YOLO一样,直接是C个类别对应的概率;不同于Faster-R-CNN的2个输出,只能代表是不是object的概率,还需后续classification)。然后就是找ground truth进行训练,要考虑不同任务的权重。可以看到对于M*N的feature map,输出节点数为M*N*K*(C+4),另外因为有F个feature map,所以还要再乘以F。




这个链接:

https://www.zhihu.com/question/35887527/answer/140239982

R-CNN,Fast-R-CNN,Faster-R-CNN, YOLO, SSD系列,深度学习object detection梳理_第1张图片


这个链接不错,作者不让转载:

http://www.cnblogs.com/venus024/p/5717766.html




R-FCN、SSD、YOLO2、faster-rcnn和labelImg实验笔记

转自:https://ask.julyedu.com/question/7490

R-FCN
paper: https://arxiv.org/abs/1605.06409
作者代码: https://github.com/daijifeng001/R-FCN #matlab版本
这里使用python版本的代码: https://github.com/Orpine/py-R-FCN

1.下载代码
git clone  https://github.com/Orpine/py-R-FCN.git

2.克隆caffe
cd py-R-FCN
git clone  https://github.com/Microsoft/caffe.git #Microsoft的源
[可选]
cd caffe
git reset --hard 1a2be8e

3.编译Cython模块
cd py-R-FCN/lib
make

4.编译caffe和pycaffe

这里Makefile.config要支持Python layers!

In your Makefile.config, make sure to have this line uncommented

WITH_PYTHON_LAYER := 1

cd py-R-FCN/caffe
cp Makefile.config.example Makefile.config 
make -j8 && make pycaffe

5.下载resnet caffemodel
从OneDriver下载rfcn_models  https://1drv.ms/u/s!AoN7vygOjLIQqUWHpY67oaC7mopf
解压到:py-R-FCN/data下
解压后的目录:
py-R-FCN/data/rfcn_models/resnet50_rfcn_final.caffemodel
py-R-FCN/data/rfcn_models/resnet101_rfcn_final.caffemodel

6.运行demo
python py-R-FCN/tools/demo_rfcn.py --net ResNet-50
python py-R-FCN/tools/demo_rfcn.py --net ResNet-101

ResNet-50效果图:



R-CNN,Fast-R-CNN,Faster-R-CNN, YOLO, SSD系列,深度学习object detection梳理_第2张图片


ResNet-101效果图:



R-CNN,Fast-R-CNN,Faster-R-CNN, YOLO, SSD系列,深度学习object detection梳理_第3张图片


7.准备训练和测试
笔者这里简单使用VOC2007,并且修改名称VOC0712,笔者把数据集直接放在py-R-FCN/data下
官网使用VOC2007和VOC2012,使用的时候要合并数据集,具体参考官网的Preparation for Training & Testing 第四点

8.下载ImageNet 与预训练的ResNet-50和ResNet-100
OneDriver: https://onedrive.live.com/%3Fa ... FF777(在KaimingHe的github  https://github.com/KaimingHe/d ... works )
mkdir py-R-FCN/data/imagenet_models
将model放到该目录

9.可自己修改模型,类别,修改相应的py-r-fcn/py-R-FCN/models/pascal_voc/目录下对应的文件和py-r-fcn/lib/datasets/pascal_voc.py。笔者这里还是使用默认的。

10.修改迭代次数
vi py-r-fcn/experiments/scripts/rfcn_end2end_ohem.sh
把pascal_voc的ITERS 调小

11.训练
./py-r-fcn/experiments/scripts/rfcn_end2end_ohem.sh 0 ResNet-50 pascal_voc 
其他训练方式请自行参考官网Usage

R-CNN,Fast-R-CNN,Faster-R-CNN, YOLO, SSD系列,深度学习object detection梳理_第4张图片


12.测试
将训练好的模型py-r-fcn/py-R-FCN/output/rfcn_end2end_ohem/voc_0712_trainval/resnet50_rfcn_ohem_iter_x.caffemodel,放到 py-r-fcn/py-R-FCN/data/rfcn_models 下,修改 py-R-FCN/tools/demo_rfcn.py的NETS,运行

SSD
paper: https://arxiv.org/abs/1512.02325
作者代码: https://github.com/weiliu89/caffe/tree/ssd

1.下载代码:
git clone  https://github.com/weiliu89/caffe.git
cd caffe
git checkout ssd

2.编译代码
cp Makefile.config.example Makefile.config
make -j8
make py
make test -j8
make runtest -j8

3.准备
1.下载caffemodel和prototxt 
https://gist.github.com/weiliu ... f81d6
从上边地址下载完放到/models/VGGNET/

4.下载VOC2007和VOC2012
cd /root/data
wget  http://host.robots.ox.ac.uk/pa ... 2.tar
wget  http://host.robots.ox.ac.uk/pa ... 7.tar
wget  http://host.robots.ox.ac.uk/pa ... 7.tar
tar -xvf VOCtrainval_11-May-2012.tar
tar -xvf VOCtrainval_06-Nov-2007.tar
tar -xvf VOCtest_06-Nov-2007.tar

5.创建LMDB文件
cd $CAFFE_ROOT
./data/VOC0712/create_list.sh
./data/VOC0712/create_data.sh

6.训练模型
python examples/ssd/ssd_pascal.py 
也可以从这里 http://www.cs.unc.edu/%257Ewli ... ar.gz 下训练好的模型。

7.评估模型
python examples/ssd/score_ssd_pascal.py

R-CNN,Fast-R-CNN,Faster-R-CNN, YOLO, SSD系列,深度学习object detection梳理_第5张图片


8.测试模型
python examples/ssd/ssd_pascal_webcam.py #笔者这步忽略
贴几张youtube的SSD实时检测效果,视频地址: https://www.youtube.com/watch?v=6q-DBCPROA8

R-CNN,Fast-R-CNN,Faster-R-CNN, YOLO, SSD系列,深度学习object detection梳理_第6张图片


R-CNN,Fast-R-CNN,Faster-R-CNN, YOLO, SSD系列,深度学习object detection梳理_第7张图片


R-CNN,Fast-R-CNN,Faster-R-CNN, YOLO, SSD系列,深度学习object detection梳理_第8张图片


R-CNN,Fast-R-CNN,Faster-R-CNN, YOLO, SSD系列,深度学习object detection梳理_第9张图片


直接用ssd_detect.ipynb(examples/ssd_detect.ipynb)测试



9.训练其他数据集忽略

mxnet 版本的ssd
代码地址: https://github.com/zhreshold/mxnet-ssd

1.下载代码
git clone --recursive  https://github.com/zhreshold/mxnet-ssd.git

2.编译mxnet
cd mxnet-ssd/mxnet
cp make/config.mk ./config.mk #自行修改配置文件
make -j8

3.下载预训练模型
地址: https://dl.dropboxusercontent. ... 2.zip。下载后解压到model下

4.测试demo
python demo.py --epoch 0 --images ./data/demo/dog.jpg --thresh 0.5

效果图:





5.其他的训练数据忽略

YOLO2
paper: https://arxiv.org/abs/1506.02640
官网: http://pjreddie.com/darknet/yolo/

1.下载代码
git clone  https://github.com/pjreddie/darknet
cd darknet
make

2.下载模型
wget  http://pjreddie.com/media/files/yolo.weights

3.检测
./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg
效果图





其他效果图





4.所有检测
./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg -thresh 0

R-CNN,Fast-R-CNN,Faster-R-CNN, YOLO, SSD系列,深度学习object detection梳理_第10张图片


5.在视频上检测
./darknet detector demo cfg/coco.data cfg/yolo.cfg yolo.weights

你可能感兴趣的:(深度学习)