PaddlePaddle / PaddleDetection

Object Detection toolkit based on PaddlePaddle. It supports object detection, instance segmentation, multiple object tracking and real-time multi-person keypoint detection.
Apache License 2.0
12.78k stars 2.88k forks source link

边训练边测试时存在bug #3209

Open zhengzhe97 opened 3 years ago

zhengzhe97 commented 3 years ago

使用训练边测试,在评估mAP时出现如下报错。开始以为是没有生成正确coco类型的json,排查后发现格式无误,使用./tools/eval.py直接验证,正确输出。

wrong right

coco_detection.yml如下:

metric: COCO
num_classes: 3 # 将其修改为数据集的类别,不包含背景类

TrainDataset:
  !COCODataSet
    image_dir: train # 训练集的图片所在文件相对于dataset_dir的路径
    anno_path: annotations/t.json # 训练集的标注文件相对于dataset_dir的路径
    dataset_dir: dataset/camera #数据集所在路径
    data_fields: ['image', 'gt_bbox', 'gt_class', 'is_crowd']

EvalDataset:
  !COCODataSet
    image_dir: train # 训练集的图片所在文件相对于dataset_dir的路径
    anno_path: annotations/val.json # 训练集的标注文件相对于dataset_dir的路径
    dataset_dir: dataset/camera #数据集所在路径
    data_fields: ['image', 'gt_bbox', 'gt_class', 'is_crowd']

TestDataset:
  !COCODataSet
    image_dir: train # 训练集的图片所在文件相对于dataset_dir的路径
    anno_path: annotations/val.json # 训练集的标注文件相对于dataset_dir的路径
    dataset_dir: dataset/camera #数据集所在路径
    data_fields: ['image', 'gt_bbox', 'gt_class', 'is_crowd']
zhengzhe97 commented 3 years ago

后来发现是边训练边测试和单测试,两次读取的anno_path不同,边训练边测试会读取TrainDataset下的anno_path。

个人认为可能是如下代码存在问题:self.dataset.get_anno() TrainDataset下的anno_path

./ppdet/engine/trainer.py

    def _init_metrics(self):
        if self.mode == 'test':
            self._metrics = []
            return
        if self.cfg.metric == 'COCO':
            # TODO: bias should be unified
            bias = self.cfg['bias'] if 'bias' in self.cfg else 0
            save_prediction_only = self.cfg['save_prediction_only'] \
                if 'save_prediction_only' in self.cfg else False
            self._metrics = [
                COCOMetric(
                    anno_file=self.dataset.get_anno(),
                    bias=bias,
                    save_prediction_only=save_prediction_only)
            ]
zhengzhe97 commented 3 years ago

不知道是不是只有我有这个问题 - -,

liuhuiCNN commented 3 years ago

感谢反馈,请问两次测试使用的是同一个模型吗?边训练边测试时,由于第一轮训练的模型效果比较差,可能会导致评估时间很长,或者预测结果为空的情况,这个问题已经修复,建议您用最新的代码试试。

zhengzhe97 commented 3 years ago

是同一个模型,我用的是2.0-rc分支。两种验证方式读取的anno_path不一样,我手动调整了下验证时的路径。最新的代码还没尝试