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

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

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

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

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

mmdetection-mastermmdetcoreevaluationclass_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-mastermmdetdatasetscoco.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,因此去下面的目录下,分别修改两个文件:

anaconda3envsconda_env_namelibpython3.7site-packagesmmdetcoreevaluationclass_names.py

anaconda3envsconda_env_namelibpython3.7site-packagesmmdetdatasetscoco.py

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

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

原文地址:https://www.cnblogs.com/52dxer/p/15401225.html