xzz777/SCTNet

请问如果我将自己的数据集组织为cityscpes格式,我应该怎样组织预训练模型?

Opened this issue · 9 comments

我把自己的数据集组织为cityscapes格式,我的分类数为5类,使用sctnet-b_seg100_8x2_160k_cityscapes.py配置文件,设置了checkpoint_teacher = 'pretrain/Teacher_SegFormer_B3_city.pth'
checkpoint_backbone = 'pretrain/SCT-B_Pretrain.pth'
然后我在iter为2000的时候得到最优的iou为52,这样正常吗?或者有没有更好的方式能够提升它,谢谢!

在你个性化的数据集上性能只能由你个人的经验判断是否正常。但通常来说,如果loss在正常收敛,那么训练过程是正常的。但如果你是想在你的项目数据集上获得一个轻量且高效的实时语义分割网络,你应该首先在你的项目数据集上训练SegFormer,之后使用tools/pth_convet.py转化模型权重,然后再训练。
我在一个类似citysapes的项目数据集上使用过SCTNet。我把模型放大到39FPS左右后(略快于PIDNet-L),使用训练好的高性能的InternImage作为语义分支,取得了超过PIDNet-L 1mIoU以上的精度。如果你想在项目中使用SCTNet,对模型的微调和对优化器(包括iteration、lr等)的调整都是有必要的,这取决于你的项目数据集的特点和你的需求。

Performance on your personalized data set can only be judged by your personal experience. But in general, if the loss converges normally, then the training process is normal. But if you want to get a lightweight and efficient real-time semantic segmentation network on your project dataset, you should first train SegFormer on your project dataset, then use tools/pth_convet.py to transform the model weights, and then train SCTNet.
I have used SCTNet on a citysapes-like project dataset. After scaling up the model to around 39FPS (slightly faster than PIDNet-L), I used the trained, high-performance InternImage as a semantic branch and achieved over 1% higher mIoU than PIDNet-L. If you want to use SCTNet in your project, it will be necessary to modify the model and adjust the optimizers (iteration, lr, etc.), depending on the characteristics of your dataset and your needs.

在你个性化的数据集上性能只能由你个人的经验判断是否正常。但通常来说,如果loss在正常收敛,那么训练过程是正常的。但如果你是想在你的项目数据集上获得一个轻量且高效的实时语义分割网络,你应该首先在你的项目数据集上训练SegFormer,之后使用tools/pth_convet.py转化模型权重,然后再训练。 我在一个类似citysapes的项目数据集上使用过SCTNet。我把模型放大到39FPS左右后(略快于PIDNet-L),使用训练好的高性能的InternImage作为语义分支,取得了超过PIDNet-L 1mIoU以上的精度。如果你想在项目中使用SCTNet,对模型的微调和对优化器(包括iteration、lr等)的调整都是有必要的,这取决于你的项目数据集的特点和你的需求。

想请教下训练SegFormer,是用哪个库呢,我尝试了https://github.com/OpenGVLab/InternImage 训练了基于自己数据的 segformer_internimage https://github.com/OpenGVLab/InternImage/blob/master/segmentation/configs/cityscapes/segformer_internimage_l_512x1024_160k_mapillary2cityscapes.py
得到了一个2.9G大小的分割模型,然后使用tools/pth_convet.py转化模型权重,得到了900MB大小的模型,我把它作为teacher模型,SCT-B_Pretrain.pth,作为backbone 。他会有很多警告

2024-04-12 15:24:02,232 - mmcv - WARNING - The model and loaded state dict do not match exactly

size mismatch for conv1.0.weight: copying a param with shape torch.Size([32, 3, 3, 3]) from checkpoint, the shape in current model is tor
ch.Size([64, 3, 3, 3]).
size mismatch for conv1.0.bias: copying a param with shape torch.Size([32]) from checkpoint, the shape in current model is torch.Size([64
]).
.
.
.

image

最终的效果和使用默认teacher模型,没什么差别。
我不清楚效果不佳是否和那些警告有关。

@xzz777 我看到了的你的回复 #24 (comment)
我有一个疑问,您遇到过这些警告吗

@xzz777 我看到了的你的回复 #24 (comment) 我有一个疑问,您遇到过这些警告吗

我没有遇到过这些警告,感觉你的权重没有load对所以训出来精度很低,你看看这些权重前缀是auxiliary_head还是backbone没load对,我感觉你像是backbone权重load错了?你检查一下是不是用的SCTNet-S的权重初始化的SCTNet-B的模型,两个通道数不一样。

@xzz777 我看到了的你的回复 #24 (comment) 我有一个疑问,您遇到过这些警告吗

我没有遇到过这些警告,感觉你的权重没有load对所以训出来精度很低,你看看这些权重前缀是auxiliary_head还是backbone没load对,我感觉你像是backbone权重load错了?你检查一下是不是用的SCTNet-S的权重初始化的SCTNet-B的模型,两个通道数不一样。

有可能是你猜测的原因,因为我初期没太分清SCTNet-S 和SCTNet-B 有可能混用了,我将重新再试一遍

@xzz777 我看到了的你的回复 #24 (comment) 我有一个疑问,您遇到过这些警告吗
您好,我想请教一下,您在使用自己的数据预训练segformer时,是如何做的?在sctnet的项目中能否实现?谢谢您!

@xzz777 我看到了的你的回复 #24 (comment) 我有一个疑问,您遇到过这些警告吗
您好,我想请教一下,您在使用自己的数据预训练segformer时,是如何做的?在sctnet的项目中能否实现?谢谢您!

我在上面的回复中已经说的比较明白了
#7
,而作者也说的很明白了,他用的是mmseg提供的segformer权重,你可以去看mmseg的官方开源项目,学习怎么训练。

@xzz777 我看到了的你的回复 #24 (comment) 我有一个疑问,您遇到过这些警告吗
您好,我想请教一下,您在使用自己的数据预训练segformer时,是如何做的?在sctnet的项目中能否实现?谢谢您!

我在上面的回复中已经说的比较明白了 #7 ,而作者也说的很明白了,他用的是mmseg提供的segformer权重,你可以去看mmseg的官方开源项目,学习怎么训练。

好的,感谢您的回复,我会去学习一下mmseg的官方开源项目。