結合這周看的論文,我對這周研究的Histogram of orientedgradients(HOG)談?wù)勛约旱睦斫猓?/span>
HOG descriptors是應用在計算機視覺(jué)和圖像處理領(lǐng)域,用于目標檢測的特征描述器。這項技術(shù)是用來(lái)計算局部圖像梯度的方向信息的統計值。這種方法跟邊緣方向直方圖(edgeorientation histograms)、尺度不變特征變換(scale-invariant feature transformdescriptors)以及形狀上下文方法( shapecontexts)有很多相似之處,但與它們的不同點(diǎn)是:HOG描述器是在一個(gè)網(wǎng)格密集的大小統一的細胞單元(dense grid ofuniformly spaced cells)上計算,而且為了提高性能,還采用了重疊的局部對比度歸一化(overlappinglocal contrast normalization)技術(shù)。
這篇文章的作者Navneet Dalal和BillTriggs是法國國家計算機技術(shù)和控制研究所French National Institute for Research inComputer Science and Control(INRIA)的研究員。他們在這篇文章中首次提出了HOG方法。這篇文章被發(fā)表在2005年的CVPR上。他們主要是將這種方法應用在靜態(tài)圖像中的行人檢測上,但在后來(lái),他們也將其應用在電影和視頻中的行人檢測,以及靜態(tài)圖像中的車(chē)輛和常見(jiàn)動(dòng)物的檢測。
HOG描述器最重要的思想是:在一副圖像中,局部目標的表象和形狀(appearance andshape)能夠被梯度或邊緣的方向密度分布很好地描述。具體的實(shí)現方法是:首先將圖像分成小的連通區域,我們把它叫細胞單元。然后采集細胞單元中各像素點(diǎn)的梯度的或邊緣的方向直方圖。最后把這些直方圖組合起來(lái)就可以構成特征描述器。為了提高性能,我們還可以把這些局部直方圖在圖像的更大的范圍內(我們把它叫區間或block)進(jìn)行對比度歸一化(contrast-normalized),所采用的方法是:先計算各直方圖在這個(gè)區間(block)中的密度,然后根據這個(gè)密度對區間中的各個(gè)細胞單元做歸一化。通過(guò)這個(gè)歸一化后,能對光照變化和陰影獲得更好的效果。
與其他的特征描述方法相比,HOG描述器后很多優(yōu)點(diǎn)。首先,由于HOG方法是在圖像的局部細胞單元上操作,所以它對圖像幾何的(geometric)和光學(xué)的(photometric)形變都能保持很好的不變性,這兩種形變只會(huì )出現在更大的空間領(lǐng)域上。其次,作者通過(guò)實(shí)驗發(fā)現,在粗的空域抽樣(coarsespatial sampling)、精細的方向抽樣(fine orientationsampling)以及較強的局部光學(xué)歸一化(strong local photometricnormalization)等條件下,只要行人大體上能夠保持直立的姿勢,就容許行人有一些細微的肢體動(dòng)作,這些細微的動(dòng)作可以被忽略而不影響檢測效果。綜上所述,HOG方法是特別適合于做圖像中的行人檢測的。
上圖是作者做的行人檢測試驗,其中(a)表示所有訓練圖像集的平均梯度(averagegradient across their trainingimages);(b)和(c)分別表示:圖像中每一個(gè)區間(block)上的最大最大正、負SVM權值;(d)表示一副測試圖像;(e)計算完R-HOG后的測試圖像;(f)和(g)分別表示被正、負SVM權值加權后的R-HOG圖像。
算法的實(shí)現:
色彩和伽馬歸一化(color and gammanormalization)
作者分別在灰度空間、RGB色彩空間和LAB色彩空間上對圖像進(jìn)行色彩和伽馬歸一化,但實(shí)驗結果顯示,這個(gè)歸一化的預處理工作對最后的結果沒(méi)有影響,原因可能是:在后續步驟中也有歸一化的過(guò)程,那些過(guò)程可以取代這個(gè)預處理的歸一化。所以,在實(shí)際應用中,這一步可以省略。
梯度的計算(Gradient computation)
最常用的方法是:簡(jiǎn)單地使用一個(gè)一維的離散微分模板(1-D centered, pointdiscrete derivativemask)在一個(gè)方向上或者同時(shí)在水平和垂直兩個(gè)方向上對圖像進(jìn)行處理,更確切地說(shuō),這個(gè)方法需要使用下面的濾波器核濾除圖像中的色彩或變化劇烈的數據(coloror intensity data)
作者也嘗試了其他一些更復雜的模板,如3×3 Sobel 模板,或對角線(xiàn)模板(diagonalmasks),但是在這個(gè)行人檢測的實(shí)驗中,這些復雜模板的表現都較差,所以作者的結論是:模板越簡(jiǎn)單,效果反而越好。作者也嘗試了在使用微分模板前加入一個(gè)高斯平滑濾波,但是這個(gè)高斯平滑濾波的加入使得檢測效果更差,原因是:許多有用的圖像信息是來(lái)自變化劇烈的邊緣,而在計算梯度之前加入高斯濾波會(huì )把這些邊緣濾除掉。
構建方向的直方圖(creating the orientationhistograms)
第三步就是為圖像的每個(gè)細胞單元構建梯度方向直方圖。細胞單元中的每一個(gè)像素點(diǎn)都為某個(gè)基于方向的直方圖通道(orientation-basedhistogram channel)投票。投票是采取加權投票(weightedvoting)的方式,即每一票都是帶權值的,這個(gè)權值是根據該像素點(diǎn)的梯度幅度計算出來(lái)??梢圆捎梅当旧砘蛘咚暮瘮祦?lái)表示這個(gè)權值,實(shí)際測試表明:使用幅值來(lái)表示權值能獲得最佳的效果,當然,也可以選擇幅值的函數來(lái)表示,比如幅值的平方根(squareroot)、幅值的平方(square of the gradient magnitude)、幅值的截斷形式(clippedversion of themagnitude)等。細胞單元可以是矩形的(rectangular),也可以是星形的(radial)。直方圖通道是平均分布在0-1800(無(wú)向)或0-3600(有向)范圍內。作者發(fā)現,采用無(wú)向的梯度和9個(gè)直方圖通道,能在行人檢測試驗中取得最佳的效果。
把細胞單元組合成大的區間(grouping the cells together intolarger blocks)
由于局部光照的變化(variations ofillumination)以及前景-背景對比度(foreground-backgroundcontrast)的變化,使得梯度強度(gradientstrengths)的變化范圍非常大。這就需要對梯度強度做歸一化,作者采取的辦法是:把各個(gè)細胞單元組合成大的、空間上連通的區間(blocks)。這樣以來(lái),HOG描述器就變成了由各區間所有細胞單元的直方圖成分所組成的一個(gè)向量。這些區間是互有重疊的,這就意味著(zhù):每一個(gè)細胞單元的輸出都多次作用于最終的描述器。區間有兩個(gè)主要的幾何形狀——矩形區間(R-HOG)和環(huán)形區間(C-HOG)。R-HOG區間大體上是一些方形的格子,它可以有三個(gè)參數來(lái)表征:每個(gè)區間中細胞單元的數目、每個(gè)細胞單元中像素點(diǎn)的數目、每個(gè)細胞的直方圖通道數目。作者通過(guò)實(shí)驗表明,行人檢測的最佳參數設置是:3×3細胞/區間、6×6像素/細胞、9個(gè)直方圖通道。作者還發(fā)現,在對直方圖做處理之前,給每個(gè)區間(block)加一個(gè)高斯空域窗口(Gaussianspatial window)是非常必要的,因為這樣可以降低邊緣的周?chē)袼攸c(diǎn)(pixels around theedge)的權重。
R-HOG跟SIFT描述器看起來(lái)很相似,但他們的不同之處是:R-HOG是在單一尺度下、密集的網(wǎng)格內、沒(méi)有對方向排序的情況下被計算出來(lái)(arecomputed in dense grids at some single scale without orientationalignment);而SIFT描述器是在多尺度下、稀疏的圖像關(guān)鍵點(diǎn)上、對方向排序的情況下被計算出來(lái)(are computed atsparse, scale-invariant key image points and are rotated to alignorientation)。補充一點(diǎn),R-HOG是各區間被組合起來(lái)用于對空域信息進(jìn)行編碼(are used in conjunctionto encode spatial form information),而SIFT的各描述器是單獨使用的(are usedsingly)。
C-HOG區間(blocks)有兩種不同的形式,它們的區別在于:一個(gè)的中心細胞是完整的,一個(gè)的中心細胞是被分割的。如右圖所示:
作者發(fā)現C-HOG的這兩種形式都能取得相同的效果。C-HOG區間(blocks)可以用四個(gè)參數來(lái)表征:角度盒子的個(gè)數(numberof angular bins)、半徑盒子個(gè)數(number of radial bins)、中心盒子的半徑(radius ofthe center bin)、半徑的伸展因子(expansion factor for theradius)。通過(guò)實(shí)驗,對于行人檢測,最佳的參數設置為:4個(gè)角度盒子、2個(gè)半徑盒子、中心盒子半徑為4個(gè)像素、伸展因子為2。前面提到過(guò),對于R-HOG,中間加一個(gè)高斯空域窗口是非常有必要的,但對于C-HOG,這顯得沒(méi)有必要。C-HOG看起來(lái)很像基于形狀上下文(ShapeContexts)的方法,但不同之處是:C-HOG的區間中包含的細胞單元有多個(gè)方向通道(orientationchannels),而基于形狀上下文的方法僅僅只用到了一個(gè)單一的邊緣存在數(edge presencecount)。
區間歸一化(Block normalization)
作者采用了四中不同的方法對區間進(jìn)行歸一化,并對結果進(jìn)行了比較。引入v表示一個(gè)還沒(méi)有被歸一化的向量,它包含了給定區間(block)的所有直方圖信息。|| vk | |表示v的k階范數,這里的k去1、2。用e表示一個(gè)很小的常數。這時(shí),歸一化因子可以表示如下:
L2-norm:
L1-norm:
L1-sqrt:
還有第四種歸一化方式:L2-Hys,它可以通過(guò)先進(jìn)行L2-norm,對結果進(jìn)行截短(clipping),然后再重新歸一化得到。作者發(fā)現:采用L2-Hys,L2-norm, 和L1-sqrt方式所取得的效果是一樣的,L1-norm稍微表現出一點(diǎn)點(diǎn)不可靠性。但是對于沒(méi)有被歸一化的數據來(lái)說(shuō),這四種方法都表現出來(lái)顯著(zhù)的改進(jìn)。
SVM分類(lèi)器(SVM classifier)
最后一步就是把提取的HOG特征輸入到SVM分類(lèi)器中,尋找一個(gè)最優(yōu)超平面作為決策函數。作者采用的方法是:使用免費的SVMLight軟件包加上HOG分類(lèi)器來(lái)尋找測試圖像中的行人。
zz fromhttp://hi.baidu.com/ykaitao_handsome/blog/item/d7a2c3156e368a0a4b90a745
本文來(lái)自CSDN博客,轉載請標明出處:http://blog.csdn.net/forsiny/archive/2010/03/22/5404268.aspx
OpenCV2.0提供了行人檢測的例子,用的是法國人Navneet Dalal最早在CVPR2005會(huì )議上提出的方法。
最近正在學(xué)習它,下面是自己的學(xué)習體會(huì ),希望共同探討提高。
1、VC 2008Express下安裝OpenCV2.0--可以直接使用2.1,不用使用CMake進(jìn)行編譯了,避免編譯出錯
2、體會(huì )該程序
在DOS界面,進(jìn)入如下路徑: C:\OpenCV2.0\samples\c peopledetect.exe filename.jpg
其中filename.jpg為待檢測的文件名
3、編譯程序
創(chuàng )建一個(gè)控制臺程序,從C:\OpenCV2.0\samples\c下將peopledetect.cpp加入到工程中;按步驟1的方法進(jìn)行設置。編譯成功,但是在DEBUG模式下生成的EXE文件運行出錯,很奇怪 ![]()
改成RELEASE模式后再次編譯,生成的EXE文件可以運行。
4程序代碼簡(jiǎn)要說(shuō)明
1) getDefaultPeopleDetector
2).cv::HOGDescriptor hog; 創(chuàng )建類(lèi)的對象 一系列變量初始化
winSize(64,128), blockSize(16,16), blockStride(8,8),
cellSize(8,8), nbins(9), derivAperture(1), winSigma(-1),
histogramNormType(L2Hys), L2HysThreshold(0.2),gammaCorrection(true)
3). 調用函數:detectMultiScale(img, found, 0, cv::Size(8,8),cv::Size(24,16), 1.05, 2);
參數分別為待檢圖像、返回結果列表、門(mén)檻值hitThreshold、窗口步長(cháng)winStride、圖像paddingmargin、比例系數、門(mén)檻值groupThreshold;通過(guò)修改參數發(fā)現,就所用的某圖片,參數0改為0.01就檢測不到,改為0.001可以;1.05改為1.1就不行,1.06可以;2改為1可以,0.8以下不行,(24,16)改成(0,0)也可以,(32,32)也行
該函數內容如下
(1) 得到層數 levels
某圖片(530,402)為例,lg(402/128)/lg1.05=23.4 則得到層數為24
(2) 循環(huán)levels次,每次執行內容如下
HOGThreadData& tdata = threadData[getThreadNum()];
Mat smallerImg(sz, img.type(), tdata.smallerImgBuf.data);
調用以下核心函數
detect(smallerImg, tdata.locations, hitThreshold, winStride,padding);
其參數分別為,該比例下圖像、返回結果列表、門(mén)檻值、步長(cháng)、margin
該函數內容如下:
(a)得到補齊圖像尺寸paddedImgSize
(b)創(chuàng )建類(lèi)的對象 HOGCache cache(this, img, padding, padding, nwindows ==0, cacheStride); 在創(chuàng )建過(guò)程中,首先初始化 HOGCache::init,包括:計算梯度descriptor->computeGradient、得到塊的個(gè)數105、每塊參數個(gè)數36
(c)獲得窗口個(gè)數nwindows,以第一層為例,其窗口數為(530+32*2-64)/8+1、(402+32*2-128)/8+1?。?7*43=2881,其中(32,32)為winStride參數,也可用(24,16)
(d)在每個(gè)窗口執行循環(huán),內容如下
在105個(gè)塊中執行循環(huán),每個(gè)塊內容為:通過(guò)getblock函數計算HOG特征并歸一化,36個(gè)數分別與算子中對應數進(jìn)行相應運算;判斷105個(gè)塊的總和 s>= hitThreshold 則認為檢測到目標
4)主體部分感覺(jué)就是以上這些,但很多細節還需要進(jìn)一步弄清。
5、原文獻寫(xiě)的算法流程
文獻NavneetDalalThesis.pdf 78頁(yè)圖5.5描述了The complete object detectionalgorithm.
前2步為初始化,上面基本提到了。后面2步如下
For each scale Si = [Ss, SsSr, . . . , Sn]
(a) Rescale the input image using bilinear interpolation
(b) Extract features (Fig. 4.12) and densely scan the scaled imagewith stride Ns for object/non-object detections
(c) Push all detections with t(wi) > c to a list
Non-maximum suppression
(a) Represent each detection in 3-D position and scale spaceyi
(b) Using (5.9), compute the uncertainty matrices Hi for eachpoint
(c) Compute the mean shift vector (5.7) iteratively for each pointin the list until it converges to a mode
(d) The list of all of the modes gives the final fuseddetections
(e) For each mode compute the bounding box from the final centrepoint and scale
以下內容節選自文獻NavneetDalalThesis.pdf,把重要的部分挑出來(lái)了。其中保留了原文章節號,便于查找。
4. Histogram of Oriented Gradients Based Encoding of Images
Default Detector.
As a yardstick for the purpose of comparison, throughout thissection we compare results to our
default detector which has the following properties: input image inRGB colour space (without
any gamma correction); image gradient computed by applying [?1, 0,1] filter along x- and yaxis
with no smoothing; linear gradient voting into 9 orientation binsin 0_–180_; 16×16 pixel
blocks containing 2×2 cells of 8×8 pixel; Gaussian block windowingwith _ = 8 pixel; L2-Hys
(Lowe-style clipped L2 norm) block normalisation; blocks spacedwith a stride of 8 pixels (hence
4-fold coverage of each cell); 64×128 detection window; and linearSVM classifier. We often
quote the performance at 10?4 false positives per window (FPPW) –the maximum false positive
rate that we consider to be useful for a real detector given that103–104 windows are tested for
each image.
4.3.2 Gradient Computation
The simple [?1, 0, 1] masks give the best performance.
4.3.3 Spatial / Orientation Binning
Each pixel contributes a weighted vote for orientation based on theorientation of the gradient element centred onit.
The votes are accumulated into orientation bins over local spatialregions that we call cells.
To reduce aliasing, votes are interpolated trilinearly between theneighbouring bin centres in both orientation andposition.
Details of the trilinear interpolation voting procedure arepresented in Appendix D.
The vote is a function of the gradient magnitude at the pixel,either the magnitude itself, its square, its
square root, or a clipped form of the magnitude representing softpresence/absence of an edge at the pixel. In practice, using themagnitude itself gives the best results.
4.3.4 Block Normalisation Schemes and Descriptor Overlap
good normalisation is critical and including overlap significantlyimproves the performance.
Figure 4.4(d) shows that L2-Hys, L2-norm and L1-sqrt all performequally well for the person detector.
such as cars and motorbikes, L1-sqrt gives the bestresults.
4.3.5 Descriptor Blocks
R-HOG.
For human detection, 3×3 cell blocks of 6×6 pixel cells performbest with 10.4% miss-rate
at 10?4 FPPW. Our standard 2×2 cell blocks of 8×8 cells are a closesecond.
We find 2×2 and 3×3 cell blocks work best.
4.3.6 Detector Window and Context
Our 64×128 detection window includes about 16 pixels of marginaround the person on all four
sides.
4.3.7 Classifier
By default we use a soft (C=0.01) linear SVM trained with SVMLight[Joachims 1999].We modified
SVMLight to reduce memory usage for problems with large densedescriptor vectors.
---------------------------------
5. Multi-Scale Object Localisation
the detector scans the image with a detection window at allpositions and scales, running the classifier in each window andfusing multiple overlapping detections to yield the final objectdetections.
We represent detections using kernel density estimation (KDE) in3-D position and scale space. KDE is a data-driven process wherecontinuous densities are evaluated by applying a smoothing kernelto observed data points. The bandwidth of the smoothing kerneldefines the local neighbourhood. The detection scores areincorporated by weighting the observed detection points by theirscore values while computing the density estimate. Thus KDEnaturally incorporates the first two criteria. The overlapcriterion follows from the fact that detections at very differentscales or positions are far off in 3-D position and scale space,and are thus not smoothed together. The modes (maxima) of thedensity estimate correspond to the positions and scales of finaldetections.
Let xi = [xi, yi] and s0i denote the detection position and scale,respectively, for the i-th detection.
the detections are represented in 3-D space as y = [x, y, s], wheres = log(s’).
the variable bandwidth mean shift vector is defined as (5.7)
For each of the n point the mean shift based iterative procedure isguaranteed to converge to a mode2.
Detection Uncertainty Matrix Hi.
One key input to the above mode detection algorithm is the amountof uncertainty Hi to be associated with each point. We assumeisosymmetric covariances, i.e. the Hi’s are diagonalmatrices.
Let diag [H] represent the 3 diagonal elements of H. We use scaledependent covariance
matrices such that diag
[Hi] = [(exp(si)_x)2, (exp(si)_y)2, (_s)2] (5.9)
where _x, _y and _s are user supplied smoothingvalues.
The term t(wi) provides the weight for each detection. For linearSVMs we usually use threshold = 0.
the smoothing parameters _x, _y,and _s used in the non-maximumsuppression stage. These parameters can have a significant impacton performance so proper evaluation is necessary. For all of theresults here, unless otherwise noted, a scale ratio of 1.05, astride of 8 pixels, and _x = 8, _y = 16, _s = log(1.3) are used asdefault values.
A scale ratio of 1.01 gives the best performance, but significantlyslows the overall process.
Scale smoothing of log(1.3)–log(1.6) gives good performance formost object classes.
We group these mode candidates using a proximity measure. The finallocation is the ode corresponding to the highest density.
----------------------------------------------------
附錄 A. INRIA Static Person Data Set
The (centred and normalised) positive windows are supplied by theuser, and the initial set of negatives is created once and for allby randomly sampling negative images.A preliminary classifier isthus trained using these. Second, the preliminary detector is usedto exhaustively scan the negative training images for hard examples(false positives). The classifier is then re-trained using thisaugmented training set (user supplied positives, initial negativesand hard examples) to produce the finaldetector.
INRIA Static Person Data Set
As images of people are highly variable, to learn an effectiveclassifier, the positive training examples need to be properlynormalized and centered to minimize the variance among them. Forthis we manually annotated all upright people in the originalimages.
The image regions belonging to the annotations were cropped andrescaled to 64×128 pixel image windows. On average the subjectsheight is 96 pixels in these normalised windows to allow for anapproximately16 pixel margin on each side. In practise we leave afurther 16 pixel margin around each side of the image window toensure that flow and gradients can be computed without boundaryeffects. The margins were added by appropriately expanding theannotations on each side before cropping the imageregions.
//<------------------------以上摘自datal的博士畢業(yè)論文
關(guān)于INRIA PersonDataset的更多介紹,見(jiàn)以下鏈接
http://pascal.inrialpes.fr/data/human/
Original Images
Normalized Images
Negative windows
//------------------------------------------------------______________>
原作者對 OpenCV2.0 peopledetect進(jìn)行了2次更新
https://code.ros.org/trac/opencv/changeset/2314/trunk
最近一次改為如下:
---------------------
#include "cvaux.h"
#include "highgui.h"
#include
#include
#include
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat img;
FILE* f = 0;
char _filename[1024];
if( argc == 1 )
{
printf("Usage: peopledetect ( | .txt)\n");
return 0;
}
img = imread(argv[1]);
if( img.data )
{
strcpy(_filename, argv[1]);
}
else
{
f = fopen(argv[1], "rt");
if(!f)
{
fprintf( stderr, "ERROR: the specified file could not beloaded\n");
return -1;
}
}
HOGDescriptor hog;
hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector
for(;;)
{
char* filename = _filename;
if(f)
{
if(!fgets(filename, (int)sizeof(_filename)-2, f))
break;
//while(*filename && isspace(*filename))
// ++filename;
if(filename[0] == '#')
continue;
int l = strlen(filename);
while(l > 0 && isspace(filename[l-1]))
--l;
filename[l] = '\0';
img = imread(filename);
}
printf("%s:\n", filename);
if(!img.data)
continue;
fflush(stdout);
vector found, found_filtered;
double t = (double)getTickCount();
// run the detector with default parameters. to get a higherhit-rate
// (and more false alarms, respectively), decrease the hitThresholdand
// groupThreshold (set groupThreshold to 0 to turn off the groupingcompletely).
int can = img.channels();
hog.detectMultiScale(img, found, 0, Size(8,8), Size(32,32), 1.05,2);
t = (double)getTickCount() - t;
printf("tdetection time = %gms\n",t*1000./cv::getTickFrequency());
size_t i, j;
for( i = 0; i < found.size(); i++ )
{
Rect r = found[i];
for( j = 0; j < found.size(); j++ )
if( j != i && (r & found[j]) == r)
break;
if( j == found.size() )
found_filtered.push_back(r);
}
for( i = 0; i < found_filtered.size(); i++ )
{
Rect r = found_filtered[i];
// the HOG detector returns slightly larger rectangles than thereal objects.
// so we slightly shrink the rectangles to get a niceroutput.
r.x += cvRound(r.width*0.1);
r.width = cvRound(r.width*0.1);
r.y += cvRound(r.height*0.07);
r.height = cvRound(r.height*0.1);
rectangle(img, r.tl(), r.br(), cv::Scalar(0,255,0), 3);
}
imshow("people detector", img);
int c = waitKey(0) & 255;
if( c == 'q' || c == 'Q' || !f)
break;
}
if(f)
fclose(f);
return 0;
}
更新后可以批量檢測圖片!
將需要批量檢測的圖片,構造一個(gè)TXT文本,文件名為filename.txt, 其內容如下
1.jpg
2.jpg
......
然后在DOS界面輸入 peopledetect filename.txt , 即可自動(dòng)檢測每個(gè)圖片。
//////////////////////////////////////////////////////////////////------------------------------Navneet Dalal的OLT工作流程描述
Navneet Dalal在以下網(wǎng)站提供了INRIA Object Detection andLocalization Toolkit
http://pascal.inrialpes.fr/soft/olt/
Wilson SuryajayaLeoputra提供了它的windows版本
http://www.computing.edu.au/~12482661/hog.html
需要 Copy all the dll's(boost_1.34.1*.dll, blitz_0.9.dll, opencv*.dll) into"/debug/"
Navneet Dalal提供了linux下的可執行程序,借別人的linux系統,運行一下,先把總體流程了解了。
下面結合OLTbinaries\readme和OLTbinaries\HOG\record兩個(gè)文件把其流程描述一下。
1.下載 INRIA person detection database解壓到OLTbinaries\;把其中的'train_64x128_H96' 重命名為 'train' ;'test_64x128_H96' 重命名為 'test'.
2.在linux下運行 'runall.sh' script.
等待結果出來(lái)后,打開(kāi)matlab 運行 plotdet.m 可繪制 DET曲線(xiàn);
------這是一步到位法--------------------------------------------------
-------此外,它還提供了分步執行法-------------------------------------
1、由pos.lst列表提供的圖片,計算正樣本R-HOG特征,pos.lst列表格式如下
train/pos/crop_000010a.png
train/pos/crop_000010b.png
train/pos/crop_000011a.png
------以下表示-linux下執行語(yǔ)句(下同)------
./bin//dump_rhog -W 64,128 -C 8,8 -N 2,2 -B 9 -G 8,8 -S 0 --wtscale2 --maxvalue 0.2 -- epsilon 1 --fullcirc 0 -v 3 --proc rgb_sqrt--norm l2hys -s 1 train/pos.lst HOG/train_pos.RHOG
2.計算負樣本R-HOG特征
./bin//dump_rhog -W 64,128 -C 8,8 -N 2,2 -B 9 -G 8,8 -S 0 --wtscale2 --maxvalue 0.2 -- epsilon 1 --fullcirc 0 -v 3 --proc rgb_sqrt--norm l2hys -s 10 train/neg.lst HOG/train_neg.RHOG
3.訓練
./bin//dump4svmlearn -p HOG/train_pos.RHOG -n HOG/train_neg.RHOGHOG/train_BiSVMLight.blt -v
4.創(chuàng )建 model file: HOG/model_4BiSVMLight.alt
./bin//svm_learn -j 3 -B 1 -z c -v 1 -t 0 HOG/train_BiSVMLight.bltHOG/model_4BiSVMLight.alt
5.創(chuàng )建文件夾
mkdir -p HOG/hard
6.分類(lèi)
./bin//classify_rhog train/neg.lst HOG/hard/list.txtHOG/model_4BiSVMLight.alt -d HOG/hard/hard_neg.txt -cHOG/hard/hist.txt -m 0 -t 0 --no_nonmax 1 --avsize 0 --margin 0--scaleratio 1.2 -l N -W 64,128 -C 8,8 -N 2,2 -B 9 -G 8,8 -S 0--wtscale 2 --maxvalue 0.2 --
epsilon 1 --fullcirc 0 -v 3 --proc rgb_sqrt --norm l2hys
--------
false +/- 分類(lèi)結果會(huì )寫(xiě)入 HOG/hard/hard_neg.txt
7. 將hard加入到neg,再次計算RHOG特征
./bin//dump_rhog -W 64,128 -C 8,8 -N 2,2 -B 9 -G 8,8 -S 0 --wtscale2 --maxvalue 0.2 -- epsilon 1 --fullcirc 0 -v 3 --proc rgb_sqrt--norm l2hys -s 0 HOG/hard/hard_neg.txt OG/train_hard_neg.RHOG--poscases 2416 --negcases 12180 --dumphard 1 --hardscore 0 --memorylimit 1700
8.再次訓練
./bin//dump4svmlearn -p HOG/train_pos.RHOG -n HOG/train_neg.RHOG -nHOG/train_hard_neg.RHOG HOG/train_BiSVMLight.blt -v 4
9.得到最終的模型
./bin//svm_learn -j 3 -B 1 -z c -v 1 -t 0 HOG/train_BiSVMLight.bltHOG/model_4BiSVMLight.alt
Opencv中用到的3780個(gè)值,應該就在這個(gè)模型里面model_4BiSVMLight.alt,不過(guò)它的格式未知,無(wú)法直接讀取,但是可以研究svm_learn程序是如何生成它的;此外,該模型由程序classify_rhog調用,研究它如何調用,估計是一個(gè)解析此格式的思路
10.創(chuàng )建文件夾
mkdir -p HOG/WindowTest_Negative
11.負樣本檢測結果
./bin//classify_rhog -W 64,128 -C 8,8 -N 2,2 -B 9 -G 8,8 -S 0--wtscale 2 --maxvalue 0.2 --epsilon 1 --fullcirc 0 -v 3 --procrgb_sqrt --norm l2hys -p 1 --no_nonmax 1 --nopyramid 0 --scaleratio 1.2 -t 0 -m 0 --avsize 0 --margin 0 test/neg.lstHOG/WindowTest_Negative/list.txt HOG/model_4BiSVMLight.alt -cHOG/WindowTest_Negative/histogram.txt
12.創(chuàng )建文件夾
mkdir -p HOG/WindowTest_Positive
13.正樣本檢測結果
./bin//classify_rhog -W 64,128 -C 8,8 -N 2,2 -B 9 -G 8,8 -S 0--wtscale 2 --maxvalue 0.2 -- epsilon 1 --fullcirc 0 -v 3 --procrgb_sqrt --norm l2hys -p 1 --no_nonmax 1 --nopyramid 1 -t 0 -m 0--avsize 0 --margin 0 test/pos.lst HOG/WindowTest_Positive/list.txt HOG/model_4BiSVMLight.alt -cHOG/WindowTest_Positive/histogram.txt
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
分析了原作者的數據集,結合網(wǎng)上一些資料,下面描述如何制作訓練樣本
1、如何從原始圖片生成樣本
對比INRIAPerson\INRIAPerson\Train\pos(原始圖片),INRIAPerson\train_64x128_H96\pos(生成樣本)可以發(fā)現,作者從原始圖片裁剪出一些站立的人,要求該人不被遮擋,然后對剪裁的圖片left-rightreflect。以第一張圖片為例crop001001,它剪裁了2個(gè)不被遮擋的人,再加上原照片,共3張,再加左右鏡像,總共6張。
2、裁剪
可利用基于opencv1.0的程序imageclipper,進(jìn)行裁剪并保存,它會(huì )自動(dòng)生成文件名并保存在同一路徑下新生成的imageclipper文件夾下。
3.改變圖片大小
可以利用Acdsee軟件,Tools/open ineditor,進(jìn)去后到Resize選項; tools/rotate還可實(shí)現left-right reflect
自己編了一個(gè)程序,批量改變圖片大小,代碼見(jiàn)下一樓
4. 制作pos.lst列表
進(jìn)入dos界面,定位到需要制作列表的圖片文件夾下,輸入 dir /b>pos.lst,即可生成文件列表;
/////////////////////////
#include "cv.h"
#include "highgui.h"
#include "cvaux.h"
int main(int argc,char * argv[])
{
IplImage* src ;
IplImage* dst = 0;
CvSize dst_size;
FILE* f = 0;
char _filename[1024];
int l;
f = fopen(argv[1], "rt");
if(!f)
{
fprintf( stderr, "ERROR: the specified file could not beloaded\n");
return -1;
}
for(;;)
{
char* filename = _filename;
if(f)
{
if(!fgets(filename, (int)sizeof(_filename)-2, f))
break;
if(filename[0] == '#')
continue;
l = strlen(filename);
while(l > 0 && isspace(filename[l-1]))
--l;
filename[l] = '\0';
src=cvLoadImage(filename,1);
}
dst_size.width = 96;
dst_size.height = 160;
dst=cvCreateImage(dst_size,src->depth,src->nChannels);
cvResize(src,dst,CV_INTER_LINEAR);//////////////////
char* filename2 = _filename;char* filename3 = _filename;filename3="_96x160.jpg";
strncat(filename2, filename,l-4);
strcat(filename2, filename3);
cvSaveImage(filename2, dst);
}
if(f)
fclose(f);
cvWaitKey(-1);
cvReleaseImage( &src );
cvReleaseImage( &dst );
return 0;
}
聯(lián)系客服