日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Faster-RCNN.pytorch的搭建、使用过程详解(适配PyTorch 1.0以上版本)

發布時間:2024/3/24 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Faster-RCNN.pytorch的搭建、使用过程详解(适配PyTorch 1.0以上版本) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Faster-RCNN.pytorch的搭建、使用過程詳解

  • 引言
  • faster-rcnn pytorch代碼下載
  • faster-rcnn pytorch配置過程
  • faster-rcnn pytorch訓練自定義Images文件和對應XML文件的model
  • faster-rcnn pytorch參數修改

引言

本文主要介紹(1)如何跑通源代碼;(2)配置過程中遇到的錯誤調試過程;(3)成功訓練自己的數據集。

faster-rcnn pytorch代碼下載

  • pytorch0.4.0版源碼:https://github.com/jwyang/faster-rcnn.pytorch.git
  • pytorch1.0.0版源碼:https://github.com/jwyang/faster-rcnn.pytorch/tree/pytorch-1.0

配置環境:

我復現代碼的環境是python3.6+cuda10.1+Ubuntu16.04+Pytorch1.2。

強烈推薦使用 pytorch1.0.0版源碼 進行配置,舊版本已不再維護,很多報錯難以調試。

具體配置,此代碼作者已在ReadMe中詳細介紹,但鑒于初學者在復現中遇到的種種問題,下面將對“具體配置過程”做出進一步闡釋,旨在做到淺顯易懂,成功復現。

faster-rcnn pytorch配置過程

1. 安裝torch

請移步至https://pytorch.org/get-started/locally/查看相應的安裝命令,安裝最新版的pytorch包。參考執行代碼如下:

conda install pytorch==1.0.0 torchvision==0.2.1 cuda100 -c pytorch

2. 下載源碼到本地

具體方法有以下兩種:

(1)git clone 到本地

git clone -b pytorch-1.0 --single-branch --depth=1 --recursive https://github.com/jwyang/faster-rcnn.pytorch.git

其中:-b是分支名,--single-branch是clone指定分支的命令,--depth==1是指克隆最近一次更改,--recursive用于循環遞歸克隆子項目。

(2)直接下載zip文件至本地


強烈推薦第二種,簡單、方便。

3. 創建數據文件夾

在本地創建一個文件夾專門用來搭建Faster-RCNN模型,所有的配置文件均在此目錄下進行(如:“/detectron”)。

首先,將源碼的zip文件copy至目標目錄/detectron,同時解壓縮得到如下所示文件夾;


其次,創建data文件夾,具體操作如下:

1. cd 進入project根目錄 2. mkdir data # 創建data文件夾

或者,直接執行

# && 表示前一條命令執行成功時,才執行后一條命令 ,如 echo '1‘ && echo '2' cd faster-rcnn.pytorch && mkdir data # 一步實現上述2條命令,此處faster-rcnn.pytorch即為存放解壓縮后源碼的文件夾

4.下載數據至data文件夾

cd 進入data文件夾

開始下載壓縮文件,執行如下命令,下載VOV2007標準數據集的相關數據。

wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar

執行下方命令解壓縮數據到data/VOCdevkit

tar xvf VOCtrainval_06-Nov-2007.tar tar xvf VOCtest_06-Nov-2007.tar tar xvf VOCdevkit_08-Jun-2007.tar

cd 進入data文件夾下,創建軟鏈接

ln -s VOCdevkit的絕對路徑 VOCdevkit2007

完整的VOC2007數據集有三個壓縮包:

  • VOCdevkit_08-Jun-2007.tar:開發工具包
  • VOCtest_06-Nov-2007.tar: 測試集,4952張圖片
  • VOCtrainval_06-Nov-2007.tar: 訓練和驗證集,5011張圖片
    \quad
    其中test和trainval的數據集目錄結構一樣,同時解壓三個壓縮包,最終會自動解壓到一個文件夾下VOCdeckit。trainval和test數據集是從一個完整數據集劃分來的,所以目錄結構一樣,且不存在沖突的圖片命名。所以, 解壓完成后相當于將兩個子數據集合并成一個完整的大數據集 有train,val,trainval,test。
    \quad
    數據集文件結構介紹:
    \quad
    VOCtrainval_06-Nov-2007文件夾下
    VOCdevkit
    └─VOC2007
    ├─Annotations
    ├─ImageSets
    │ ├─Layout
    │ ├─Main
    │ └─Segmentation
    ├─JPEGImages
    ├─SegmentationClass
    └─SegmentationObject
    \quad

數據集文件夾分布情況如下:
VOC 2007數據集結構的詳細介紹: VOC 2007數據集結構

  • Annotation
    Annotations文件夾中存放的是xml格式的標簽文件,每一個xml文件都對應于JPEGImages文件夾中的一張圖片。
  • ImageSets
    ImageSets存放的是每一種類型的challenge對應的圖像數據。
    \quad

核心知識點:
\quad

我們進行model訓練,讀取圖像的時候,其實就是先從這個ImageSets文件夾中,找到對應任務的子文件夾,然后讀取其中txt文本文檔的圖像ID號碼, 接著按照這個ID號碼去JPEGImages文件夾下尋找對應的圖像。
\quad
ImageSets下的四個文件夾,如下:

當我們在faster-rcnn中運行訓練和測試程序時,會在完整的大數據集中自動調用相對應的數據集。
(1) Action下存放的是人的動作(running、jumping等等,這也是VOC challenge的一部分)

(2) Layout下存放的是人體部位(head、hand、feet等等,這也是VOC challenge的一部分)

(3) Main下存放的是圖像物體識別的數據,總共分為20類。

備注:

  • train.txt 是用來訓練的圖片文件的文件名列表 (訓練集)
  • val.txt是用來驗證的圖片文件的文件名列表 (驗證集)
  • trianval.txt是用來訓練和驗證的圖片文件的文件名列表, 修改自己的圖片檢測模型時,僅需要修改該文件,即:將新的訓練圖像name list 去掉后綴,更新入trianval.txt文件。
  • test.txt 是用來測試的圖片文件的文件名列表 (測試集)
    \quad
    train是網絡模型在訓練的時候用的,而val是網絡模型在訓練過程中測試用的。val是不影響訓練的。在訓練的時候可以得到train和val這兩個數據集的誤差率,利用這個誤差率可以繪制出學習曲線,通過觀察學習曲線,可以發現一些網絡模型的問題,然后再根據這些問題去調整網絡參數。test就是網絡模型訓練完畢測試用的。
    \quad
    Main文件夾下還包含了20個分類的***_train.txt、***_val.txt和***_trainval.txt。這些txt中的內容都差不多如下:

前面的表示圖像的name,后面的1代表正樣本(即:表示當前圖像中有該類物體),-1代表負樣本(即:表示當前圖像中,沒有該類物體),偶爾也會出現0(即:0 表示當前圖像中,該類物體只露出了一部分)。
_train中存放的是訓練使用的數據,每一個class的train數據都有5717個;
_val中存放的是驗證結果使用的數據,每一個class的val數據都有5832個;
_trainval將上面兩個進行了合并,每一個class有11540個;
需要保證的是train和val兩者沒有交集,也就是訓練數據和驗證數據不能有重復,在選取訓練數據的時候,也應該是隨機產生的。

\quad
(4) Segmentation下存放的是可用于分割的圖片的編號。

*_train中存放的是訓練集的圖片編號。
*_val中存放的是驗證集的圖片編號。
*_trainval是上面兩者的合并集合。
train和val包含的圖片沒有交集。

  • JPEGImages
    JPEGImages文件夾中包含了PASCAL VOC所提供的所有的圖片,包含訓練圖片和測試圖片,共有17125張。圖片均以“年份_編號.jpg”格式命名。圖片的尺寸大小不一,所以在后面訓練的時候需要對圖片進行resize操作。
    圖片的像素尺寸大小不一,但是橫向圖的尺寸大約在500ㄨ375左右,縱向圖的尺寸大約在375ㄨ500左右,基本不會偏差超過100。(在之后的訓練中,第一步就是將這些圖片都resize到300ㄨ300或是500ㄨ500,所有原始圖片不能離這個標準過遠。)
  • SegmentationClass
    這里面包含了2913張圖片,每一張圖片都對應JPEGImages里面的相應編號的圖片。
    圖片的像素顏色共有20種,對應20類物體。
  • SegmentationObject
    這里面同樣包含了2913張圖片,圖片編號都與Class里面的圖片編號相同。
    這里面的圖片和Class里面圖片的區別在于,這是針對Object的。
    在Class里面,一張圖片里如果有多架飛機,那么會全部標注為紅色。
    而在Object里面,同一張圖片里面的飛機會被不同顏色標注出來。

    \quad
    參考鏈接:
    關于VOC2007數據集的更多詳細介紹,詳見
    數據集:Pascal voc2007數據集分析
    VOC數據集介紹-VOCtrainval_06-Nov-2007文件結構和下載
    VOC數據集解析 VOC2007解析

5.下載預訓練模型

首先,在/data/下創建子文件夾/data/pretrained_model;然后,下載預訓練模型到/data/pretrained_model下,如VGG16,ResNet101等。

VGG16: Dropbox, VT Server
ResNet101: Dropbox, VT Server

備注: Dropbox, VT Server是兩個云存儲公司開放的下載數據源,建議使用Dropbox的數據源進行下載。下載結束后,將這兩個模型都放進/data/pretrained_model/文件夾中。

6.編譯

  • 使用pip安裝所有python依賴包
cd 進入data文件夾 pip install -r requirements.txt

安裝python依賴包遇到錯誤:
ERROR: Could not open requirements file: [Errno 2] No such file or directory: 'requirements.txt',說明找不到’requirements.txt’文件,查找發現在data/的上一級,即:/work/elta/detectron/faster-rcnn.pytorch-pytorch-1.0文件夾下。在此處再執行pip install -r requirements.txt即可。

error: [Errno 13] Permission denied: '/usr/local/lib/處理方法 ,處理方法:在命令前面加sudo命令。

備注:
在ubuntu系統下使用pip 命令安裝包時,出現以下類似錯誤提示:
error: [Errno 13] Permission denied: '/usr/local/lib/python2.7/dist-packages/
那么,要用root權限,可以用sudo表示用root權限執行,所以,在命令前面加sudo。

  • 編譯CUDA依賴環境

這里為pytroch1.0分支下的編譯設置,編輯所需的cuda環境后,回到主目錄。

cd lib python setup.py build develop # 不要使用sh make.sh

編譯時遇到過兩個報錯

  • error: invalid command 'develop';
  • ImportError: cannot import name '_mask'
  • can’t import ‘imread’
  • Tips:要注意如果出現can’t import ‘imread’,請檢查scipy的版本是否超過了1.0,因為1.0以上的版本里,scipy不再使用imread。
from imageio import imread # 修改解決ImportError: cannot import name 'imread' from 'scipy.misc'

之前嘗試通過pytorch0.4.0分支ReadMe配置好pytorch環境后,運行訓練時出現錯誤ImportError: torch.utils.ffi is deprecated. Please use cpp extensions instead.,解決方法參考鏈接【已解決】ImportError: torch.utils.ffi is deprecated. Please use cpp extensions instead.。
但限于版本更新和pytorch放棄對之前版本部分語法的支持,此問題是短時間內難以解決的死胡同,遂建議大家直接放棄0.4.0版本轉入1.0.0版本。

7.訓練

在訓練之前需要根據自己的環境將trainval_net.py和test_net.py中的兩個參數save_dir和load_dir進行更改。

(1)如果使用VGG16在pascal_voc上訓練faster R-CNN使用如下命令(具體參數根據自己的需要修改):

CUDA_VISIBLE_DEVICES=$GPU_ID python trainval_net.py \--dataset pascal_voc --net vgg16 \--bs $BATCH_SIZE --nw $WORKER_NUMBER \--lr $LEARNING_RATE --lr_decay_step $DECAY_STEP \--cuda

(2) 訓練命令行示例——res101:

CUDA_VISIBLE_DEVICES=0 python trainval_net.py --dataset pascal_voc --net res101 --bs 4 --nw 0 --lr 0.001 --lr_decay_step 5 --cuda

或者

CUDA_VISIBLE_DEVICES=0,1 python trainval_net.py --dataset pascal_voc --net res101 --cuda

參數說明:
\quad

  • CUDA_VISIBLE_DEVICES:指gpu的id,這得看你實驗室服務器哪塊gpu是閑置的。
  • –dataset:指訓練數據集名稱,此處以pascal-voc為例。
  • –net:你要使用的預訓練模型,可以換為resnet101。
  • –bs:指的batch size。
    –epoch:指要訓練的輪數。
  • –nw:指的是worker number,取決于你的Gpu能力,我用的是Titan Xp
    12G,所以選擇4。稍微差一些的gpu可以選小一點的值。
  • –lr:指學習率
  • –cuda:指的是使用gpu。
    \quad
    BATCH_SIZE 和 WORKER_NUMBER 可以根據你的GPU情況來設置。
    \quad
    訓好的model會存到models文件夾底下,此處暫時使用默認的訓練參數。

8.測試

如果想評估VGG16預訓練模型在pascal_voc測試集上的表現,使用如下命令:

python test_net.py --dataset pascal_voc --net vgg16 \--checksession $SESSION --checkepoch $EPOCH --checkpoint $CHECKPOINT \--cuda

要指定具體的checksession、checkepoch、checkpoint數值。如果你不知該如何設置,可以根據你訓練出來的模型名字來設置。

設置示例:

# 批量測試 python test_net.py --dataset pascal_voc --net vgg16 \--checksession 1 --checkepoch 1 --checkpoint 10021 \--cuda

注意,這里的三個check參數,是定義了訓好的檢測模型名稱,我訓好的名稱為faster_rcnn_1_20_10021,代表了checksession = 1,checkepoch = 20, checkpoint = 10021,這樣才可以讀到模型“faster_rcnn_1_20_10021”。訓練中,源碼代碼默認設置的epoch為20,所以checkepoch選擇20,也就是選擇最后那輪訓好的模型,理論上應該是效果最好的。下圖就是我20次epochs的模型。

9.運行demo.py

如果你想要運行預訓練模型去檢測新的test圖片,要先下載預訓練模型或者訓練你自己模型,然后把圖片放到工作目錄下(示例路徑:/usr/detectron/faster-rcnn.pytorch-pytorch-1.0/images/)的images文件夾里,再運行如下命令:

python demo.py --net vgg16 \--checksession $SESSION --checkepoch $EPOCH --checkpoint $CHECKPOINT \--cuda --load_dir + 模型存放文件夾

除了指定那三個數值外,還要寫清楚存放vgg16/pascal_voc/模型.pth的文件夾。例如:

demo命令行示例:

python demo.py --net res101 --checksession 1 --checkepoch 20 --checkpoint 10021 --cuda --load_dir models

此處我們需輸入使用的網絡(如:res101),以及訓練好的模型路徑(models)。我們測試的圖片都在images文件夾里。
\quad
作者提供了4張image做測試,默認測試完的圖像會輸出到images文件夾里,所以做完一次測試,images文件夾會有8張圖片(輸出圖片命名規則是在原圖像文件名后面加上"_det"),而原作者沒有把他自己測試后的圖片刪去,所以大家在做demo測試時,別忘把以"_det"結尾的檢測輸出文件先刪去,否則,測試完你的images文件夾可能會得到16張圖像。 后續在參數修改部分,會詳細介紹如何修改打框后圖像的存放路徑、包括保存生成的XML文件用于后續修改標注等:
當然,你可以放一些你自己在網上搜的圖片在images文件夾里進行demo測試,看看效果。但檢測類別一定在訓練的類別中,否則,目標檢測的結果就是隨機標注了,意義不大~

faster-rcnn pytorch訓練自定義Images文件和對應XML文件的model

我們仍然采用VOC2007數據集的結構分布框架,只是把我們自己的數據集“塞進去”,做適當調整即可。

1、VOC數據集制作:

將自己準備的images文件和對應的目標檢測XML文件,做成VOC2007格式標準數據集,用于Faster-RCNN模型訓練。

VOC2007格式要求: 圖片名是六位數字,對應XML文件名也是六位數字。 數據集準備好之后,用數據集相應的替換掉VOC2007中的數據。具體位置如下:

一、JPEGImages文件夾
  將自己的數據集中所有的圖片存放的這一文件夾下,圖片數據的格式需要統一。
二、Annotations文件夾
  將自己數據集所有圖片一一對應的xml格式的標簽文件放于這一文件夾下。
三、ImageSets文件夾
  完成ImageSets\Main中trainval.txt文件的修改
  trainval.txt是訓練和驗證集,內容為文件名(去除".jpg"后綴),該文件中的圖像list將全部用于目標檢測的model訓練,即:默認不劃分train和val的比例。 一般默認操作就OK了。
\quad
備注:
  如果想實現劃分輸入圖像的train、val、test比例,需要同時修改ImageSets\Main文件夾下4個文件(test.txt、train.txt、trainval.txt、val.txt)。
  一般而言:在原始VOC2007數據集中,trainval大約占整個數據集的50%,test大約為整個數據集的50%;train大約是trainval的50%,val大約為trainval的50%。所以我們可參考以下代碼來生成這4個txt文件。參考鏈接:faster-rcnn.pytorch-1.0指南(三)——制作PASCAL VOC2007數據集

生成這4個txt文件的示例代碼:

import os import randomtrainval_percent = 0.5 train_percent = 0.5 xmlfilepath = '/home/VOC2007/Annotations' txtsavepath = '/home/VOC2007/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(txtsavepath+'/trainval.txt', 'w') ftest = open(txtsavepath+'/test.txt', 'w') ftrain = open(txtsavepath+'/train.txt', 'w') fval = open(txtsavepath+'/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()

2、修改/lib/datasets/pascal_voc.py里的檢測類別:

VOC2007數據集的類別在路徑"/faster-rcnn.pytorch/lib/datasets/pascal_voc.py"文件中已注明,示例如下:

原始標注類別為:

self._classes = ('__background__', # always index 0'aeroplane', 'bicycle', 'bird', 'boat','bottle', 'bus', 'car', 'cat', 'chair','cow', 'diningtable', 'dog', 'horse','motorbike', 'person', 'pottedplant','sheep', 'sofa', 'train', 'tvmonitor','plane')

這個文件里存著VOC數據庫的classes,即:需要更改我們識別的類別,我的做法是把原classes注釋掉,把自己的classes加進去。

此處修改如下:

可能發生如下錯誤:

  • assert(boxes[:,2]>=boxes[:,0]).all()
    基本上都會碰上,只要是你標注的框靠近邊緣,都會出這個錯誤。表示:左上角坐標(x,y)可能為0,或標定區域溢出圖片,而faster rcnn會對Xmin,Ymin,Xmax,Ymax進行減一操作,如果Xmin為0,減一后變為負值。但是,不用急,按照下面方法改,完美解決:https://blog.csdn.net/xzzppp/article/details/52036794
  • Keyerror:'width'
    該句指的是得到的圖像數據庫imdb文件沒有‘width’,也就是沒有讀到圖像的寬度值,而這個寬度值是通過圖片讀出來的,所以說明你的訓練文件夾JPEGImage中沒有ImagesSet\Main\trainval.txt里列出的圖片,我查了下,圖片都放進去了,那為啥還出錯呢?
    原因:在訓練原數據集VOC時,圖像數量是10021張(進行了數據增強),這時會保存訓練信息至緩存中,文件路徑為:/home/zhangxin/faster-rcnn.pytorch/data/cache/voc_2007_trainval_gt_roidb.pkl
    因此,=你在重新訓練新數據集的時候,會讀取這個緩存配置,以加快訓練,那么,在更換訓練數據集之后,就會報錯了。我的新集合只有499張,所以訓練時,由于讀取緩存文件,故需要讀的圖像還是原來那10021張,那勢必會找不到這10021張圖像。
    解決方法:把這個緩存文件voc_2007_trainval_gt_roidb.pkl刪掉!!!( 每次更新訓練數據集都需要執行此操作

3、開始訓練自己的數據集:

  • 命令行運行trainval_net.py和配置參數,開始model訓練。示例如下:
  • CUDA_VISIBLE_DEVICES=0 python trainval_net.py --dataset pascal_voc --net res101 --bs 4 --nw 0 --lr 0.001 --lr_decay_step 5 --cuda
  • 修改demo.py文件中的目標檢測類別classes,具體同上:/lib/datasets/pascal_voc.py中classes的類別修改。
  • self._classes = ('__background__', # always index 0'id1', 'id2', 'id3', 'id4','id5', 'id6', 'id7', 'id8', 'id9','id10', 'id11', 'id12', 'id13','id14', 'id15', 'id18','id19', 'id26')
  • 命令行運行demo.py和配置參數,開始model測試。示例如下:
  • python demo.py --net res101 --checksession 1 --checkepoch 20 --checkpoint 233 --cuda --load_dir '/usr/detectron/faster-rcnn.pytorch-pytorch-1.0/tools/models/'

    參考鏈接:
    Faster RCNN(Pytorch) 配置過程記錄及問題解決

    使用faster-rcnn.pytorch訓練自己數據集(完整版)

    Faster-RCNN.Pytorch的使用

    Pytorch版Faster R-CNN訓練自己數據集

    目標檢測——Faster R-CNN 詳解、Pytorch搭建、訓練自己的數據集

    faster-rcnn pytorch參數修改

    基本參數:

    • base_lr:0.001
    • lr_policy:‘step’
    • step_size:30000
    • display:20
    • iteration: 數據進行一次前向-后向的訓練
    • batchsize: 每次迭代訓練的圖片數量
    • epoch: 1個epoch就是將所有的訓練圖像全部通過網絡訓練一次

    參數設置和計算:
    \quad
    (1)batchsize、epoch和iteration的關系計算:
    例如:假如有1280000張圖片,batchsize=256,則1個epoch需要1280000/256=5000次,若iteration 它的max-iteration=450000,則共有450000/5000=90個epoch;
    (2)lr、stepsize和gamma的關系計算:
    由于lr什么時候衰減與stepsize有關,減少多少與gamma有關,即:若stepsize=500, base_lr=0.01, gamma=0.1,則當迭代到第一個500次時,lr第一次衰減,衰減后的lr=lr×gamma=0.01×0.1=0.001lr=lr×gamma=0.01×0.1=0.001lr=lr×gamma=0.01×0.1=0.001,以后重復該過程,所以, stepsize是lr的衰減步長,gamma是lr的衰減系數
    (3)test_size, test_iter和test_interval的關系計算:
    在訓練過程中,每到一定的迭代次數都會測試,迭代次數是由test-interval決定的,如test_interval=1000,則訓練集每迭代1000次測試一遍網絡,而 test_size, test_iter, 和test圖片的數量決定了怎樣test, test-size決定了test時每次迭代輸入圖片的數量,test_iter就是test所有的圖片的迭代次數,如:500張test圖片,test_iter=100,則test_size=5, 而solver文檔里只需要根據test圖片總數量來設置test_iter,以及根據需要設置test_interval即可。
    迭代次數修改max_iters=[80000, 40000, 80000, 40000]
    分別對應rpn第1階段,fast rcnn第1階段,rpn第2階段,fast rcnn第2階段的迭代次數。

    pytorch faster R-CNN源碼測試、訓練自己的數據集

    修改數據讀取路徑:

    數據讀取路徑可以直接賦值,在lib/datasets/pascal_voc.py中,把self._data_path修改為自己的數據路徑,下面就是自己的數據classes類別。

    train過程中修改訓練模型保存路徑:

    在trainval_net.py中修改模型保存的路徑,對應參數'--save_dir',將default的值改為自己的model保存路徑即可。

    ##############################################修改模型存放路徑parser.add_argument('--save_dir', dest='save_dir',help='directory to save models', default="/urs/detectron/faster-rcnn.pytorch-pytorch-1.0/tools/models/", type=str)

    test過程中修改訓練模型讀入路徑:

    在demo.py中修改讀入模型的路徑,對應參數'--load_dir',將default的值改為自己的model保存路徑即可。

    ############################ 修改讀入模型的路徑parser.add_argument('--load_dir', dest='load_dir',help='directory to load models',default="/urs/detectron/faster-rcnn.pytorch-pytorch-1.0/tools/models/")

    修改圖像打標后test數據保存路徑:

    在demo.py中修改保存圖片的路徑,把推斷過后的圖片另存一個文件夾中,
    具體方法為:在parse_args中新增一個參數output_images,用于存放新生成的預測后畫框的圖片,同時修改圖像保存代碼,如下:

    if vis and webcam_num == -1: # cv2.imshow('test', im2show) # cv2.waitKey(0) result_path = os.path.join(args.output_images, imglist[num_images][:-4] + "_det.jpg") ###stt change output_images dir cv2.imwrite(result_path, im2show)

    添加保存圖片xml文件的路徑和生成對應xml文件:

    在demo.py中修改代碼,用于生成并保存預測后的圖片xml文件(減少后期標注量)具體修改參考如下:

    pred_det = [] for j in xrange(1, len(pascal_classes)):inds = torch.nonzero(scores[:,j]>thresh).view(-1)# if there is detif inds.numel() > 0: ### stt 判斷預測出來的類別中是否有框cls_scores = scores[:,j][inds] ### stt預測出來的所有得分_, order = torch.sort(cls_scores, 0, True)if args.class_agnostic:cls_boxes = pred_boxes[inds, :]else:cls_boxes = pred_boxes[inds][:, j * 4:(j + 1) * 4] ###stt 預測出來的所有框cls_dets = torch.cat((cls_boxes, cls_scores.unsqueeze(1)), 1) ### stt框和得分降成1維# cls_dets = torch.cat((cls_boxes, cls_scores), 1)cls_dets = cls_dets[order]# keep = nms(cls_dets, cfg.TEST.NMS, force_cpu=not cfg.USE_GPU_NMS)keep = nms(cls_boxes[order, :], cls_scores[order], cfg.TEST.NMS) #### stt預測出來的框nmscls_dets = cls_dets[keep.view(-1).long()]### stt addarr_2 =[]np.set_printoptions(suppress=True) ###不以科學計數法保存arr_cls_det = cls_dets.cpu().numpy() ###張量轉數組arr_cls_det.astype(float) ###列表數據轉為float格式for i in arr_cls_det:arr_2.append(pascal_classes[j]) ###類別加入新的數組中arr_2 += map(int, i.tolist()[:4]) ###預測出來的框(四個坐標點)加入數組中pred_det.append(arr_2) ###類比,框保存為一個列表,每張圖片可能有多個預測框#print(arr_cls_det)#print((np.round(cls_dets)))if vis:im2show = vis_detections(im2show, pascal_classes[j], cls_dets.cpu().numpy(), 0.5) #print(pred_det) #######stt add save_txt and xml save_txt = True save_xml = True ### Write results: for i in pred_det:if save_txt: # Write to fileimg_name = im_file.split('/')[-1].split('.')[0]txt_path = os.path.join(args.output_images, 'txt_path')if not os.path.exists(txt_path):os.makedirs(txt_path)with open(txt_path + '/' + img_name + '.txt', 'a') as file:file.write(('%s, %g , %g, %g, %g ' + '\n') % (i[0], i[1], i[2], i[3], i[4]))txtfile = os.path.join(txt_path, img_name + '.txt')###stt _add start write_xmlif save_txt and save_xml:Anno_path = os.path.join(args.output_images, 'Annotations')if not os.path.exists(Anno_path):os.makedirs(Anno_path)outdir = os.path.join(Anno_path,img_name + '.xml')txt2xml(pascal_classes, txtfile, im_file, outdir) ####stt add end misc_toc = time.time() nms_time = misc_toc - misc_tic

    參考鏈接:
    pytorch 版fasterrcnn 跑通代碼增加保存xml的功能

    總結

    以上是生活随笔為你收集整理的Faster-RCNN.pytorch的搭建、使用过程详解(适配PyTorch 1.0以上版本)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。