运动目标检测算法比较中SSD为什么比YOLO还要快

主题信息(必填)
主题描述(最多限制在50个字符)
申请人信息(必填)
申请信息已提交审核,请注意查收邮件,我们会尽快给您反馈。
如有疑问,请联系
CSDN &《程序员》编辑/记者,投稿&纠错等事宜请致邮
你只管努力,剩下的交给时光!
如今的编程是一场程序员和上帝的竞赛,程序员要开发出更大更好、傻瓜都会用到软件。而上帝在努力创造出更大更傻的傻瓜。目前为止,上帝是赢的。个人网站:。个人QQ群:、
个人大数据技术博客:目标检测中SSD为什么比YOLO还要快? - 知乎100被浏览7881分享邀请回答12 条评论分享收藏感谢收起18602人阅读
深度学习-CNN(19)
转载注明出处:http://write.blog.csdn.net/postedit
在上一篇文章中,介绍了以region+proposal来检测的框架,这一系列速度和精度不断提高,但是还是无法达到实时。存在的主要问题为:速度不够快,主要原因是proposal比较多,特征进行分类的时候,相同区域的特征计算多遍,所以BGR大神有了最新作品,YOLO,故名思议,就是解决Faster-RCNN中proposal重复look的问题。这一些列代表作有YOLO和SSD.首先介绍YOLO.
0.YOLO【这一部分转载:】
作者Joseph Redmon * , Santosh Divvala *+ , Ross Girshick ? , Ali Farhadi,文献[1]
优点,速度快(45fps,小模型快速版本为155fps),缺点,很明显对位置预测不够精确,对小物体效果不够理想。
做法,简单粗暴,网格划分为S*S个网格,对每个网格直接进行回归预测,最后NMS进行处理。
1. YOLO的核心思想YOLO的核心思想就是利用整张图作为网络的输入,直接在输出层回归bounding box的位置和bounding box所属的类别。没记错的话faster RCNN中也直接用整张图作为输入,但是faster-RCNN整体还是采用了RCNN那种 proposal+classifier的思想,只不过是将提取proposal的步骤放在CNN中实现了。2.YOLO的实现方法将一幅图像分成SxS个网格(grid cell),如果某个object的中心
落在这个网格中,则这个网格就负责预测这个object。
每个网格要预测B个bounding box,每个bounding box除了要回归自身的位置之外,还要附带预测一个confidence值。
这个confidence代表了所预测的box中含有object的置信度和这个box预测的有多准两重信息,其值是这样计算的:
其中如果有object落在一个grid cell里,第一项取1,否则取0。 第二项是预测的bounding box和实际的groundtruth之间的IoU值。每个bounding box要预测(x, y, w, h)和confidence共5个值,每个网格还要预测一个类别信息,记为C类。则SxS个网格,每个网格要预测B个bounding box还要预测C个categories。输出就是S x S x (5*B+C)的一个tensor。
注意:class信息是针对每个网格的,confidence信息是针对每个bounding box的。举例说明: 在PASCAL VOC中,图像输入为448x448,取S=7,B=2,一共有20个类别(C=20)。则输出就是7x7x30的一个tensor。
整个网络结构如下图所示:
在test的时候,每个网格预测的class信息和bounding box预测的confidence信息相乘,就得到每个bounding box的class-specific confidence score:
等式左边第一项就是每个网格预测的类别信息,第二三项就是每个bounding box预测的confidence。这个乘积即encode了预测的box属于某一类的概率,也有该box准确度的信息。得到每个box的class-specific confidence score以后,设置阈值,滤掉得分低的boxes,对保留的boxes进行NMS处理,就得到最终的检测结果。3.YOLO的实现细节每个grid有30维,这30维中,8维是回归box的坐标,2维是box的confidence,还有20维是类别。
其中坐标的x,y用对应网格的offset归一化到0-1之间,w,h用图像的width和height归一化到0-1之间。在实现中,最主要的就是怎么设计损失函数,让这个三个方面得到很好的平衡。作者简单粗暴的全部采用了sum-squared error loss来做这件事。
这种做法存在以下几个问题:
第一,8维的localization error和20维的classification error同等重要显然是不合理的;
第二,如果一个网格中没有object(一幅图中这种网格很多),那么就会将这些网格中的box的confidence push到0,相比于较少的有object的网格,这种做法是overpowering的,这会导致网络不稳定甚至发散。
解决办法:更重视8维的坐标预测,给这些损失前面赋予更大的loss weight, 记为在pascal VOC训练中取5。对没有object的box的confidence loss,赋予小的loss weight,记为在pascal VOC训练中取0.5。有object的box的confidence loss和类别的loss的loss weight正常取1。对不同大小的box预测中,相比于大box预测偏一点,小box预测偏一点肯定更不能被忍受的。而sum-square error loss中对同样的偏移loss是一样。
为了缓和这个问题,作者用了一个比较取巧的办法,就是将box的width和height取平方根代替原本的height和width。这个参考下面的图很容易理解,小box的横轴值较小[补充,个人觉得还有更好的选择,W,H归一化为相对变化,这样对不同大小的物体,w,同等对待],发生偏移时,反应到y轴上相比大box要大。
一个网格预测多个box,希望的是每个box predictor专门负责预测某个object。具体做法就是看当前预测的box与ground truth box中哪个IoU大,就负责哪个。这种做法称作box predictor的specialization。最后整个的损失函数如下所示:
这个损失函数中:
只有当某个网格中有object的时候才对classification error进行惩罚。只有当某个box predictor对某个ground truth box负责的时候,才会对box的coordinate error进行惩罚,而对哪个ground truth box负责就看其预测值和ground truth box的IoU是不是在那个cell的所有box中最大。其他细节,例如使用激活函数使用leak RELU,模型用ImageNet预训练等等,在这里就不一一赘述了。4.YOLO的缺点YOLO对相互靠的很近的物体,还有很小的群体 检测效果不好,这是因为一个网格中只预测了两个框,并且只属于一类。 对测试图像中,同一类物体出现的新的不常见的长宽比和其他情况是。泛化能力偏弱。由于损失函数的问题,定位误差是影响检测效果的主要原因。尤其是大小物体的处理上,还有待加强。
5.SSD,文献【2】
简介: 由于YOLO简单粗暴的将图像进行网格划分,然后对每个网格进行处理,这样导致定位不精确等一些列问题。而基于region proposal却又定位较精确的优点,那么SSD就结合了YOLO和anchor进行检测,结果也是比yolo提高很多【72%mAP】,速度58fps.
和faster的anchor不同之处在于,SSD在多个featureMap上进行处理,因为每一层featureMap的感受野不同。 faster是先提取proposal,然后在分类,而SSD值利用anchor直接进行分类和BBox回归。由于他是Yolo和anchor的结合,具体不再展开。下面给出SSD和YOLO网络比较:
&[1].You Only Look Once:Unified, Real-Time Object Detection
[2].SSD:Single Shot MultiBox Detector
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:152769次
积分:2128
积分:2128
排名:第19168名
原创:60篇
转载:64篇
评论:19条
(1)(1)(1)(1)(3)(4)(2)(1)(11)(1)(4)(28)(23)(4)(6)(5)(9)(2)(10)(7)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'YOLO:实时目标检测 - 简书
YOLO:实时目标检测
一瞥(You Only Look Once, YOLO),是检测 2012数据集内对象/目标的系统,能够检测出20种Pascal对象:
鸟bird、猫cat、牛cow、狗dog、马horse、羊sheep
飞机aeroplane、自行车bicycle、船boat、巴士bus、汽车car、摩托车motorbike、火车train
瓶子bottle、椅子chair、餐桌dining table、盆景potted plant、沙发sofa、显示器tv/monitor
YOLO由以下参与者共同完成:Santosh、Ross和Ali,详细内容参见其以下教程分为9部分(不要害怕,easy),运行系统Ubuntu 14.04。OpenCV、cuda、GPU这些依赖是可选项,如果没有也可以,就是慢点(其实是慢很多)啦。最后会添加一下官网教程中没有的安装错误和修改信息。本篇教程内容全部翻译自1.How It Works
先前的检测系统多使用分类器(classifier)或者定位器(localizer)进行检测任务,把图片的不同局部位置和多种尺度输入到模型中去,图片得分较高的区域(region)作为检测目标。YOLO是一个全新的方法,把一整张图片一下子应用到一个神经网络中去。网络把图片分成不同的区域,然后给出每个区域的边框预测和概率,并依据概率大小对所有边框分配权重。最后,设置阈值,只输出得分(概率值)超过阈值的检测结果。
输入-检测-输出
我们的模型相比于基于分类器的模型有一些优势,在测试阶段,整张图片一次输入到模型中,所以预测结果结合了图片的全局信息。同时,模型只是用一次网络计算来做预测,而在R-CNN中一张图片就需要进行上千次的网络计算!所以YOLO非常快,比R-CNN快1000倍,比Fast R-CNN快100倍。整个系统的细节见2.Detection Using A Pre-Trained Model本节内容会知道你如何使用YOLO预训练好的模型进行目标检测。在这之前,你应该安装好DarkNet,安装方法。安装好DarkNet之后,在darknet的子目录cfg/下已经有了一些网络模型的配置文件,在使用之前,需要下载好预训练好的权重文件(1.0 GB).现在,使用DarkNet的yolo命令进行一下测试吧(假设你在darknet/目录下,自己修改好yolo.weights和image的路径) ./darknet yolo test cfg/yolo.cfg &path&/yolo.weights &image&
如果你没有现成的图片,不妨直接使用darknet/data/下面的某张图片。进行上面的测试,Darknet会打印出检测到的目标对象和可信度,以及耗时。使用CPU时,每张图片耗时为6-12秒,GPU版本会快,快很多。如果安装DarkNet的时候,没有使用OpenCV,上面的测试不会直接显示出图片结果,你需要自己手动打开predictions.png. 打开你会看到类似于下图的预测结果
predictions.png
如果想运行一次DarkNet检测多张图片的话,你应该先运行以下命令载入预训练模型./darknet yolo test cfg/yolo.cfg yolo.weights
模型载入成功后,会提示输入图片路径Enter Image Path:键入类似于data/eagle.jpg的路径,检测这张图片,给出结果之后,会继续提示Enter Image Path。注意如果你连续输入了多张图片,之前的结果会被下一次的检测结果覆盖掉,因为预测结果都叫predictions.jpg。。。要退出/中断程序的话,直接键入Ctrl-C(自己记住这个命令,后面会再用)即可。3.A Smaller Model
上面的YOLO模型会占用很多GPU内存,方法类似,只需要调用不同的配置文件,载入相应的权重文件即可。在这里,提供一个更小版本的模型,使用yolo-small.cfg配置文件,调用(359MB),命令如下 ./darknet yolo test cfg/yolo-small.cfg yolo-small.weights
这个小版本的YOLO大概占用1.1GB的GPU内存~4.A Tiny Model, (172 MB) ./darknet yolo test cfg/yolo-tiny.cfg yolo-tiny.weights
占用611MB的GPU内存,在Titan X上的速度是150 fps5.YOLO Model Comparison
yolo.cfg,基于,处理一张图片的速度为45fps,训练数据来源2007 train/val + 2012 train/val + 所有数据
yolo-small.cfg,全连接层变小,占用内存变小,50fps,训练数据来源2007 train/val + 2012 train/val
yolo-tiny.cfg,更加小型的网络,基于,155fps,数据来源2007 train/val + 2012 train/val
6.Changing The Detection ThresholdYOLO默认返回可信度至少为0.2的检测结果,可以通过-thres &val&参数改变可信度阈值,例如设置为0:
./darknet yolo test cfg/yolo.cfg yolo.weights data/dog.jpg -thresh 0这将可能返回所有的检测结果。7.Real-Time Detection On VOC 2012如果编译时使用了CUDA,那么预测的速度回远远超过你(手动)输入图片的速度。为了更快速地检测多张图片的内容,应该使用yolo的valid子程序。首先预备好数据并生成元数据给DarkNet。这里我们使用VOC2012的数据(需要注册一个账号才能下载),下载之后,运行以下命令
tar xf 2012test.tar
cp VOCdevkit/VOC2012/ImageSets/Main/test.txt .
sed 's?^?'`pwd`'/VOCdevkit/VOC2012/JPEGImages/?; s?$?.jpg?' test.txt & voc.2012.test
这些命令首先解压数据包,然后生成全路径的测试图像,然后把voc.2012.test移动到darknet/data子目录下mv voc.2012.test &path-to&/darknet/dataOKAY,现在使用这些图片做检测,我们使用CUDA版本的,超级快!运行下面命令./darknet yolo valid cfg/yolo.cfg yolo.weights运行上面命令后,你会看到一串数字在屏幕上飞,数字表示当前处理了多少图片。VOC 2012 test数据集共有10991张图片,共耗时250秒,相当于44fps。如果你用方法的话,要耗时6小时!相比之下,咱的方法整个pipeline才耗时4分钟,pretty cool!预测结果在results/子目录下,其格式为Pascal VOC要求提交的特殊格式。如果你想复现我们在Pascal挑战赛中的结果,你得使用才行。8.Real-Time Detection on a Webcam只是简单地跑一下测试数据集,而且看不到实时的结果,真的挺无趣的。所以,我们把输入改成webcam挖个坑,后面填9.Training YOLO其实,你可以从头开始训练YOLO,如果你想的话。你可以尝试不同的训练方法,设置不同的超参数,以及使用自己的数据集。咱们下面尝试自己训练Pascal VOC数据集。9.1下载Pascal VOC Data咱们先下载2007年到2012年的VOC数据,下载之前,新建一个文件夹(比如VOC)存放这些数据,进入此文件夹,按如下方式下载数据,然后解压。
curl -O /media/files/VOCtrainval_11-May-2012.tar
curl -O /media/files/VOCtrainval_06-Nov-2007.tar
curl -O /media/files/VOCtest_06-Nov-2007.tar
tar xf VOCtrainval_11-May-2012.tar
tar xf VOCtrainval_06-Nov-2007.tar
tar xf VOCtest_06-Nov-2007.tar
解压完之后,所有数据都自动存放在VOCdevkit/子目录下了。9.2生成VOC的标注信息接下来生成DarkNet训练所需的标签文件,该文件扩展名为.txt,文件内每一行对应一张图片的标注信息,具体格式如下&object-class& &x& &y& &width& &height&其中的x, y, width和height是对应图片上的坐标和宽、高。只要运行一下DarkNet项目中scripts/子目录下面的voc_label.py脚本,就会自动生成VOC的标注文件。如果你没找到这个文件,可以再重新下载一下。下载和脚本运行方式如下
curl -O /media/files/voc_label.py
python voc_label.py
这个脚本大概要运行几分钟,运行结束之后,你会看到多了两个文件夹,VOCdevkit/VOC2007/labels/和VOCdevkit/VOC2012/labels/。现在,你的VOC目录下应该是这个样子的ls
2007_test.txt
2007_train.txt
voc_label.py
2007_val.txt
VOCtest_06-Nov-2007.tar
2012_train.txt
VOCtrainval_06-Nov-2007.tar
2012_val.txt
VOCtrainval_11-May-2012.tar
其中的文本文件,比如2007_test.txt,包含的内容是VOC 2007年的test数据集标注信息。DarkNet需要一个txt文件提供所有标注信息,所以我们还需要把这些信息导入到一个txt文件中。本例中,我们使用2007年的train和validation数据和2012年的train数据作为训练集,2012年的validation数据作验证数据。具体使用如下命令cat 2007_* 2012_train.txt & train.txtOKAY,现在2007年的所有图片和2012年的train数据集的图片路径都在train.txt文件里面了。标注信息在下面两个路径中
/darknet/VOC/VOCdevkit/VOC2007/labels/
/darknet/VOC/VOCdevkit/VOC2012/labels/
上面所做的就是训练自己的数据集之前所要准备的数据信息了。9.3重定向DarkNet到Pascal数据进入DarkNet目录中,src/子目录里面有一个yolo.c文件,打开并编辑一下其中的18、19行(54、55行?不重要,自己确定)18
char *train_images = "/your_path/VOC_train/train.txt";
char *backup_directory = "/your_path/backup/";其中,train_images指向的是训练文件,backup_directory指向的是训练过程中权重的备份路径。编辑好yolo.c之后,保存,重新编译一下DarkNet。9.4下载预训练之后的卷积权重
训练的时候使用来自Extraction模型的卷积层权重,这个模型训练时用的是Imagenet数据。(54MB)下载这些权重。如果你想直接用Extraction模型生成这些预训练好的权重,你得先下载预训练好的Extraction模型,运行下面的命令./darknet partial cfg/extraction.cfg extraction.weights extraction.conv.weights 25劝告大家直接下载权重会更简单。。。9.5训练运行下面命令开始训练./darknet yolo train cfg/yolo.cfg extraction.conv.weights运行时,屏幕会提示一下数字和任务信息。如果你想训练更快些,同时降低提示信息频率,首先终止训练,然后在cfg/yolo.cfg中修改一下第三行的信息3
subdivisions = 2或修改成4,或更大,比如64。然后重新开始训练9.6训练Checkpoints每训练128000张图片之后,DarkNet自动保存checkpoint信息到你在src/yolo.c中指定的备份路径下。checkpoint的文件名类似于yolo_12000.weights。你可以使用这些checkpoint信息重新开始训练,避免从头开始。40,000次迭代之后,DarkNet会保存模型的权重,然后结束训练,最后的权重会以yolo.weights命名。恭喜,这就训练结束了~Good Luck!!上两张训练时的截图
下面是你安装过程中可能遇到的问题和解决办法Q1.使用GPU=1,运行测试命令,例如./darknet imtest data/eagle.jpg或者./darknet yolo demo cfg/yolo.cfg yolo.weights并键入图片地址报以下错误
L2 Norm: 372.007568
CUDA Error:invalid device function
darknet: ./src/cuda.c:21: check_error: Assertion `0' failed.
Aborted (core dumped)
看了看./src/cuda.c的代码也没发现啥。。。出现这个问题是因为DarkNet的配置信息Makefile文件里面的GPU架构和实际安装的GPU不对应。ARCH= --gpu-architecture=compute_xx
--gpu-code=compute_xx经测试,k40m和k40显卡应该设置为ARCH= --gpu-architecture=compute_35
--gpu-code=compute_35tk1显卡的设置应该为ARCH=--gpu-architecture=compute_20 --gpu-code=compute_20或许这些信息对你有所帮助
gpu-architecture
但行好事,莫問前程目标检测中SSD为什么比YOLO还要快? - 知乎100被浏览7881分享邀请回答12 条评论分享收藏感谢收起3添加评论分享收藏感谢收起查看更多回答

我要回帖

更多关于 运动目标检测 的文章

 

随机推荐