上期给大家介绍了YOLO模型的检测系统和具体实现,YOLO是如何进行目标定位和目标分类的,这期主要给大家介绍YOLO是如何进行网络训练的,话不多说,马上开始!
前言:
输入图片首先被分成S*S个网格cell,每个网格会预测B个边界框bbox,这B个边界框来定位目标,每个边界框又包含5个预测:x,y,w,h和置信度confidence.那这取值有什么约束嘛?如下图所示:
黄色的圆圈代表了中间这个网格的中心点,红色的圆圈代表了这个红色方框的中心点,则x,y的取值是两个中心的偏移量和 cell 本身宽高的比值:
x = (bbox.x-cell.x)/cell.width
y = (bbox.y - cell.y)/cell.height
bbox 的宽高w,h是和整张图片的宽高的比值:
w = bbox.width / image.width
h = bbox.height / image.height
现在回到我们YOLO的训练上。
YOLO训练
YOLO先使用ImageNet数据集对前20层卷积神经网络进行预训练,然后使用完整的网络,在Pascal voc2007和2012数据集上进行对象识别和定位的训练和预测。网络结构图如下所示:
YOLO的最后一层采用线性激活函数,其它层都是Leaky Relu,训练过程中为了防止数据过拟合,数据过拟合的话对于外来检测的数据的检测效果会不好,采用了(drop out)正则化和数据增强(data augmentation)技术防止过拟合。
YOLO损失函数
损失就是网格实际输出值和样本标签之间的偏差:
总的来说就是,就是用网格输出与样本标签的各项内容的误差平方和作为一个样本的整体误差,损失函数中的五项分别对应于每一个网格的输出的30维相对应,边框中心xy,宽高wh,可以称为定位误差,以及边框是否有对象,和有对象时的分类误差,可以称为分类误差。
YOLO预测:
在上期中我已经讲解来了YOLO是如何进行目标定位和分类了,输入一张图片到我们已经训练好了的YOLO网络,将输出一个7*7*30的张量来表示图片中所有网格包含的对象(概率)以及该网格中对象可能的两个位置(bounding box)以及可信程度(置信度),就是说一张图片上最后会有98个边界框,那么如何找到最有可能的对象和位置呢? 如下图所示:
这就用到 交并比(Intersection over union 和非极大值抑制(Non-max suppression )算法。
交并比:
如下图,把A和B分别当做一个边界框,由于我们从预测结果中可以得到边界框的宽高和中心坐标,我们就可以计算边界框A和边界框B的面积,从而计算他们之间的交并比,又假如A是实际边界框,而B是预测框,那么当A和B之间的交并比大于0.5时,判断预测这个框预测正确,否则舍弃这个框。
那剩下还有许多边界框怎么办呢?
最后附上TensorFlow版的YOLOv1的代码地址:下载好代码装好环境即可使用预训练好了的权重就可测试https://github.com/gliese581gg/YOLO_tensorflow,下载下来进行自己的训练吧!
参考:
https://zhuanlan.zhihu.com/p/32525231
https://link.zhihu.com/?target=https%3A//segmentfault.com/a/1190000016692873%3Futm_source%3Dtag-newest
往期推荐:
小白也能弄懂的目标检测之YOLO系列 - 第一期
小白也能弄懂的目标检测YOLO系列之YOLOV1 - 第二期
更多有关python、深度学习和计算机编程和电脑知识的精彩内容,可以关注微信公众号:码农的后花园