参考文章:
- https://blog.youkuaiyun.com/woduoxiangfeiya/article/details/80866155(质量一般,还得对照原文看)
- https://zhuanlan.zhihu.com/p/58716896
代码以及训练自己的数据:
- 官方源代码:https://github.com/hizhangp/yolo_tensorflow,网络的配置参数在yolo/config.py下
- 设置数据集文件的嵌套格式如下,Annotations存放的是用labelImg标注好的xml文件,一张图片对应一个xml;JPEGImages下存放的是图片;ImageSets需要稍微再处理一下,在VOC2007路径中新建一个test.py, 并写入以下代码执行一下,执行后ImageSets/Main下会生成四个文件:trainval.txt、test.txt、train.txt、val.txt
import os import random trainval_percent = 0.1 train_percent = 0.9 xmlfilepath = 'Annotations' txtsavepath = 'ImageSets\Main' total_xml = os.listdir(xmlfilepath) num = len(total_xml) list = range(num) tv = int(num * trainval_percent) tr = int(tv * train_percent) trainval = random.sample(list, tv) train = random.sample(trainval, tr) ftrainval = open('ImageSets/Main/trainval.txt', 'w') ftest = open('ImageSets/Main/test.txt', 'w') ftrain = open('ImageSets/Main/train.txt', 'w') fval = open('ImageSets/Main/val.txt', 'w') for i in list: name = total_xml[i][:-4] + '\n' if i in trainval: ftrainval.write(name) if i in train: ftest.write(name) else: fval.write(name) else: ftrain.write(name) ftrainval.close() ftrain.close() fval.close() ftest.close() # 参考的那篇文章给忘了,如有侵权,请在评论区留言并附上地址
- 训练自己的数据集,参考网址有:yolo_tensorflow_v1训练自己的数据集、TensorFlow下使用YOLOv1训练+测试自己的数据集,具体要修改的内容有三处吧,第一处修改config.py文件CLASSES = ['class1', 'class2', 'class2'....] ;第二处pascal_voc.py文件中
labels = np.zeros( (self.batch_size, self.cell_size, self.cell_size, 8)) #25修改为5+类别数
第三处为(具体原因:每个框有四个位置信息和一个置信度,每一个网格只能预测出一个类别)
label = np.zeros((self.cell_size, self.cell_size, 8)) #25修改为5+类别数
- 测试自己的模型:修改一下加载模型的路径和要测试的图片即可
(自己做的完整的代码,见github)
论文笔记:
摘要:
提出了一种新的目标检测算法YOLO,在该论文中把目标检测看做了一个回归问题来预测空间分离的边界框和相关类别的概率;整个检测过程是一个单一过程,预测速度极快。(住:ground truth表示真实的标注框)
1、介绍
YOLO的输入为448*448,与R-CNN两阶段的模型相比,YOLO是单一网络,相比传统网络有以下优点:
- 速度很快,因为YOLO中把物体检测当做一个回归问题,可以达到45帧每秒,实现了实时监测;
- YOLO可以检测到整体的图像,不像fast-RCNN只检测到局部,所以YOLO的背景误差率相比fast-RCNN降低了一半;
- YOLO在自然物体(指实物)的图中进行学习,用在艺术图中的物体检测效果也很好;
缺点是:
- 每个网格只对应两个bounding box,当物体的长宽比不常见(训练未覆盖)时,效果较差;
- 原始图片只划分为7*7的网格,两个物体靠的很近时,效果很差;
- 最终每个网格只对应一个类别,容易出现漏检;
- 对于图片中较小的物体,效果比较差
2、Unified Detection(统一检测)
将一张图划分为s*s个网格,如果一个物体的中心落在某个网格,则该网格负责检测该物体 ,每个网格预测B个边界框及每个框的confidence,conference反映了网格模型对该边界框是否有物体的信心,以及边界框位置预测的准确度,,其中
,如果在该网格中没有物体,则置信度得分为0;否则置信度得分为IOU。每个边界框有五个预测值:x,y,w,h,confidence,其中(x,y)表示相对于网格单元边界的框的中心,(w,h)表示相对于整个图的宽和高。每个网格还会预测类别的条件概率
,每个网格只能给出一个类别概率,不管该网格有几个框。在测试时,将条件概率和confidence相乘从而得到每个边界框在各个类别的得分,这些得分表示某一类别出现在框中的概率以及预测框和真实框的拟合程度:
。
作者在PASCAL VOC数据集上评估YOLO时,令,所以最终结果是
维。
2.1 Network Design
- 用卷积层提取特征,用FC预测概率和坐标;
- 在网络中,
的卷积后加一个
卷积,用
的卷积来降低前一层的特征空间;
- 使用
的输入在ImageNet上预训练模型,然后在检测时加倍
- 普通的YOLO有24个卷积层,而fast YOLO只有9个卷积层,其余一样,加上两个FC层,最后得到结果(普通的YOLO结构如下所示,注意:最后一层在代码中是以全连接层的形式即最后输出
个结果,然后再reshape)
2.2 training
- 在ImageNet上预训练,用的是前20层conv,一个avgpool,一个FC层。得到预训练模型后,在此基础上随机初始化4个卷积层和2个FC层,并将网络输入从
变到了
;最后一层输出类别概率和边界框坐标,并且在最后一层中使用了leaky-relu
- 损失函数如下两图所示(损失函数,有点费解,代码中更为费解)。在文中,
,增加了包含物体的边界框预测的权重,并减少了不包含物体的边界框的置信度预测损失的权重。(注:loss函数只在网格中出现物体时才惩罚分类错误,如果这个预测器负责预测真实边界框(即所有网格的预测都有最高的IOU),他也仅惩罚预测坐标损失)【不懂?】
- 在PASCAL VOC 2007和2012上,训练了135个epochs,batch size=64, momentum=0.9, decay=0.0005
- 为了防止过拟合使用了dropout(rate=0.5)和数据增强的方法。通过dropout降低层之间的联合性,增强了泛化能力;数据增强:引入原始图像的20%的随即缩放和平移,在HSV色彩空间随机调整图像的曝光饱和达1.5倍
2.3 前向传播
- 检测图时网络只需要执行一次,为每个图预测98个边界框,每个边界框一个置信度得分;
- 当一个大物体跨越多个网格,并被多个网格检测出时,用NMS解决(YOLO-v1的NMS策略, 对比SSD的正负样本匹配策略(还有SSD中的难负例例挖掘)以及faster rcnn中的RPN中正负样本的标注策略的差别)
NMS方法并不复杂,其核心思想是:选择得分最高的作为输出,与该输出重叠的去掉,不断重复这一过程直到所有备选处理完。YOLO的NMS计算方法如下:(参考网址:YOLO v1深入理解 9))
网络输出的7*7*30的张量,在每一个网格中,对象位于第j个bounding box的得分:
它代表着某个对象
存在于第j个bounding box的可能性。
每个网格有:20个对象的概率*2个bounding box的置信度,共40个得分(候选对象)。49个网格共1960个得分。Andrew Ng建议每种对象分别进行NMS,那么每种对象有 1960/20=98 个得分。
NMS步骤如下:
1)设置一个Score的阈值,低于该阈值的候选对象排除掉(将该Score设为0)
2)遍历每一个对象类别
2.1)遍历该对象的98个得分
2.1.1)找到Score最大的那个对象及其bounding box,添加到输出列表
2.1.2)对每个Score不为0的候选对象,计算其与上面2.1.1输出对象的bounding box的IOU
2.1.3)根据预先设置的IOU阈值,所有高于该阈值(重叠度较高)的候选对象排除掉(将Score设为0)
2.1.4)如果所有bounding box要么在输出列表中,要么Score=0,则该对象类别的NMS完成,返回步骤2处理下一种对象
3)输出列表即为预测的对象
2.4 YOLO局限性
- 由于每个网格只预测两个框,且每个网格只能有一个类,所以很多小物体检测不出来;
3 与其他检测系统对比
YOLO是通用的检测器,可以检测多个物体。
4 试验 YOLO的mAP达到了63.4%
6 结论
以上就是学习的YOLO-v1的笔记,由于在做比赛,所以时间跨度有点久,感觉整体框架好理解,但是loss这一块还是不是特别清楚,欢迎大家积极讨论。以下附上手写笔记。
YOLO-V2:
YOLO-v2(参考网址),由于事情比较多,所以这里先补上之前做的yolo-v2笔记,如果日后有时间,会仔细补上yolo-v2的笔记。【原作地址:https://arxiv.org/pdf/1612.08242.pdf】
参考网址:
YOLO-v2(作者将主干网络称为Darknet-19)主要是精读了第二章better,并对比YOLO-V1所做的改进之处做了如下笔记:
yolo v3参考网址