centernet损失函数修改记录

本文探讨了在CenterNet模型中使用IOU Loss优化宽高损失的方法,详细讲解了自定义损失函数时需要注意的问题,包括确保函数可导、避免使用for循环及如何正确创建张量等,并介绍了梯度量级匹配的重要性。

想将centernet中w,h的loss修正关联起来,采用iouloss进行优化,于是需修改loss函数,注意事项如下:

(1)loss函数本身到网络的输出层存在一个函数,这个函数求导,再逐层链式向前求导,完成训练。所以,自己写出的损失函数到pred一定要明确可导,不能乱写。

(2)写损失函数尽量使用torch自带的函数和+,-,*,/号进行操作,避免新建变量和for循环等操作,容易造成梯度无法反向传播。常用torch函数:

torch.clamp(),截断操作,限定最大最小值

torch.min, max

新建tensor需注意用原有输入tensor赋值方式:a=pred.new_tensor([0])

(3)正常操作流程如下:loss函数继承nn.module模块,编写forward过程。

(4)即便所有流程都编写正确,由于loss中存在的各种运算,还会出现计算出的梯度和weight不在一个量级,导致weight无法更新问题。比如,weight在1e-4量级,计算出的梯度在1e-10量级,这样会导致你训练几千次,weight也不会更新,进而loss没有任何改变。

(5)针对(4)中的问题,mmdet中的loss函数模板会有两个weight,一个weight为标量,可线性扩大缩小loss的数值;第二weight为tensor,与输出loss的维度一致,可精确控制每一个tensor元素对应loss的权重。

(6)即使通过(5)中操作,将loss放大较大范围,是的weight对应的grad在相同量级,可进行正常更新,还会存在问题:即损失函数设计不合理,weight较小时导致grad很小,梯度不更新,weight较大时,导致grad更新又跳变,训练发散。  总结就是:loss函数本身设计有问题,是无法通过简单的weight权重调整解决的。得尝试更换或重新设计loss函数。

我现在需要做焊接区域缺陷目标检测任务,现有的数据如下: 现有的有待测焊接接头图片(path=D:\seam\SegNet\PH2Dataset\origin image),焊接区域缺陷数据集(img path=D:\seam\SegNet\PH2Dataset\welding image\img,label path=D:\seam\SegNet\PH2Dataset\welding image\label),焊接区域匹配模板(path=D:\seam\SegNet\Multiple templates\Templates)模板是从待测焊接图像中切割出来用于匹配焊接区域的,数据集是切割出的焊接区域,按照yolo数据集格式标注的,原图和标签。 现在需要形成两个代码:这两个代码的要求是相互作用的 训练代码:需要完成下列要求 1、根据我的数据集,学习标定框选焊接缺陷 2、要求用到centerNET网络模型,必须修改网络结构,有一定的改动 3、训练的最佳记录需要保存下来,path=D:/seam/SegNet/PH2Dataset/weights/best_model_improved.pth,设定在训练轮数中,损失最小的即为最佳记录 4、训练的结果要形成一个train loss、test loss与训练次数的曲线图 5、显示五张训练结果图 6、代码需要进行数据增强,在训练时动态增强扩充数据集5倍,不要采用颜色变化的方式,其他的都可用, 7、我的数据集没有划分训练集、测试集,将扩充的图像数据按照8:2的比例划分训练集和测试集 8、直接在代码中定义centerNET模型 检测代码:需要完成下列要求 1、不用再次训练,直接使用训练代码的最佳记录,进行目标检测 2、待测图片是整个的焊接接头,必须用模板匹配,匹配出焊接区域后,将这部分的图像切割出来,再送进目标检测模型 3、检测结果需要显示模板匹配结果、切割出来的图像以及目标检测的结果 4、目标检测的结果中,需要有检测框,希望检测代码能够像YOLO算法的检测结果那样,用不同的小框,框选出检测目标 5、目标检测3个分类,0:crack,1:aluminum,2:Nocrack,这三个分类中,0,1和2是对立的,不同时出现,这是多分类问题,当检测出0,1类结果时就框选出0,1类结果,两个分别用两个识别框框选,当检测到2类结果时,就用一个框框选出来,0,1和2类结果不同时出现,只要有0,1那么就不可能有2,生成的识别框要求精准,数量强制要求,0和1类的结果中,0类结果优先显示 6、必须要有注意力特征融合模块,多特征融合模块,多模板匹配模块,多尺度检测,将模板匹配的位置切割出来在送进预测模型,这个过程也必须需要(我的数据集就是训练的切割后的区域),完成精确目标检测任务,这个框一定要像YOLO结果那样,带有置信度,大小位置合理 7、现有的路径都是存在的,不用修改 请结合我的要求,生成这两个代码,这两个代码必须协调,特别注意训练代码保存的模型参数与检测代码的使用时的参数能否兼容,这两个代码不能相互使用时出现问题 8、要引入orb算法和flann优化器 9、检测代码加入一些检测的指标,如正确率、回归率、召回率等数据值 两个代码相互协调,给我完整的两个代码,不用在意篇幅限制,两个代码必须完整 10、仔细生成代码,注意代码是否能够运行 我的标签按照这个: 0,crack,(255,0,0) 1,aluminum,(0,255,0) 2,nocrack,(0,0,255) 我的数据集中的图片和标签数量是一一对应的,代码动态扩充数据集时,注意两者的对应关系
03-08
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值