# AssertionError: The `num_classes` (3) in Shared2FCBBoxHead of MMDataParallel does not matches the length of `CLASSES` 80) in CocoDataset
我看很多人都遇到了这个问题,有很多解决了的。我就把这篇博文再完善一下,让大家对mmdetection使用得心应手。
mmdetection训练自己的数据集时报错 ️ :
# AssertionError: The `num_classes` (3) in Shared2FCBBoxHead of MMDataParallel does not matches the length of `CLASSES` 80) in CocoDataset
你可能已经修改了以下两个文件,但是还是报错:
mmdetection-master\mmdet\core\evaluation\class_names.py
mmdetection-master\mmdet\datasets\coco.py
意思就是你指定的类别(3种)与CocoDataset的类别(80种)不匹配。
如果是报错翻过来的话,也就是你指定的类别(80种)与CocoDataset的类别(3种)不匹配。一定是配置文件里设置错了,去你的配置文件搜索num_classes,然后修改好。
废话不多说,直接上方法。有以下几种方法【经过我多次使用后,推荐第四种,方便的很】:
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环境里把这两个文件里的类别修改了,就可以了,这一招一定可以。
4️⃣ 第四种方法,更简单,更方便,我现在使用的方法。直接在mmdetection配置文件中指定好所有要指定的东西,因为在mmdetection中配置文件的参数值优先级是最高的,所以不用管环境里有没有修改,配置文件里修改了,就可以了。我写了个脚本,把脚本放到mmdetection根目录,根据自己要用的模型,把脚本中的变量都改成自己的。
我以cascade_mask_rcnn_r101为例:
# 在mmdetection的根目录下运行,如果报错:没有那个参数,就把create_mm_config中那个参数赋值给注释掉。生成配置文件后,直接修改配置文件就可以了。
import os
from mmcv import Config
################################# 下边是要修改的内容 ####################################
root_path = os.getcwd()
model_name = 'cascade_mask_rcnn_r101' # 改成自己要使用的模型名字
work_dir = os.path.join(root_path, "work_dirs", model_name) # 训练过程中,保存日志权重文件的路径,。
baseline_cfg_path = os.path.join('configs', 'cascade_rcnn', 'cascade_mask_rcnn_r101_fpn_mstrain_3x_coco.py')
# 改成自己要使用的模型的配置文件路径
save_cfg_path = os.path.join(work_dir, 'config.py') # 生成的配置文件保存的路径
train_data_images = os.path.join(root_path, 'data', 'train', 'images') # 改成自己训练集图片的目录。
val_data_images = os.path.join(root_path, 'data', 'train', 'images') # 改成自己验证集图片的目录。
test_data_images = os.path.join(root_path, 'data', 'val', 'images') # 改成自己测试集图片的目
train_ann_file = os.path.join(root_path, 'data', 'train', 'annotations', 'new_train.json') # 修改为自己的数据集的训练集json
val_ann_file = os.path.join(root_path, 'data', 'train', 'annotations', 'new_val.json') # 修改为自己的数据集的验证集json
test_ann_file = os.path.join(root_path, 'data', 'val', 'annotations', 'new_test.json') # 修改为自己的数据集的验证集json录。
# 去找个网址里找你对应的模型的网址: https://github.com/open-mmlab/mmdetection/blob/master/README_zh-CN.md
load_from = os.path.join(work_dir, 'checkpoint.pth') # 修改成自己的checkpoint.pth路径
# File config
num_classes = 50 # 改成自己的类别数。
classes = ('1', '2', '3', '4', '5', '6', '7', '8', '9', '10',
'11', '12', '13', '14', '15', '16', '17', '18', '19',
'20', '21', '22', '23', '24', '25', '26', '27', '28',
'29', '30', '31', '32', '33', '34', '35', '36', '37',
'38', '39', '40', '41', '42', '43', '44', '45', '46',
'47', '48', '49', '50') # 改成自己的类别
############### 下边一些参数包含不全,可以在生成的配置文件中再对其他参数进行修改 #####################
# Train config # 根据自己的需求对下面进行配置
gpu_ids = range(0, 1) # 改成自己要用的gpu
gpu_num = 1
total_epochs = 20 # 改成自己想训练的总epoch数
batch_size = 2 ** 1 # 根据自己的显存,改成合适数值,建议是2的倍数。
num_worker = 1 # 比batch_size小,就行
log_interval = 300 # 日志打印的间隔
checkpoint_interval = 7 # 权重文件保存的间隔
lr = 0.02 * batch_size * gpu_num / 16 # 学习率
ratios = [0.5, 1.0, 2.0]
strides = [4, 8, 16, 32, 64]
cfg = Config.fromfile(baseline_cfg_path)
if not os.path.exists(work_dir):
os.makedirs(work_dir)
cfg.work_dir = work_dir
print("Save config dir:", work_dir)
# swin和mmdetection的训练集配置不在一个地方,那个不报错用哪个:
cfg.classes = classes
# mmdetection用这个:
cfg.data.train.img_prefix = train_data_images
cfg.data.train.classes = classes
cfg.data.train.ann_file = train_ann_file
# swin用这个,注释上边那个
# cfg.data.train.dataset.img_prefix = train_data_images
# cfg.data.train.dataset.classes = classes
# cfg.data.train.dataset.ann_file = train_ann_file
cfg.data.val.img_prefix = val_data_images
cfg.data.val.classes = classes
cfg.data.val.ann_file = val_ann_file
cfg.data.test.img_prefix = test_data_images
cfg.data.test.classes = classes
cfg.data.test.ann_file = test_ann_file
cfg.data.samples_per_gpu = batch_size
cfg.data.workers_per_gpu = num_worker
cfg.log_config.interval = log_interval
# 有些配置文件num_classes可能不在这个地方,生成之后去配置文件里搜索一下,看看都修改了没
for head in cfg.model.roi_head.bbox_head:
head.num_classes = num_classes
if "mask_head" in cfg.model.roi_head:
cfg.model.roi_head.mask_head.num_classes = num_classes
cfg.load_from = load_from
cfg.runner.max_epochs = total_epochs
cfg.total_epochs = total_epochs
cfg.optimizer.lr = lr
cfg.checkpoint_config.interval = checkpoint_interval
cfg.model.rpn_head.anchor_generator.ratios = ratios
cfg.model.rpn_head.anchor_generator.strides = strides
cfg.dump(save_cfg_path)
print(save_cfg_path)
print("—" * 50)
print(f'CONFIG:\n{cfg.pretty_text}')
print("—" * 50)
生成配置文件后,路径在 ./work_dirs/cascade_mask_rcnn_r101/config.py,在mmdetection根目录下,又可以愉快的进行训练了。
训练命令(在mmdetection根目录):4GPU训练
./tools/dist_train.sh work_dirs/cascade_mask_rcnn_r101/config.py 4
最终也功夫不负有心人,解决掉了这个bug,写此博客,以帮助大家少走弯路。
# AssertionError: The `num_classes` (3) in Shared2FCBBoxHead of MMDataParallel does not matches the length of `CLASSES` 80) in CocoDataset的更多相关文章
- Hadoop 2.6.0编译on mac
花了一个晚上的时间弄了下hadoop的编译环境,碰到些错误,这里保存下. 需要编译Hadoop,不但需要安装Maven,还需要安装protobuf 安装Maven 下载:apache-maven-3. ...
- 学习笔记TF020:序列标注、手写小写字母OCR数据集、双向RNN
序列标注(sequence labelling),输入序列每一帧预测一个类别.OCR(Optical Character Recognition 光学字符识别). MIT口语系统研究组Rob Kass ...
- Pytorch版本yolov3源码阅读
目录 Pytorch版本yolov3源码阅读 1. 阅读test.py 1.1 参数解读 1.2 data文件解析 1.3 cfg文件解析 1.4 根据cfg文件创建模块 1.5 YOLOLayer ...
- Eclipse 导入Hadoop 2.6.0 源码
1. 首先前往 官网(Hadoop 2.6 下载地址)上下载Hadoop的源码文件,并解压 2. 事先请确定已经安装好jdk以及maven(Maven安装教程 这是其他人写的一篇博文,保存profil ...
- 目标检测之车辆行人(tensorflow版yolov3)
背景: 在自动驾驶中,基于摄像头的视觉感知,如同人的眼睛一样重要.而目前主流方案基本都采用深度学习方案(tensorflow等),而非传统图像处理(opencv等). 接下来我们就以YOLOV3为基本 ...
- 卷积神经网络学习笔记——Siamese networks(孪生神经网络)
完整代码及其数据,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/DeepLearningNote 在整理这些知识点之前,我 ...
- 开着idea,死机了,关机重启。重启之后,重新打开idea报错java.lang.AssertionError:upexpected content storage modification
开着idea,死机了,关机重启.重启之后,重新打开idea报错java.lang.AssertionError:upexpected content storage modification. goo ...
- [改善Java代码]在switch的default代码块中增加AssertionError错误
switch的后跟枚举类型,case后列出所有的枚举项,这是一个使用枚举的主流写法,那留着default语句似乎没有任何作用了,程序已经列举出了所有的可能选项,肯定不会执行到default语句,. 错 ...
- 【Flask】报错解决方法:AssertionError: View function mapping is overwriting an existing endpoint function: main.user
运行Flask时出现了一个错误, AssertionError: View function mapping is overwriting an existing endpoint function: ...
- 解决用try except 捕获assert函数产生的AssertionError异常时,导致断言失败的用例在测试报告中通过的问题
在使用Python3做自动化测试过程中可能会遇到,assert函数不加try except,就可以正常在报告里体现用例不通过,加上变成通过. 这是因为在使用try except 时,捕获了asser ...
随机推荐
- AI大模型加速RPAxAI时代到来,谁会是RPA领域的杀手级应用?
GPT等AI大模型震撼来袭,基于RPA的超级自动化仍是最佳落地载体 对话弘玑CPO贾岿,深入了解国产RPA厂商对AI大模型的探索与实践 文/王吉伟 关于RPA已死的说法,在中国RPA元年(2019年) ...
- Cordova下载文件,监听进度,退出疯狂报错
如题. 报错如下: W/cr_AwContents: Application attempted to call on a destroyed WebView java.lang.Throwable ...
- Sharding-JDBC源码解析与vivo的定制开发
作者:vivo IT 平台团队 - Xiong Huanxin Sharding-JDBC是在JDBC层提供服务的数据库中间件,在分库分表场景具有广泛应用.本文对Sharding-JDBC的解析.路由 ...
- 摆脱鼠标系列 - Alt + N 快速切换vscode多个项目 - HotKeyP
摆脱鼠标系列 - Alt + N 快速切换vscode多个项目 用的软件是 HotKeyP 打开软件选择vscode vscode里面的 project那个插件也很好,但是需要打开vscode以后,这 ...
- 重新定义 vscode 命令行工具 code命令 code $profile
vscode 默认命令行有问题 他那个每次都打开cli.js 目录名里面有空格 要 &开头后面跟双引号 所以从新定义后 变量是 $变量名 前面再加上& 就能调用那个exe了 后面再跟上 ...
- use shell scrpit to jlink download bin file
一 JLINK 下载 JLINK作为一个arm的调试工具,是很多基于arm芯片无法绕过去的调试和下载工具.这里有一个问题,就是该工具链接和使用需要的命令特别多,假如不做成脚本,会浪费很多时间,笔者花了 ...
- day01-2-导入驱动和工具类
满汉楼01-2 4.功能实现01 4.1导入驱动和工具类 4.1.1导入驱动 首先将连接mysql的相关jar包引入项目中,分别右键,点击add as library 4.1.2导入工具类Utilit ...
- 3DCAT首届行业生态交流会|燧光CTO 戴景文:云渲染 XR大发展的助推器
2021年12月17日下午,由深圳市瑞云科技有限公司主办,深圳市虚拟现实产业联合会协办的 云XR如何赋能元宇宙--3DCAT实时云渲染首届行业生态合作交流会 圆满落幕.此次活动围绕"云XR如 ...
- Flutter如何状态管理
目录介绍 01.什么是状态管理 02.状态管理方案分类 03.状态管理使用场景 04.Widget管理自己的状态 05.Widget管理子Widget状态 06.简单混合管理状态 07.全局状态如何管 ...
- NA嵌入Flutter页面
目录介绍 01.Android承载flutter容器 02.过时的NA跳转flutter方案 03.升级版本NA跳转Flutter处理 04.如何处理NA跳转flutter传参 05.思考遇到的几个问 ...