Faster-RCNN.pytorch的搭建、使用过程详解(适配PyTorch 1.0以上版本)
Faster-RCNN.pytorch的搭建、使用過程詳解
- 引言
- faster-rcnn pytorch代碼下載
- faster-rcnn pytorch配置過程
- faster-rcnn pytorch訓(xùn)練自定義Images文件和對應(yīng)XML文件的model
- faster-rcnn pytorch參數(shù)修改
引言
本文主要介紹(1)如何跑通源代碼;(2)配置過程中遇到的錯(cuò)誤調(diào)試過程;(3)成功訓(xùn)練自己的數(shù)據(jù)集。
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
配置環(huán)境:
我復(fù)現(xiàn)代碼的環(huán)境是python3.6+cuda10.1+Ubuntu16.04+Pytorch1.2。
強(qiáng)烈推薦使用 pytorch1.0.0版源碼 進(jìn)行配置,舊版本已不再維護(hù),很多報(bào)錯(cuò)難以調(diào)試。
具體配置,此代碼作者已在ReadMe中詳細(xì)介紹,但鑒于初學(xué)者在復(fù)現(xiàn)中遇到的種種問題,下面將對“具體配置過程”做出進(jìn)一步闡釋,旨在做到淺顯易懂,成功復(fù)現(xiàn)。
faster-rcnn pytorch配置過程
1. 安裝torch
請移步至https://pytorch.org/get-started/locally/查看相應(yīng)的安裝命令,安裝最新版的pytorch包。參考執(zhí)行代碼如下:
conda install pytorch==1.0.0 torchvision==0.2.1 cuda100 -c pytorch2. 下載源碼到本地
具體方法有以下兩種:
(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用于循環(huán)遞歸克隆子項(xiàng)目。
(2)直接下載zip文件至本地
強(qiáng)烈推薦第二種,簡單、方便。
3. 創(chuàng)建數(shù)據(jù)文件夾
在本地創(chuàng)建一個(gè)文件夾專門用來搭建Faster-RCNN模型,所有的配置文件均在此目錄下進(jìn)行(如:“/detectron”)。
首先,將源碼的zip文件copy至目標(biāo)目錄/detectron,同時(shí)解壓縮得到如下所示文件夾;
其次,創(chuàng)建data文件夾,具體操作如下:
或者,直接執(zhí)行
# && 表示前一條命令執(zhí)行成功時(shí),才執(zhí)行后一條命令 ,如 echo '1‘ && echo '2' cd faster-rcnn.pytorch && mkdir data # 一步實(shí)現(xiàn)上述2條命令,此處faster-rcnn.pytorch即為存放解壓縮后源碼的文件夾4.下載數(shù)據(jù)至data文件夾
cd 進(jìn)入data文件夾開始下載壓縮文件,執(zhí)行如下命令,下載VOV2007標(biāo)準(zhǔn)數(shù)據(jù)集的相關(guān)數(shù)據(jù)。
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執(zhí)行下方命令解壓縮數(shù)據(jù)到data/VOCdevkit
tar xvf VOCtrainval_06-Nov-2007.tar tar xvf VOCtest_06-Nov-2007.tar tar xvf VOCdevkit_08-Jun-2007.tarcd 進(jìn)入data文件夾下,創(chuàng)建軟鏈接
ln -s VOCdevkit的絕對路徑 VOCdevkit2007完整的VOC2007數(shù)據(jù)集有三個(gè)壓縮包:
- VOCdevkit_08-Jun-2007.tar:開發(fā)工具包
- VOCtest_06-Nov-2007.tar: 測試集,4952張圖片
- VOCtrainval_06-Nov-2007.tar: 訓(xùn)練和驗(yàn)證集,5011張圖片
\quad
其中test和trainval的數(shù)據(jù)集目錄結(jié)構(gòu)一樣,同時(shí)解壓三個(gè)壓縮包,最終會自動解壓到一個(gè)文件夾下VOCdeckit。trainval和test數(shù)據(jù)集是從一個(gè)完整數(shù)據(jù)集劃分來的,所以目錄結(jié)構(gòu)一樣,且不存在沖突的圖片命名。所以, 解壓完成后相當(dāng)于將兩個(gè)子數(shù)據(jù)集合并成一個(gè)完整的大數(shù)據(jù)集 有train,val,trainval,test。
\quad
數(shù)據(jù)集文件結(jié)構(gòu)介紹:
\quad
VOCtrainval_06-Nov-2007文件夾下
VOCdevkit
└─VOC2007
├─Annotations
├─ImageSets
│ ├─Layout
│ ├─Main
│ └─Segmentation
├─JPEGImages
├─SegmentationClass
└─SegmentationObject
\quad
數(shù)據(jù)集文件夾分布情況如下:
VOC 2007數(shù)據(jù)集結(jié)構(gòu)的詳細(xì)介紹: VOC 2007數(shù)據(jù)集結(jié)構(gòu)
- Annotation
Annotations文件夾中存放的是xml格式的標(biāo)簽文件,每一個(gè)xml文件都對應(yīng)于JPEGImages文件夾中的一張圖片。 - ImageSets
ImageSets存放的是每一種類型的challenge對應(yīng)的圖像數(shù)據(jù)。
\quad
核心知識點(diǎn):
\quad
我們進(jìn)行model訓(xùn)練,讀取圖像的時(shí)候,其實(shí)就是先從這個(gè)ImageSets文件夾中,找到對應(yīng)任務(wù)的子文件夾,然后讀取其中txt文本文檔的圖像ID號碼, 接著按照這個(gè)ID號碼去JPEGImages文件夾下尋找對應(yīng)的圖像。
\quad
ImageSets下的四個(gè)文件夾,如下:
當(dāng)我們在faster-rcnn中運(yùn)行訓(xùn)練和測試程序時(shí),會在完整的大數(shù)據(jù)集中自動調(diào)用相對應(yīng)的數(shù)據(jù)集。
(1) Action下存放的是人的動作(running、jumping等等,這也是VOC challenge的一部分)
(2) Layout下存放的是人體部位(head、hand、feet等等,這也是VOC challenge的一部分)
(3) Main下存放的是圖像物體識別的數(shù)據(jù),總共分為20類。
備注:
- train.txt 是用來訓(xùn)練的圖片文件的文件名列表 (訓(xùn)練集)
- val.txt是用來驗(yàn)證的圖片文件的文件名列表 (驗(yàn)證集)
- trianval.txt是用來訓(xùn)練和驗(yàn)證的圖片文件的文件名列表, 修改自己的圖片檢測模型時(shí),僅需要修改該文件,即:將新的訓(xùn)練圖像name list 去掉后綴,更新入trianval.txt文件。
- test.txt 是用來測試的圖片文件的文件名列表 (測試集)
\quad
train是網(wǎng)絡(luò)模型在訓(xùn)練的時(shí)候用的,而val是網(wǎng)絡(luò)模型在訓(xùn)練過程中測試用的。val是不影響訓(xùn)練的。在訓(xùn)練的時(shí)候可以得到train和val這兩個(gè)數(shù)據(jù)集的誤差率,利用這個(gè)誤差率可以繪制出學(xué)習(xí)曲線,通過觀察學(xué)習(xí)曲線,可以發(fā)現(xiàn)一些網(wǎng)絡(luò)模型的問題,然后再根據(jù)這些問題去調(diào)整網(wǎng)絡(luò)參數(shù)。test就是網(wǎng)絡(luò)模型訓(xùn)練完畢測試用的。
\quad
Main文件夾下還包含了20個(gè)分類的***_train.txt、***_val.txt和***_trainval.txt。這些txt中的內(nèi)容都差不多如下:
前面的表示圖像的name,后面的1代表正樣本(即:表示當(dāng)前圖像中有該類物體),-1代表負(fù)樣本(即:表示當(dāng)前圖像中,沒有該類物體),偶爾也會出現(xiàn)0(即:0 表示當(dāng)前圖像中,該類物體只露出了一部分)。
_train中存放的是訓(xùn)練使用的數(shù)據(jù),每一個(gè)class的train數(shù)據(jù)都有5717個(gè);
_val中存放的是驗(yàn)證結(jié)果使用的數(shù)據(jù),每一個(gè)class的val數(shù)據(jù)都有5832個(gè);
_trainval將上面兩個(gè)進(jìn)行了合并,每一個(gè)class有11540個(gè);
需要保證的是train和val兩者沒有交集,也就是訓(xùn)練數(shù)據(jù)和驗(yàn)證數(shù)據(jù)不能有重復(fù),在選取訓(xùn)練數(shù)據(jù)的時(shí)候,也應(yīng)該是隨機(jī)產(chǎn)生的。
\quad
(4) Segmentation下存放的是可用于分割的圖片的編號。
*_train中存放的是訓(xùn)練集的圖片編號。
*_val中存放的是驗(yàn)證集的圖片編號。
*_trainval是上面兩者的合并集合。
train和val包含的圖片沒有交集。
- JPEGImages
JPEGImages文件夾中包含了PASCAL VOC所提供的所有的圖片,包含訓(xùn)練圖片和測試圖片,共有17125張。圖片均以“年份_編號.jpg”格式命名。圖片的尺寸大小不一,所以在后面訓(xùn)練的時(shí)候需要對圖片進(jìn)行resize操作。
圖片的像素尺寸大小不一,但是橫向圖的尺寸大約在500ㄨ375左右,縱向圖的尺寸大約在375ㄨ500左右,基本不會偏差超過100。(在之后的訓(xùn)練中,第一步就是將這些圖片都resize到300ㄨ300或是500ㄨ500,所有原始圖片不能離這個(gè)標(biāo)準(zhǔn)過遠(yuǎn)。) - SegmentationClass
這里面包含了2913張圖片,每一張圖片都對應(yīng)JPEGImages里面的相應(yīng)編號的圖片。
圖片的像素顏色共有20種,對應(yīng)20類物體。
- SegmentationObject
這里面同樣包含了2913張圖片,圖片編號都與Class里面的圖片編號相同。
這里面的圖片和Class里面圖片的區(qū)別在于,這是針對Object的。
在Class里面,一張圖片里如果有多架飛機(jī),那么會全部標(biāo)注為紅色。
而在Object里面,同一張圖片里面的飛機(jī)會被不同顏色標(biāo)注出來。
\quad
參考鏈接:
關(guān)于VOC2007數(shù)據(jù)集的更多詳細(xì)介紹,詳見
數(shù)據(jù)集:Pascal voc2007數(shù)據(jù)集分析
VOC數(shù)據(jù)集介紹-VOCtrainval_06-Nov-2007文件結(jié)構(gòu)和下載
VOC數(shù)據(jù)集解析 VOC2007解析
5.下載預(yù)訓(xùn)練模型
首先,在/data/下創(chuàng)建子文件夾/data/pretrained_model;然后,下載預(yù)訓(xùn)練模型到/data/pretrained_model下,如VGG16,ResNet101等。
VGG16: Dropbox, VT Server
ResNet101: Dropbox, VT Server
備注: Dropbox, VT Server是兩個(gè)云存儲公司開放的下載數(shù)據(jù)源,建議使用Dropbox的數(shù)據(jù)源進(jìn)行下載。下載結(jié)束后,將這兩個(gè)模型都放進(jìn)/data/pretrained_model/文件夾中。
6.編譯
- 使用pip安裝所有python依賴包
安裝python依賴包遇到錯(cuò)誤:
ERROR: Could not open requirements file: [Errno 2] No such file or directory: 'requirements.txt',說明找不到’requirements.txt’文件,查找發(fā)現(xiàn)在data/的上一級,即:/work/elta/detectron/faster-rcnn.pytorch-pytorch-1.0文件夾下。在此處再執(zhí)行pip install -r requirements.txt即可。
error: [Errno 13] Permission denied: '/usr/local/lib/處理方法 ,處理方法:在命令前面加sudo命令。
備注:
在ubuntu系統(tǒng)下使用pip 命令安裝包時(shí),出現(xiàn)以下類似錯(cuò)誤提示:
error: [Errno 13] Permission denied: '/usr/local/lib/python2.7/dist-packages/
那么,要用root權(quán)限,可以用sudo表示用root權(quán)限執(zhí)行,所以,在命令前面加sudo。
- 編譯CUDA依賴環(huán)境
這里為pytroch1.0分支下的編譯設(shè)置,編輯所需的cuda環(huán)境后,回到主目錄。
cd lib python setup.py build develop # 不要使用sh make.sh編譯時(shí)遇到過兩個(gè)報(bào)錯(cuò),
- error: invalid command 'develop';
- ImportError: cannot import name '_mask'
- can’t import ‘imread’
- Tips:要注意如果出現(xiàn)can’t import ‘imread’,請檢查scipy的版本是否超過了1.0,因?yàn)?.0以上的版本里,scipy不再使用imread。
之前嘗試通過pytorch0.4.0分支ReadMe配置好pytorch環(huán)境后,運(yùn)行訓(xùn)練時(shí)出現(xiàn)錯(cuò)誤ImportError: torch.utils.ffi is deprecated. Please use cpp extensions instead.,解決方法參考鏈接【已解決】ImportError: torch.utils.ffi is deprecated. Please use cpp extensions instead.。
但限于版本更新和pytorch放棄對之前版本部分語法的支持,此問題是短時(shí)間內(nèi)難以解決的死胡同,遂建議大家直接放棄0.4.0版本轉(zhuǎn)入1.0.0版本。
7.訓(xùn)練
在訓(xùn)練之前需要根據(jù)自己的環(huán)境將trainval_net.py和test_net.py中的兩個(gè)參數(shù)save_dir和load_dir進(jìn)行更改。
(1)如果使用VGG16在pascal_voc上訓(xùn)練faster R-CNN使用如下命令(具體參數(shù)根據(jù)自己的需要修改):
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) 訓(xùn)練命令行示例——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 參數(shù)說明:
\quad
- CUDA_VISIBLE_DEVICES:指gpu的id,這得看你實(shí)驗(yàn)室服務(wù)器哪塊gpu是閑置的。
- –dataset:指訓(xùn)練數(shù)據(jù)集名稱,此處以pascal-voc為例。
- –net:你要使用的預(yù)訓(xùn)練模型,可以換為resnet101。
- –bs:指的batch size。
–epoch:指要訓(xùn)練的輪數(shù)。 - –nw:指的是worker number,取決于你的Gpu能力,我用的是Titan Xp
12G,所以選擇4。稍微差一些的gpu可以選小一點(diǎn)的值。 - –lr:指學(xué)習(xí)率
- –cuda:指的是使用gpu。
\quad
BATCH_SIZE 和 WORKER_NUMBER 可以根據(jù)你的GPU情況來設(shè)置。
\quad
訓(xùn)好的model會存到models文件夾底下,此處暫時(shí)使用默認(rèn)的訓(xùn)練參數(shù)。
8.測試
如果想評估VGG16預(yù)訓(xùn)練模型在pascal_voc測試集上的表現(xiàn),使用如下命令:
python test_net.py --dataset pascal_voc --net vgg16 \--checksession $SESSION --checkepoch $EPOCH --checkpoint $CHECKPOINT \--cuda要指定具體的checksession、checkepoch、checkpoint數(shù)值。如果你不知該如何設(shè)置,可以根據(jù)你訓(xùn)練出來的模型名字來設(shè)置。
設(shè)置示例:
注意,這里的三個(gè)check參數(shù),是定義了訓(xùn)好的檢測模型名稱,我訓(xùn)好的名稱為faster_rcnn_1_20_10021,代表了checksession = 1,checkepoch = 20, checkpoint = 10021,這樣才可以讀到模型“faster_rcnn_1_20_10021”。訓(xùn)練中,源碼代碼默認(rèn)設(shè)置的epoch為20,所以checkepoch選擇20,也就是選擇最后那輪訓(xùn)好的模型,理論上應(yīng)該是效果最好的。下圖就是我20次epochs的模型。
9.運(yùn)行demo.py
如果你想要運(yùn)行預(yù)訓(xùn)練模型去檢測新的test圖片,要先下載預(yù)訓(xùn)練模型或者訓(xùn)練你自己模型,然后把圖片放到工作目錄下(示例路徑:/usr/detectron/faster-rcnn.pytorch-pytorch-1.0/images/)的images文件夾里,再運(yùn)行如下命令:
python demo.py --net vgg16 \--checksession $SESSION --checkepoch $EPOCH --checkpoint $CHECKPOINT \--cuda --load_dir + 模型存放文件夾除了指定那三個(gè)數(shù)值外,還要寫清楚存放vgg16/pascal_voc/模型.pth的文件夾。例如:
demo命令行示例:
此處我們需輸入使用的網(wǎng)絡(luò)(如:res101),以及訓(xùn)練好的模型路徑(models)。我們測試的圖片都在images文件夾里。
\quad
作者提供了4張image做測試,默認(rèn)測試完的圖像會輸出到images文件夾里,所以做完一次測試,images文件夾會有8張圖片(輸出圖片命名規(guī)則是在原圖像文件名后面加上"_det"),而原作者沒有把他自己測試后的圖片刪去,所以大家在做demo測試時(shí),別忘把以"_det"結(jié)尾的檢測輸出文件先刪去,否則,測試完你的images文件夾可能會得到16張圖像。 后續(xù)在參數(shù)修改部分,會詳細(xì)介紹如何修改打框后圖像的存放路徑、包括保存生成的XML文件用于后續(xù)修改標(biāo)注等:
當(dāng)然,你可以放一些你自己在網(wǎng)上搜的圖片在images文件夾里進(jìn)行demo測試,看看效果。但檢測類別一定在訓(xùn)練的類別中,否則,目標(biāo)檢測的結(jié)果就是隨機(jī)標(biāo)注了,意義不大~
faster-rcnn pytorch訓(xùn)練自定義Images文件和對應(yīng)XML文件的model
我們?nèi)匀徊捎肰OC2007數(shù)據(jù)集的結(jié)構(gòu)分布框架,只是把我們自己的數(shù)據(jù)集“塞進(jìn)去”,做適當(dāng)調(diào)整即可。
1、VOC數(shù)據(jù)集制作:
將自己準(zhǔn)備的images文件和對應(yīng)的目標(biāo)檢測XML文件,做成VOC2007格式標(biāo)準(zhǔn)數(shù)據(jù)集,用于Faster-RCNN模型訓(xùn)練。
VOC2007格式要求: 圖片名是六位數(shù)字,對應(yīng)XML文件名也是六位數(shù)字。 數(shù)據(jù)集準(zhǔn)備好之后,用數(shù)據(jù)集相應(yīng)的替換掉VOC2007中的數(shù)據(jù)。具體位置如下:
一、JPEGImages文件夾:
將自己的數(shù)據(jù)集中所有的圖片存放的這一文件夾下,圖片數(shù)據(jù)的格式需要統(tǒng)一。
二、Annotations文件夾:
將自己數(shù)據(jù)集所有圖片一一對應(yīng)的xml格式的標(biāo)簽文件放于這一文件夾下。
三、ImageSets文件夾:
完成ImageSets\Main中trainval.txt文件的修改。
trainval.txt是訓(xùn)練和驗(yàn)證集,內(nèi)容為文件名(去除".jpg"后綴),該文件中的圖像list將全部用于目標(biāo)檢測的model訓(xùn)練,即:默認(rèn)不劃分train和val的比例。 一般默認(rèn)操作就OK了。
\quad
備注:
如果想實(shí)現(xiàn)劃分輸入圖像的train、val、test比例,需要同時(shí)修改ImageSets\Main文件夾下4個(gè)文件(test.txt、train.txt、trainval.txt、val.txt)。
一般而言:在原始VOC2007數(shù)據(jù)集中,trainval大約占整個(gè)數(shù)據(jù)集的50%,test大約為整個(gè)數(shù)據(jù)集的50%;train大約是trainval的50%,val大約為trainval的50%。所以我們可參考以下代碼來生成這4個(gè)txt文件。參考鏈接:faster-rcnn.pytorch-1.0指南(三)——制作PASCAL VOC2007數(shù)據(jù)集
生成這4個(gè)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數(shù)據(jù)集的類別在路徑"/faster-rcnn.pytorch/lib/datasets/pascal_voc.py"文件中已注明,示例如下:
原始標(biāo)注類別為:
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')這個(gè)文件里存著VOC數(shù)據(jù)庫的classes,即:需要更改我們識別的類別,我的做法是把原classes注釋掉,把自己的classes加進(jìn)去。
此處修改如下:
可能發(fā)生如下錯(cuò)誤:
- assert(boxes[:,2]>=boxes[:,0]).all()
基本上都會碰上,只要是你標(biāo)注的框靠近邊緣,都會出這個(gè)錯(cuò)誤。表示:左上角坐標(biāo)(x,y)可能為0,或標(biāo)定區(qū)域溢出圖片,而faster rcnn會對Xmin,Ymin,Xmax,Ymax進(jìn)行減一操作,如果Xmin為0,減一后變?yōu)樨?fù)值。但是,不用急,按照下面方法改,完美解決:https://blog.csdn.net/xzzppp/article/details/52036794 - Keyerror:'width'
該句指的是得到的圖像數(shù)據(jù)庫imdb文件沒有‘width’,也就是沒有讀到圖像的寬度值,而這個(gè)寬度值是通過圖片讀出來的,所以說明你的訓(xùn)練文件夾JPEGImage中沒有ImagesSet\Main\trainval.txt里列出的圖片,我查了下,圖片都放進(jìn)去了,那為啥還出錯(cuò)呢?
原因:在訓(xùn)練原數(shù)據(jù)集VOC時(shí),圖像數(shù)量是10021張(進(jìn)行了數(shù)據(jù)增強(qiáng)),這時(shí)會保存訓(xùn)練信息至緩存中,文件路徑為:/home/zhangxin/faster-rcnn.pytorch/data/cache/voc_2007_trainval_gt_roidb.pkl
因此,=你在重新訓(xùn)練新數(shù)據(jù)集的時(shí)候,會讀取這個(gè)緩存配置,以加快訓(xùn)練,那么,在更換訓(xùn)練數(shù)據(jù)集之后,就會報(bào)錯(cuò)了。我的新集合只有499張,所以訓(xùn)練時(shí),由于讀取緩存文件,故需要讀的圖像還是原來那10021張,那勢必會找不到這10021張圖像。
解決方法:把這個(gè)緩存文件voc_2007_trainval_gt_roidb.pkl刪掉!!!( 每次更新訓(xùn)練數(shù)據(jù)集都需要執(zhí)行此操作)
3、開始訓(xùn)練自己的數(shù)據(jù)集:
參考鏈接:
Faster RCNN(Pytorch) 配置過程記錄及問題解決
使用faster-rcnn.pytorch訓(xùn)練自己數(shù)據(jù)集(完整版)
Faster-RCNN.Pytorch的使用
Pytorch版Faster R-CNN訓(xùn)練自己數(shù)據(jù)集
目標(biāo)檢測——Faster R-CNN 詳解、Pytorch搭建、訓(xùn)練自己的數(shù)據(jù)集
faster-rcnn pytorch參數(shù)修改
基本參數(shù):
- base_lr:0.001
- lr_policy:‘step’
- step_size:30000
- display:20
- iteration: 數(shù)據(jù)進(jìn)行一次前向-后向的訓(xùn)練
- batchsize: 每次迭代訓(xùn)練的圖片數(shù)量
- epoch: 1個(gè)epoch就是將所有的訓(xùn)練圖像全部通過網(wǎng)絡(luò)訓(xùn)練一次
參數(shù)設(shè)置和計(jì)算:
\quad
(1)batchsize、epoch和iteration的關(guān)系計(jì)算:
例如:假如有1280000張圖片,batchsize=256,則1個(gè)epoch需要1280000/256=5000次,若iteration 它的max-iteration=450000,則共有450000/5000=90個(gè)epoch;
(2)lr、stepsize和gamma的關(guān)系計(jì)算:
由于lr什么時(shí)候衰減與stepsize有關(guān),減少多少與gamma有關(guān),即:若stepsize=500, base_lr=0.01, gamma=0.1,則當(dāng)?shù)降谝粋€(gè)500次時(shí),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,以后重復(fù)該過程,所以, stepsize是lr的衰減步長,gamma是lr的衰減系數(shù)。
(3)test_size, test_iter和test_interval的關(guān)系計(jì)算:
在訓(xùn)練過程中,每到一定的迭代次數(shù)都會測試,迭代次數(shù)是由test-interval決定的,如test_interval=1000,則訓(xùn)練集每迭代1000次測試一遍網(wǎng)絡(luò),而 test_size, test_iter, 和test圖片的數(shù)量決定了怎樣test, test-size決定了test時(shí)每次迭代輸入圖片的數(shù)量,test_iter就是test所有的圖片的迭代次數(shù),如:500張test圖片,test_iter=100,則test_size=5, 而solver文檔里只需要根據(jù)test圖片總數(shù)量來設(shè)置test_iter,以及根據(jù)需要設(shè)置test_interval即可。
迭代次數(shù)修改max_iters=[80000, 40000, 80000, 40000]
分別對應(yīng)rpn第1階段,fast rcnn第1階段,rpn第2階段,fast rcnn第2階段的迭代次數(shù)。
pytorch faster R-CNN源碼測試、訓(xùn)練自己的數(shù)據(jù)集
修改數(shù)據(jù)讀取路徑:
數(shù)據(jù)讀取路徑可以直接賦值,在lib/datasets/pascal_voc.py中,把self._data_path修改為自己的數(shù)據(jù)路徑,下面就是自己的數(shù)據(jù)classes類別。
train過程中修改訓(xùn)練模型保存路徑:
在trainval_net.py中修改模型保存的路徑,對應(yīng)參數(shù)'--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過程中修改訓(xùn)練模型讀入路徑:
在demo.py中修改讀入模型的路徑,對應(yīng)參數(shù)'--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/")修改圖像打標(biāo)后test數(shù)據(jù)保存路徑:
在demo.py中修改保存圖片的路徑,把推斷過后的圖片另存一個(gè)文件夾中,
具體方法為:在parse_args中新增一個(gè)參數(shù)output_images,用于存放新生成的預(yù)測后畫框的圖片,同時(shí)修改圖像保存代碼,如下:
添加保存圖片xml文件的路徑和生成對應(yīng)xml文件:
在demo.py中修改代碼,用于生成并保存預(yù)測后的圖片xml文件(減少后期標(biāo)注量)具體修改參考如下:
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 判斷預(yù)測出來的類別中是否有框cls_scores = scores[:,j][inds] ### stt預(yù)測出來的所有得分_, 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 預(yù)測出來的所有框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預(yù)測出來的框nmscls_dets = cls_dets[keep.view(-1).long()]### stt addarr_2 =[]np.set_printoptions(suppress=True) ###不以科學(xué)計(jì)數(shù)法保存arr_cls_det = cls_dets.cpu().numpy() ###張量轉(zhuǎn)數(shù)組arr_cls_det.astype(float) ###列表數(shù)據(jù)轉(zhuǎn)為float格式for i in arr_cls_det:arr_2.append(pascal_classes[j]) ###類別加入新的數(shù)組中arr_2 += map(int, i.tolist()[:4]) ###預(yù)測出來的框(四個(gè)坐標(biāo)點(diǎn))加入數(shù)組中pred_det.append(arr_2) ###類比,框保存為一個(gè)列表,每張圖片可能有多個(gè)預(yù)測框#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的功能
總結(jié)
以上是生活随笔為你收集整理的Faster-RCNN.pytorch的搭建、使用过程详解(适配PyTorch 1.0以上版本)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GISer与魔方
- 下一篇: 计算机微课论文参考文献,关于计算机论文范