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].
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博客
参考资料:
SSD训练自己的数据集(pytorch版)_ssd训练自己的数据集pytorch-CSDN博客
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博客
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):