问题1:
TypeError: __init__() got an unexpected keyword argument 'metainfo'
一开始把metainfo放在train_dataloader里,
train_dataloader = dict(
dataset=dict(
datasets=[labeled_dataset, unlabeled_dataset],
metainfo=metainfo
)
)
导致报错
TypeError: __init__() got an unexpected keyword argument 'metainfo'
解决:
查看github上的问题:
如果data的type是ConcatDataset,则要保持两个数据集的metainfo一样。
github上mmdetection/configs/_base_/datasets /semi_coco_detection.py里的train_dataloader的type是ConcatDataset,
train_dataloader = dict(
batch_size=batch_size,
num_workers=num_workers,
persistent_workers=True,
sampler=dict(
type='GroupMultiSourceSampler',
batch_size=batch_size,
source_ratio=[1, 4]),
dataset=dict(
type='ConcatDataset', datasets=[labeled_dataset, unlabeled_dataset]))
把metainfo放在两个数据集中,
labeled_dataset = _base_.labeled_dataset
unlabeled_dataset = _base_.unlabeled_dataset
labeled_dataset.data_prefix=dict(img='train2017/')
labeled_dataset.ann_file='semi_annotations/train2017.json'
labeled_dataset.data_root=data_root
labeled_dataset.metainfo=metainfo
unlabeled_dataset.data_prefix=dict(img='train2017/')
unlabeled_dataset.ann_file='semi_annotations/unlabeledtrain2017.json'
unlabeled_dataset.data_root=data_root
unlabeled_dataset.metainfo=metainfo
问题2:
报错:
data['category_id'] = self.cat_ids[label]
IndexError: list index out of range
Traceback (most recent call last):
File "tools/train.py", line 121, in <module>
main()
File "tools/train.py", line 117, in main
runner.train()
File "......./mmdetection/lib/python3.8/site-packages/mmengine/runner/runner.py", line 1777, in train
model = self.train_loop.run() # type: ignore
File "......./mmdetection/lib/python3.8/site-packages/mmengine/runner/loops.py", line 284, in run
self.runner.val_loop.run()
File "......./mmdetection/lib/python3.8/site-packages/mmdet/engine/runner/loops.py", line 31, in run
metrics = self.evaluator.evaluate(len(self.dataloader.dataset))
File "......./mmdetection/lib/python3.8/site-packages/mmengine/evaluator/evaluator.py", line 79, in evaluate
_results = metric.evaluate(size)
File "......./mmdetection/lib/python3.8/site-packages/mmengine/evaluator/metric.py", line 133, in evaluate
_metrics = self.compute_metrics(results) # type: ignore
File "......./mmdetection/lib/python3.8/site-packages/mmdet/evaluation/metrics/coco_metric.py", line 423, in compute_metrics
result_files = self.results2json(preds, outfile_prefix)
File "......./mmdetection/lib/python3.8/site-packages/mmdet/evaluation/metrics/coco_metric.py", line 243, in results2json
data['category_id'] = self.cat_ids[label]
IndexError: list index out of range
原因:没添加metainfo
val_dataloader = dict(
dataset=dict(
data_root=data_root,
ann_file='annotations/instances_val2017.json',
data_prefix=dict(img='val2017/')))
# test_dataloader = val_dataloader
test_dataloader = dict(
dataset=dict(
data_root=data_root,
ann_file='annotations/instances_test2017.json',
data_prefix=dict(img='test2017/')))
val_dataloader = dict(
dataset=dict(
data_root=data_root,
metainfo=metainfo,
ann_file='annotations/instances_val2017.json',
data_prefix=dict(img='val2017/')))
# test_dataloader = val_dataloader
test_dataloader = dict(
dataset=dict(
data_root=data_root,
metainfo=metainfo,
ann_file='annotations/instances_test2017.json',
data_prefix=dict(img='test2017/')))
问题3:
ValueError: need at least one array to concatenate
....................
File ".../.conda/envs/mmdetection/lib/python3.8/site-packages/mmengine/registry/build_functions.py", line 121, in build_from_cfg
obj = obj_cls(**args) # type: ignore
File ".../.conda/envs/mmdetection/lib/python3.8/site-packages/mmdet/datasets/base_det_dataset.py", line 44, in __init__
super().__init__(*args, **kwargs)
File ".../.conda/envs/mmdetection/lib/python3.8/site-packages/mmengine/dataset/base_dataset.py", line 247, in __init__
self.full_init()
File ".../.conda/envs/mmdetection/lib/python3.8/site-packages/mmdet/datasets/base_det_dataset.py", line 82, in full_init
self.data_bytes, self.data_address = self._serialize_data()
File ".../.conda/envs/mmdetection/lib/python3.8/site-packages/mmengine/dataset/base_dataset.py", line 768, in _serialize_data
data_bytes = np.concatenate(data_list)
File "<__array_function__ internals>", line 200, in concatenate
原因:metainfo的类别名称和json里categories的类别名称不一致
metainfo = {
'classes': (。。。。)
}
问题4:
想计算mmdet每一类的map以及precision,recall
方法:
(1) 计算每一类map:
/mmdet/evaluation/metrics/coco_metric.py
class CocoMetric(BaseMetric):
"""COCO evaluation metric.
Evaluate AR, AP, and mAP for detection tasks including proposal/box
detection and instance segmentation. Please refer to
https://cocodataset.org/#detection-eval for more details.
Args:
metric (str | List[str]): Metrics to be evaluated. Valid metrics
include 'bbox', 'segm', 'proposal', and 'proposal_fast'.
Defaults to 'bbox'.
classwise (bool): Whether to evaluate the metric class-wise.
Defaults to False.
"""
default_prefix: Optional[str] = 'coco'
def __init__(self,
ann_file: Optional[str] = None,
metric: Union[str, List[str]] = 'bbox',
classwise: bool = False,
...................
CocoMetric有个属性classwise,默认值是False,因此不会计算每一类的map,在配置文件中指定为True即可,
# 修改评价指标相关配置
val_evaluator = dict(ann_file=data_root + 'val/val.json')
# test_evaluator = val_evaluator
test_evaluator = dict(ann_file=data_root + 'test/test.json', classwise=True)
(2) 计算precison,recall
参考:mmdetection如何计算准确率、召回率、F1值_mmdetection怎么打印整体的准确率和召回率-优快云博客