簡歷上寫了這一項,鑒於時間隔的太久,每次面試的時候問到這個問題的時候,都是一臉蒙蔽啊。。
還有一篇關於AP解釋的blog:http://blog.csdn.net/a1154761720/article/details/50864994
"
如果做VOC competition一定會用到一個評價指標(evaluation measure)叫做ap(average precision);事實上在VOC中都提供了計算ap的方式,在VOC12中,代碼在\VOCdevkit\VOCcode目錄下的VOCevaluation.m和VOCap.m兩個文件中。代碼如下:
[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中有個圖非常形象的表示出了這幾個基本概念:
"
1、HOG特征
DPM模型用到的就是HOG特征,HOG特征,簡單說就是,求梯度直方圖(cell里面的梯度,然后block里面cell梯度直方圖串聯起來,掃描整個圖像串聯起來)
網上描述:
“
把樣本圖像分割為若干個像素的單元(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描述子尤其適合人的檢測。
2、sift特征
SIFT算法是一種提取局部特征的算法,在尺度空間尋找極值點,提取位置,尺度,旋轉不變量
4*4*8=128維的特征
每45度1個bin,所以每個極值點處有8個bin
sift特征的優點:SIFT特征不只具有尺度不變性,即使改變旋轉角度,圖像亮度或拍攝視角,仍然能夠得到好的檢測效果。
3、檢測的評估指標
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倍’ - 權值衰減,為了避免模型的over-fitting,需要對cost function加入規范項。
-