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的过程。

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

  1. Jupyter-Notebook笔记-01 安装与简单操作

    文章目录 1 安装 1.1 PIP安装 1.2 Anacoda安装 2 配置 2.1 生成配置文件 2.2 生成密码 2.3 常用配置文件修改 2.4 配置jupyter运行内核 2.5 配置Jupy ...

  2. Haskell超简单自学笔记-01安装及入门编程

    一. 安装Haskell编程环境:(笔者MacOS-10.15系统为例) 如果你的Mac已经有 macPort 了,直接打开终端输入: sudo port install ghc 比网上一堆安装配置指 ...

  3. 微信小程序开发01(安装与简单使用)

    微信小程序开发 注册账号与安装开发工具 创建项目 文件结构 小程序文件结构与传统web对比 新建文件夹 全局配置 Window TabBar 组件 Button 效果图 注册账号与安装开发工具 官网: ...

  4. OCaml 安装以及简单的加减乘除Demo(以Ubuntu16.04为例)

    安装nix 参考 https://mirrors.tuna.tsinghua.edu.cn/help/nix/ 安装nix $ sh <(curl https://mirrors.tuna.ts ...

  5. MySQL学习笔记01【数据库概念、MySQL安装与使用】

    MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...

  6. PHP学习笔记01: 安装PHP开发套件xampp

    PHP学习笔记01: 安装PHP开发套件xampp 1.从网上下载xampp7.3.7 2.安装xampp

  7. 尚硅谷大数据技术Zookeeper教程-笔记01【Zookeeper(入门、本地安装、集群操作)】

    视频地址:[尚硅谷]大数据技术之Zookeeper 3.5.7版本教程_哔哩哔哩_bilibili 尚硅谷大数据技术Zookeeper教程-笔记01[Zookeeper(入门.本地安装.集群操作)] ...

  8. Flink 笔记01:安装部署与快速入门

    stypora-copy-images-to: img typora-root-url: ./ Flink 笔记01:安装部署与快速入门 一.课程回安排与内容提纲 大数据技术框架转折点:2017年,天 ...

  9. 【新手入门】树莓派Raspberry学习笔记4 摄像头安装+配置+简单使用

    树莓派Raspberry Pi3B+学习笔记4 今日达成: ①摄像头安装+配置+简单使用 ②树莓派上python编程初尝试 这份笔记里主要讲的是摄像头的安装+配置+简单使用. 一.摄像头和树莓派连接+ ...

最新文章

  1. python怎么读取文件-python怎么读取文件内容
  2. opencv与opengl混用实现三维点云图像
  3. python实现表格合并_Python实现合并excel表格的方法分析
  4. php开启mysqlnd,如何启用mysqlnd的PHP?
  5. 数据库基础知识——数据库的相关概念
  6. mysql limit 后子查询_mysql 关于limit 子查询和获取某当天所有记录
  7. .Net培训个人总结笔记26
  8. [SAP ABAP开发技术总结]ABAP调优——Open SQL优化
  9. 模拟数据生成工具--Faker
  10. -- 99美金和299美金的开发者证书的区别 --
  11. Nginx服务器软件学习记录
  12. [题单]多校补题 2017-2012
  13. SAP增强总结-第四代增强(BTE概念及原理)
  14. 解决ThinkPad X200找不到无线网卡硬件的问题
  15. 基于Android学生考勤管理系统设计与实现
  16. vs2019新建一个html项目,VS2019 自定义项目模板的实现方法
  17. 炸弹人问题(加强版)
  18. docker 国内镜像设置
  19. 服务器两个cpu能使用不同型号吗,双路主板可以上一个cpu吗
  20. fico RMA部署规则时,jdk过期报错

热门文章

  1. Vue-cli 3.X 构建工具零基础快速上手
  2. SpringBoot配置文件 【自定义配置项】
  3. Oracle 11g Java驱动包ojdbc6.jar安装到maven库,并查看jar具体版本号
  4. (Docker实战) 第2篇:Centos7 拉取和部署Gitlab
  5. flowable实战(十四) 关于流程设计器 act_de_mode的表详解
  6. python3-pandas 缺失数据的处理
  7. JavaScript-数据类型
  8. 推荐算法 php SQL,MixPHP 独特的SQL构建方式
  9. vue 判断同一数组内的值是否一直_vue一些笔记
  10. Python bytearray/bytes/string区别