mmdetection 使用笔记 01: 安装与简单的推理demo

mmdetection 使用笔记 01: 安装与简单的推理demo

mmdetection是来自商汤和港中文联合实验室openmmlab推出的目标检测工具包,与其同系列的还有基础视觉包mmcv,图像分类mmclassification,还有mmaction,mmaction2等等。

今天第一次尝试使用mmdetection,先进行安装和简单的demo使用。

安装

根据其github的get_started.md介绍进行安装即可

这里介绍一下我的安装过程,亲测没什么问题

Ubuntu 18.04

PyTorch 1.7.0

Cuda 11.1

RTX 3060 Ti

  1. 为其新建一个conda环境并激活并安装pytorch(这里就不详细介绍了,网上教程很多,应该不难)

  2. 安装mmdetection

    pip install openmim
    mim install mmdet
    

以上方式即可自动安装成功mmdetection,get_started.md还提供了一种手动安装的方法,比较麻烦,可以自己去试一下。

demo尝试

这里我们根据商汤给出的教程给出的介绍尝试了一下inference的demo。

使用Faster RCNN进行demo图像的目标检测

安装成功后,新建一个工程即可

mkdir mmdet_proj
cd mmdet_proj

新建一个ipynb文件

(因为这个demo默认要用matplotlib来展示检测结果框,而我是用vscode连接远程服务器进行工作的,所以直接用py文件无法进行结果展示,要savefig的话应该要改一点源码,如果是在本机进行demo尝试的话,py文件应该也可)

import torch
from PIL import Image
from mmdet.apis import inference_detector, init_detector, show_result_pyplot
from mmdet.configs.faster_rcnn import faster_rcnn_r50_fpn_1x_cocoimport warnings				# 我这里会报一些警告,不影响运行,但影响心情,就先把警告关掉了
warnings.filterwarnings("ignore")image = 'demo.jpeg'device = torch.device('cuda:0')
config = '~/anaconda3/envs/[your_conda_env_name]/lib/python3.8/site-packages/mmdet/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py'
checkpoint = 'weights/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth'model = init_detector(config, checkpoint, device=device)
result = inference_detector(model, image)
show_result_pyplot(model, image, result, score_thr=0.9)
  1. config文件是模型的一些配置,如果是直接拉的mmdet github仓库的话,config是可以按照相对路径拿到的,但我们是mim安装的,所以我就找了一下这个config文件的绝对路径拿过来了。

  2. checkpoint可以从mmdet的Faster RCNN model zoo下载。

  3. 运行ipynb文件即可以看到结果啦。

    在这里插入图片描述

    可以看到检测结果还是不错的。

  4. 然后我们看一下这个过程中的中间变量都是什么东西。

    model:

    model		# print(model) for .py
    
    FasterRCNN((backbone): ResNet((conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)(bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(relu): ReLU(inplace=True)(maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)(layer1): ResLayer(# ...# ...)init_cfg={'type': 'Pretrained', 'checkpoint': 'torchvision://resnet50'}(neck): FPN((lateral_convs): ModuleList((0): ConvModule((conv): Conv2d(256, 256, kernel_size=(1, 1), stride=(1, 1)))(1): ConvModule((conv): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1)))(2): ConvModule((conv): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1)))(3): ConvModule((conv): Conv2d(2048, 256, kernel_size=(1, 1), stride=(1, 1))))(fpn_convs): ModuleList((0): ConvModule((conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)))(1): ConvModule((conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)))(2): ConvModule((conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)))(3): ConvModule((conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)))))init_cfg={'type': 'Xavier', 'layer': 'Conv2d', 'distribution': 'uniform'}(rpn_head): RPNHead((loss_cls): CrossEntropyLoss()(loss_bbox): L1Loss()(rpn_conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(rpn_cls): Conv2d(256, 3, kernel_size=(1, 1), stride=(1, 1))(rpn_reg): Conv2d(256, 12, kernel_size=(1, 1), stride=(1, 1)))init_cfg={'type': 'Normal', 'layer': 'Conv2d', 'std': 0.01}(roi_head): StandardRoIHead((bbox_roi_extractor): SingleRoIExtractor((roi_layers): ModuleList((0): RoIAlign(output_size=(7, 7), spatial_scale=0.25, sampling_ratio=0, pool_mode=avg, aligned=True, use_torchvision=False)(1): RoIAlign(output_size=(7, 7), spatial_scale=0.125, sampling_ratio=0, pool_mode=avg, aligned=True, use_torchvision=False)(2): RoIAlign(output_size=(7, 7), spatial_scale=0.0625, sampling_ratio=0, pool_mode=avg, aligned=True, use_torchvision=False)(3): RoIAlign(output_size=(7, 7), spatial_scale=0.03125, sampling_ratio=0, pool_mode=avg, aligned=True, use_torchvision=False)))(bbox_head): Shared2FCBBoxHead((loss_cls): CrossEntropyLoss()(loss_bbox): L1Loss()(fc_cls): Linear(in_features=1024, out_features=81, bias=True)(fc_reg): Linear(in_features=1024, out_features=320, bias=True)(shared_convs): ModuleList()(shared_fcs): ModuleList((0): Linear(in_features=12544, out_features=1024, bias=True)(1): Linear(in_features=1024, out_features=1024, bias=True))(cls_convs): ModuleList()(cls_fcs): ModuleList()(reg_convs): ModuleList()(reg_fcs): ModuleList()(relu): ReLU(inplace=True))init_cfg=[{'type': 'Normal', 'std': 0.01, 'override': {'name': 'fc_cls'}}, {'type': 'Normal', 'std': 0.001, 'override': {'name': 'fc_reg'}}, {'type': 'Xavier', 'layer': 'Linear', 'override': [{'name': 'shared_fcs'}, {'name': 'cls_fcs'}, {'name': 'reg_fcs'}]}])
    )
    

    由于mmdetection也是基于pytorch的,所以可以看到我们这里的Faster RCNN的检测模型也是一个nn.Module的子类,与我们平时自己使用pytorch定义的模型类似。只不过在mmdetection中已经被封装的很好了。

    result:

    type(result)	# print(type(result)) for .py
    len(result) 
    result[0]
    
    list80array([[3.7534842e+02, 1.1917159e+02, 3.8195099e+02, 1.3446083e+02,1.3552596e-01],[5.3236182e+02, 1.0955501e+02, 5.4052661e+02, 1.2522261e+02,8.8892356e-02],[3.6112421e+02, 1.0904940e+02, 3.6862576e+02, 1.2248302e+02,7.2088778e-02]], dtype=float32)
    

    这里的result就是我们检测的结果了。其最外层是一个列表,长度为80,这是因为我们使用COCO数据集进行训练的,共有80个类,其返回的结果就是每个类可能存在的边界框。

    最外层列表的每个元素即是其中一类可能存在的 nnn 个边界框。每个边界框由四个值来表示,最后一个是置信度,而前四个则是xyhw格式(中心点坐标+高和宽)的边界框坐标。

    show_result_pyplot函数中给出的参数 score_thr 即是置信度的阈值,即各个边界框的置信度大于该值时才会被显示。

    我们可以将阈值 score_thr更改看一下

    result = inference_detector(model, image)
    show_result_pyplot(model, image, result, score_thr=0.2)		# 将阈值由 0.9 改为 0.2
    

在这里插入图片描述

将阈值由 0.9 改为 0.2,可以明显看到显示出来的边界框个数增多了。

  1. 教程中还给出了单独使用RPN网络生成提议框的展示,来帮助大家理解RPN网络。我们这里只是展示mmdetecition的用法,展示RPN的流程和我们展示Faster RCNN都是一样的,只是将config和checkpoint对应替换即可,有兴趣可以自己动手是一些,这里就不再详细介绍了。

本次mmdet的安装和初步inference demo尝试就记录到这里,后续会继续记录一下笔者使用mmdet的过程。

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

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

相关文章

php无限评论回复_php实现无限级评论功能_后端开发

php去除数组的键名的方法_后端开发在php中可以使用“array_values()”函数去除数组的键名,该函数返回包含数组中所有的值的数组,其语法是“array_values(array)”,其参数“array”表示规定的数组,返回值是包含数组中所有的值的数组…

错误类型、混淆矩阵及目标检测常用评价指标

目标检测常用评价指标 本文主要参考陈恺大佬在B站商汤账号的介绍mmdetection的视频。 检测结果的正确/错误类型 真阳性(Ture Positive):算法检测到了某类物体(Positive),而实际图中也确实有这个物体&…

php显示json,PHP解决JSON中文显示问题

PHP如何解决JSON中文显示问题&#xff1f;本文主要介绍了PHP JSON格式的中文显示问题解决方法&#xff0c;本文总结了3种解决中文显示\u开头字符问题的方法。希望对大家有所帮助。返回json数据中文显示的问题解决方法一&#xff1a;<?php function Notice(){include ./incl…

使用yolov5训练自己的目标检测数据集

使用yolov5训练自己的目标检测数据集 yolov4出来后不久&#xff0c;又出现了yolov5&#xff0c;没有论文。虽然作者没有放上和yolov4的直接测试对比&#xff0c;但在COCO数据集的测试效果还是很可观的。很多人考虑到YOLOv5的创新性不足&#xff0c;对算法是否能够进化&#xf…

php的integer,PHP整型 integer

整数是一个没有小数的数字。整数规则:整数必须至少有一个数字 (0-9)整数不能包含逗号或空格整数是没有小数点的整数可以是正数或负数整型可以用三种格式来指定&#xff1a;十进制&#xff0c; 十六进制( 以 0x 为前缀)或八进制(前缀为 0)。在以下实例中我们将测试不同的数字。 …

einops和einsum:直接操作张量的利器

einops和einsum&#xff1a;直接操作张量的利器 einops和einsum是Vision Transformer的代码实现里出现的两个操作tensor维度和指定tensor计算的神器&#xff0c;在卷积神经网络里不多见&#xff0c;本文将介绍简单介绍一下这两样工具&#xff0c;方便大家更好地理解Vision Tra…

php的filter input,php中filter_input函数用法分析

本文实例分析了php中filter_input函数用法。分享给大家供大家参考。具体分析如下&#xff1a;在 php5.2 中,内置了filter 模块,用于变量的验证和过滤,过滤变量等操作&#xff0c;这里我们看下如何直接过滤用户输入的内容.fliter 模块对应的 filter_input 函数使用起来非常的简单…

COCO 数据集格式及mmdetection中的转换方法

COCO 数据集格式及mmdetection中的转换方法 COCO格式 CV中的目标检测任务不同于分类&#xff0c;其标签的形式稍为复杂&#xff0c;有几种常用检测数据集格式&#xff0c;本文将简要介绍最为常见的COCO数据集的格式。 完整的官方样例可自行查阅&#xff0c;以下是几项关键的…

php获取h1,jQuery获取h1-h6标题元素值方法实例

本文主要介绍了jQuery实现获取h1-h6标题元素值的方法,涉及$(":header")选择器操作h1-h6元素及事件响应相关技巧,需要的朋友可以参考下&#xff0c;希望能帮助到大家。1、问题背景&#xff1a;查找到h1-h6&#xff0c;并遍历它们&#xff0c;打印出内容2、实现代码&am…

在导入NVIDIA的apex库时报错 ImportError cannot import name ‘UnencryptedCookieSessionFactoryConfig‘ from

在导入NVIDIA的apex库时报错 ImportError: cannot import name ‘UnencryptedCookieSessionFactoryConfig’ from ‘pyramid.session’ (unknown location) 报错 在使用NVIDIA的apex库时报错 ImportError: cannot import name ‘UnencryptedCookieSessionFactoryConfig’ fro…

php怎么取request,PHP-如何在Guzzle中获取Request对象?

我需要使用Guzzle检查数据库中的很多项目.例如,项目数量为2000-5000.将其全部加载到单个数组中太多了,因此我想将其分成多个块&#xff1a;SELECT * FROM items LIMIT100.当最后一个项目发送到Guzzle时,则请求下一个100个项目.在“已满”处理程序中,我应该知道哪个项目得到了响…

[2021-CVPR] Jigsaw Clustering for Unsupervised Visual Representation Learning 论文简析及关键代码简析

[2021-CVPR] Jigsaw Clustering for Unsupervised Visual Representation Learning 论文简析及关键代码简析 论文&#xff1a;https://arxiv.org/abs/2104.00323 代码&#xff1a;https://github.com/dvlab-research/JigsawClustering 总结 本文提出了一种单批次&#xff0…

java jps都卡死,java长时间运行后,jps失效

在部署完应用后&#xff0c;原本jps使用的好好的&#xff0c;能正确的查询到自己正在运行的java程序。但&#xff0c;过了一段时间后&#xff0c;再使用jps来查看运行的应用时&#xff0c;自己运行的程序都看不到&#xff0c;但是自己也没有关闭这些程序啊&#xff01;然而使用…

指针(*)、取地址()、解引用(*)与引用()

指针(*)、取地址(&)、解引用(*)与引用(&) C 提供了两种指针运算符&#xff0c;一种是取地址运算符 &&#xff0c;一种是间接寻址运算符 *。 指针是一个包含了另一个变量地址的变量&#xff0c;您可以把一个包含了另一个变量地址的变量说成是"指向"另一…

matlab电类,985电气研二,有发过考研经验贴 电气电力类的有

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼clc;clear;p[2.259;2.257;2.256;2.254;2.252;2.248;2.247;2.245;2.244;2.243;2.239;2.238;2.236;2.235;2.234;2.231;2.229;2.228;2.226;2.225;2.221;2.220;2.219;2.217;2.216;2.211;2.209;2.208;2.207;2.206;2.202;2.201;2.199;2.1…

matlab legend 分块,matlab legend 分块!

matlab legend 分块&#xff01;(2013-03-26 18:07:38)%%%压差clc;clear all;figure(55);set (gcf,Position,[116 123 275 210],color,w);P[25 26 27 28 29 30 31 32 33 34 35];%理论q0.00006*pi*28*P*10^(6)*0.03^3/(12*0.028448*5);q1110.00006*pi*28*P*10^(6)*0.03^3/(12*0.…

利用opencv-python绘制多边形框或(半透明)区域填充(可用于分割任务mask可视化)

利用opencv-python绘制多边形框或&#xff08;半透明&#xff09;区域填充&#xff08;可用于分割任务mask可视化&#xff09; 本文主要就少opencv中两个函数polylines和fillPoly分别用于绘制多边形框或区域填充&#xff0c;并会会以常见用途分割任务mask&#xff08;还是笔者…

matlab与maple互联,Matlab,Maple和Mathematica三款主流科学计算软件的互操作

本文根据网上零散的信息以及这三款软件自带的说明文档整理而成&#xff0c;为备忘而记录。记录了Matlab和Maple之间的相互调用&#xff0c;以及Matlab和Mathematica之间相互调用的安装配置方法。为何需要互操作&#xff1f; 数值计算和图形方面Matlab毫无疑问是最强的&a…

PyTorch中的topk方法以及分类Top-K准确率的实现

PyTorch中的topk方法以及分类Top-K准确率的实现 Top-K 准确率 在分类任务中的类别数很多时&#xff08;如ImageNet中1000类&#xff09;&#xff0c;通常任务是比较困难的&#xff0c;有时模型虽然不能准确地将ground truth作为最高概率预测出来&#xff0c;但通过学习&#…

java高级语言特性,Java高级语言特性之注解

注解的定义Java 注解(Annotation)又称 Java 标注&#xff0c;是 JDK1.5 引入的一种注释机制。注解是元数据的一种形式&#xff0c;提供有关于程序但不属于程序本身的数据。注解对它们注解的代码的操作没有直接影响。注解本身没有任何意义&#xff0c;单独的注解就是一种注释&am…