ziqi-jin / finetune-anything

Fine-tune SAM (Segment Anything Model) for computer vision tasks such as semantic segmentation, matting, detection ... in specific scenarios
MIT License
791 stars 56 forks source link

当我使用交叉熵loss进行训练我的自定义数据集时,出现了loss不下降的问题(During the training of my custom dataset using cross-entropy loss, I encountered the issue of the loss not decreasing) #47

Open jiaweichaojwc opened 12 months ago

jiaweichaojwc commented 12 months ago

感谢大佬非常优秀的工作 当我使用交叉熵loss进行训练时,loss一直不下降,而且mIoU一直是7左右,不知道有没有什么解决办法 image Thank you for the compliment. When I train using cross-entropy loss, the loss consistently does not decrease, and the mIoU (mean Intersection over Union) remains around 7. I'm not sure if there is a solution to this issue."

LiquorPerfect commented 11 months ago

我也是这个问题,请问你解决了吗?

jiaweichaojwc commented 11 months ago

我也是这个问题,请问你解决了吗?

你好,我发现使用作者的maskadapter收敛是相当慢的,甚至不能收敛,我也查看了一些别的资料,我觉得是这种maskadapter好像不适合我的具体任务,我还有一种感觉好像是梯度不能反传,这个问题是一直困惑着我,我目前还是一个学生,我觉得以我的能力好像是暂时解决不了这个问题,如果你有更好的想法或者有解决方法,可以告诉一下我,谢谢

LiquorPerfect commented 11 months ago

@jiaweichaojwc 我已经解决了,最主要的是optimizer优化器和get_scheduler学习率更新策略要自己看下,我这边都自己重新写了,目前可以loss可以正常减小。优化器我现在使用的是adam,另外损失函数部分你可以根据自己训练集场景再优化下。

jiaweichaojwc commented 11 months ago

@LiquorPerfect 我自己重写过adamw的优化器,我的loss能降低一部分,但是我的val的miou好像最高达到10,你的miou是否是正常的?我做的是语义分割的微调,感谢你的工作

LiquorPerfect commented 11 months ago

@jiaweichaojwc 我就一个类别的分割,算上背景就2个类别,miou是正常上升的,最高能达到93左右。我损失函数使用的是bce,没有用作者提供的ce损失。我修了forward部分,使用了sam原始结构中forward的,使用了后处理后,并对mask进行sigmoid,因为我是二分类。

jiaweichaojwc commented 11 months ago

@LiquorPerfect 恭喜你的训练结果取得了不错的接果,我看作者发布的源码,大概就是将最后的输出变成了(b,n,h,w),而我修改了一部分encoder的部分,出现了loss不收敛,我接着使用原来sam的forward结构,还是不收敛,我倒是觉得不像是ce的loss的问题,虽然你是二分类的问题,但是我是多分类的问题,我觉得最后都要输出(b,n,h,w),您可以让我看一下你的训练配置文件吗? image 这是我的优化器和训练策略,我改了好几次的训练策略,好像loss降低到0.2左右附近,然后出现了loss上下浮动,并且miou也维持到了8左右,我想应该是训练策略的问题

LiquorPerfect commented 11 months ago

我后面没有通过配置文件创建,修改的直接在代码里。我感觉point和boxes不适合多类别语义分割,你的提示词是什么?mask or point or box?

add: 要不你看看下面两个。 https://github.com/UX-Decoder/Semantic-SAM https://github.com/UX-Decoder/Segment-Everything-Everywhere-All-At-Once

jiaweichaojwc commented 11 months ago

我后面没有通过配置文件创建,修改的直接在代码里。我感觉point和boxes不适合多类别语义分割,你的提示词是什么?mask or point or box?

add: 要不你看看下面两个。 https://github.com/UX-Decoder/Semantic-SAM https://github.com/UX-Decoder/Segment-Everything-Everywhere-All-At-Once

我使用的是https://github.com/ziqi-jin/finetune-anything,这个目前还不支持提示信息呀,作者是将提示的舍弃掉了,直接用的encoder和maskadapter,loss这个问题困惑我许久,直到最近你回答了这个问题,我觉得可以试一下,目前感觉还是很难解决,不知道什么原因,可能会暂时搁置一下了

LiquorPerfect commented 11 months ago

我后面没有通过配置文件创建,修改的直接在代码里。我感觉point和boxes不适合多类别语义分割,你的提示词是什么?mask or point or box? add: 要不你看看下面两个。 https://github.com/UX-Decoder/Semantic-SAM https://github.com/UX-Decoder/Segment-Everything-Everywhere-All-At-Once

我使用的是https://github.com/ziqi-jin/finetune-anything,这个目前还不支持提示信息呀,作者是将提示的舍弃掉了,直接用的encoder和maskadapter,loss这个问题困惑我许久,直到最近你回答了这个问题,我觉得可以试一下,目前感觉还是很难解决,不知道什么原因,可能会暂时搁置一下了

我在他的基础上加了boxes和point提示词,forward部分我没有用作者给的,还是使用的原生sam forward部分内容。

jiaweichaojwc commented 11 months ago

这样呀,虽然我的数据集有boxes的提示信息,但是当我在进行验证的时候是否还是需要一个人工交互的场景?我目前做的任务是安检语义分割的任务,如果我训练的时候使用boxes,但是当我部署下来使用的时候就会出现人工交互的场景,这样无疑是给人工带来了极大的不便,所以我觉得加提示信息不太适合我的任务,还是我的理解有误?如果你有更好的想法欢迎给出指导

LiquorPerfect commented 11 months ago

这样呀,虽然我的数据集有boxes的提示信息,但是当我在进行验证的时候是否还是需要一个人工交互的场景?我目前做的任务是安检语义分割的任务,如果我训练的时候使用boxes,但是当我部署下来使用的时候就会出现人工交互的场景,这样无疑是给人工带来了极大的不便,所以我觉得加提示信息不太适合我的任务,还是我的理解有误?如果你有更好的想法欢迎给出指导

如果包含提示词,在实际使用中需要加入的效果好点,但是也不一定非要人工交互,可以模型生成boxes?,而且boxes和point是通用的,有了boxes point也就有了。我等会训个没有提示词的看看。我感觉sam不适合多类别语义分割,普通模型输出的是BCHW,C表示类别数。而这里multimask最多3个,是不是损失函数也有问题。

jiaweichaojwc commented 11 months ago

@LiquorPerfect 原本sam最后生成的是0和1的mask图,作者通过这个仓库进行了maskadapter,引入了num_class,让其能够适应多分类的任务了,但是我确实是loss不能下降,miou确实也是最高只能达到10左右

LiquorPerfect commented 11 months ago

@jiaweichaojwc 多个类别分割的话,建议还是下面两个方法尝试。 https://github.com/UX-Decoder/Semantic-SAM https://github.com/UX-Decoder/Segment-Everything-Everywhere-All-At-Once

jiaweichaojwc commented 11 months ago

@LiquorPerfect 好的,谢谢你啊,我去看看这两个项目

bvcg204 commented 10 months ago

@jiaweichaojwc 你好,请问现在SAM输出多分类语义信息上的问题解决了吗? 我也是用这个仓库的代码对SAM进行微调,三分类语义分割,虽然loss在下降但是最有的mIoU只有0.5;自己写了推理代码,但是发现推理出来的图片基本都是黑的,说明训练失败了,请问有解决方案吗

jiaweichaojwc commented 10 months ago

@bvcg204 我觉得是这种微调的架构有问题,我目前没有解决方法,这个问题困惑了我很久,现在已经放弃了

tequila28 commented 9 months ago

@LiquorPerfect 您好,我也是使用bce和sam原始结构中forward进行一个二分类的分割任务,结果出现了loss不下降的情况,感觉是梯度没有传过去,请问您具体是如何实现的呢

LiquorPerfect commented 8 months ago

@LiquorPerfect 您好,我也是使用bce和sam原始结构中forward进行一个二分类的分割任务,结果出现了loss不下降的情况,感觉是梯度没有传过去,请问您具体是如何实现的呢

你好,我机会是基于原生sam修改的,只用了此作者的一个框架,需要注意的是mask_threshold会阻止梯度回传,导致梯度不更新。(我好像图片上传不了)

vdogmcgee commented 8 months ago

我后面没有通过配置文件创建,修改的直接在代码里。我感觉point和boxes不适合多类别语义分割,你的提示词是什么?mask or point or box?

add: 要不你看看下面两个。 https://github.com/UX-Decoder/Semantic-SAM https://github.com/UX-Decoder/Segment-Everything-Everywhere-All-At-Once

你好,请问一下,用这个项目预训练自己的多类语义分割模型,我只有无监督图片,以及少量的分割标注,我的prompt应该从哪里来呢?