目录
【1 - 问题描述】
【2 - 报错位置检查】
【3 - 问题解决】
【4 - 解决的过程】
【1 - 问题描述】
在mmsegmentation中运行mask2former模型的分割任务遇到报错缺少关键字的错误:
TypeError: class `Mask2FormerHead` in mmseg/models/decode_heads/mask2former_head.py: __init__() got an unexpected keyword argument 'in_channels'
【2 - 报错位置检查】
在我运行train.py命令中对应的--config 文件中确实有in_channels和strides等参数(我在查看了Mask2Former的源码Mask2Former/mask2former/modeling/transformer_decoder/mask2former_transformer_decoder.py at main · facebookresearch/Mask2Former (github.com)中,网络结构确实需要这些参数的输入)
而在模型库的".../mmsegmentation/mmseg/models/decode_heads/maskformer_head.py"(下文中 maskformer_head.py 都说的是这个文件)的head模块定义中,只有如下简单的几个参数报错,导致了__init__() got an unexpected keyword argument 'in_channels'。
【3 - 问题解决】
根本原因在于没有安装mmdet这一图像检测的库,maskformer这一实例分割网络依赖目标检测的结果,故会调用mmdetection的类和模块!!
参考 快速入门 — MMDetection 3.3.0 文档
由于我只是将 mmdet 用作依赖项或第三方包,故使用 MIM 安装它:
mim install mmdet
到这里 ,我的__init__() got an unexpected keyword argument 'in_channels'的报错就解决了!!
【4 - 解决的过程】
(可选读)在这里只是简单记录一下我的解决过程:
通过搜索 ‘maskformer head定义in_channel’ ,发现一篇很详细的博文:mmdetection源码阅读--MaskFormer(三) - 知乎 (zhihu.com)。
对比博文中的代码发现我的mmseg(分割)工作的MaskFormer Head的定义(maskformer_head.py)为:
看到“class Mask2FormerHead(MMDET_Mask2FormerHead):”,意识到是继承了mmdet的类。并且在该(maskformer_head.py)的import中有这么一句:
try:
from mmdet.models.dense_heads
import Mask2FormerHead as MMDET_Mask2FormerHead
except ModuleNotFoundError:
MMDET_Mask2FormerHead = BaseModule # BaseModule即 mmseg.models,而mmseg中没有in_channels等参数的定义