【项目】使用VGG16 ResNet50预训练模型为backbone进行FCN网络训练 完成分割任务

发布时间 2023-10-25 03:46:24作者: yonuyeung

代码以及数据集后面会在我的ai studio主页公开

拿到这个题目的思路

1.VOC2007,VOC2012怎么统一到一起?

参考:基于PaddlePaddle框架的YOLOv1复现 - 飞桨AI Studio星河社区 (baidu.com)

本地:基于PaddlePaddle框架的YOLOv1复现 - 飞桨AI Studio星河社区 (baidu.com)

2.在页面写代码怎么运行?

参考:飞桨AI Studio星河社区-人工智能学习与实训社区 (baidu.com)

想法:也不一定要写成在页面运行的,只是在页面展示

3.想法:用GPT辅助自己去写代码

相关项目

FCN语义分割 - 飞桨AI Studio星河社区 (baidu.com)

FCN对Pascal VOC2012数据集进行语义分割 - 飞桨AI Studio星河社区 (baidu.com)

实际解决

1.统一VOC2007,VOC2012

在github上搜到相关资料,告诉我们要手动合并数据集。

观察发现,构建数据集的函数里面,只读取了这些内容,完全可以把图片以及txt文件手动整合到一起,取一个新名字,最后调用也要改一下

常见的训练模式

07+12: 使用 VOC2007 和 VOC2012 的 train+val。(16551) 上训练,然后使用 VOC2007 的test(4952) 测试

07++12: 使用 VOC2007 的 train+val+test(9963) 和 VOC2012的train+val(11540) 训练,然后使用 VOC2012 的 test 测试,这种法需提交到 PASCAL VOC Evaluation Server 上评估结果,因为VOC2012 test 没有公布。

这里我们采用07+12的模式训练,需手动构建数据集
手动构建train.txt,val.txt

.....

问题

1.pred形状不匹配?

训练的时候,发现“Valid loss nan, Valid Acc 0.7289, Valid mIoU 0.3159”这种情况

这几天先尝试自己解决,不行的话,在ddl的时候,提交读取PSACAL VOC,训练FCN全流程! - 飞桨AI Studio星河社区 (baidu.com)里面现有的模型

解决

属于偶然事件,有时候就可以正常运行

2.违反了卷积操作的规则

在卷积操作中,输入数据的通道数应该等于卷积核的通道数乘以分组数(groups)。然而,实际情况是输入数据的通道数为2048,而卷积核的通道数为512,分组数为1。这违反了卷积操作的规则,因此引发了错误。

image-20231024125925587

解决

resnet从34换成50导致的问题,需要更改fcn网络,先理解fcn网络是怎么构建的,然后去借鉴下fcn网络

后面更改了很久还是有报错,最后不使用迁移学习去写以resnet50为backbone的fcn网络了,使用一般的方法

3.训练完后的模型怎么只有不?

解决

模型能跑就行,这个我实在是不想去debug了,大概率也是偶然事件,之前数据集的问题导致的,后面模型能跑之后我没有尝试过去跑一遍完整的代码

经验总结

有现成的经验要去借鉴,比如去github找到的手动合并数据集的方法,还有在paddle项目里面找到的现成的对VOC进行分割的项目

走捷径没错,但是太过于依赖捷径只会让自己越慢,不要妄想去用gpt帮助自己更改代码,它只能提供思路!!!

之前一直不敢去改模型,经过这次项目经历,对深度学习的熟练度以及自我学习能力得到了很大的提升。比如在程序中间打断点,看输出,匹配形状,增加卷积层,做数据预处理等等..