YOLOv3多类多目标检测

        yolov3在目标追踪方面是借鉴了其它算法的优点形成的,既加快了运算时间又提高了识别的精度。单类多目标的有MTCNN,多类多目标的有RCNN系列和YOLO系列。

        RCNN系列:RCNN通过像素聚类建议框,svm支持向量机的方法去检测,测试的时候运行时间太慢。fast--Rcnn在得到的特征图上面去画建议框,每个特征点都去运算一遍,没有使用nms,iou所以运行时间也很慢,但是比RCNN快了很多。然后是faster--RCNN多训练了一个置信度的网络,精确度很高,运算时间也快。

        YOLO系列:YOLOv1传入固定大小的224*224的图片输出的是全连接,将图片划分成7  *  7的大小网络,认为的在有目标对象中心点的网格画2中建议框,因此检测的准确率不高。YOLOv2传入固定大小的416*416的图片,采用了9种建议框,网络使用的是darknet19,如果两个类别的中心点都在同一个格子里,只能挑选出置信度最大的那一个类别,因此不能够解决两个物体的中心点都在一个格子里面的情况。yolov3就相对于yolov1,yolov2改进了很多,针对大中小的物体分别给出了大中小的3类建议框每类3个建议框,网络也输出3种特征图,分别是13*13的用于检测大物体的,26*26的用于检测中等物体的,52*52的用于检测小物体的,并且对每种输出都设置了专有卷积来提高运算的精度,因为只去检测置信度较大的框,所以运算时间也比较快。在yolov1和yolov2之间还出现过ssd,yolov3就是借鉴了ssd的针对不同目标大小,输出不同大小的3类特征图,对小目标也能够友好的检测。


        yolov3的实现原理:通过输入416*416的图片,将图片划分成13*13,26*26,52*52大小的网格图,通过网络去判断我们需要识别的类别的中心点分别在哪一个网格置信度的比较大,结合3种特征图输出的置信度,只保留置信度最大的框,最终通过自己认为设置的先验框和真实类别的中心点反算出真实框的位置。



  然后是代码的实现过程:(1)数据预处理:将图片都变成416*416的大小,将图片最大的边长缩放成416,另外一边按同比例缩放,再创建一个416*416的图片像素值为128,将缩放的图片粘贴到创建的这张像素值为128的图片上面。


数据标注:


xml文件解析成txt格式文件:


(2)制作成训练数据:

创建一个形状为划分的网格大小的0矩阵,计算真实框和先验框的面积iou,计算出对象中心点相对于网格的偏移量,再求出真实框相对于先验框的宽高比,将求得的iou,cx,cy,logp_w,logp_h填充到划分的网格的对应位置,制作成标签。这里为什么长宽比要加log是因为神经网络学习有正有负,加log值域范围有正有负符合网络的输出,另外在测试反算的时候等于e的次方始终为正数,还有在网络训练的时候都是挑选的置信度iou最大的所以长宽比的值总是在1的附近,对数函数在1的附近梯度较大,利于网络的收敛。


(3)网络模型:网络采用darknet53,借鉴了ssd的跳跃连接,使检测对大中小物体都均衡友好,加入了卷积集提高了识别的精度。用卷积步长为2代替了下采样,减少了pool池化带来的梯度负面影响。


(4)网络训练:使用 了sigmoid加BCEloss进行置信度的回归,首先找到在网格中有对象中心点网格进行,置信度回归,坐标回归,和类别区分的损失,再找到没有对象的网格只进行负样本置信度回归。


(5)测试阶段主要涉及切片反算,找到中心点对应网格的索引,反算出真实框的坐标值,再将置信度,坐标值,和分出的类别数字,传入nms筛选掉置信度小的框。


你可能感兴趣的:(YOLOv3多类多目标检测)