使用mmdetection時遇到的問題比較多,首先要對自己要使用的預訓練模型有一定的了解,并且懂得使用各種分類模型時不同的模型不同任務執行階段需要參數上的對其。(比如mask-rcnn和它的三個頭之間的參數)。
首先,談談torch.save()方法保存和加載的.ph文件的格式:
import torch pretrained_weights = torch.load("C:\\Users\\username\\Downloads\\mask_rcnn_x101_32x8d_fpn_mstrain-poly_1x_coco_20220630_170346-b4637974.pth") # 11 是指 數據類別 + 1 print(pretrained_weights)
如上可以得到:
這個meta所保存的是各種類別名、mmdet版本
巴拉巴拉,往下翻還有一個鍵值對
這里保存的是各個層的參數。
然后,談一下遇到的兩個問題:
1.
The model and loaded state dict do not match exactly
size mismatch for roi_head.bbox_head.fc_cls.weight: copying a param with shape torch.Size([81, 1024]) from checkpoint, the shape in current model is torch.Size([2, 1024]).
還有五個這種參數,筆者較為仔細地看了mask-rcnn文章和另一位博主使用這個商湯的框架去跑DETR時候遇到的類似的問題,得出解決方案。
先說原因:預訓練模型在coco上預訓練,而coco本身類別是80,所以它的主干網絡送到其他的三個頭(分類頭、mask回歸頭、bbox頭的參數種類對不上),我這個是個1個類別,加上背景。六個錯誤維數對不上,剛好對應w、b和三個頭。(幾個頭之間權重是不共享的)
解決方案:把load_from中的權重下載下來,resize然后重新保存,即可。
import torch
pretrained_weights = torch.load("C:\\Users\\user\\Downloads\\mask_rcnn_x101_32x8d_fpn_mstrain-poly_1x_coco_20220630_170346-b4637974.pth")pretrained_weights['state_dict']['roi_head.bbox_head.fc_cls.weight'].resize_(2, 1024) pretrained_weights['state_dict']['roi_head.bbox_head.fc_cls.bias'].resize_(2) pretrained_weights['state_dict']['roi_head.bbox_head.fc_reg.weight'].resize_(4, 1024) pretrained_weights['state_dict']['roi_head.bbox_head.fc_reg.bias'].resize_(4) pretrained_weights['state_dict']['roi_head.mask_head.conv_logits.weight'].resize_(1, 256, 1, 1) pretrained_weights['state_dict']['roi_head.mask_head.conv_logits.bias'].resize_(1)
torch.save(pretrained_weights, "mask_rcnn_x101_32x8d_fpn_mstrain-poly_1x_coco_20220630_170346-b4637974_changed.pth")
筆者做的是一個實例分割任務,加載的權重是從mask-rcnn官方提供的微軟在coco數據集預訓練的以resnext101為主干網絡,權重調整策略是1x。
遇到的問題:unexpectde argument:times
顯示多傳了一個參數times,我沒搜到這個issue
解決方案:
然后把繼承的配置文件的訓練策略改成一樣的然后就可以了,有大佬對訓練了解的深一些的可以在評論區講解一下這個框架中的學習率sheduler策略有什么差別:在1x、2x、3x直接,我還在配置文件中看到一個20e.
參考博客:
1.加載并修改權重https://zhuanlan.zhihu.com/p/465657162
2.相似問題的分析:MMdetection3.0 訓練DETR問題分析_mmdetection 訓練detr-CSDN博客