原文地址 http://www.reibang.com/p/2e1dd35c2763#comment-12556518
這篇文章結(jié)構(gòu)比較簡單康栈,但是效果還不錯(cuò)漏麦,主要就三點(diǎn)
- hard negative mining
- long-term 和 short-term 更新
- bb回歸
起作用比較大的是hard negative mining
MDnet--master 源代碼目錄###
- dataset (存放數(shù)據(jù)集的文件夾)
seqList (存放otb或者vot數(shù)據(jù)集的子序列名稱列表) - matconvnet (這個(gè)不用說了例书,是matlab下的CNN框架)
- models (存放已訓(xùn)練模型的文件夾)
- pretraining (實(shí)現(xiàn)模型訓(xùn)練功能模塊的文件夾)
- tracking
- utils
pretraining (訓(xùn)練網(wǎng)絡(luò))
1友多、調(diào)用mdnet_prepare_model,準(zhǔn)備CNN網(wǎng)絡(luò)模型;
2、調(diào)用mdnet_pretrain,完成網(wǎng)絡(luò)的訓(xùn)練和保存)
mdnet_prepare_model (為MDnet準(zhǔn)備初始的卷積網(wǎng)絡(luò)模型:
1闲昭、conv1-3直接采用VGG-M的結(jié)構(gòu)和初始化權(quán)重罐寨,注意新的網(wǎng)絡(luò)結(jié)構(gòu)里filters對(duì)應(yīng)原weight{1},
biases對(duì)應(yīng)weight{2};pad由原來的格式[0,0汤纸,0衩茸,0],變換為0。
2贮泞、添加fc4層和相應(yīng)的relu和dropout層楞慈,fc5層和相應(yīng)的relu和dropout層,fc6層和softmax層,
fc4-6隨機(jī)初始化啃擦,fc6構(gòu)造為K個(gè)分支
注意:fc層的stride為數(shù)字1囊蓝,conv層的stride為數(shù)組[1,1],
為了保證fc層的更新令蛉,還要設(shè)置w和B的倍乘速率和decay)
- mdnet_pretrain (三個(gè)參數(shù):seqslist聚霜、outFile、roiDir
首先設(shè)置各種參數(shù)opts珠叔,
然后通過調(diào)用mdnet_setup_data獲得所有圖像序列的圖像列表以及正負(fù)樣本bb蝎宇,保存為roidb,
初始化mdnet祷安,設(shè)置fc6的1×1×K×2結(jié)構(gòu)姥芥,設(shè)置最后一層為softmax_k
訓(xùn)練mdnet,調(diào)用的函數(shù)為mdnet_train,過程中嵌套調(diào)用了生成minibatch的函數(shù)getBatch;
最后汇鞭,調(diào)用mdnet_finish_train凉唐,將fc6還原為1×1×1×2結(jié)構(gòu),保存網(wǎng)絡(luò)到layers - getBatch(輸入為:1霍骄、roidb某個(gè)子序列所有的圖像路徑台囱,正樣本和負(fù)樣本bb;
2、img_idx為了組成一個(gè)minibatch抽到的8幀圖像標(biāo)號(hào);
3读整、batch_pos-已設(shè)置為32;batch_neg已設(shè)置為96;opts代表各個(gè)參數(shù)結(jié)構(gòu)體
中間變量含義:pos_boxes表示正樣本的組合:8幀圖像簿训,每幀50個(gè)正樣本,一共400個(gè)正樣本
然后從0-400隨機(jī)抽取32個(gè)序號(hào)idx米间,得到長度為32的pos_boxes,
再用pos_idx來標(biāo)記其所在幀處于8幀里的第幾個(gè)煎楣。
同樣的方法得到一個(gè)minibatch里的96個(gè)負(fù)樣本,然后正負(fù)樣本拼接起來;
調(diào)用get_batch函數(shù)生成minibatch
輸出為:128個(gè)im和對(duì)應(yīng)的labels车伞,數(shù)字2代表正,1為負(fù)) - mdnet_train(輸入:net,roidb,getBatch函數(shù)
首先喻喳,網(wǎng)絡(luò)參數(shù)初始化設(shè)定
然后另玖,按照每個(gè)序列8幀一個(gè)batch,一個(gè)序列迭代100次來計(jì)算,打亂序列的圖像次序后組一個(gè)800幀的序列,保存在frame_list里
接著谦去,是訓(xùn)練過程:
外循環(huán)是cycle100慷丽,內(nèi)循環(huán)是子序列總數(shù)K
在內(nèi)循環(huán)里,首先得到每一個(gè)batch里亂序8幀的編號(hào)鳄哭,調(diào)用getBatch生成圖像和label;
然后是backprop要糊,將label送入loss層,調(diào)用mdnet_simplenn妆丘,實(shí)現(xiàn)網(wǎng)絡(luò)的前向反向計(jì)算
注意:mdnet_simplenn中softmax_k是作者自己定義的層锄俄,是為fc6的多域設(shè)計(jì)的
接著是梯度更新
最后是打印訓(xùn)練中的信息 - get_batch(輸入:8張圖像的列表images,正負(fù)樣本bb和對(duì)應(yīng)幀1-8編號(hào)組成的數(shù)組boxes,varargin
輸出:128張107×107×3的圖像組)
tracking###
-
mdnet_run(主代碼-實(shí)現(xiàn)tracking
1勺拣、調(diào)用mdnet_init執(zhí)行初始化
2奶赠、bbox回歸訓(xùn)練
1.調(diào)用gen_samples,生成10000個(gè)回歸樣本
2.調(diào)用overlap_ratio計(jì)算樣本與gt的重疊率
3.選出重疊率大于0.6的樣本药有,隨機(jī)從中選擇1000個(gè)作為正樣本
4.調(diào)用mdnet_features_convX得到正樣本經(jīng)過卷積層處理后的特征圖表示
5.將第4步的結(jié)果進(jìn)行維度變換并拉伸為一行毅戈,輸入到tran_bbox_regressor訓(xùn)練回歸模型
3、提取第一幀圖像的正負(fù)樣本經(jīng)過三層卷積后的特征
4愤惰、調(diào)用mdnet_finetune_hnm選出hard負(fù)樣本苇经,并和正樣本一起微調(diào)net的fc層
5、為在線更新做好數(shù)據(jù)樣本準(zhǔn)備
6宦言、從第二幀開始進(jìn)入主循環(huán)
1.在當(dāng)前幀調(diào)用gen-sample選出256個(gè)candidate樣本扇单,得到卷積后特征;
2.送入fc層,得到fc6二進(jìn)制輸出蜡励,正得分最高的五個(gè)取平均如果大于0令花,則為最佳結(jié)果,否則凉倚,擴(kuò)大搜索范圍
3.bounding box回歸調(diào)整最后結(jié)果
4.做下一幀的數(shù)據(jù)樣本準(zhǔn)備兼都,保存正負(fù)樣本的特征)
- mdnet_finetune_hnm(用hard minibatch來訓(xùn)練CNN:
輸入:要微調(diào)的net部分(fc層),正樣本特征稽寒,負(fù)樣本特征扮碧,其他參數(shù)
注意hard體現(xiàn)在負(fù)樣本的選擇上,從1024個(gè)負(fù)樣本選出得分最高的96個(gè)
輸出:微調(diào)后的net杏糙,以及所有選中的正負(fù)樣本序號(hào) - mdnet_features_convX(提取輸入圖像樣本bbox的卷積特征:
輸入:卷積層慎王、圖像、該圖像樣本box宏侍、參數(shù)opts
調(diào)用mdnet_extract_regions得到樣本圖像赖淤,然后將這些樣本圖像送入網(wǎng)絡(luò)vl_simplenn
輸出:計(jì)算得到其經(jīng)過卷積層處理后的特征圖) - mdnet_extract_regions(從輸入圖像提取bounding box regions并調(diào)用im_crop去均值并resize到107×107:
輸入:圖像、該圖像樣本bbox谅河、參數(shù)opts
輸出:resize后的各樣本圖像) - mdnet_init(初始化tracker:
輸入:圖像序列image咱旱、已訓(xùn)練好的網(wǎng)絡(luò)net
幾乎所有參數(shù)的設(shè)置都在這里确丢,返回卷積層net_conv,全連接層net_fc,學(xué)習(xí)和跟蹤過程中各
參數(shù)的結(jié)構(gòu)體opts) - gen_samples(根據(jù)第一個(gè)輸入?yún)?shù)決定采樣方式,返回采樣得到的矩陣box
gaussian,uniform,uniform_aspect,whole四種類型吐限,針對(duì)采樣的不同需求鲜侥,如樣本正/負(fù)) - utils(一些用來支撐算法實(shí)現(xiàn)的函數(shù))
-parseImage(得到圖像列表imgList)
-genConfig(得到圖像信息conf:
conf.dataset:數(shù)據(jù)集(是otb/vot)
conf.seqName:序列名稱('divng'/'Divid')
conf.imgDir:圖像所在目錄
conf.imgList:圖像列表(../../0001.jpg)
conf.gt:ground truth列表(double類型數(shù)組))
-overlap_ratio(計(jì)算圖像塊的重疊率overlap)
-im_crop(-----這是RCNN里的函數(shù)------
對(duì)輸入圖像按照?qǐng)D像樣本box crop,減去均值(默認(rèn)128),然后按照比例resize到統(tǒng)一大小107
因邊界條件不足比例的補(bǔ)0
輸入中有參數(shù)padding目前只看到其會(huì)影響bbox的尺度,即按照padding擴(kuò)大區(qū)域后再處理) - train_bbox_regressor(-----這是rcnn里的函數(shù)----
輸入:每一個(gè)3×3的特征圖都拉伸為一行诸典,512個(gè)拼接成一行X;采樣的bbox;groundtruth
輸出:一個(gè)結(jié)構(gòu)體包含訓(xùn)練好的model和參數(shù)
SANet基于MDNet描函,代碼有很大的相似性。