随着深度学习对目标检测的工业应用发展,尤其是在无人驾驶热度的带动之下,社会的各个工业领域都在尝试把这样一个好用的东西迁移到自己的产业中来。自从把 YOLO v3 用于训练自己的数据集 Chat 发布之后,发现文章的订阅量在逐步的上升,其中也发现了一些疏漏的地方和不足之处。
本Chat为 YOLO v1 和 YOLO v3 两篇文章的补充内容,针对上述两篇文章存在的不足,给予适当的修改和补充。包括:
- YOLO v1 中的网络构建问题;
- YOLO v3 动手实践第四部分改动一处,voc_label.py 的特定修改;
- YOLO v3 动手实践第四部分增添对 cfg 文件夹下 .cfg 文件修改;
- YOLO v3 Darknet 框架下的训练和识别数据可视化;
- 总结感悟。
本Chat免费,欢迎订阅,谢谢!
本 Chat 为 YOLO v1 和 YOLO v3 两篇文章的补充内容,针对上述两篇文章存在的不足,给予适当的修改和补充。包括:
- YOLO v1 中的网络构建问题;
- YOLO v3 动手实践第四部分改动一处,voc_label.py 的特定修改;
- YOLO v3 动手实践第四部分增添对 cfg 文件夹下 .cfg 文件修改;
- YOLO v3 Darknet 框架下的训练和识别数据可视化;
- 总结感悟。
首先,记录下 Pooling 层的作用:
[1].深度学习---之pooling层的作用与缺陷
[2].max-pooling,avange-pooling,Global pooling三类
其次,解答一个问题
请问最后为啥要先 transpose 一下再 flatten net19 = tf.transpose(net18, [0, 3, 1, 2], name='trans_31') net20 = slim.flatten(net19, scope='flat_32')
答:
tf.transpose(input,[dimension_1,dimenaion_2,..,dimension_n])
:这个函数主要适用于交换输入张量的不同维度用的。dimension_n
是整数,如果张量是三维,就是用 0,1,2 来表示。这个列表里的每个数对应相应的维度。如果是 [2,1,0],就把输入张量的第三维度和第一维度交换。同理,net19 = tf.transpose(net18, [0, 3, 1, 2], name='trans_31')
,就是一个四维输入张量,各个对应维度间的转换。
但问题是,为什么要这样维度转换呢?
boxes: 4-D tensor [CELL_SIZE, CELL_SIZE, BOXES_PER_CELL, 4] ====> (x_center, y_center, w, h)
对应着 boxes[0,1,2,3]
,0 表示 x_center
,1 表示 y_center
,2 表示 w,3 表示 h(文中有),对 boxes[0,1,2,3]====>boxes[0, 3, 1, 2]
,也就是 (x_center,h,y_center,w)
,slim.flatten(inputs,outputs_collections=None,scope=None) 将输入扁平化。
例如:
test=([[[1,2,3],[4,5,6],[7,8,9]],[[10,11,12],[13,14,15],[16,17,27]],[[18,19,20],[21,22,23],[24,25,26]]]) #shape is (3,3,3)test=slim.fatten(test)test.eval()array([[ 1, 2, 3, ..., 7, 8, 9], [10, 11, 12, ..., 16, 17, 27], [18, 19, 20, ..., 24, 25, 26]], dtype=int32) #shape is (3,9)
有兴趣的可以深入网络里面,细查究竟。
二:YOLO v3 动手实践第四部分改动一处,voc_label.py 的特定修改整理整个文章的时候,遗漏了这一点,想起来就补充一下(圈子里面也有补充说明);这个文件主要是对 train.txt 文件的读取,设定读取顺序:
- 改 labels 数据;
- 我把最后一行给注释了,根据自己的情况改了,也不确定是不是真必须这样,不影响训练和测试。
1.cfg 文件下,根据自己训练数据类别 classes 的不同,有针对性的修改,修改为的数根据论文中给出的公式:
last_filter_number=3*(4+1+classes)
注 .classes 为类别数目
2.其后的 classses 数目,也相对应的修改,不详述了,就是一个补充
四:YOLO v3 Darknet 框架下的训练和识别数据可视化1. 关于YOLO模型训练“可视化中间变量”的可视化方式
可参照这个博客:YOLO模型训练可视化训练过程中的中间参数。能够实现对训练过程中数据进行记录,包括 loss, learning_rate 等比较有参照意义的训练参数。发现这个 Darknet 框架并没有像 TensorFlow,提供了像 TensorBoard 一样简单好用的可视化工具,所以这里就多中间变量先记录,后数据分析的方式,显示出来,或许对要写论文的小伙伴比较有帮助。
如图,对 loss 的图像记录后的数据处理图,这里对迭代次数过多的 loss 变化,提供了查看跳过的方式,可以更加有重点的发现最佳用于测试的 batch。
2. 推荐这篇文章,对 mAP 进行运算和绘制
支持了查全率和查准率的图像的调取,点这里:mAP 数据测试
这里展示了对自己数据的一个图像,代码不需要太多修改,推荐
其实这里对于自己数据的训练,也发现了一些问题。
- 就是发现用 voc_eval.py 对 valid 后生成的检测数据 AP 结果和 123.py 生成的 AP 值不一样。
- 就是有点绘制出来的 recall-prec 曲线很怪异,会满足线性递增,然后突然又递减,并不像上面这个,随着 recall 的增加,prec 减小的特征。但是测试结果又那么好,不像是有问题的样子,很纳闷。如有前辈知道是为什么,求留言指教。
1. 数据集,数据集,数据集
数据集的好快,直接影响到后面的训练学习、验证、及测试的整个过程。所以对数据的采集,尤其是后面对数据的筛选、处理将直接影响到最后测试的好坏,甚至使得整个训练没有价值。
2. 看着输出数据调参数
在每一次发现了训练结果不满意的情况下,先不着急乱调,采用数据处理的方式,对训练数据查看一下,有针对性的微调数据,能起到事半功倍的效果。
3. 推荐一个自己整理和经过调试后证明好用的代码:VS批量读取文件夹,自动改图片名字
[VS]批量读取文件夹,自动改图片名字。这将明显的提高图像预处理的效率。
4. 推荐一个图像增强方法:CNN Data Augmentation(数据增强)-旋转
CNN Data Augmentation(数据增强)-旋转。自己还没有尝试下好不好用,如果各位客官在实践中发现了什么问题,欢迎留言探讨。
本文首发于GitChat,未经授权不得转载,转载需与GitChat联系。
阅读全文: http://gitbook.cn/gitchat/activity/5b2865f15b15e22abb141005
您还可以下载 CSDN 旗下精品原创内容社区 GitChat App ,阅读更多 GitChat 专享技术内容哦。