MDNet(轉(zhuǎn))

原文地址 http://www.itdecent.cn/p/2e1dd35c2763#comment-12556518

這篇文章結(jié)構(gòu)比較簡單,但是效果還不錯(cuò),主要就三點(diǎn)

  1. hard negative mining
  2. long-term 和 short-term 更新
  3. 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對應(yīng)原weight{1},
biases對應(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)號;
    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è)序號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和對應(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幀的編號,調(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和對應(yīng)幀1-8編號組成的數(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ù)樣本序號
  • 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四種類型,針對采樣的不同需求,如樣本正/負(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ù)------
    對輸入圖像按照圖像樣本box crop,減去均值(默認(rèn)128),然后按照比例resize到統(tǒng)一大小107
    因邊界條件不足比例的補(bǔ)0
    輸入中有參數(shù)padding目前只看到其會影響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,代碼有很大的相似性。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容