detectron2的结构介绍及代码实现

2023-10-31

detectron2的结构介绍

上一篇文章 detectron2的简介和配置_d948142375的博客-CSDN博客 介绍了怎么配置detectron2(以下简称DET2)到一台ubuntu18.04的远程服务器,本文将介绍为了实现一个基本的faster-RCNN该如何理解并运用DET2提供的功能。我不提供大量的代码讲解,DET2的代码、注释、doc非常的多,对于有基础的小伙伴,我只需要介绍其中最有价值的脚本及关键内容即可。你们仍然需要阅读我所提到的文件并理解其中的内容,所以本系列文章不适合直接co的人群。

DET2的colab

google提供了一个在线跑demo的环境colab:https://colab.research.google.com/drive/16jcaJoc6bCFAQ96jDe2HwtXj7BMD_-m5,并且google重构了一些功能例如cv2的imshow,所以在开始之前你需要先pip一下google-colab,不过colab google research的网站这几天崩了,网上说这个网站经常崩。我下载了这个网站的镜像,如有需要私信我。

最重要的是,colab提供了一套最基本的流程代码,可以跑起来那种,作为入门非常合适。但是镜像大约就只能看看代码了。

DET2的关键代码文件

如果需要自行配置一套模型并设计完整的流程,你需要仔细阅读下面所提到的文件,如果是初学者只打算跑完这个项目,下面几个文件可以跳过,内容比较多。

1. DET2的config是以树的形式存储的,detectron2/detectron2/config/defaults.py这个文件你需要认真看完,包含了算法细节的所有公共设置和各类衍生算法的改良设置,如果你懂图像识别的几种主流算法的话,这个文件的诸多设置英文名称你应当很熟悉,这个文件的注释也很全。所有简化的cfg最终都会继承自这里(不过简化cfg是先继承各自的default,然后继承自这里)。

从这个大而全的cfg文件(记为CFG)出发,可以在另一个目录:detectron2/configs/ 找到你需要的各种算法的default cfg和cfg文件,,其中子类cfg的第一行标明了它继承的父类cfg文件,创建项目所需的cfg文件需要先实例化一个cfg(get_cfg()),这一步继承自CFG,接下来需要merge一下所用算法的cfg。特别的,你需要根据CFG文件中所用算法的种类,修改不符合需求的默认设置。

值得注意的是,CFG文件有很多子类cfg没有的属性,你应该经常需要查看其中的属性,一定不要修改CFG原文件!

其中,主要的属性有这样几个关键字:MODEL(网络超参数),SOLVER(训练超参数),DATA/DATASET(数据集属性),按需查找,大多是默认设置好的。

当你所用算法的cfg属性配置完成,便可将cfg送到后续实例当中。值得注意的是,cfg.MODEL.ROI_HEADS.NUM_CLASSES应当直接是前景种类数量,而不包含背景。

2. DET2需要实例化一个训练器trainer,并向它送入cfg(DefaultTrainer(cfg)),在目录:detectron2/detectron2/engine/defaults.py,大致浏览即可。此外,还提供了预测器predictor在该文件中,用于简单地对给定图像进行预测。

3. DET2提供了可视化工具visualizer,不过远程调试需要配置xserver在远程地址输出,远程可视化日常用不到,跳过。

4. DET2提供了评估工具evaluator,在目录:detectron2/detectron2/evaluation 下,类似的,需要先实例化,提供了AP及其它维度的评估数据,DET2针对各种数据集,做了特定的评估工具。默认在训练结束后就进行评估,当你未实例化evaluator等之时,代码可能会报错。

5. DET2需要你提供标准数据集或是register一个标准风格的数据集才能使用各种功能,但是某些脚本注明仍适用结构一致的其它数据集。

6. DET2的注册数据集默认存放在./datasets目录下,而且应当有标准化的数据集存储格式,以Pascal VOC为例,用以下格式存放(默认格式):VOC20{07,12}.(Annotations, ImageSets.Main.(trainval.txt, test.txt), JPEGImages) 深度学习: VOC数据集详解(转载) - 简书 (jianshu.com),详见detectron2/datasets/README.md,有常见数据集的存放要求。

但是DET2需要注意的一点是,cfg.DATASETS.TRAIN=("VOC2007"),直接运行会报错未注册该数据集,因为注册数据集并不包含“VOC2007”字样,因为VOC2007所对应的是以下4种注册数据集:voc_2007_train, voc_2007_test, voc_2007_trainval, voc_2007_val,所以当你存放的是标准的VOC数据集时,更改cfg为:cfg.DATASETS.TRAIN=("voc_2007_train")(以此类推)。值得注意的是,你大约不能直接修改VOC的classname和img来替换VOC数据集的内容,因为DET2的metadata收集的是注册数据集的各种复用信息,且注册数据集的代码已经返回了一个字典,直接更改VOC数据集的内容将导致前后不一致而报错。类似于tf需要制record格式,DET2提供了各类标准数据集风格到DET2风格的转换方法,例如:./detectron2/data/datasets/pacal_voc.py,相似的还有其它数据集的转换方法,你需要阅读这份源码以了解它的arg和工作原理。阅读源码可以发现,需要分别注册train, test, val, tranval四个数据集,并返回一个大字典,这个大字典dict包含了所有(标签,图片)的字典"r"(类似json),"r"包含(file_name, image_id, height, width, annotations)几种属性,其中annotations又包含(category_id, bbox, bbox_mode)几种属性。

坑:

DET2是面向多来源数据集、多种类处理方法,所以在应用时直接代入对象名称(如字符串)会报错,往往报错的是“只读取了你录入字符串的首字母”,这是因为DET2大多数场合应当读取的是可迭代容器(如列表),所以当你报错“只读了你录入字符串的首字母”这类错误时,试试改成("input1",)转换成可迭代的tuple(注意逗号)。

与上一坑所对应的,当你出现读取字符串总是失败,类似读取成("input1",)的格式时,应当考虑改成input_tuple[0]获取tuple的字符串成员。

DET2默认的evaluator大多都是评估标准数据集(如VOC{2007,2012}的,所以当你使用客制化数据集时,只有两个evaluator可以使用:COCOEvaluator, SemSegEvaluator,其中COCOEvaluator应当输入已注册数据集的名字,或是json文件。其中COCOEvaluator实现了目标检测(bbox,如voc)、实例分割(segm)、关键点检测(keypoints)数据集自动转换成coco风格,前提是该数据集被正确register过。此外,这个evaluator提供的AP并不是标准AP算法,而是它的近似方法(为了更快,也占用了更多ram)。

以上register, cfg, trainer, evaluator,predictor以及datasets就构成了实现一个项目所需要的大致全部工具。

你应当常常需要register客制化数据集:

若你需要客制化一份数据集,那么你需要register一份DET2可以识别的数据集,DET2提供了一种有全局性质的数据集注册功能,被注册的数据集自注册起,将保留全局性并生存到流程终止。你可以按照以下标准重构你的数据集,或是添加新的属性,标准化的属性可以使用DET2的特性,但是新的属性的使用方法需要自己实现。

DET2的dataset register tutorial:Use Custom Datasets — detectron2 0.4 documentation 有需要设置的属性详细介绍

DET2的标准属性,自行阅读tutorial。

其中,值得注意的是,category_id是类别ID,最后一个ID指的是背景(如果有的话),但是你在cfg中填入的class number并不需要cls+1(背景),所以当你的类别ID出现问题,你应当优先考虑这两个问题:类别数量NUM_CLASSES是否少于实际类别数量,或是是否考虑“背景”类。此外,对于标签为空(但是有指向标签,即标签文件为空节点)等情况,默认将移出训练过程。对于custom dataset(即你添加其它属性的非标准数据集),是存储在内存中的,所以确保你的内存足够大,或者使用小数据集。

以上介绍了detectron2的核心模块,若你阅读了colab的demo,并阅读了以上我提及的脚本文件,那么你应当有能力搭建一套训练-评估-测试流程,以及制备detectron2风格的数据集。我也已经将训练-测试流程搭建完毕并成功跑了起来。

若我写的有误或有改良方法,望评论指出,谢谢。

实现代码,注册-训练-测试

其中,训练中自动调用evaluator进行评估并没有找到如何实现,我需要进一步实验,为了实现阶段性回滚,可以以例如10000轮迭代为周期,评估并保存报告和checkpoint,回滚时直接读对应checkpoint即可。

贴一下我的代码,本地化修改即可运行。

# -*- coding: utf-8 -*-
#!python==3.6
# @Time: 2021.06.22
# @Author: 蜗牛1515
# @url:detectron2的结构介绍及代码实现_d948142375的博客-CSDN博客
# @Software: pycharm -v2020.1.5
# key words: faster-RCNN, detectron2
# version: 0.3

import os
import random

import torch
import torchvision
import numpy as np
import json
import cv2

import detectron2
from detectron2.config import get_cfg
from detectron2 import model_zoo
from detectron2.data import build_detection_test_loader
from detectron2.data.datasets import load_voc_instances, register_pascal_voc
from detectron2.evaluation import COCOEvaluator, inference_on_dataset
from detectron2.utils.logger import setup_logger
from detectron2.engine import DefaultTrainer

from google.colab.patches import cv2_imshow


def my_register():
    tag_dict = {
        key:val,
        ...
    }
    dataset_name = name
    year = year
    class_name = tuple(tag_dict.keys())
    for spt in ("train", "val", "trainval", "test"):
        register_pascal_voc(name="%s_%s_%s"%(dataset_name, year, spt), dirname="./datasets/%s"%dataset_name,
                            split=spt, year=year, class_names=class_name)
        print("register dataset:%s_%s_%s"%(dataset_name, year, spt), "successfully!")


def my_faster_RCNN():

    # SEG: setup
    cfg = get_cfg()
    cfg.merge_from_file(model_zoo.get_config_file("Base-RCNN-FPN.yaml"))
    cfg.merge_from_file(model_zoo.get_config_file("PascalVOC-Detection/faster_rcnn_R_50_FPN.yaml"))
    model_name = "faster_rcnn_R_50_FPN"

    cfg.DATASETS.TRAIN = ('name_year_train',) #你register的数据集
    cfg.DATASETS.TEST = ('name_year_test',)

    cfg.MODEL.WEIGHTS = "net_weights_src/faster_R50_FPN.pkl"
    cfg.MODEL.ROI_HEADS.NUM_CLASSES = 22    # NOTE: this config means the number of classes
                                            # but a few popular unofficial tutorials incorrect uses num_classes+1 here.

    cfg.SOLVER.IMS_PER_BATCH = 4    # 一批的图,数量取决于显存
    cfg.SOLVER.BASE_LR = 0.001
    cfg.SOLVER.MAX_ITER = 100000
    cfg.SOLVER.STEPS = [50000, 80000]    # 学习率衰减区间
    cfg.OUTPUT_DIR = "./output_%s"%model_name

#    cfg.freeze()

    # SEG: train
    os.makedirs(cfg.OUTPUT_DIR, exist_ok=True)
    trainer = DefaultTrainer(cfg)
    trainer.resume_or_load(resume=True) # 从断点继续训练,将忽略一开始读取的WEIGHTS,从最近的checkpoint进行训练。若为False,将忽略断点
    trainer.train()

    # SEG: test
    cfg.MODEL.WEIGHTS = os.path.join(cfg.OUTPUT_DIR, "model_final.pth")  # path to the model we just trained
    cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.7  # set a custom testing threshold

    evaluator = COCOEvaluator(
        dataset_name=cfg.DATASETS.TEST[0], tasks=["bbox",], distributed=True,
        output_dir=cfg.OUTPUT_DIR, use_fast_impl=True, kpt_oks_sigmas=()
    ) # dataset_name传入的应当是测试数据集名(字符串)而不是tuple,use_fast_impl指DET2自带的快速计算AP的近似方法
#    test_loader = build_detection_test_loader(cfg, cfg.DATASETS.TEST)

    trainer.test(cfg=cfg, model=trainer.model, evaluators=evaluator)    # 将自动创建data_loader
#    print(inference_on_dataset(trainer.model, test_loader, evaluator))

def main():
    print("hello, detectron2!")


if __name__ == "__main__":
    main()
    my_register()
    my_faster_RCNN()

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

detectron2的结构介绍及代码实现 的相关文章

  • IDEA mvn 命令作用介绍

    idea工具maven projects里面有9种生命周期 今天刚好遇到 顺便分享下自己的理解 生命周期是包含在一个项目构建中的一系列有序的阶段 最常用的两种打包方法 一 clean package 如果报错 很可能就是jar依赖的问题 二
  • 我们到底是不是产品经理

    产品究竟是什么 百度百科的解释 产品是一组将输入转化为输出的相互关联或相互作用的活动的结果 其实理解的更直白一点 产品就是用来解决莫个问题的东西 现在我们用的键盘 显示器 水杯 包括买东西时导购员的服务都是产品 也就是说产品这个东西可以是有
  • 从零开始学习React——(七):React列表循环数据以及事件绑定

    本节主要介绍React中列表循环展示数据以及事件的绑定 1 列表循环数据化 目前Child js组件中的 li 标签内的数据是静态的 也就是死的 如果要换成动态的 就需要把这个列表进行数据化之后再用JavaScript代码循环在页面上 首先
  • [systemc][tlm2.0]父模块与子模块的实现

    一 windows下环境配置 尝试1 visual studio 配置systemc环境 systemC学习笔记3 vs开发环境搭建 知乎 zhihu com 32 封私信 80 条消息 流浪码农 知乎 zhihu com 之前配置总是不通

随机推荐

  • pb_ds实现可重复set

    简单来说 就是将数据类型改为pair 保证值不同就行 less
  • 基于vue的picker组件

    概述 基于vue js选择器组件 github https github com xiecg vue DEMO vue picker 安装 npm install vue 3d picker save import picker from
  • 解决freemarker数组中的对象属性获取不到

    1 问题现象 使用Freemarker写入模板的时候 遍历List的时候发现对象中的首字母大写和带下划线的时候就会报错 The following has evaluated to null or missing FTL stack tra
  • 基于Rockchip RK3588 Android12 SDK搭建自己的repo 仓库服务器

    基于Rockchip RK3588 Android12 SDK搭建自己的repo 仓库服务器 文章目录 基于Rockchip RK3588 Android12 SDK搭建自己的repo 仓库服务器 搭建自己的repo代码服务器 流程框图 环
  • Markdown自定义CSS样式

    前言 当我第一次接触到Markdown时 我就深深爱上了它 这简洁的界面 编程式的书写都令我爱不释手 最重要的是 还能够支持自定义html css 自定义CSS样式 说到Markdown 就不得不提及Typora这个软件 本例子即是在此软件
  • 解决vue3类型“{}”上不存在属性

    刚创建的一个Vue3和Ts的项目 结果使用Vscode打开后 修改了index vue文件就报错了 修改tsconfig json文件 在tsconfig json文件中添加一行代码 就是让ts识别vue文件 include src ts
  • Ubuntu虚拟机中网络中没有网卡

    由于断电等异常操作 导致vmware的ubuntu系统连接不到网络 ping www baidu com 提示 name or service not known 查看网卡配置 vi etc network interfaces 结果发现只
  • Circular placeholder reference 'server.port' in property definitions

    Exception in thread main java lang IllegalArgumentException Circular placeholder reference server port in property defin
  • Cannot run program "scripts\saveVersion.sh"

    用Maven 编译hadoop遇到以下错误 saveVersion sh script fails in windows cygwin hadoop yarn common 半天是个bug 解决方案如下 Index hadoop mapre
  • C++常用经典算法总结

    一 算法概述 排序算法可以分为两大类 非线性时间比较类排序 通过比较来决定元素间的相对次序 由于其时间复杂度不能突破O nlogn 因此称为非线性时间比较类排序 线性时间非比较类排序 不通过比较来决定元素间的相对次序 它可以突破基于比较排序
  • C#如何通过存储过程从数据库中获得数据

    存储过程就是在数据库中写好的函数 C 通过调用存储过程来获得数据 可以在一定程度上提高数据库的安全性 将一些重要的数据封装了起来 那么如何在C 中调用存储过程呢 一 存储过程 环境如下 1 数据库Itcast2014中包含表TblStude
  • VS的C++项目添加LAPACK库简便方法(注:64位+32位,且不用自己编译库)

    需要材料 1 已经编译好的库文件 dll文件和头文件 http icl cs utk edu lapack for windows lapack libraries 这个网站中有已经用minGW编译好的LAPACK库 lib 一共有三个 除
  • 实践DIV+CSS网页布局入门指南

    实践DIV CSS网页布局入门指南 你正在学习CSS布局吗 是不是还不能完全掌握纯CSS布局 通常有两种情况阻碍你的学习 第一种可能是你还没有理解CSS处理页面的原理 在你考虑你的页面整体表现效果前 你应当先考虑内容的语义和结构 然后再针对
  • uniapp使用jsZip打包多个url文件,下载为一个压缩包

    1 需求及前言 可选中多个文件 类型不限png doc xls ppt等 点击下载时 将选中的文件全部打包成一个压缩包给用户 本文讲解jszip这个插件的打包下载使用方法 2 下载插件 npm install file saver npm
  • kafka服务端常见报错

    打印错误ERROR日志 cat kafkaserver log grep i A3 ERROR 日志目录 1 x data 2 x data logs kedacom project namespace dol kafka dol kafk
  • c++四内存区

    c 程序执行时 内存分为四个区域 1 代码区 存放函数体的二进制代码 由操作系统管理 2 全局区 存放全局变量 静态变量和常亮 3 栈区 编译器自动分配释放 存放函数的参数和局部变量等 4 堆区 程序员分配和释放 若未释放 程序结束时有操作
  • # 关于idea中模块文件夹右下角没有蓝色小方块,pom文件显示橘色

    关于idea中模块文件夹右下角没有蓝色小方块 pom文件显示橘色 模块文件夹中右下角没有蓝色小方块 根本原因是因为模块文件夹中没有xxx iml文件 这个本人亲自试验过 将xxx iml文件删除后 模块文件夹右下角小蓝块立马消失 可以参考下
  • 玩好go的切片

    go的slice 入门就会遇到 但这个东西大多数人都是停留在简单的使用 一些干了好几年的老程序员都说不明白里面的道道 这里面坑不少 恰巧今天有空 好好整理下 永不踩坑 1 为什么要用切片 其他语言大多用的都是数组 在go中 数组的长度是不可
  • 尝试构建知识体系

    1 构建知识体系架构是需要 深入 广知 思考 整理 深入 需要反反复复 学致用 用致学 深度思考 锤炼打磨 不同角度不同方式去尝试思考 实践 广知 需要周围东西的敏感度 好学 求知 充满兴趣 我们积累的知识 能否形成体系 却依赖于我们能否做
  • detectron2的结构介绍及代码实现

    detectron2的结构介绍 上一篇文章 detectron2的简介和配置 d948142375的博客 CSDN博客 介绍了怎么配置detectron2 以下简称DET2 到一台ubuntu18 04的远程服务器 本文将介绍为了实现一个基