【mmdetection系列】mmdetection之evaluate评测

news2024/11/26 2:42:53

1.configs

         还是以yolox为例,配置有一项evaluation。用于配置评估是用什么评价指标评估。

https://github.com/open-mmlab/mmdetection/blob/master/configs/yolox/yolox_s_8x8_300e_coco.py#L151

max_epochs = 300
num_last_epochs = 15
interval = 10

evaluation = dict(
    save_best='auto',
    # The evaluation interval is 'interval' when running epoch is
    # less than ‘max_epochs - num_last_epochs’.
    # The evaluation interval is 1 when running epoch is greater than
    # or equal to ‘max_epochs - num_last_epochs’.
    interval=interval,
    dynamic_intervals=[(max_epochs - num_last_epochs, 1)],
    metric='bbox')

其中这几个参数:

interval:指每多少epoch进行一次评测;

dynamic_intervals:指当运行epoch大于或等于“max_epochs-num_last_epochs”时,评估间隔为1。

metric:表示使用什么作为评价指标。

2.具体实现

 

        主体函数,一般是写在自定义数据集的解析dataset类中的。有的会实现在基类中,还是以yolox这个配置文件中对应的数据集为例CocoDataset:

https://github.com/open-mmlab/mmdetection/blob/master/mmdet/datasets/coco.py#L592

    def evaluate(self,
                 results,
                 metric='bbox',
                 logger=None,
                 jsonfile_prefix=None,
                 classwise=False,
                 proposal_nums=(100, 300, 1000),
                 iou_thrs=None,
                 metric_items=None):
        """Evaluation in COCO protocol.
        Args:
            results (list[list | tuple]): Testing results of the dataset.
            metric (str | list[str]): Metrics to be evaluated. Options are
                'bbox', 'segm', 'proposal', 'proposal_fast'.
            logger (logging.Logger | str | None): Logger used for printing
                related information during evaluation. Default: None.
            jsonfile_prefix (str | None): The prefix of json files. It includes
                the file path and the prefix of filename, e.g., "a/b/prefix".
                If not specified, a temp file will be created. Default: None.
            classwise (bool): Whether to evaluating the AP for each class.
            proposal_nums (Sequence[int]): Proposal number used for evaluating
                recalls, such as recall@100, recall@1000.
                Default: (100, 300, 1000).
            iou_thrs (Sequence[float], optional): IoU threshold used for
                evaluating recalls/mAPs. If set to a list, the average of all
                IoUs will also be computed. If not specified, [0.50, 0.55,
                0.60, 0.65, 0.70, 0.75, 0.80, 0.85, 0.90, 0.95] will be used.
                Default: None.
            metric_items (list[str] | str, optional): Metric items that will
                be returned. If not specified, ``['AR@100', 'AR@300',
                'AR@1000', 'AR_s@1000', 'AR_m@1000', 'AR_l@1000' ]`` will be
                used when ``metric=='proposal'``, ``['mAP', 'mAP_50', 'mAP_75',
                'mAP_s', 'mAP_m', 'mAP_l']`` will be used when
                ``metric=='bbox' or metric=='segm'``.
        Returns:
            dict[str, float]: COCO style evaluation metric.
        """

        metrics = metric if isinstance(metric, list) else [metric]
        allowed_metrics = ['bbox', 'segm', 'proposal', 'proposal_fast']
        for metric in metrics:
            if metric not in allowed_metrics:
                raise KeyError(f'metric {metric} is not supported')

        coco_gt = self.coco
        self.cat_ids = coco_gt.get_cat_ids(cat_names=self.CLASSES)

        result_files, tmp_dir = self.format_results(results, jsonfile_prefix)
        eval_results = self.evaluate_det_segm(results, result_files, coco_gt,
                                              metrics, logger, classwise,
                                              proposal_nums, iou_thrs,
                                              metric_items)

        if tmp_dir is not None:
            tmp_dir.cleanup()
        return eval_results

        发现是调用 self.evaluate_det_segm这个函数进行评测,发现其调用的是pycocotools进行测评的。

        其实除此之外,我们还可以在这里写相应的评测指标:

 

3.调用

3.1 train.py

        主要是在训练时,在评估间隔处进行评测,知道模型好坏。然后可以存性能指标较好的模型,用于后续的应用,也方便进行优化。

训练过程怎么调用evaluation的呢?

(1)训练先调用tools/train.py

https://github.com/open-mmlab/mmdetection/blob/master/tools/train.py#L233

train_detector(
        model,
        datasets,
        cfg,
        distributed=distributed,
        validate=(not args.no_validate),
        timestamp=timestamp,
        meta=meta)

 (2)该函数会调用mmdet/apis/train.py

https://github.com/open-mmlab/mmdetection/blob/master/mmdet/apis/train.py#L246 

from mmcv.runner import (DistSamplerSeedHook, EpochBasedRunner,
                         Fp16OptimizerHook, OptimizerHook, build_runner,
                         get_dist_info)

runner = build_runner(
        cfg.runner,
        default_args=dict(
            model=model,
            optimizer=optimizer,
            work_dir=cfg.work_dir,
            logger=logger,
            meta=meta))

runner.run(data_loaders, cfg.workflow)

 (3)看配置文件

https://github.com/open-mmlab/mmdetection/blob/master/configs/_base_/schedules/schedule_1x.py

runner = dict(type='EpochBasedRunner', max_epochs=12)

 使用的是EpochBasedRunner这个Runner。

(4)通过builder_runner构建

mmcv/builder.py at master · open-mmlab/mmcv · GitHub

def build_runner(cfg: dict, default_args: Optional[dict] = None):
    runner_cfg = copy.deepcopy(cfg)
    constructor_type = runner_cfg.pop('constructor',
                                      'DefaultRunnerConstructor')
    runner_constructor = build_runner_constructor(
        dict(
            type=constructor_type,
            runner_cfg=runner_cfg,
            default_args=default_args))
    runner = runner_constructor()
    return runner

 (5)调用

mmcv/epoch_based_runner.py at master · open-mmlab/mmcv · GitHub

 

-----待添加

 

3.2 test.py

-----待添加

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/92636.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LVS 负载均衡

LVS 负载均衡 本篇主要介绍一下 lvs 是什么 以及它的 nat 模式的搭建 配合nginx来演示 1.概述 LVS 是 Linux Virtual Server 的简写 (Linux 虚拟服务器 ), 是由章文嵩博士主导, 它虚拟出一个服务器集群,然后进行负载均衡的项目, 目前LVS 已经被集成到Linux内核模块中了, 外部请…

直播弹幕系统(三)- 直播在线人数统计

直播弹幕系统(三)- 直播在线人数统计前言一. 在线人数统计功能实现1.1 Redis整合1.2 在线人数更新1.3 演示前言 上一篇文章整合RabbitMQ进行消息广播和异步处理 写完了消息的广播、削峰、异步处理业务逻辑等操作。完成了实时共享功能。 不过写到后面发…

Netcat介绍及安装使用

目录 介绍 Linux 安装 Windows安装 1.下载安装包 2.解压安装包 3.安装路径加入系统变量 Netcat命令参数 使用Netcat互相通信 1.创建一个服务端 2.创建一个客户端(连接服务端) 介绍 Netcat 是一款简单的Unix工具,使用UDP和TCP协议。…

七、Docker 安装Tomcat(流程、注意点、实操)

1、从中央仓库搜索tomcat 命令:docker search tomcat 也可以从官网查找,地址:Docker Hub 2、从中央仓库拉取tomcat 命令:docker pull tomcat:8.0 这里我们选择8.0 版本tomcat 3、查看镜像 命令:docker images 4、运行镜像 命令:docker run -d

如何从内存卡恢复丢失的数据?简单内存卡(SD卡)数据恢复方法分享

SD卡,也就是内存卡,在日常使用中有着体积小、存储量大的优点,被我们用来存储一些重要的数据。相机是使用SD卡的场景之一。目前大多数相机都使用SD卡来存储相关数据,这不仅是因为SD容量的优势,而且其运行速度也比较快&a…

苹果手机有什么好玩的app推荐

creativeclock 苹果手机有什么好玩的app推荐,iPhone时钟app推荐下载。 An elegant clock application that contains various creative clock styles and widgets. FlipClock, PolarClock, DigitalClock, RouletteClock, AnalogClock … and so on. view on Appsto…

Matplotlib学习笔记(第二章 2.1.5 图形的绘制过程)

本教程旨在展示使用Matplotlib的单个可视化的开始、中间和结束。 我们将从一些原始数据开始,最后保存一个定制的可视化图形。 在此过程中,我们尝试使用Matplotlib来突出一些整洁的特性和最佳实践。 注意:本教程基于克里斯莫菲特这篇优秀的博…

【图像去噪】鲁棒PCA图像去噪【含Matlab源码 463期】

⛄一、图像去噪及滤波简介 1 图像去噪 1.1 图像噪声定义 噪声是干扰图像视觉效果的重要因素,图像去噪是指减少图像中噪声的过程。噪声分类有三种:加性噪声,乘性噪声和量化噪声。我们用f(x,y)表示图像,g(x,y&#xff0…

jmeter性能测试-Arrivals 线程组解释

📌 博客主页: 程序员二黑 📌 专注于软件测试领域相关技术实践和思考,持续分享自动化软件测试开发干货知识! 📌 公号同名,欢迎加入我的测试交流群,我们一起交流学习! 目录…

Go项目目录结构该怎么写?

原文地址:Go项目目录结构该怎么写? Go 目录 /cmd 项目的主干。 每个应用程序的目录名应该与想要的可执行文件的名称相匹配(例如,/cmd/myapp)。 不要在这个目录中放置太多代码。如果认为代码可以导入并在其他项目中使用,那么它…

Python入门自学到精通需要看哪些书籍?

Python语言在近几年可以算得上如日中天,越来越火爆的同时,学习Python的人也越来越多了。对于不同基础的学习者来讲,学习的重点和方式也许会有差别,但是基础语法永远都是重中之重。在牢牢掌握基础知识的前提下,我们才能…

SAP ABAP 利用弹窗(POPUP)实现屏幕(DIALOG)快速开发

SAP ABAP 利用弹窗(POPUP)实现屏幕(DIALOG)快速开发 引言: 在 ABAP 开发中经常用到屏幕(DIALOG)开发,这通常都比较耗时。按复杂度可以分成复杂和简单两类屏幕开发,复杂的…

linux(乌班图)开发环境搭建

乌班图远程连接方法:安装openssh-server 和openssh-clientsudo apt-get -y install openssh-server openssh-client 设置允许root用户进行远程连接 方法一: /etc/ssh/sshd_config里面添加PermitRootLogin yes #重启 service ssh restart方法二&#xff1…

Pandas小白入门(一)---将value_counts的结果转为DataFrame

文章目录代码示例工作原理rename_axisreset_index各函数对于DataFrame下的应用其他应用quantile结果转为DataFrame代码示例 value_counts的结果是一个series,其index为原来列的值,value为值的个数。要将其转为DataFrame需要两个函数rename_axis和reset_…

为什么每个程序员都必须写博客

工作了好几年了,一直没写过技术类的博客,最近才开始尝试写一些技术类的博客。通过写博客的这段时间发现,写博客能够帮助我们快速成长已经提高我们学习的积极性,本文将和大家详细说说程序员写博客的好处。 🚀 一、加深对…

机器学习必会技能之微积分【一文到底】

机器学习必会技能 —— 微积分【一文到底】 文章目录机器学习必会技能 —— 微积分【一文到底】1 微积分的四类问题2 深入理解导数的本质3 深入理解复合函数求导4 理解多元函数偏导5 梯度究竟是什么?6 真正理解微积分6.1 直观理解6.2 理解微积分基本定理7 非常重要的…

NLP之文本分类项目(基于tensorflow1.14版本)

1.README.md:(查看项目整体结构以及各个部分作用) # Text Classification with RNN使用循环神经网络进行中文文本分类本文是基于TensorFlow在中文数据集上的简化实现,使用了字符级RNN对中文文本进行分类,达到了较好的效果。## 环境- Python 3 - TensorF…

Oracle项目管理之设施与资产管理Facilities and Asset (English)

目录 Maintenance Management Stand Alone or Integrated Facility Condition Assessment Space Management Lease Management Full Lease Expenses and Payment Management Transaction Management Asset Portfolio Management Portfolio Management Capabilities S…

改进二进制粒子群算法在配电网重构中的应用(Matlab实现)【论文复现】

目录 ​ 0 概述 1 配电网重构的目标函数 2 算例 3 matlab代码实现 0 概述 配电系统中存在大量的分段开关和联络开关,配电网重构正是通过调整分段开关和联络升大的组合状态来变换网络结构,用于优化配电网某些指标,使其达到最优状态。正常运行时,则通…

简单理解Vue的data为啥只能是函数

在学习vue的时候vue2只有在组件中严格要求data必须是一个函数,而在普通vue实例中,data可以是一个对象,但是在vue3出现后data必须一个函数,当时看着官方文档说的是好像是对象的引用问题,但是内部原理却不是很了解&#…