簡歷上寫了這一項,鑑於時間隔的過久,每次面試的時候問到這個問題的時候,都是一臉矇蔽啊。。css
還有一篇關於AP解釋的blog:http://blog.csdn.net/a1154761720/article/details/50864994html
"git
若是作VOC competition必定會用到一個評價指標(evaluation measure)叫作ap(average precision);事實上在VOC中都提供了計算ap的方式,在VOC12中,代碼在\VOCdevkit\VOCcode目錄下的VOCevaluation.m和VOCap.m兩個文件中。代碼以下:github
[so,si]=sort(-out);%out is the result from your classifier tp=gt(si)>0; fp=gt(si)<0; fp=cumsum(fp);%判爲負樣本的數 tp=cumsum(tp);%判爲正樣本的數 rec=tp/sum(gt>0);%召回率 prec=tp./(fp+tp);%精確度 ap=VOCap(rec,prec); function ap = VOCap(rec,prec) mrec=[0 ; rec ; 1]; mpre=[0 ; prec ; 0]; for i=numel(mpre)-1:-1:1 mpre(i)=max(mpre(i),mpre(i+1)); end i=find(mrec(2:end)~=mrec(1:end-1))+1;%去掉mrec中重複的部分,+1是保持下標的一致 ap=sum((mrec(i)-mrec(i-1)).*mpre(i));%area=(x(2)-x(1))*y
若是隻須要ap的結果,上面的代碼就夠了,須要注意的一點是2010以前和以後ap的計算方式是不一樣的。具體而言,ap計算至關於計算precision/recall曲線下方的面積,也就是平均精度。在VOC07計算ap時,取rec上的11個位置[0:0.1:0.1:1],而後獲得近似的ap;12以後取全部rec上的不一樣座標值,計算ap,因爲兩個precision對於recall是分段線性的,故能夠獲得精確的ap值。
下面從基本概念分析ap的值所表明的含義以及上面的代碼。
以正負樣本分類爲例,分類的樣本根據分類結果有四類:true positive(被正確分類的正例)false negative(原本是正例,錯分爲負例) true negative(被正確分類的負例)false positive(原本是負例,被錯分爲整理)。
如上所說的,計算ap用到了兩個指標:precision和recall;
precision:衡量一個結果的準確度,也稱爲PPV(positive predictive value);
recall:衡量一個結果的完整性,也被稱爲true positive rate或sensitivity。
wiki中有個圖很是形象的表示出了這幾個基本概念: 面試
"算法
一、HOG特徵chrome
DPM模型用到的就是HOG特徵,HOG特徵,簡單說就是,求梯度直方圖(cell裏面的梯度,而後block裏面cell梯度直方圖串聯起來,掃描整個圖像串聯起來)api
網上描述:數組
「網絡
把樣本圖像分割爲若干個像素的單元(cell),把梯度方向平均劃分爲9個區間(bin),在每一個單元裏面對全部像素的梯度方向在各個方向區間進行直方圖統計,獲得一個9維的特徵向量,每相鄰的4個單元構成一個塊(block),把一個塊內的特徵向量聯起來獲得36維的特徵向量,用塊對樣本圖像進行掃描,掃描步長爲一個單元。最後將全部塊的特徵串聯起來,就獲得了人體的特徵。例如,對於64*128的圖像而言,每16*16的像素組成一個cell,每2*2個cell組成一個塊,由於每一個cell有9個特徵,因此每一個塊內有4*9=36個特徵,以8個像素爲步長,那麼,水平方向將有7個掃描窗口,垂直方向將有15個掃描窗口。也就是說,64*128的圖片,總共有36*7*15=3780個特徵。
」
HOG特徵的有點:HOG獲得的描述子保持了幾何和光學轉化不變性(除非物體方向改變)。所以HOG描述子尤爲適合人的檢測。
二、sift特徵
SIFT算法是一種提取局部特徵的算法,在尺度空間尋找極值點,提取位置,尺度,旋轉不變量
4*4*8=128維的特徵
每45度1個bin,因此每一個極值點處有8個bin
sift特徵的優勢:SIFT特徵不僅具備尺度不變性,即便改變旋轉角度,圖像亮度或拍攝視角,仍然可以獲得好的檢測效果。
三、檢測的評估指標
precise-recall曲線
非極大值抑制NMS找到一個最好的檢測窗口
libsvm採用one-vs-one的方法
來源於網上:
「
目標檢測須要同時實現目標定位和目標識別兩項任務。其中,經過比較預測邊框和ground truth邊框的重疊程度和閾值的大小斷定目標定位的正確性;經過置信度分數和閾值的比較肯定目標識別的正確性。以上兩步綜合斷定目標檢測是否正確,最終將目標檢測轉換爲「檢測正確、檢測錯誤」的分類問題,從而能夠構造混淆矩陣,使用目標分類的指標評估模型精度。
**重點內容**PASCAL Visual Object Classes Challenge2007 (VOC2007) [Everingham]數據集使用P-R曲線進行定性分析,使用average precision(AP)定量分析模型精度。重複檢測同一目標只算一次正確,其他判爲錯誤。
重點內容對於大規模數據集ImageNet[Olga Russakovsky*],爲每個類別的檢測結果計算精確率(Precision)、召回率(Recall)。對於每一個目標類別的最終評測指標是平均精度(AP),即P-R曲線的積分值。單目標類別檢測AP最高者獲勝,檢測目標類別獲勝數目最多的團隊贏得目標檢測的挑戰。
」
用P-R曲線的積分map去衡量最後的結果。
神經網絡:AlexNet
前5層神經卷積層,後3層全鏈接層
imagenet 100萬張圖片訓練的神經網路結構差很少
而後用ILSVRC2012的數據輸入,finetune,輸出是1000個類別的標號
MODLE:
bvlc_reference_rcnn_ilsvrc13.model
卷積神經網絡:
去均值:把輸入數據各個維度都中心化到0(減去訓練集合上面的RGB均值,測試集也是減去訓練集上面的均值,爲了梯度回傳
mAP結果:
桌子 0.26
椅子 0.17
沙發 0.29
牀 0.29
吃飯的桌子 0.26
目標分類檢測教程
這是牛津大學視覺組的計算機視覺實驗教程,版權歸 Andrea Vedaldi and Andrew Zisserman 全部。(Release 2014a).
目標分類檢測的任務是發現和定位給定圖片中的物體。 示例應用包括行人檢測、車輛檢測、交通訊號檢測以及網絡圖像上感興趣的工具或者動物等。給定目標類別,好比說人,檢測器接收圖像而且產生一個、0個或者多個目標在圖像中的包圍框。主要的挑戰在於檢測器須要找到物體無論他們是否有平移或者尺度的縮放以及姿態的變化還有其餘因素的影響,好比服裝、光照或者着遮擋等。
這個教程探索了視覺目標檢測的基本技術,特別是基於圖像的模型。目標圖的表觀片經過統計方法學習獲得。而後,爲了檢測圖片中的物體,這個統計模型被用到從圖片提取的全部可能的位置和尺度上,而後決定是否有一個窗口包含目標物體。
更細一點的說,這個教程包含如下幾個話題:(i) 使用HOG特徵描述圖片區域, (ii) 構造一個基於HOG特徵的滑窗家車企來定位圖片中的物體; (iii) 處理多尺度和多目標的狀況; (iv) 使用線性分類器學習目標的表觀; (v) 使用平均準確率評估學習到的模型; (vi) 使用難例挖掘學習目標檢測器.
Object category detection practical Getting started Part 1: Detection fundamentals Step 1.0: Loading the training data Step 1.1: Visualize the training images Step 1.2: Extract HOG features from the training images Step 1.3: Learn a simple HOG template model Step 1.4: Apply the model to a test image Step 1.5: Extract the top detection Part 2: Multiple scales and learning with an SVM Step 2.1: Multi-scale detection Step 2.2: Collect positive and negative training data Step 2.3: Learn a model with an SVM Step 2.4: Evaluate the learned model Part 3: Multiple objects and evaluation Step 3.1: Multiple detections Step 3.2: Detector evaluation Step 3.3: Evaluation on multiple images Part 4: Hard negative mining Step 4.1: Train with hard negative mining Step 4.2: Evaluate the model on the test data Part 5: Train your own object detector Step 5.1: Preparing the training data Step 5.2: Learn the model Step 5.3: Test the model Step 5.4: Detecting symmetric objects with multiple aspects History 開始
閱讀並理解requirements and installation instructions. 下載連接是:
Code and data: practical-category-detection-2014a.tar.gz Code only: practical-category-detection-2014a-code-only.tar.gzData only: practical-category-detection-2014a-data-only.tar.gz Git repository (for lab setters and developers)
在安裝完成後,在matlab編輯器中打開並編輯腳本exercise1.m. 這個腳本包含了這個實驗的有註釋的代碼和和第一部分相關的每一步的描述.你能夠剪切和黏貼這些代碼到matlab的窗口而後運行它而且隨着實驗的進行,你可能須要修改它。其餘的好比exercise2.m, exercise3.m, and exercise4.m 是第 II, III, and IV對應的腳本.
每一個部分包含了在更進一步實驗所需的幾個問題和任務來回答和完成。
Part 1: 檢測入門
Part I–IV 使用了來自German Traffic Sign Detection Benchmark. 的街道信號燈檢測數據。這個數據包含了幾個交通圖片以及更多的測試圖片,包含了一個或多個在不一樣位置和尺度的交通訊號圖片. 它還包含真值的標註,也就是說每一個信號燈的包圍框以及信號標註,這用來評估檢測器的質量。
在這部分咱們構建一個基於HOG特徵的滑窗目標檢測器。按接下來的步驟執行:
Step 1.0: 加載訓練數據
MATLAB腳本loadData.m 把數據加載到內存. loadData(targetClass)函數須要一個感興趣的目標類別targetClass做爲輸入.打開example1.m文件, 選中下面的代碼, 而且在MATLAB中執行 (right button > Evaluate selection or Shift+F7).
% Load the training and testing data (trainImages, trainBoxes, ...) % The functio takes the ID of the type of traffic sign we want to recognize % 1 is the 30 km/h speed limit loadData(1) ;
這會把下列變量加載到當前的工做空間:
trainImages: 訓練圖片的名稱列表. trainBoxes: 一個 4×N 表明包圍框的數組,格式爲[xmin,ymin,xmax,ymax]. trainBoxImages: 每一個包圍框對應的圖片名. trainBoxLabels: 每一個包圍框對應的標註.它是目標類別targetClass的索引. trainBoxPatches: 一個64×64×3×N大小表明圖像片的數組, 每一個包含一個目標.片是RGB格式的. 相似的變量名 testImages, testBoxes等式測試數據的. 使你本身熟悉這些變量.
問題: 爲何要有一個 trainImages和一個trainBoxImages變量? 一個是負樣本的,一個是正樣本的。
Step 1.1:可視化訓練樣本
選擇和 1.1 節有關的樣本而且執行它. 這會構造一個訓練樣本以它們均值的圖片.
問題:你能從均值圖片中看出點什麼東西來嗎? 問題: 大多數包圍框都會比目標略大一點。你認爲這在學習分類器時有什麼價值嗎? 包含了一部分的環境信息
Step 1.2:從訓練圖片提取HOG特徵
檢測器一般使用更高一些層次的特徵而不是原始的像素工做.在這裏,咱們使用HOG(灰度梯度直方圖). 爲了學習目標的模型,咱們首先從已有的訓練樣本中提取它們的特徵。這是經過如下的循環完成的:
hogCellSize = 8 ;
trainHog = {} ;
for i = 1:size(trainBoxPatches,4) trainHog{i} = vl_hog(trainBoxPatches(:,:,:,i), hogCellSize) ; end trainHog = cat(4, trainHog{:}) ;
HOG 是經過 VLFeat的 vl_hog (doc)函數計算的. 這個函數須要HOG元胞的大小做爲輸入. 它還須要一張RGB格式的圖片,在matlab中是一個w×h×3的數組從trainBoxPatches切片而來). 輸出是一個w/hogCellSize×h/hogCellSize×31 維的數組. 每張訓練樣本圖片都會提取一個HO特徵,最後造成了一個4D的數組。
Step 1.3: 學習一個簡單的HOG魔板模型
一個很是基本的模型能夠經過簡單的平均訓練樣本的特徵獲得。能夠這麼作:
w = mean(trainHog, 4) ;
因爲模型是一個HOG特徵的數組,能夠經過vl_hog可視化:
figure(2) ; clf ; imagesc(vl_hog('render', w)) ;
問題: 你能解釋結果圖嗎? Step 1.4: 把模型用到測試圖片上
模型經過如下步驟匹配測試圖片: (i)提取測試圖片的HOG特徵and (ii) 模型和特徵卷積獲得結果:
im = imread('data/signs-sample-image.jpg') ; im = im2single(im) ; hog = vl_hog(im, hogCellSize) ; scores = vl_nnconv(hog, w, []) ;
前兩行讀取一張測試圖片,而且轉換爲單精度格式. 第三行使用vl_hog計算測試圖片的HOG特徵. 第四行把模型和HOG圖進行卷積. 它使用了vl_nnconv1函數,而且返回結果圖.
任務: 計算結果的維數. 而後檢查和matlab給出的是否一致.
問題: 可視化圖片而且使用代碼獲取結果,結果圖是否如你所預期的那樣?
Step 1.5: 提取好的檢測
如今模型已經應用到圖片上來,而且咱們獲得告終果圖. 爲了從這裏獲得檢測的結果,咱們(i) 找到最大的響應and (ii) 計算最大最大響應包圍框的位置. 最大值是經過找到的:
[best, bestIndex] = max(scores(:)) ;
注意bestIndex是[1,M]間的線性索引,M是全部濾波器的位置.咱們把它轉換成二維索引 (hx,hy)使用matlab的ind2sub 函數:
[hy, hx] = ind2sub(size(scores), bestIndex) ;
(hx,hy) 是HOG單元的位置. 咱們還須要把它轉換爲對應的座標:
x = (hx - 1) * hogCellSize + 1 ; y = (hy - 1) * hogCellSize + 1 ;
問題: 爲何須要-1和+1? 找到的是HOG cell (hx,hy)單元的哪一個像素 (x,y)? HOG胞元的大小有好幾種計算方式,一個簡單的方法是:
modelWidth = size(trainHog, 2) ; modelHeight = size(trainHog, 1) ;
如今咱們有足夠的信息來計算包圍框了:
detection = [ x - 0.5 ; y - 0.5 ; x + hogCellSize * modelWidth - 0.5 ; y + hogCellSize * modelHeight - 0.5 ;] ;
注意:像素是整數的,像素的邊界至少有距離 ±1/2.
問題: 使用上面的代碼畫出檢測中的包圍框,它是否如你所願? Part 2: 使用SVM的多尺度檢測
在第二部分,咱們將會: (i) 把檢測器擴展到多尺度搜索 (ii) 使用支持向量機學習一個更好的模型. 咱們首先加載所需的數據:
setup ;
targetClass = 'mandatory' ; loadData(targetClass) ;
mandatory相似全部信號裏比較簡單的一個。
Step 2.1: 多尺度檢測
O目標存在於不一樣於模板的許多尺度中. 爲了找到全部的目標,咱們縮放圖片而且不斷的在上面搜索.
搜索的尺度定義以下:
% Scale space configuraiton minScale = -1 ; maxScale = 3 ; numOctaveSubdivisions = 3 ; scales = 2.^linspace(... minScale,... maxScale,... numOctaveSubdivisions*(maxScale-minScale+1)) ;
給定如第一部分所述的模型w, 咱們上海移動 detectAtMultipleScales函數來在多尺度檢索:
detection = detectAtMultipleScales(im, w, hogCellSize, scales) ;
注意這個函數會隨着運行產生不一樣的圖。所以若是你不想讓當前圖片被刪除的話,給它一個新的索引.
問題: 打開並學習detectAtMultipleScales函數.確保和以前的代碼組偶的工做同樣,只是把測試圖片縮放了不少次.
問題: 使用提供的代碼可視化檢測的結果,它工做的好嗎? 若是很差的話,你能想出爲何嗎?
問題: 觀察代碼產生的結果.他們能解釋的通嗎? 有什麼地方錯了嗎?
Step 2.2: 收集正負訓練樣本
剛纔學習到的模型很難工做的很好. 是時候使用SVM來學習一個更好的模型了.爲了實現這個目的,咱們須要準備一些數據. 咱們已經有一些正樣本了s (從目標塊提取的特徵):
% Collect positive training data pos = trainHog ;
爲了收集負樣本,咱們在訓練圖片中遍歷,而且均勻的採樣:
任務: 確保你已經理解example2.m 代碼.
問題: 咱們收集了多少負樣本? 200 Step 2.3: 使用SVM學習一個模型
既然咱們已經有了數據,就可使用SVM學習模型了.在這裏咱們使用vl_svmtrain函數. 這個函數須要數據是D×N的矩陣, 其中D是特徵的維數,N訓練樣本的個數. 能夠這麼作:
% Pack the data into a matrix with one datum per column x = cat(4, pos, neg) ; x = reshape(x, [], numPos + numNeg) ;
咱們還須要一個二值標籤的向量,正樣本是+1,負樣本是-1:
% Create a vector of binary labels y = [ones(1, size(pos,4)) -ones(1, size(neg,4))] ;
最後,咱們須要設置SVM的λ參數.因爲在後面咱們會解釋它,這裏咱們使用C參數代替:
numPos = size(pos,4) ; numNeg = size(neg,4) ; C = 10 ; lambda = 1 / (C * (numPos + numNeg)) ;
只需一行代碼就能完成SVM的學習:
% Learn the SVM using an SVM solver w = vl_svmtrain(x,y,lambda,'epsilon',0.01,'verbose') ;
問題: 使用提供的代碼可視化模型w. 它和咱們以前學到的模型是否不一樣? 體如今哪裏?
Step 2.4: 評估學習到的模型
使用上面提到的detectAtMultipleScales來評估新學習到的模型.
問題: 學習到的模型比原始的平均要好嗎? 是。
任務: 試下不一樣的圖片.這個分類器總能在全部的實驗中表現很好嗎 ?若是不是的話,你看到了什麼類型的錯誤 ? 這些錯誤能夠理解嗎? 不是。錯誤不可理喻
Part 3: 多目標檢測和評估
Step 3.1: 多目標檢測
只是在多尺度上檢測仍是不足的: 咱們還須要檢測那些圖片中出現的多於一個的物體.爲了實現這個工做,包裏還有一個合適的檢測函數。這個函數和 detectAtMultipleScales相似, 可是它返回前1000個響應而不是一個:
% Compute detections [detections, scores] = detect(im, w, hogCellSize, scales) ;
任務: 打開並學習detect.m. 確保你已經理解它是怎樣工做的.
問題: 爲何須要返回這麼多響應?在實踐中,給定的圖片不大可能包含這麼多物體… 誤檢能夠經過非極大值壓縮抑制,但一旦漏檢,就不再可能找回來了。
單個檢測子很容易在目標位置附近產生不少的響應,爲了消除這些冗餘的檢測,咱們使用非極大值抑制算法. 這是經過boxsuppress.m實現的. 這個算法很簡單: 從最大響應位置開始, 而後移除那些重疊率大於必定閾值的響應.這個函數返回一個二值的向量指示是否應該保留檢測的值:
% Non-maximum suppression keep = boxsuppress(detections, scores, 0.25) ; detections = detections(:, keep) ; scores = scores(keep) ;
爲了高效起見,在非極大值抑制以後,咱們只保留響應最大的10個值:
% Further keep only top detections detections = detections(:, 1:10) ; scores = scores(1:10) ;
如今須要審慎的評估咱們的檢測器了. 咱們使用 PASCAL VOC 準則, 計算平均精度(AP). 考慮包含了一系列真值的圖片(g1,…,gm)以及候選的檢測列表(b1,s1),…,(bn,sn),值爲si. 下面的算法把這些數據轉換成一個由T標籤和分數組成的列表(si,yi) ,它能夠用來計算精度-回召曲線,例如使用VLFeat的 vl_pr函數. 這個算法在evalDetections.m中實現, 以下所示:
Assign each candidate detection (bi,si) a true or false label yi∈{+1,−1}. To do so: The candidate detections (bi,si) are sorted by decreasing score si. For each candidate detection in order: a. If there is a matching ground truth detection gj (overlap(bi,gj) larger than 50%), the candidate detection is considered positive (yi=+1). Furthermore, the ground truth detection is removed from the list and not considered further. b. Otherwise, the candidate detection is negative (yi=−1). Add each ground truth object gi that is still unassigned to the list of candidates as pair (gj,−∞) with label yj=+1. The overlap metric used to compare a candidate detection to a ground truth bounding box is defined as the ratio of the area of the intersection over the area of the union of the two bounding boxes: overlap(A,B)=|A∩B||A∪B|.
問題: 爲何匹配後的真值在列表中要刪除? 若是一個物體被檢測兩次會發生什麼? 你能解釋下爲怎麼沒有匹配真值給值−∞嗎?
爲了使用這個算法,咱們首先須要找到測試圖片的真值:
% Find all the objects in the target image s = find(strcmp(testImages{1}, testBoxImages)) ; gtBoxes = testBoxes(:, s) ;
而後能夠計算 evalDetections :
% No example is considered difficult gtDifficult = false(1, numel(s)) ;
% PASCAL-like evaluation matches = evalDetections(... gtBoxes, gtDifficult, ... detections, scores) ;
gtDifficult能夠標識一些很難的須要忽略的真值.它在 PASCAL VOC 挑戰中被使用, 可是咱們這裏沒有考慮它.  evalDetections 返回匹配的一系列結構.在這裏咱們關注matches.detBoxFlags:正確的檢測爲+1 不然爲-1 . 咱們還使用它來可視化檢測的偏差: ```matlab % Visualization figure(1) ; clf ; imagesc(im) ; axis equal ; hold on ; vl_plotbox(detections(:, matches.detBoxFlags==+1), 'g', 'linewidth', 2) ; vl_plotbox(detections(:, matches.detBoxFlags==-1), 'r', 'linewidth', 2) ; vl_plotbox(gtBoxes, 'b', 'linewidth', 1) ; axis off ;
任務:使用提供的代碼評估一幅圖片們確保你已經理解輸出. 如今畫出PR曲線:
figure(2) ; clf ; vl_pr(matches.labels, matches.scores) ;
問題:在每幅圖片中有不少的錯誤. 你應該爲此擔憂嗎? PR曲線是怎麼被影響的?在實踐中爲了減小這些影響你會怎麼作? Step 3.3: 評估多目標檢測
評估是在多福圖片而不是一幅圖片就完事了,這是經過evalModel.m實現的
任務: 打開evalModel.m並確保你已經理解評估的主要過程. 使用提供的代碼在這個測試集上運行評估,並得到結果:
matches = evaluateModel(testImages, testBoxes, testBoxImages, ... w, hogCellSize, scales) ;注意: 這個函數處理每張圖片都須要很長的時間,而且隨着進度可視化結果.PR曲線是到目前爲止得到的結果.
任務Task: 打開evaluateModel.m文件,並在循環的最後設置一個斷點. 如今從新運行評估的代碼而且單獨觀察每張圖片的結果. 檢查哪些正確和錯誤的匹配以及它們的排名和累積PR曲線的影響. Part 4: 難例挖掘
這部分探索更高級的技術T. 如今,SVM學習的模型已經使用了小的以及隨機的樣本. 然而,在實踐中,每一個不包含物體的單獨的塊均可以認爲是負樣本. 在實際中這麼作的話會有很大的風險,不幸的是,隨機採樣和大多數感興趣的物體都很小而且只有不多的負樣本.
難例挖掘是發現關鍵的負樣本的簡單的技術. 想法很簡單:咱們首先不使用任何負樣本(在這裏稱爲一類SVM) , 而後把拿下錯誤的檢測做爲負樣本加入到訓練集中。
Step 4.1: 使用難例訓練
使用example4.m提供的代碼來進行難例挖掘. 這個代碼不斷的運行SVM的訓練好屢次,逐漸的提升難例數組的大小。這是使用下面的代碼完成的:
[matches, moreNeg] = ...
evaluateModel(...
vl_colsubset(trainImages', schedule(t), 'beginning'), ... trainBoxes, trainBoxImages, ... w, hogCellSize, scales) ;
任務:從新檢查evaluateModel.m並理解難例是怎樣被髮掘出來的.
問題: vl_colsubset(trainImages', schedule(t), 'beginning')的做用是什麼? 你認爲爲何咱們須要在後面的迭代中使用更多的負樣本? 下一步是把新的負樣本和已有的融合:
% Add negatives neg = cat(4, neg, moreNeg) ;
注意難例挖掘可能在不一樣的迭代過程當中選擇一樣的樣本,下面的代碼旨在消除這些冗餘:
% Remove negative duplicates z = reshape(neg, [], size(neg,4)) ; [~,keep] = unique(z','stable','rows') ; neg = neg(:,:,:,keep) ;
一旦難例挖掘和訓練過程結果,咱們就能夠在測試數據上評估獲得的模型了,如前所述:
evaluateModel(...
testImages, testBoxes, testBoxImages, ...
w, hogCellSize, scales) ;
快速學習的話能夠跳過
在最後一部分,你講學習怎麼訓練本身的目標檢測器。打開exercise5.m. 你須要準備以下的數據:
Step 5.1: 準備訓練數據
data/myPositives文件夾包含文件image1.jpeg, image2.jpeg, …, 每一個圖片都是目標的裁剪. 這些圖片可使任意大小,但必須是方形的. data/myNegatives文件夾下包含文件image1.jpeg, image2.jpeg, …, 不該該含有任何目標. 測試圖片data/myTestImage.jpeg包含目標物體. 它不該該是訓練集中的圖片. 運行example5.m 來檢查你的訓練數據看起來是否正確.
任務:理解這個檢測器的缺陷所在,選擇那些更容易學習的目標. Hint:特別注意那些相似的和對齊的目標. 若是你的目標不是對稱的話,選擇特定方向的圖片 (例如頭朝向左的馬).
Step 5.2: 學習模型
使用example5.m 利用難例挖掘來學習一個SVM模型。
Step 5.3: 測試模型
使用example5.m來評估獲得的模型
任務:確保你已經獲得能夠理解的結果. 若是須要的話跳回2.1從新準備你的數據. Hint: 若是須要調試的話,使用訓練集的圖片做爲測試集,看下這種狀況下它是否好轉??
Step 5.4: 檢測多個角度的對稱物體
你學習到的檢測器還不能處理諸如變形、平面外旋轉、部分遮擋等天然場景物體一般的挑戰. 處理這些影響須要更復雜的模型,包括變形圖匹配以及使用多個模型混合.
特別的,在天然中,有不少對稱的物體,而且這些圖片看起來好像是左右翻轉了(例如人臉). 這能夠經過對稱HOG模板來處理,在這部分咱們將探索這個選擇.
任務:使用上面的處理過程訓練特定朝向的物體,例如訓練一個檢測左朝向馬的檢測器 .
任務: 收集包含兩個朝向的測試圖片。運行你的檢測器而且確保他只在訓練的方向上工做. HOG特徵有良好的結構使得它可以預測圖片翻轉的情形.對於給定的胞元,HOG有31個維度. 下面的代碼在垂直軸上翻轉胞元:
perm = vl_hog('permutation') ; hog_flipped = hog(perm) ;
注意這個干擾只是用到了單個的HOG胞元上。可是,模板是胞元組成的H×W×31維度的數組.
任務: 給定H×W×31維度大小的數組, 編寫matlab代碼得到翻轉後的特徵hog_flipped. Hint: 回一下第一維是垂直座標,第二維是水平座標,第三維是特徵通道. perm應該被用於最後一個維度你還須要轉置其餘的東西嗎?
如今讓咱們把翻轉用於訓練以前的模型:
任務:假設 w是你以前訓練的模型使用翻轉獲得的模型爲 w_flipped. 而後如1.3那樣可視化 w 和w_flipped. 確保你的翻轉是成功的. 咱們如今有兩個模型w and w_flipped, 每一個對應物體的一個視角.
任務: 在同一幅圖運行兩個模型,獲得兩個檢測結果.找到一種方式來融合着兩個列表而且可視化前幾個響應. 確保如今你可以檢測兩個方向的物體. Hint: 不要忘了能夠在兩個方向上使用非極大值抑制.
恭喜你完成整個教程!
History
Used in the Oxford AIMS CDT, 2014-15 This is part of the MatConvNet toolbox for convolutional neural networks. Nevertheless, there is no neural network discussed here. ↩
學習率,可是最終的學習率須要乘以 solver.prototxt 配置文件中的 base_lr .
若是有兩個 lr_mult, 則第一個表示 weight 的學習率,第二個表示 bias 的學習率
通常 bias 的學習率是 weight 學習率的2倍’