# AssertionError: The `num_classes` (80) in Shared2FCBBoxHead of MMDataParallel does not matches the

在使用MMDetection训练自定义数据集时遇到类别数不匹配的错误,主要涉及mmdetection中的class_names.py和coco.py文件。尝试修改这两处文件的类别列表,以及重新编译代码,但仍然报错。最后通过直接在conda环境的site-packages目录下修改相应文件解决了问题,确保类别数目和定义一致,且每个类别后需加上逗号作为元组。
摘要由CSDN通过智能技术生成

mmdetection训练自己的数据集时报错 ⚠️ :

# AssertionError: The `num_classes` (3) in Shared2FCBBoxHead of MMDataParallel does not matches the length of `CLASSES` 80) in CocoDataset

意思就是你指定的类别(3种)与CocoDataset的类别(80种)不匹配。

你可能已经修改了以下文件,但是还是报错:

mmdetection-master\mmdet\core\evaluation\class_names.py

def coco_classes():
    return [
        # 'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train',
        # 'truck', 'boat', 'traffic_light', 'fire_hydrant', 'stop_sign',
        # 'parking_meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep',
        # 'cow', 'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella',
        # 'handbag', 'tie', 'suitcase', 'frisbee', 'skis', 'snowboard',
        # 'sports_ball', 'kite', 'baseball_bat', 'baseball_glove', 'skateboard',
        # 'surfboard', 'tennis_racket', 'bottle', 'wine_glass', 'cup', 'fork',
        # 'knife', 'spoon', 'bowl', 'banana', 'apple', 'sandwich', 'orange',
        # 'broccoli', 'carrot', 'hot_dog', 'pizza', 'donut', 'cake', 'chair',
        # 'couch', 'potted_plant', 'bed', 'dining_table', 'toilet', 'tv',
        # 'laptop', 'mouse', 'remote', 'keyboard', 'cell_phone', 'microwave',
        # 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase',
        # 'scissors', 'teddy_bear', 'hair_drier', 'toothbrush'
        'lm','ls'
    ]

mmdetection-master\mmdet\datasets\coco.py

class CocoDataset(CustomDataset):
    # CLASSES = (
    #     'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus',
    #            'train', 'truck', 'boat', 'traffic light', 'fire hydrant',
    #            'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog',
    #            'horse', 'sheep', 'cow', 'elephant', 'bear', 'zebra', 'giraffe',
    #            'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee',
    #            'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat',
    #            'baseball glove', 'skateboard', 'surfboard', 'tennis racket',
    #            'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl',
    #            'banana', 'apple', 'sandwich', 'orange', 'broccoli', 'carrot',
    #            'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch',
    #            'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop',
    #            'mouse', 'remote', 'keyboard', 'cell phone', 'microwave',
    #            'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock',
    #            'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush'
    #     )
    CLASSES = ('lm', 'ls')

废话不多说,直接上方法。有以下几种方法:

1️⃣ 是修改最少的,假设你有2个类,你就把上边两处地方,前2个类替换成你的类别。方法比较简单,但是可能存在隐患。

2️⃣ 第二种方法就是修改完 class_names.py 和 voc.py 之后一定要重新编译代码(运行python setup.py install),再进行训练。

我试了,还是报同样的错误,可能是我方法不对。

参考:

新版 MMDetection V2.3.0训练测试笔记 - it610.com

mmdetectionV2.x版本 训练自己的VOC数据集_桃子酱momo的博客-CSDN博客

3️⃣ 第三种方法,也是我使用的方法,其实跟重新编译一样,重新编译的原因就是因为环境里的源文件没有修改,所以你才会报错。mmdetection-master目录下只是一些python文件,真正运行程序时,运行的还是环境里的源文件,因为我们直接去环境里修改源文件。

假设我的conda环境名为conda_env_name,因此去下面的目录下,分别修改两个文件:

\anaconda3\envs\conda_env_name\lib\python3.7\site-packages\mmdet\core\evaluation\class_names.py

\anaconda3\envs\conda_env_name\lib\python3.7\site-packages\mmdet\datasets\coco.py

在conda环境里把这两个文件里的类别修改了,就可以了。

注意!!!:一个类别的要在类别后加逗号,定义为元组,例如:("class_1",)。

⭐ 最终也功夫不负有心人,解决掉了这个bug,写此博客,以帮助大家少走弯路。

评论 41
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gy-7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值