【mmdetection】使用coco数据集训练后结果可视化

一.开始

本文使用的是mmdetection=V2.11的cascade-rcnn、faster-rcnn模型,使用的数据集是coco数据集,记录训练结果可视化的过程。并且记录训练过程中参数含义

二.可视化代码

  • 以下操作都是在mmdetection根目录下进入到open-mmlab环境中进行的

1. Loss曲线

  • –work_dirs设置自己模型得到的log.json文件,
    –out后面是保存的位置以及文件名字,可以保存为jpg/png等格式,
    –key后面可以跟更多参数,但这些参数要在json文件里面有的
python tools/analysis_tools/analyze_logs.py plot_curve ./work_dirs/cascade_rcnn_r50_fpn_1x_coco/20210510_140522.log.json --keys loss --out ./plot_result/1.png
  • 输出结果:在这里插入图片描述

2. P-R曲线

  • 进行P-R曲线可视化前,需要先使用test.py生成pkl文件
    –out后面可以加路径,不然直接生成再项目根路径下
python tools/test.py configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py work_dirs/cascade_rcnn_r50_fpn_1x_coco/latest.pth --out results.pkl
  • 在根目录下创建一个PR.py文件,输入以下代码
# =========================================================
# @purpose: plot PR curve by COCO API and mmdet API
# @date:   2020/12
# @version: v1.0
# @author: Xu Huasheng
# @github: https://github.com/xuhuasheng/mmdetection_plot_pr_curve
# =========================================================

import os
import mmcv
import numpy as np
import matplotlib.pyplot as plt

from pycocotools.coco import COCO
from pycocotools.cocoeval import COCOeval

from mmcv import Config
from mmdet.datasets import build_dataset

MODEL = "cascade_rcnn"
MODEL_NAME = "cascade_rcnn_r50_fpn_1x_coco"

CONFIG_FILE = f"configs/{MODEL}/{MODEL_NAME}.py"
RESULT_FILE = f"results.pkl"

def plot_pr_curve(config_file, result_file, metric="bbox"):
    """plot precison-recall curve based on testing results of pkl file.

        Args:
            config_file (list[list | tuple]): config file path.
            result_file (str): pkl file of testing results path.
            metric (str): Metrics to be evaluated. Options are
                'bbox', 'segm'.
    """
    
    cfg = Config.fromfile(config_file)
    # turn on test mode of dataset
    if isinstance(cfg.data.test, dict):
        cfg.data.test.test_mode = True
    elif isinstance(cfg.data.test, list):
        for ds_cfg in cfg.data.test:
            ds_cfg.test_mode = True

    # build dataset
    dataset = build_dataset(cfg.data.test)
    # load result file in pkl format
    pkl_results = mmcv.load(result_file)
    # convert pkl file (list[list | tuple | ndarray]) to json
    json_results, _ = dataset.format_results(pkl_results)
    # initialize COCO instance
    coco = COCO(annotation_file=cfg.data.test.ann_file)
    coco_gt = coco
    coco_dt = coco_gt.loadRes(json_results[metric]) 
    # initialize COCOeval instance
    coco_eval = COCOeval(coco_gt, coco_dt, metric)
    coco_eval.evaluate()
    coco_eval.accumulate()
    coco_eval.summarize()
    # extract eval data
    precisions = coco_eval.eval["precision"]
    '''
    precisions[T, R, K, A, M]
    T: iou thresholds [0.5 : 0.05 : 0.95], idx from 0 to 9
    R: recall thresholds [0 : 0.01 : 1], idx from 0 to 100
    K: category, idx from 0 to ...
    A: area range, (all, small, medium, large), idx from 0 to 3 
    M: max dets, (1, 10, 100), idx from 0 to 2
    '''
    pr_array1 = precisions[0, :, 0, 0, 2] 
    pr_array2 = precisions[1, :, 0, 0, 2] 
    pr_array3 = precisions[2, :, 0, 0, 2] 
    pr_array4 = precisions[3, :, 0, 0, 2] 
    pr_array5 = precisions[4, :, 0, 0, 2] 
    pr_array6 = precisions[5, :, 0, 0, 2] 
    pr_array7 = precisions[6, :, 0, 0, 2] 
    pr_array8 = precisions[7, :, 0, 0, 2] 
    pr_array9 = precisions[8, :, 0, 0, 2] 
    pr_array10 = precisions[9, :, 0, 0, 2] 

    x = np.arange(0.0, 1.01, 0.01)
    # plot PR curve
    plt.plot(x, pr_array1, label="iou=0.5")
    plt.plot(x, pr_array2, label="iou=0.55")
    plt.plot(x, pr_array3, label="iou=0.6")
    plt.plot(x, pr_array4, label="iou=0.65")
    plt.plot(x, pr_array5, label="iou=0.7")
    plt.plot(x, pr_array6, label="iou=0.75")
    plt.plot(x, pr_array7, label="iou=0.8")
    plt.plot(x, pr_array8, label="iou=0.85")
    plt.plot(x, pr_array9, label="iou=0.9")
    plt.plot(x, pr_array10, label="iou=0.95")

    plt.xlabel("recall")
    plt.ylabel("precison")
    plt.xlim(0, 1.0)
    plt.ylim(0, 1.01)
    plt.grid(True)
    plt.legend(loc="lower left")
    plt.show()

if __name__ == "__main__":
    plot_pr_curve(config_file=CONFIG_FILE, result_file=RESULT_FILE, metric="bbox")
  • 需要修改模型名字及位置(4个参数)
    我的pkl文件在根目录下所以result_file设置如下
    在这里插入图片描述
    运行该程序
python PR.py

3.mAP参数

  • 由于mAP是用于评价VOC数据集的指标,实际上coco数据集在训练过程中输出的AP就相当于VOC的mAP(下图可以对照发现)
python tools/test.py  configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py work_dirs/cascade_rcnn_r50_fpn_1x_coco/latest.pth  --eval-options  'classwise=True'  --eval bbox  proposal

在这里插入图片描述
参考:Airs_Gao的博文
这篇文章关于coco数据集的评价指标写的很详细

  • 4.fps参数

  • fps代表的是每秒检测的帧数,也就是推理速度,数值越高代表处理的速度越快,在工程应用中是需要考虑的
    首先将训练好的pth文件放入checkpoints文件夹中,之后会使用到benchmark.py这个文件(使用更高版本时候可能会报错,建议从V2.11拷贝过去),该文件用于记录fps
python ./tools/analysis_tools/benchmark.py ./configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py ./checkpoints/epoch_100.pth

在这里插入图片描述

  • 如图我训练得到的cascade-rcnn模型的推理速度是13.2img/s
    参考:whai362的回复
  • 5.acc曲线

  • acc曲线是模型训练过程中有这项内容的才可以可视化,例如faster-rcnn就有,而cascade-rcnn没有
python tools/analysis_tools/analyze_logs.py plot_curve ./work_dirs/faster_rcnn_r50_fpn_1x_coco/20210525_195108.log.json --keys acc --legend acc --out acc.jpg

输出图像如下:在这里插入图片描述

  • 6.计算FLOPs和参数量

  • 这两个参数是衡量模型的一个重要指标,越低越好。使用代码前需要先进入到get_flops.py代码修改所需图片的尺寸
python tools/analysis_tools/get_flops.py ./configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py

输出图像如下:
请添加图片描述
参考了阿基美德的博文

三.参数意义及总结

训练过程当中出现的参数含义(个人理解,有错可指出,后续学习到其他知识可能会更改)

  • eta:剩余训练时间
  • memory:内存使用
  • loss_rpn_cls:rpn层的分类损失(rpn层中对分类进行评估)
  • loss_rpn_bbox:rpn层的回归损失(rpn层中对bbox定位进行评估)
  • loss_cls:分类损失(对分类进行评估,采用真实分类概率决定)
  • loss_bbox:回归损失(对bbox定位进行评估,用于比较真实分类对应的预测参数 tutu 和真实平移缩放参数为 vv 的差别)它在训练过程中是4个损失里面最大的
  • loss:总损失(上面4个损失之和)
    loss=loss_rpn_cls+loss_rpn_bbox+loss_cls+loss_bbox
  • acc:准确度

目前先更新到这里,后续有学到新的就继续更新

参考文章:慢行厚积的文章

在这里插入图片描述

版权声明:本文为CSDN博主「小鸠控」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41627396/article/details/116834884

小鸠控

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐