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,写此博客,以帮助大家少走弯路。