MMDetetcion实验

1. 问题一:pytroch-ssd : RuntimeError: Expected a 'cuda' device type for generator but found 'cpu'

解决:File "C:\ProgramData\Anaconda3\lib\site-packages\torch\utils\data\sampler.py", line 133, in __iter__ yield from torch.randperm(n, generator=generator).tolist()。点击该报错的链接,定位到sampler.py文件中,找到如图1所示位置,121行和122行进行修改,将generator = troch.Generator() 修改为generator = torch.Generator(device='cuda')即可。

图1

2. 问题二:IndexError: Caught IndexError in DataLoader worker process 0.

解决:将num_works设置为0 ,parser.add_argument('--num_workers', default=0, type=int,help='Number of workers used in dataloading')

3. 问题三:当只有一个类别时,注意点

当只有一个类别时,需要修改为NUM_CLASSES= [('people')],给类别中小括号外再添加一个中括号。

4. 问题四:IndexError: too many indices for array: array is 1-dimensional, but 2 were indexed

解决:说明某些xml文件中没有标签,也就是没有object,所以需要将此类xml文件进行删除。

5. 问题五:IndexError: invalid index of a 0-dim tensor. Use tensor.item() in Python or tensor.item<T>()

解决:由于pytorch版本不一致导致的问题,将所有类似报错中的.data[0]改为.item()

# 把data[0]全部改为.item()
self.losses[loss name] = losses [loss name] .data[0]
self.losses[loss name] = losses [loss name] .item()

6. 问题六:StopIteration

解决:将train.py165行代码

images, targets = next(batch_iterator)

改为:

try:
        images, targets = next(batch_iterator)
except StopIteration:
        batch_iterator = iter(data_loader)
        images, targets = next(batch_iterator)

7. 问题七:训练时,LOSS为nan

解决:可以尝试将train.py中的学习率从0.001改为1e-4

重点经验注意:在数据集没有任何问题的情况下,如果出现训练loss以及其他指标全为nan的情况,都可以尝试缩小学习率(lr),可以尝试在原学习率基础上缩小十倍,如果还是nan,可继续缩小十倍......

8. 问题八:运行eval.py时,args = parser.parse_args()处报错,运行过程中可能出现pytest错误

解决:将eval.py文件中,最后三行的test_net改为set_net,并且将该方法的具体实现,也同样改成set_net。右键运行eval.py时,会从原来的run pytest in eval.py 变为 run eval

9. 问题九:运行eval.py时,报错:TypeError:can only concatenate str(not "int") to str

解决:将eval.py中代码进行修改

# 原代码
# dataset = MaizeDetection(args.voc_root, [('2007', set_type)],
#                        BaseTransform(300, dataset_mean),
#                        MaizeAnnotationTransform())
# 修改后
dataset = MaizeDetection(args.voc_root, set_type,
                       BaseTransform(300, dataset_mean),
                       MaizeAnnotationTransform())

10. 问题十:RuntimeError: Legacy autograd function with non-static forward method is deprecated. Please use new-style autograd function with static forward method. (Example: 

解决:首先根据http://t.csdnimg.cn/nQ4NQ修改detection.py中的内容,然后在ssd.py中进行如下修改

# if self.phase == "test":
#    output = self.detect(
#        loc.view(loc.size(0), -1, 4),                   # loc preds
#        self.softmax(conf.view(conf.size(0), -1,
#                     self.num_classes)),                # conf preds
#        self.priors.type(type(x.data))                  # default boxes
#     )
#修改为
if self.phase == "test":
    output = self.detect.apply(self.num_classes, 0, 200, 0.01, 0.45, 
        loc.view(loc.size(0), -1, 4),  # loc preds
        self.softmax(conf.view(-1,
                     self.num_classes)),  # conf preds
        self.priors.type(type(x.data))  # default boxes
             )

11. 问题十一:UserWarning: An output with one or more elements was resized since it had shape [80], which does not match the required output shape [84].

解决: http://t.csdnimg.cn/HmaR3

12. 问题十二:DeprecationWarning: elementwise comparison failed; this will raise an error in the future.   if dets == []: 

解决:将 if dets == []: 替换为 if len(dets) == 0:即可。

13. 问题十三:DeprecationWarning: `np.bool` is a deprecated alias for the builtin `bool`.

解决:将出现的np.bool替换成bool即可。

总结:在使用pytorch-ssd进行实验过程中,数据集格式转换在本人的http://t.csdnimg.cn/Xahl7这篇文章第三部分;本篇只是为记录一些实验过程中遇到的错误以及解决...... 

14. 问题十四:mmdetection输出precision指标(voc数据集)

解决:使用voc格式数据集训练mmdetection模型时,测试只输出recall和AP。想要输出precision指标,其实很简单,实际上mmdet/core/evaluation/mean_ap.py的eval_map()函数中已经得到了precision的值并写入了字典,通过修改print_map_summary()函数打印出来

参考资料:https://www.cnblogs.com/chentiao/p/16378844.html

15. 问题十五:mmdetection如何计算参数量、计算量和速度fps

解决:找到mmdetection的tools/analysis_tools/get_flops.py文件。

参考资料:关于mmdetection、mmrotate如何计算参数量、计算量和速度FPS_mmdetection计算fps-CSDN博客

参考资料:

http://t.csdnimg.cn/5Fiz3

http://t.csdnimg.cn/qLASF

 http://t.csdnimg.cn/EXfQw

 SSD训练自己的数据集(pytorch版)_ssd训练自己的数据集pytorch-CSDN博客

 http://t.csdnimg.cn/OFKG4

 http://t.csdnimg.cn/l63YE

 http://t.csdnimg.cn/SkLk0

16. 训练faster rcnn过程(VOC格式)

1. 首先确定voc数据集,将voc数据集放在data文件夹下,数据格式为

data

    VOCdevkit

        VOC_YH(自己数据集,也是annotations文件夹里的folder名)

            Annotations

                01.xml

            ImageSets

                Main

                    train.txt

                    test.txt

                    val.txt

            JPEGImages

                01.jpg

2. 在configs/_base_/datasets/下找到voc0712.py文件,进行数据集路径的改变

3. 在configs/pascal_voc/找到faster-rcnn_r50_fpn_1x_voc0712.py文件进行修改,包括数据集路径、训练次数、batch_size、类别数

4. 在core/evaluation/下找到class_names.py文件进行修改,添加voc_classes()。(自己数据集的类别)

5. 训练代码:

python tools/train.py configs/pascal_voc/faster-rcnn_r50_fpn_1x_voc0712.py --work-dir my_faster

6. 测试代码:

python tools/test.py configs/pascal_voc/faster-rcnn_r50_fpn_1x_voc0712.py  my_faster/epoch_12.pth

7. 计算参数量和计算复杂度

python tools/analysis_tools/get_flops.py work_dirs/faster_rcnn_r50_fpn_1x_voc0712/faster_rcnn_r50_fpn_1x_voc0712.py

8. 图片结果显示(后续下游任务)

python demo/image_demo.py demo/demo.jpg configs/pascal_voc/faster-rcnn_r50_fpn_1x_voc0712.py my_faster/epoch_12.pth --out-file result.jpg
 

9. 视频结果显示(后续下游任务)

 python demo/video_demo.py demo/demo.mp4 configs/pascal_voc/faster-rcnn_r50_fpn_1x_voc0712.py my_faster/epoch_12.pth --out result.mp4

10. 将预测结果逐一展示

python tools/test.py configs/pascal_voc/faster-rcnn_r50_fpn_1x_voc0712.py my_faster/epoch_12.pth --show

# 批量预测
python tools/test.py configs/pascal_voc/faster-rcnn_r50_fpn_1x_voc0712.py my_faster/epoch_12.pth --show-dir my_faster_show

11. 对预测结果进行统计

        使用demo/image_demo.py进行结果计算。

参考资料:Mmcation2中使用mmdetection中的yolo、faster-rcnn、detr训练VOC数据集-CSDN博客​​​​

mmdetection训练voc数据集-CSDN博客

17. 问题十六: mmdetection中运行python setup.py出现错误, usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]    or: setup.py --help [cmd1 cmd2 ...]    or: setup.py --help-commands    or: setup.py cmd --help  error: no commands supplied 

解决:python setup.py install

重点注意:在改变mmdetection代码后,需要运行python setup.py install

18. 问题十七:AttributeError: module 'mmcv' has no attribute 'is_str'

解决:mmcv最新模块中已不再支持"is_str",直接安装mmengine即可,将原先的import mmcv改成import mmengine。再将mmcv.is_str()改为mmengine.is_str()

19. mmdetection训练、测试代码

python setup.py install # 修改代码后,需要进行重新运行
python tools/train.py configs/pascal_voc/faster-rcnn_r50_fpn_1x_voc0712.py # 训练
python tools/test.py work_dirs/faster-rcnn_r50_fpn_1x_voc0712/faster-rcnn_r50_fpn_1x_voc0712.py work_dirs/faster-rcnn_r50_fpn_1x_voc0712/epoch_12.pth # 测试
python tools/analysis_tools/get_flops.py work_dirs/faster-rcnn_r50_fpn_1x_voc0712/faster-rcnn_r50_fpn_1x_voc0712.py # 得到参数

20. 问题十八:ValueError: class `EpochBasedTrainLoop` in mmengine/runner/loops.py: class `RepeatDataset` in mmengine/dataset/dataset_wrapper.py: class `ConcatDataset` in mmdet/datasets/dataset_wrappers.py: class `VOCDataset` in
 mmdet/datasets/voc.py: need at least one array to concatenate

解决:mmdetection 训练自定义数据集出现 need at least one array to concatenate-CSDN博客

21. 问题十九:训练ssd300时,AttributeError: 'SSDHead' object has no attribute 'loss_cls'

解决:

        1. 导航到代码文件mmdetection/mmdet/models/dense_heads/base_dense_head.py

        2. 在第 376 行的 if 语句中

修改前
if getattr(self.loss_cls, 'custom_cls_channels', False):
    scores = self.loss_cls.get_activation(cls_score)
elif self.use_sigmoid_cls:
    scores = cls_score.sigmoid()
else:
    # remind that we set FG labels to [0, num_class-1]
    # since mmdet v2.0
    # BG cat_id: num_class
    scores = cls_score.softmax(-1)[:, :-1]

修改后
if False: # getattr(self.loss_cls, 'custom_cls_channels', False):  # Change made here
    scores = self.loss_cls.get_activation(cls_score)
elif self.use_sigmoid_cls:
    scores = cls_score.sigmoid()
else:
    # remind that we set FG labels to [0, num_class-1]
    # since mmdet v2.0
    # BG cat_id: num_class
    scores = cls_score.softmax(-1)[:, :-1]

22. mmdetection中训练retinanet模型(voc数据集)

链接:MMDetection训练自己的数据集过程_mmdetection训练retinanet-CSDN博客

23.问题二十: 运行demo/image_demo.py时,在输入SSD512模型报错。AttributeError: 'SSDHead' object has no attribute 'loss_cls'

if getattr(self.loss_cls, 'custom_cls_channels', False):
修改为:
if getattr(self, 'loss_cls', None) and getattr(self.loss_cls, 'custom_cls_channels', False):

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值