概述
1、报错module 'torch' has no attribute 'count_nonzero'
我的Pytorch版本是1.6.0,可以在pytorch网页上搜一下,count_nonzero这个方法最低版本要求1.7.0
https://pytorch.org/docs/1.6.0/search.html?q=count_nonzero&check_keywords=yes&area=default
可用以下代码测试一下已安装torch是否支持这个方法
import torch
print(torch.__version__)
x = torch.zeros(3,3)
x[torch.randn(3,3) > 0.5] = 1
print(x)
a=torch.count_nonzero(x)
print(a)
如果确认是pytorch版本太高的原因,又不想重装pytorch可以改成:
a=torch.tensor(torch.nonzero(x).shape[0])
2、同个任务不同loss的比较
同个任务换了模型后不能简单比较哪个方法的loss小,因为不同方法的loss定义可能是不同的。比如在分割场景中,有的loss有检测损失box_loss,有的没有,就不能粗暴对比了。可以具体关注其中的segm_mAP或loss_mask
3、改配置继续训练某个模型
如果改了配置文件coco_inatance.py而模型没变,注意把模型保存路径下的配置文件如cascade_mask_rcnn_r50_fpn_1x_coco.py删掉,之前训练的时候改了几次参数,最后的修改没完全更新上,效果烂烂的。如下的dump config是引起这个问题的关键。
# dump config
cfg.dump(osp.join(cfg.work_dir, osp.basename(args.config)))
4、同个模型不同backbone
同个模型根据backbone的不同,有多个模型,可查看对应配置文件夹下的README.md,了解其准确率mAP。有意思的是,某些模型的AP范围,最差的backbone可能AP很低,但最好的又很高。所以在用多个模型选型时,不能简单地用每个模型的的R-50版本进行比较。
README.md同样启发我们要用“mask mAP”、“box mAP”这种指标进行对比,而不是看loss。虽然在同个框架下,但loss不同。
5、OOM显存不足
在不同模型间切换时,注意修改某些重要参数,尤其某些配置文件也是层层嵌套的。如训练swin版的mask2former也要改调用的r50版配置文件,并且不同模型的类数量等参数可能命名方式不同,看一下配置文件就知道了。
vim configs/mask2former/mask2former_r50_lsj_8x2_50e_coco.py
修改:
num_things_classes = 80
samples_per_gpu=2,
workers_per_gpu=2,
改后:
num_things_classes = 1
samples_per_gpu=1,
workers_per_gpu=0,
6、评价指标
训练时打印如下输出
2023-01-11 02:32:33,580 - mmdet - INFO - Epoch(val) [83][151] bbox_mAP: 0.8710, bbox_mAP_50: 0.9640, bbox_mAP_75: 0.9090, bbox_mAP_s: -1.0000, bbox_mAP_m: -1.0000, bbox_mAP_l: 0.8710, bbox_mAP_copypaste: 0.871 0.964 0.909 -1.000 -1.000 0.871, segm_mAP: 0.8740, segm_mAP_50: 0.9550, segm_mAP_75: 0.9090, segm_mAP_s: -1.0000, segm_mAP_m: -1.0000, segm_mAP_l: 0.8740, segm_mAP_copypaste: 0.874 0.955 0.909 -1.000 -1.000 0.874
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.874
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=1000 ] = 0.955
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=1000 ] = 0.909
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = -1.000
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = -1.000
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.874
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.896
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=300 ] = 0.896
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=1000 ] = 0.896
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = -1.000
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = -1.000
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.896
其中涉及
bbox_mAP、bbox_mAP_50、bbox_mAP_75、bbox_mAP_s、bbox_mAP_m、bbox_mAP_l
"bbox_mAP_copypaste": "0.845 0.933 0.857 -1.000 -1.000 0.845",
segm_mAP、segm_mAP_50、segm_mAP_75、segm_mAP_s、segm_mAP_m、segm_mAP_l
segm_mAP_copypaste": "0.847 0.928 0.857 -1.000 -1.000 0.848"
以上含义官方介绍:
https://blog.csdn.net/qq_17457331/article/details/84590662
https://blog.csdn.net/qq_27095227/article/details/105450470
这些是coco数据集的评价指标,
_50、_75 指IOU;
_s、_m、_l指面积大小area<32^2、 32^2< area<96^2、area >96^2,
0.50:0.95 指0.50:0.05:0.95的十个阈值,AP是用十个阈值下的P求平均获取的
7、“KeyError: 'TABLEMASTER is not in the models registry'” 提示没注册
TABLEMASTER 用到了mmdet、mmocr、mmcv,在TABLEMASTER开源代码里显式有mmdet和mmocr
搞了半天是因为我注释掉了下面2行,不该注释掉。项目中有些看起来没有用用到的import 包,不要注释掉,会影响mmcv的注册机制。搞不通的时候反思下,自己都干过啥
from mmocr.datasets import build_dataset # noqa: F401
from mmocr.models import build_detector # noqa: F401
8、KeyError: 'DiceLoss is already registered in models'
分析:我的mmdet版本高于项目要求,因此比开源的内容多一些,重复安装后,有些东西就重合了。改一下源码,加一行continue跳过即可,不重复注册。
vim /usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py
9、mmocr的衍生TABLEMASTER,训练时需要生成lmdb文件
lmdb(Lightning Memory-Mapped Database)闪电般的内存映射数据库,减少读取大量小文件的IO开销
data.mdb 数据文件
lock.mdb锁文件
最后
以上就是友好母鸡为你收集整理的MMDet踩坑与使用体会的全部内容,希望文章能够帮你解决MMDet踩坑与使用体会所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复