1.标签读取
前面改了模型detect层的输出通道,现在修改标签读取。
需要修改:
数据集标签格式,改成5+8=13位,标签读取进来之后要和pre的结果计算损失。在dataloader里面读取的过程中会有相应的变换,后面用归一化到中心点的方法搞出来。
targets
传到self.build_targets(p,targets)里面的targets是从调用compute_loss实例中得到的:
loss, loss_items = compute_loss(pred, targets.to(device))
for i, (imgs, targets, paths, _) in pbar:
targets在上面pbar得到,而pbar从trainloader中得到,trainloader中传入了dataset,dataset由cache文件得到标签信息
for i, (imgs, targets, paths, _) in pbar:
pbar = enumerate(train_loader)
中间省略一万步,这里已经可以正常训练输出所有的数据了,但是数据有问题,框正常,但是点都是0,这里一个一个整理一下:
后面经过复杂的调试过程,能够正常读取标签点的信息,标签读取之后可以用函数画出来。
2、问题整理
(1)模仿plots.py的方法用原来的标签把框和点画出来
在pythonProject1/yolov5/try_draw.py中
整理下detect.py由预测得到的pre到画出框的过程:
detect得到pre,然后经由scale_coords()放大:
pred = model(im, augment=augment, visualize=visualize)
# pred.shape=(1,20160,93)
# 为什么这里pred的第一个维度是1??
# NMS
pred = non_max_suppression(pred, conf_thres, iou_thres, classes, agnostic_nms, max_det=max_det)
# pred.shape= list:1 * Tensor(1,14)
# 经过了NMS之后开头叠了一层list:1,Tenosr变成(1,14)=(目标数,xywh+8),在NMS里面有相关变换
# Rescale boxes from img_size to im0 size
det[:, :4] = scale_coords(im.shape[2:], det[:, :4], im0.shape).round()
det[:, 6:] = scale_coords(im.shape[2:], det[:, 6:], im0.shape).round()
先进到NMS里面看一下:
pred.shape(1,20160,93)
下面研究一下scale_coords的变换过程:
这里先跳过
3、运行结果
(1)lpoints参数0.001,epoch=768:
精度:0.995
loss:
结果: 有框无点
(2)lpoints参数0.1,初始lpoints约25,epoch=206:(exp206)
精度:0.05991
到50epoch左右精度突然崩溃,损失也都突然上升,训练了100epoch精度没有明显改善之后训练停止。但是最后精度和损失都有改善的趋势。
结果:有框无点
(3)lpoints参数0.1,结果同上面部分,调整patience=500:(exp207)
精度:最高0.53左右
前面和上面(2)的训练结果基本一致,之后精度有所起色,但是在500epoch之后就不太健康,在800之后更是直接崩溃,可能是要调整学习率动量之类的参数。
损失:obj在后面突然间暴涨,可能是相关参数的变化导致的
box_los在基本相同的位置逐步爬高
cls_loss的情况倒是挺奇怪,看起来像是正常下降了。exp206的结果在前面部分也跟exp207完全一致。
detect结果:有框无点,甚至有几张小置信度误识别
(4)对模型进行了一次比较彻底的修改,labels也改成了收敛在中心点,detect.py也能收到点的数值,只是数值比较小,训练没法收敛,需要合适的优化方法(exp253)
参数:lpoints参数0.1,batch-size=32,momentum=0.937
精度:
刚开始效果还可以,在100epcoh的时候突然崩溃
(5)重新打开了数据增强(exp255)
参数:lpoints=0.1,batch-size=32,momentum=0.95,epoch=2000
有框无点,预测出来的值还是很小
上面损失的代码有bug,其实参考价值不大,把点的损失加到[:,4:12]了其实这是93位的,后面8位才是点的位置,相当于点和类别在抢这个损失,下面更新了之后,mosaic还是关了,因为打开之后函数会冲突,点会飘掉。segment随机缩放打开,因为没什么太大问题。
(6)更正了损失函数
参数:segment=False,mosaic=False,lpoints=0.1,momentum=0.95,epoch=2000,batch-size=32
备注:segment和val代码冲突,检查的时候val时装甲板和框还是不重合,先关掉segment试看看,看来还是得入手val
训练备注:训练的时候val时lpoints会突然暴涨到几千,但是下一个epoch,train的时候不会受影响,现在不得不去看下val.py里面的操作了。
奇怪的是,几个epoch之后,val的时候lpoints又正常了,确实奇怪。
(7)再次迭代:(exp267)
更正了部分bug和detect.py网络中最后一层的sigmoid问题,正确输出框和点,但是点不太稳定
训练并没有完全收敛,只是稍微训练了100多epoch尝试一下,而且直接平方的损失也有点问题,在点比较接近标签的时候平方之后损失太小。
参数:lpoints=0.004
bug导致点偏移:
修复后:
(7)更改损失函数(exp273)
更改了损失函数,平方之后开10次方,最后参数更改大一点。不小心把exp267的权重放进去跑了,将错就错,反正之前也没训练收敛。
参数:lpoints=0.1
已经训练360+epoch,好像动不了了:
精度基本在0.01之内变化,损失也长期在1.3左右:
最终训练了800epoch左右仍然没有太大的变化
点的损失最终也在1.3难以下降:
(8)从头开始训练(exp275@CRT)
用yolov5s.py重新训练
参数:lpoints=0.1,开方=0.1
(9)三套参数(主机上exp302-304)
全部完蛋
(10)又是三套参数(主机上exp305-307)
set_pow=0.999也是完蛋,可能是那个函数的问题,暂时还不清楚
1,3两套参数没什么太大区别: (红色是exp305第1套参数,灰色是exp307第3套参数)