我会持续分享一些编程和机器学习相关的心得或理解,感兴趣的可以关注下^-^!!!
趣闻
震惊:YOLO之父宣布退出CV界:出于道德考虑,不希望算法用于军事和隐私
这意味着,经过多个版本的迭代,越来越好的yolo将不会迎来根正苗红的新版本Yolo v4了,这确实是令人遗憾的事情,不过,对于YOLO之父给出的理由:“不希望算法用于军事和隐私”,却能看的出,YOLO之父是一个有责任心、有担当、胸怀天下的大人物。这种人已经不多见了,很多企业、个人经常为了利益而不顾道德底线,所以,真心给YOLO之父点个赞。
不过,有人认为,技术人不应该因为技术负面的影响而放弃技术,而更应该努力引导技术发挥积极的价值。同时,也有声音认为,如果事情一开始就是错的,那么怎么引导也没有用,所以,你怎么看呢?
什么是YOLO
这里的YOLO不是设么直播软件,也不是“you only live once”,而是"you only look once",也就是你只看一次,哈哈。
图1
YOLO最权威的资料当然来自作者论文以及作者写的介绍博客了,大家可以访问他的个人网站:https://pjreddie.com/darknet/yolo/。作者的个人网站我浏览下来,有几个比较有价值的信息,大家可以关注下:
- publications栏目下有作者发布的一些文章可供下载,其中就包含了yolo v1/v2/v3。
- darknet栏目下有很多作者实现的酷酷的项目,其中包括yolo。此外,还有一片推荐gpu的文章,如果你正在考虑购买gpu来做深度学习,也很值得借鉴。
从直观来看,这就是YOLO:
图2
其实就是目标检测了。只不过之所以称为yolo,是因为它的实现方法是一种端到端的目标检测算法,也就是输入图片,经过一个神经网络,输出目标的位置及其类别。具体原理,还得从yolo v1说来。
YOLO v1
YOLO v1将目标检测的多个任务统一在一个单一的神经网络。也就是或YOLO能从整个图像预测每个目标边界框,同时也能预测边界框包含图像的类别。这意味着YOLO会对整个图像和图像中的所有对象进行全局性的分析。
YOLO的设计实现了端到端的训练和实时的检测速度,同时保持高平均精度。YOLO将输入图像分割成S×S网格。如果对象的中心落在网格单元中,则该网格单元负责预测那个物体。每个网格单元预测B个矩形框和置信度,置信度反映了确信模型中包含一个对象同时,矩形框的预测有多准确。在形式上,将置信度定义为Pr(Object)*IOUtruth。如果没有对象存在于该单元格中,置信度得分应为零。否则我们希望置信度等于预测框之间的交集与并集之比(IOU。每个边界框由5个预测组成:x、y、w、h,置信度。(x,y)坐标表示中心相对于网格单元左上角的点。w和h表示图像的宽和高。
每个网格单元还预测C条类别概率Pr(Classi|Object),这些概率取决于包含对象的网格单元。对于一个网格单元,只预测一次类别概率。
Pr(Classi | Object)∗Pr(Object)∗IOU=Pr(分类)*iIOU
图4
由于YOLO假设最后一层全连接层可以看成S*S(图中为7)个方格。然后每个方格预测B个矩形框、一个自信度、还有这个矩形框所在图像的类别。也就是说,全连接层总共有这么多个输出:S*S(B*5+C)。
参数汇总说明:
- S:是输出map可以看成S*S个方格,图中为7,这个很好理解把。
- B:是每个cell可以预测B个矩形框。不是简单的之预测一个哦,那么预测这么多用哪个矩形框呢?那么confidence的就起作用了,我们可以选择置信度高的呀。
- 5:为什么是5,因为5包括(x,y,w,h,confidence),置信度=Pr(Object)*IOU
- C:是类别,如果有10中类别,C就是10。
需要补充的是:计算矩形框的误差要用到IOU,也就是两个矩形框的交、并集之比:
接下来看yolo的网络模型:
图3
YOLO检测网络有24个卷积层和2个完全连接层。交替1×1卷积层减少了前几层的特征空间。
从模型来看,网络基本由卷积、全连接构成(当然还有池化)。全连接有两个,最后一个会回归出图片上目标的位置,同时输出该位置上目标的类别。可见YOLO v1的基本组成单元是非常常见的基础组件,关键是最后一层格式的设计以及训练的思路。
损失函数:
YOLO使用平方和误差,原因是作者说它更容易优化。但是简答的平方误差也有一些问题。
- 其实大多数网格单元都是没有物体存在的,如果不做处理,会使得置信度confidence经常为0。因为存在物体,置信度期望接近1,不存在期望为0,但大多数都不存在的话,不断减小confidence的值,却很少增大confience的值,因此confidence很容易为0的,那么解决办法就是给存在对象的confidence计算误差时×5,不存在时×0.5,那么这种情况就会缓解很多。这也是设置λcoord=5和λnoobj=0.5的原因。
- w和h计算误差使用了平方根来计算误差,并没有使用原始值直接计算,这是为什么呢?这是因为,作者期望,计算大的矩形框的误差的时候,计算出的梯度应该大一点,计算晓得矩形框的误差的时候,得到的梯度应该小一点,所以选择了sqrt函数,哎,它正好满足这样的属性。也正是这个原因,到了v2的时候,引入自然指数函数的原因,自然指数函数也符合这个需求。
- 为什么每个网格要预测多个矩形框?其实,一个就够了对吧,多了处理复杂,还要选来选去的。我的理解,训练多个可以降低偶然出错的风险。如果只训练一个,错了就错了,训练多个的话,通过执行度的方法,能够降低出错的概率。
YOLO和其他实时目标检测算法的对比
其他目标检测算法主要介绍两种:
- DPM:DPM是通过滑动窗口来扫描图片,每到一处,就对该区域的图片进行分类。
- R-CNN及其变体:R-CNN及其变体放弃了滑窗的方式,取而代之的是生成建议的边界框。然后使用卷积cnn来提取特征。svm会为这些边界框打分,然后有个线性模型精细的调整这些边界框,之后再使用nms(非极大值抑制)来消除重复的边界框。这么多复杂的步骤,每一个都是花很多时间做精确的调整。因此,R-CNN及其变体准确率很好,但是非常慢,检测一张图片短则几秒,长则几十秒不等。
可见,YOLO VGG16版本是准确率最好的yolo版本,但是FPS只有21。YOLO版本能达到45FPS,同时mAP只下降了3个点。FAST YOLO能达到惊人的155FPS,是速度最好的实时监测模型了,而且mAP也相当客观。
从作者的论文来看,yolo确实在速度方面非常有优势,同时准确率保持很高的竞争性,这使得YOLO在工业界的应用价值非常高。
由于FAST R-CNN比YOLO在准确率方面好不少,作者也没有放弃研究二者的差异:
作者分析了背景错误和定位错误的差异:
发现,YOLO有更小的背景错误,而FAST-RCNN有更小的定位错误。因此,作者很聪明的把二者结合起来,强强联合,只会更强:
最好的Fast-RCNN在voc 2007上的准确率是71.8,其他版本和最好版本组合,性能的提升不太大,但是当YOLO和Fast-RCNN的最好版本组合后,mAP达到了惊人的75。这个比YOLO单独的63.4的mAP有了一个巨大的提升。比最好的Fast-RCNN的mAP也提升了3.2点。
YOLO V1的限制
- 每个cell预测出一种类别,这意味着对与较小的、很靠近的物体,比如鸟群,几乎无能为力。
- YOLO 在边界框的回归上依然有很大的误差(相比Fast-RCNN)。
我不知道我是否真的说清楚了,我希望能通过我的引导,让你理解yolo的工作原理,还有很多细节,为什么不认真拜读下论文或者源码呢?