jbwang1997 / OBBDetection

OBBDetection is an oriented object detection library, which is based on MMdetection.
Apache License 2.0
525 stars 112 forks source link

dota格式修改类别报错 #14

Closed HeuristicLU closed 2 years ago

HeuristicLU commented 2 years ago

1修改类别为我自己数据集的类别,但继续用dota1格式。 'DOTA1_0': ('ore-oil', 'Container', 'Fishing', 'yacht', 'LawEnforce', 'Small', 'Passenger'),

'DOTA1_0': ('large-vehicle', 'swimming-pool', 'helicopter', 'bridge',

#            'plane', 'ship', 'soccer-ball-field', 'basketball-court',
#            'ground-track-field', 'small-vehicle', 'baseball-diamond',
#            'tennis-court', 'roundabout', 'storage-tank', 'harbor'),

2配置文件里面修改类别数目 num_classes=7,

3运行报错:2021-08-31 20:17:55,895 - mmdet - INFO - workflow: [('train', 1)], max: 12 epochs Traceback (most recent call last): File "tools/train.py", line 153, in main() File "tools/train.py", line 142, in main train_detector( File "/media/asus/299D817A2D97AD94/ok_PROJs/OBBDetection/mmdet/apis/train.py", line 129, in train_detector runner.run(data_loaders, cfg.workflow, cfg.total_epochs) File "/home/asus/anaconda3/envs/Beta/lib/python3.8/site-packages/mmcv/runner/epoch_based_runner.py", line 122, in run epoch_runner(data_loaders[i], **kwargs) File "/home/asus/anaconda3/envs/Beta/lib/python3.8/site-packages/mmcv/runner/epoch_based_runner.py", line 27, in train for i, data_batch in enumerate(data_loader): File "/home/asus/anaconda3/envs/Beta/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 435, in next data = self._next_data() File "/home/asus/anaconda3/envs/Beta/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 1085, in _next_data return self._process_data(data) File "/home/asus/anaconda3/envs/Beta/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 1111, in _process_data data.reraise() File "/home/asus/anaconda3/envs/Beta/lib/python3.8/site-packages/torch/_utils.py", line 428, in reraise raise self.exc_type(msg) ValueError: Caught ValueError in DataLoader worker process 0. Original Traceback (most recent call last): File "/home/asus/anaconda3/envs/Beta/lib/python3.8/site-packages/torch/utils/data/_utils/worker.py", line 198, in _worker_loop data = fetcher.fetch(index) File "/home/asus/anaconda3/envs/Beta/lib/python3.8/site-packages/torch/utils/data/_utils/fetch.py", line 44, in fetch data = [self.dataset[idx] for idx in possibly_batched_index] File "/home/asus/anaconda3/envs/Beta/lib/python3.8/site-packages/torch/utils/data/_utils/fetch.py", line 44, in data = [self.dataset[idx] for idx in possibly_batched_index] File "/media/asus/299D817A2D97AD94/ok_PROJs/OBBDetection/mmdet/datasets/custom.py", line 187, in getitem data = self.prepare_train_img(idx) File "/media/asus/299D817A2D97AD94/ok_PROJs/OBBDetection/mmdet/datasets/custom.py", line 210, in prepare_train_img return self.pipeline(results) File "/media/asus/299D817A2D97AD94/ok_PROJs/OBBDetection/mmdet/datasets/pipelines/compose.py", line 40, in call data = t(data) File "/media/asus/299D817A2D97AD94/ok_PROJs/OBBDetection/mmdet/datasets/pipelines/obb/base.py", line 393, in call results['angle'] = self.get_random_angle(results) File "/media/asus/299D817A2D97AD94/ok_PROJs/OBBDetection/mmdet/datasets/pipelines/obb/base.py", line 303, in get_random_angle vert_lbls = [results['cls'].index(c) for c in self.vert_cls] File "/media/asus/299D817A2D97AD94/ok_PROJs/OBBDetection/mmdet/datasets/pipelines/obb/base.py", line 303, in vert_lbls = [results['cls'].index(c) for c in self.vert_cls] ValueError: tuple.index(x): x not in tuple

仿佛是类别哪里还需要修改,想问下,你有什么好的建议或者知道修改哪里么

jbwang1997 commented 2 years ago

这个是在dataloader的pipline中,旋转增强会寻找相应类别进行直角旋转,可以将这里的vert_cls=[]

HeuristicLU commented 2 years ago

非常感谢,确实改了这里就可以,排查了大半天

jbwang1997 commented 2 years ago

在之后的commit中,我也会在这个进行修改,使不同类别的数据集级也不会报错。

HeuristicLU commented 2 years ago

我现在可以正常训练,但是精度评估的时候都是0,还有哪里需要注意的么? (Beta) root@asus-System-Product-Name:/media/asus/299D817A2D97AD94/ok_PROJs/OBBDetection# python tools/test.py configs/obb/oriented_rcnn/faster_rcnn_orpn_r50_fpn_1x_dota10.py work_dirs/faster_rcnn_orpn_r50_fpn_1x_dota10/latest.pth --out=work_dirs/faster_rcnn_orpn_r50_fpn_1x_dota10/results.pkl --eval mAP [>>>>>>>>>>>>>>>>>>>>>>>>>>] 2241/2241, 16.7 task/s, elapsed: 135s, ETA: 0s writing results to work_dirs/faster_rcnn_orpn_r50_fpn_1x_dota10/results.pkl

Merging patch bboxes into full image!!! [>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] 9/9, 3.2 task/s, elapsed: 3s, ETA: 0s Used time: 3.3 s

Start calculate mAP!!! Result is Only for reference, final result is subject to DOTA_devkit

+------------+-----+------+--------+--------+ | class | gts | dets | recall | ap | +------------+-----+------+--------+--------+ | ore-oil | 64 | 912 | 0.0000 | 0.0000 | | Container | 997 | 8631 | 0.0000 | 0.0000 | | Fishing | 202 | 910 | 0.0000 | 0.0000 | | yacht | 106 | 954 | 0.0000 | 0.0000 | | LawEnforce | 15 | 823 | 0.0000 | 0.0000 | | Small | 29 | 850 | 0.0000 | 0.0000 | | Passenger | 22 | 876 | 0.0000 | 0.0000 | +------------+-----+------+--------+--------+ | mAP | | | | 0.0000 | +------------+-----+------+--------+--------+

jbwang1997 commented 2 years ago

可以检查一下数据集的格式是否正确,OBBDetection的dota数据集接受的数据需要时BboxToolkit中裁图出来的,不知道这是数据集是否也用BboxToolkit进行裁图了。

其次如果数据集图片比较少的话,需要适当的增加epoch数量,不然网络会训练不充分。

HeuristicLU commented 2 years ago

我仔细分析了一下,可能是因为我的大图中目标较少,不想DOTA那样比较多,所以用BboxToolkit切分的话会出现很多没有样本的图像,会导致样本过于不平衡。我之前改过DOATtoolkit的切分,读入xml目标坐标,然后只在目标附件切分,这样不会产生很多空的图,你的代码写的比较好,看了好一会不太会改,就没改成那种。我epoch增加到36,效果还是不好,推理了下看,检测出来的很少,看样子不是map计算的错,是模型训的不好。

jbwang1997 commented 2 years ago

训练网络的时候程序会自动过滤没有目标的图像块的,所以应该不会出现太大的样本不平衡。

有可能还是超参的问题,可以检查一下学习率是否遵循线性法则。

HeuristicLU commented 2 years ago

我用faster_rcnn_orpn_r50_fpn_1x_dota10.py这个模型是可以正常评估map的,但是用faster_rcnn_orpn_r50_fpn_1x_ms_rr_dota10.py会报错。 我的指令是:python tools/test.py configs/obb/oriented_rcnn/faster_rcnn_orpn_r50_fpn_1x_ms_rr_dota10.py work_dirs/faster_rcnn_orpn_r50_fpn_1x_ms_rr_dota10/latest.pth --out=work_dirs/faster_rcnn_orpn_r50_fpn_1x_ms_rr_dota10/results.pkl --eval mAP --show-dir=work_dirs/faster_rcnn_orpn_r50_fpn_1x_ms_rr_dota10/result/

报错信息为: [>> ] 373/3942, 6.4 task/s, elapsed: 58s, ETA: 553sTraceback (most recent call last): File "tools/test.py", line 153, in main() File "tools/test.py", line 130, in main outputs = single_gpu_test(model, data_loader, args.show, args.show_dir, File "/media/asus/299D817A2D97AD94/ok_PROJs/OBBDetection/mmdet/apis/test.py", line 26, in single_gpu_test result = model(return_loss=False, rescale=True, data) File "/home/asus/anaconda3/envs/Beta/lib/python3.8/site-packages/torch/nn/modules/module.py", line 727, in _call_impl result = self.forward(*input, *kwargs) File "/home/asus/anaconda3/envs/Beta/lib/python3.8/site-packages/torch/nn/parallel/data_parallel.py", line 159, in forward return self.module(inputs[0], kwargs[0]) File "/home/asus/anaconda3/envs/Beta/lib/python3.8/site-packages/torch/nn/modules/module.py", line 727, in _call_impl result = self.forward(*input, kwargs) File "/media/asus/299D817A2D97AD94/ok_PROJs/OBBDetection/mmdet/core/fp16/decorators.py", line 51, in new_func return old_func(*args, kwargs) File "/media/asus/299D817A2D97AD94/ok_PROJs/OBBDetection/mmdet/models/detectors/base.py", line 174, in forward return self.forward_test(img, img_metas, kwargs) File "/media/asus/299D817A2D97AD94/ok_PROJs/OBBDetection/mmdet/models/detectors/base.py", line 155, in forward_test return self.simple_test(imgs[0], img_metas[0], *kwargs) File "/media/asus/299D817A2D97AD94/ok_PROJs/OBBDetection/mmdet/models/detectors/obb/obb_two_stage.py", line 215, in simple_test return self.roi_head.simple_test( File "/media/asus/299D817A2D97AD94/ok_PROJs/OBBDetection/mmdet/models/roi_heads/obb/obb_standard_roi_head.py", line 179, in simple_test det_bboxes, det_labels = self.simple_test_bboxes( File "/media/asus/299D817A2D97AD94/ok_PROJs/OBBDetection/mmdet/models/roi_heads/obb/obb_test_mixins.py", line 64, in simple_test_bboxes det_bboxes, det_labels = self.bbox_head.get_bboxes( File "/media/asus/299D817A2D97AD94/ok_PROJs/OBBDetection/mmdet/core/fp16/decorators.py", line 131, in new_func return old_func(args, kwargs) File "/media/asus/299D817A2D97AD94/ok_PROJs/OBBDetection/mmdet/models/roi_heads/bbox_heads/obb/obbox_head.py", line 238, in get_bboxes multiclass_arb_nms(bboxes, scores, cfg.score_thr, File "/media/asus/299D817A2D97AD94/ok_PROJs/OBBDetection/mmdet/core/post_processing/obb/obb_nms.py", line 36, in multiclass_arb_nms dets, keep = arb_batched_nms(bboxes, scores, labels, nms_cfg) File "/media/asus/299D817A2D97AD94/ok_PROJs/OBBDetection/mmdet/ops/nms_rotated/nms_rotated_wrapper.py", line 113, in arb_batched_nms dets, keep = nms_op( File "/media/asus/299D817A2D97AD94/ok_PROJs/OBBDetection/mmdet/ops/nms_rotated/nms_rotated_wrapper.py", line 40, in obb_nms inds = nms_rotated_ext.nms_rotated(bboxes, scores, iou_thr) RuntimeError: CUDA error: invalid configuration argument

报cuda的错误,请问你有什么建议排查的地方吗?

jbwang1997 commented 2 years ago

这种情况我也没怎么碰见过,可以先尝试用--show看网络输出是否正常