【yolo关键点系列】正式开始改dataloader和损失

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套参数)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值