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.pswp.cn/news/532864.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532864.shtml
英文地址,請注明出處:http://en.pswp.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…