docker與mmdetection

這里不再介紹 mmdetection 的安裝和配置,使用 mmdetection 較簡單的方法是使用已安裝 mmdetection 的 docker 容器。這樣直接省去了安裝 mmdetection 的過程,讓重心放在模型訓練上!

如果你對 docker 和 mmdetection 還不是很熟悉,請自行搜索一下,本文就不再贅述了。

這里附上 mmdetection 的 GitHub 地址:

https://github.com/open-mmlab/mmdetection

0. 前期準備

首先默認你的電腦已經做好了下面這些前期準備工作:

  • Ubuntu 16.04 或以上

  • GPU 安裝

  • cuda 安裝

  • cudnn 安裝

  • docker 安裝

  • nvidia-docker

當然,如果你連接的是公司或學校的服務器,且服務器已經做了上面幾點準備,那你只需要一個 Xshell 遠程登錄服務器就行了。

1. 下載含 mmdetection 的 docker 鏡像

首先,我們需要找到一個已經配置好 mmdetection 環境的 docker 鏡像。可以在 dockerhub 上用 “mmdetection” 作為關鍵詞進行搜索,也可以在 terminal 里直接使用命令 docker search 進行搜索:

$ docker search mmdetection

結果顯示如下圖所示:

這里,我們選擇排第一的 vistart/mmdetection 鏡像,下載 docker 鏡像的方法也很簡單,使用 docker pull 從鏡像倉庫中拉取指定鏡像:

$ docker pull vistart/mmdetection

如果網絡沒問題,下載會在幾分鐘之內完成。下載完成之后,我們就可以查看 vistart/mmdetection 鏡像是否已經放在本地鏡像里了:

$ docker images

可以看到 vistart/mmdetection 鏡像已經成功下載了。

2. 新建含 mmdetection 的容器

包含 mmdetection 的鏡像已經下載好了,下一步就是新建一個 docker 容器以供使用了:

$ docker run --runtime=nvidia --name mm_prj -i -t vistart/mmdetection /bin/bash

對上面的命令解釋一下:–runtime=nvidia 很關鍵,能使新建的 docker 容器能使用宿主機器的 GPU,不加這個參數則默認使用 CPU;–name mm_prj 是對新建的 docker 容器進行命名,該名稱為 mm_prj,讀者可自行修改。

新建容器之后的界面如下:

至此,名為 mm_prj 容器已經打開了。可以看到,該目錄中已經包含了 mmdetection 目錄,表示該 docker 鏡像已經安裝好了 mmdetection。

補充:

另外,補充一些退出容器、進入容器的操作。

退出容器:

# exit

查看現有容器:

$ docker ps -a

可以看到,名為 mm_prj 的 docker 容器已經在容器列表了。

打開容器:

$ docker start mm_prj
$ docker exec -i -t mm_prj /bin/bash

3. 導入自己的 VOC 數據

這一步,我們需要把自己的數據打包成 Pascal VOC 格式。其目錄結構如下:

VOCdevkit--VOC2007----Annotations----ImageSets------Main----JEPGImages

簡單介紹一下,其中 Annotations 存放的是 .xml 文件,JEPFImages 存放的是 .jpg 圖片。

按照此格式放置好自己的訓練數據之后,需要切分訓練數據和測試數據。在 VOCdevkit 目錄下新建一個 test.py 文件。test.py 內容為:

import os
import randomtrainval_percent = 0.8
train_percent = 0.8
xmlfilepath = 'Annotations'
txtsavepath = 'ImageSets\Main'
total_xml = os.listdir(xmlfilepath)num = len(total_xml)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)ftrainval = open('ImageSets/Main/trainval.txt', 'w')
ftest = open('ImageSets/Main/test.txt', 'w')
ftrain = open('ImageSets/Main/train.txt', 'w')
fval = open('ImageSets/Main/val.txt', 'w')for i in list:name = total_xml[i][:-4] + '\n'if i in trainval:ftrainval.write(name)if i in train:ftrain.write(name)else:fval.write(name)else:ftest.write(name)ftrainval.close()
ftrain.close()
fval.close()
ftest.close()

上面的代碼劃分數據集,trainval 占 80%,作為訓練集;test 占 20%,作為測試集。

運行 test.py,將會在 VOCdevkit/ImageSets/Main 目錄下生成下面三個文件:

打開文件可以看到,trainval.txt 包含訓練時所有的樣本索引,test.txt 包含測試時所有的樣本索引。

自己的 VOC 數據制作完畢之后,從宿主機(Ubuntu)復制到 /mmdetection/data/ 目錄下:

$ docker cp VOCdevkit mm_prj:/mmdetection/data/

4. 修改 class_names.py 文件

打開 /mmdetection/mmdet/core/evaluation/class_names.py 文件,修改 voc_classes 為將要訓練的數據集的類別名稱。如果不改的話,最后測試的結果的名稱還會是’aeroplane’, ‘bicycle’, ‘bird’, ‘boat’,…這些。改完后如圖:

5. 修改 voc.py 文件

打開 mmdetection/mmdet/datasets/voc.py 文件,修改 VOCDataset 的 CLASSES 為將要訓練的數據集的類別名稱。

如果只有一個類,要加上一個逗號,否則將會報錯。

6. 修改配置文件

mmdetection 中提供了很多目標檢測模型可供使用。例如,進入 /mmdetection/config/ 目錄,就會看到很多模型:

根據我們選擇使用的模型,修改相應的配置文件。本文我們使用的是FasterRCNN 模型,修改的是 faster_rcnn_r50_fpn_1x.py 文件。

6.1 修改 num_classes 變量

打開 faster_rcnn_r50_fpn_1x.py,將 num_classes 變量改為:類別數 + 1(例如我有 20 類,因此改為 21):

6.2 修改 data_settings

因為 faster_rcnn_r50_fpn_1x.py 默認使用的是 coco 數據集格式,我們要對其修改成相應的 VOC 數據格式。修改后的內容如下圖所示:

6.3 調整學習率

本文使用單 gpu 訓練,修改 img_per_gpu = 2,workers_per_gpu = 0。

對學習率的調整,一般遵循下面的習慣:

  • 8 gpus、imgs_per_gpu = 2:lr = 0.02;

  • 2 gpus、imgs_per_gpu = 2 或 4 gpus、imgs_per_gpu = 1:lr = 0.005;

  • 4 gpus、imgs_per_gpu = 2:lr = 0.01

這里,我們只使用單 gpu,且 img_per_gpu = 2,則設置 lr = 0.00125。

這里說一下 epoch 的選擇,默認 total_epoch = 12,learning_policy 中,step = [8,11]。total_peoch 可以自行修改,若 total_epoch = 50,則 learning_policy 中,step 也相應修改,例如 step = [38,48]。

至此,配置文件已修改完畢。

7. 模型訓練

模型訓練非常簡單,只需一行命令:

python3 ./tools/train.py ./configs/faster_rcnn_r50_fpn_1x.py

注意執行上面的命令是在 /mmdetection 目錄下。

如果有多個 gpu,例如 0, 1 號 gpu 都可用,則可以全部用起來訓練,命令如下:

CUDA_VISIBLE_DEVICES=0,1 python3 ./tools/train.py ./configs/faster_rcnn_r50_fpn_1x.py --gpus 2

上面的 –gpus 2 表示使用的 gpu 個數為 2。如果使用多塊 gpu,注意修改學習率 lr。

然后,訓練就開始了:

從打印出的信息中,可以看到當前的 epoch 和 loss 值。

每個 epoch 會生成一個模型,并自動保存在 /mmdetection/work_dirs/faster_rcnn_r50_fpn_1x/ 目錄下。

訓練完成之后,latest.pth 即 epoch_12.pth 就是最終的模型。

8. 模型測試,計算 mAP

下面我們將使用訓練好的模型對測試集進行驗證,并計算 mAP。

8.1 生成 pkl 文件

首先,生成 pkl 文件:

python3 ./tools/test.py ./configs/faster_rcnn_r50_fpn_1x.py ./work_dirs/faster_rcnn_r50_fpn_1x/latest.pth --out=result.pkl

8.2 計算測試集

mAP 對測試集計算 mAP,只需一行命令:

python3 ./tools/voc_eval.py result.pkl ./configs/faster_rcnn_r50_fpn_1x.py

計算結果如下:

圖中可以看到,最后計算的 mAP = 0.978。(本文中的目標檢測場景比較簡單,目標清晰明確,故 mAP 很高)

9. 總結

好了,以上就是教你如何一步一步在 docker 容器中使用 mmdetection 來訓練自己的數據集并測試。建議大家使用自己的數據集嘗試跑一下,看下效果~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251934.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251934.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251934.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

互聯網平臺掘金三四五線城市,你需要知道的9.9個真相

互聯網上半場結束,一二線城市流量紅利消失,許多互聯網平臺、投資機構一度經歷至黑之夜。融資失敗、公司倒閉、大裁員迭出。對比鮮明的是,深耕三四五線城市的互聯網平臺正在迅猛崛起。春節期間,小部分敏銳的業者注意到互聯網產品在…

平滑重啟更新(GR機制)

平滑重啟更新(GR機制) 什么是平滑啟動機制 是一種在協議重啟時保證轉發業務不中斷的機制。什么時候用到平滑重啟 平滑重啟一般應用于業務更新或者版本發布過程中,能夠避免因為代碼發布重啟服務導致的暫時性服務不可用的影響。ngnix 平滑重啟和…

正斜杠( / )和反斜杠( \ )的區別

反斜杠“\”是電腦出現了之后為了表示程序設計里的特殊含義才發明的專用標點。所以除了程序設計領域外,任何地方都不應該使用反斜杠。 如何區分正反斜杠 英語:"/" 英文是forward slash, “\" 是backward slash形象些比喻的話,…

MMDetectionV2 + Colab

MMDetectionV2 Colab 超詳細教程及踩坑實錄 文章目錄 前言一、環境配置二、準備自己的數據集 Aug.14更新三:修改config文件 3.1 文件結構3.2 (本地)修改config文件 3.2.1 (本地)構造自己模型的權重文件3.2.2 &#x…

剛剛,OpenStack 第 19 個版本來了,附28項特性詳細解讀!

剛剛,OpenStack 第 19 個版本來了,附28項特性詳細解讀! OpenStack Stein版本引入了新的多云編排功能,以及幫助實現邊緣計算用例的增強功能。 OpenStack由一系列相互關聯的項目組成,這些項目可以以不同的組合方式組合在…

SQL作業:綜合練習(二)的返評

一:作業題目:綜合練習(二) 二:題目要求: 1、創建數據庫CPXS,保存于E盤根目錄下以自己學號姓第一個字母(阿拉伯數字大寫字母)方式創建的文件夾中,初始大小5MB&…

caffe cifar10試跑問題總結

caffe cifar10試跑問題總結 [daniel] 寫了一個腳本可以直接用來添加環境變量:/Users/songdanzju/daniel_script/export_for_ananconda.sh#! /bin/bash export PATH~/ananconda/bin:$PATH export DYLD_FALLBACK_LIBRARY_PATH~/anaconda:~/anaconda/lib:/usr/local/l…

paddlepaddle-VisualDL2.0對項目進行可視化調參

如果需要更好的閱讀體驗,可以在ai studio上fork該項目:使用VisualDL2.0對項目進行可視化調參 調參是深度學習必須要做的事情。數據和模型處理好后,需要進行模型訓練,這個時候就需要進行調參了。一種好的參數配置,可以…

第一、二次實訓作業

1.編寫程序: 聲明一個整型變量a,并賦初值5,在程序中判斷a是奇數還是偶數,然后輸出判斷的結果。 package 判斷奇偶; public class liux { public static void main(String[] args){ int x5; if(x%20){ System.out.println("這…

推薦一款作圖工具

以前看到別人的時序圖覺得好好看,然后就想這都是用的什么工具畫出來的呢?然后看到了一個師兄用的這個工具,真的挺好用的。這是是試用版的界面。類圖我覺著看起來效果都挺不錯的。轉載于:https://www.cnblogs.com/tuhooo/p/8874410.html

【codeforces】【比賽題解】#849 CF Round #431 (Div.2)

cf的比賽越來越有難度了……至少我做起來是這樣。 先看看題目吧:點我。 這次比賽是北京時間21:35開始的,算是比較良心。 【A】奇數與結束 "奇數從哪里開始,又在哪里結束?夢想從何處起航,它們又是否會破滅呢&#…

PaddleDetection支持的數據格式

PaddleDetection支持的數據格式 目前#PaddleDetection支持43種數據格式:coco voc widerface。在這里我們主要說明一下如何使用自定義COCO進行目標檢測、實例分割;如何使用自定義VOC數據集進行目標檢測。在PaddleDetection新的版本中,我們將數…

[dts]Device Tree機制【轉】

轉自:https://www.cnblogs.com/aaronLinux/p/5496559.html 轉自:http://blog.csdn.net/machiner1/article/details/47805069 ------------------Based on linux 3.10.24 source code 參考/documentation/devicetree/Booting-without-of.txt文檔 目錄 1.…

AntiSamy測試

AntiSamy為owasp針對xss提供的處理庫,可以配置xml策略來決定過濾的內容,比如標簽、屬性、css等,自定義策略給開發人員使用成本比較高,AntiSamy也提供了幾個內置的策略,其安全級別也不同,過濾的內容也不一樣…

1625 數字金字塔

1625 數字金字塔 鏈接:http://codevs.cn/problem/1625/ USACO 時間限制: 1 s空間限制: 128000 KB題目描述 Description考慮在下面被顯示的數字金字塔. 寫一個程序來計算從最高點開始在底部任意處結束的路徑經過數字的和的最大. 每一步可以走到下方的點也可以到達右…

ubuntu下的能安裝的百度網盤的資源最新網址

Index of /deepin/pool/non-free/d/deepin.com.baidu.pan/

C# 匿名委托、匿名方法、匿名對象、Lambda表達式

C# 匿名委托、匿名方法、匿名對象、Lambda表達式 原文:C# 匿名委托、匿名方法、匿名對象、Lambda表達式一、匿名類型可通過使用 new 運算符和對象初始值創建匿名類型。示例:var v new { Name "Micro", Message "Hello" };var v new[] { …

【9018:1956】線段樹1

問題 D: 【模板】線段樹1 時間限制: 1 Sec 內存限制: 512 MB提交: 80 解決: 40[提交][狀態][討論版]題目描述 給定一個無序數列,有四種操作: 1.令數列中的某個數加上某個數 2.求一個區間的和 3.查詢一段區間內的最大值; 4.查詢一段區間內的…

c++調用函數的dll

在工程項目中,為了不暴露源代碼和避免嚴重耦合,所以將代碼封裝成 .dll二進制文件,以供項目調用。 這幾天,也是在看這些封裝dll,并使用Java中的JNA調用c的dll鏈接庫中的函數,做個筆記! 1、創建…

SoJpt Boot 2.2-3.8 發布,Spring Boot 使用 Jfinal 特性極速開發

開發四年只會寫業務代碼,分布式高并發都不會還做程序員? 在Spring Boot框架下使用Jfinal特性極速開發,可以在Spring Boot中向使用Jfinal一樣使用Enjoy、Aop、Controller等一系列方法(如: getFile(), renderFile....),以及ActiveRecord SoJpt Boot&…