目標檢測的影象特徵提取 HOG特徵
方向梯度直方圖(Histogram of Oriented Gradient, HOG)特徵是一種在計算機視覺和影象處理中用來進行物體檢測的特徵描述子。它通過計算和統計影象區域性區域的梯度方向直方圖來構成特徵。Hog特徵結合SVM分類器已經被廣泛應用於影象識別中,尤其在行人檢測中獲得了極大的成功。需要提醒的是,HOG+SVM進行行人檢測的方法是法國研究人員Dalal在2005的CVPR上提出的,而如今雖然有很多行人檢測演算法不斷提出,但基本都是以HOG+SVM的思路為主。
(1)主要思想:
在一副影象中,區域性目標的表象和形狀(appearance and shape)能夠被梯度或邊緣的方向密度分佈很好地描述。(本質:梯度的統計資訊,而梯度主要存在於邊緣的地方)。
(2)具體的實現方法是:
首先將影象分成小的連通區域,我們把它叫細胞單元。然後採集細胞單元中各畫素點的梯度的或邊緣的方向直方圖。最後把這些直方圖組合起來就可以構成特徵描述器。
(3)提高效能:
把這些區域性直方圖在影象的更大的範圍內(我們把它叫區間或block)進行對比度歸一化(contrast-normalized),所採用的方法是:先計算各直方圖在這個區間(block)中的密度,然後根據這個密度對區間中的各個細胞單元做歸一化。通過這個歸一化後,能對光照變化和陰影獲得更好的效果。
(4)優點:
與其他的特徵描述方法相比,HOG有很多優點。首先,由於HOG
2、HOG特徵提取演算法的實現過程:
大概過程:
HOG特徵提取方法就是將一個image(你要檢測的目標或者掃描視窗):
1)灰度化(將影象看做一個x,y,z(灰度)的三維影象);
2)採用Gamma校正法對輸入影象進行顏色空間的標準化(歸一化);目的是調節影象的對比度,降低影象區域性的陰影和光照變化所造成的影響,同時可以抑制噪音的干擾;
3)計算影象每個畫素的梯度(包括大小和方向);主要是為了捕獲輪廓資訊,同時進一步弱化光照的干擾。
4)將影象劃分成小cells(例如6*6畫素/cell);
5)統計每個cell的梯度直方圖(不同梯度的個數),即可形成每個cell的descriptor;
6)將每幾個cell組成一個block(例如3*3個cell/block),一個block內所有cell的特徵descriptor串聯起來便得到該block的HOG特徵descriptor。
7)將影象image內的所有block的HOG特徵descriptor串聯起來就可以得到該image(你要檢測的目標)的HOG特徵descriptor了。這個就是最終的可供分類使用的特徵向量了。
具體每一步的詳細過程如下:
(1)標準化gamma空間和顏色空間
為了減少光照因素的影響,首先需要將整個影象進行規範化(歸一化)。在影象的紋理強度中,區域性的表層曝光貢獻的比重較大,所以,這種壓縮處理能夠有效地降低影象區域性的陰影和光照變化。因為顏色資訊作用不大,通常先轉化為灰度圖;
Gamma壓縮公式:
比如可以取Gamma=1/2;
(2)計算影象梯度
計算影象橫座標和縱座標方向的梯度,並據此計算每個畫素位置的梯度方向值;求導操作不僅能夠捕獲輪廓,人影和一些紋理資訊,還能進一步弱化光照的影響。
影象中畫素點(x,y)的梯度為:
最常用的方法是:首先用[-1,0,1]梯度運算元對原影象做卷積運算,得到x方向(水平方向,以向右為正方向)的梯度分量gradscalx,然後用[1,0,-1]T梯度運算元對原影象做卷積運算,得到y方向(豎直方向,以向上為正方向)的梯度分量gradscaly。然後再用以上公式計算該畫素點的梯度大小和方向。
(3)為每個細胞單元構建梯度方向直方圖
第三步的目的是為區域性影象區域提供一個編碼,同時能夠保持對影象中人體物件的姿勢和外觀的弱敏感性。
我們將影象分成若干個“單元格cell”,例如每個cell為6*6個畫素。假設我們採用9個bin的直方圖來統計這6*6個畫素的梯度資訊。也就是將cell的梯度方向360度分成9個方向塊,如圖所示:例如:如果這個畫素的梯度方向是20-40度,直方圖第2個bin的計數就加一,這樣,對cell內每個畫素用梯度方向在直方圖中進行加權投影(對映到固定的角度範圍),就可以得到這個cell的梯度方向直方圖了,就是該cell對應的9維特徵向量(因為有9個bin)。
畫素梯度方向用到了,那麼梯度大小呢?梯度大小就是作為投影的權值的。例如說:這個畫素的梯度方向是20-40度,然後它的梯度大小是2(假設啊),那麼直方圖第2個bin的計數就不是加一了,而是加二(假設啊)。
細胞單元可以是矩形的(rectangular),也可以是星形的(radial)。
(4)把細胞單元組合成大的塊(block),塊內歸一化梯度直方圖
由於區域性光照的變化以及前景-背景對比度的變化,使得梯度強度的變化範圍非常大。這就需要對梯度強度做歸一化。歸一化能夠進一步地對光照、陰影和邊緣進行壓縮。
作者採取的辦法是:把各個細胞單元組合成大的、空間上連通的區間(blocks)。這樣,一個block內所有cell的特徵向量串聯起來便得到該block的HOG特徵。這些區間是互有重疊的,這就意味著:每一個單元格的特徵會以不同的結果多次出現在最後的特徵向量中。我們將歸一化之後的塊描述符(向量)就稱之為HOG描述符。
區間有兩個主要的幾何形狀——矩形區間(R-HOG)和環形區間(C-HOG)。R-HOG區間大體上是一些方形的格子,它可以有三個引數來表徵:每個區間中細胞單元的數目、每個細胞單元中畫素點的數目、每個細胞的直方圖通道數目。
例如:行人檢測的最佳引數設定是:3×3細胞/區間、6×6畫素/細胞、9個直方圖通道。則一塊的特徵數為:3*3*9;
(5)收集HOG特徵
最後一步就是將檢測視窗中所有重疊的塊進行HOG特徵的收集,並將它們結合成最終的特徵向量供分類使用。
(6)那麼一個影象的HOG特徵維數是多少呢?
順便做個總結:Dalal提出的Hog特徵提取的過程:把樣本影象分割為若干個畫素的單元(cell),把梯度方向平均劃分為9個區間(bin),在每個單元裡面對所有畫素的梯度方向在各個方向區間進行直方圖統計,得到一個9維的特徵向量,每相鄰的4個單元構成一個塊(block),把一個塊內的特徵向量聯起來得到36維的特徵向量,用塊對樣本影象進行掃描,掃描步長為一個單元。最後將所有塊的特徵串聯起來,就得到了人體的特徵。例如,對於64*128的影象而言,每8*8的畫素組成一個cell,每2*2個cell組成一個塊,因為每個cell有9個特徵,所以每個塊內有4*9=36個特徵,以8個畫素為步長,那麼,水平方向將有7個掃描視窗,垂直方向將有15個掃描視窗。也就是說,64*128的圖片,總共有36*7*15=3780個特徵。
HOG維數,16×16畫素組成的block,8x8畫素的cell
註釋:
行人檢測HOG+SVM
總體思路:
1、提取正負樣本hog特徵
2、投入svm分類器訓練,得到model
3、由model生成檢測子
4、利用檢測子檢測負樣本,得到hardexample
5、提取hardexample的hog特徵並結合第一步中的特徵一起投入訓練,得到最終檢測子。
深入研究hog演算法原理:
一、hog概述
hog是05年一位nb的博士提出來的,論文連結 http://wenku.baidu.com/view/676f2351f01dc281e53af0b2.html 三、演算法理解
終於到10月了,終於可以鬆一口氣了,整理一下hog的演算法流程。 首先要有一個整體的認識,每一個目標都對應一個一維特徵向量,這個向量一共有n維,這個n不是憑空瞎猜的,是有理有據,打個比方,為什麼opencv自帶的hog檢測子是3781維的?這個問題在初期確實比較頭疼,糾結了好長的時間,不過彆著急, 我們先來看一下opencv裡的HOGDescriptor這個結構的建構函式HOGDescriptor(Size winSize,Size blocksize,Size blockStride,Size cellSize,...(後面的引數在這裡用不到)),去查一下opencv預設的引數我們可以看到,winSize(64,128),blockSize(16,16),blockStride(8,8),cellSize(8,8),很顯然hog是將一個特徵視窗win劃分為很多的塊block,在每一個塊裡又劃分為很多的細胞單元cell(即胞元),hog特徵向量既是把這些所有的cell對應的小特徵串起來得到一個高維的特徵向量,那麼這個視窗對應的一維特徵向量維數n就等於視窗中的塊數 x 塊中的胞元數 x 每一個胞元對應的特徵向量數。 寫到這裡,我們計算一下3781如何得到的,視窗大小64x128,塊大小16x16,塊步長8x8,那麼視窗中塊的數目是((64-16)/8+1)*((128-16)/8+1) = 7*15 =105個塊,塊大小為16x16,胞元大小為8x8,那麼一個塊中的胞元cell數目是 (16/8)*(16/8) =4個胞元,到這裡我們可以看到要求最後需要的維數n,只需要計算每一個胞元對應的向量,這個引數在哪呢?別急,我們把每一個胞元投影到9個bin(如何投影?這裡卡了很長一段時間,後面會說),那麼每一個胞元對應的向量就是9維,每個bin對應該9維向量的一個數,現在看一下是不是計算視窗維數的三個需求量都知道了,n = 視窗中的塊數 x 塊中的胞元數 x 每一個胞元對應的特徵向量數,帶入看一下n= 105x4x9 = 3780,這就是這個視窗對應的特徵了。有人會說,為什麼opencv裡的getDefaultPeopleDetector()得到的是3781維呢?這是因為另外一維是一維偏移,(很崩潰是吧,我也崩潰很久。。。,下一段解釋)。 我們利用hog+svm檢測行人,最終的檢測方法是最基本的線性判別函式,wx + b = 0,剛才所求的3780維向量其實就是w,而加了一維的b就形成了opencv預設的3781維檢測運算元,而檢測分為train和test兩部分,在train期間我們需要提取一些列訓練樣本的hog特徵使用svm訓練最終的目的是為了得到我們檢測的w以及b,在test期間提取待檢測目標的hog特徵x,帶入方程是不是就能進行判別了呢? ************************************************************************************************** 華麗的分割線 寫到這裡,至少對hog的運作流程有了一個大概的認識,在網上能看到很多的hog計算方法,神馬歸一化,計算梯度,對每個胞元進行投影,千篇一律,對剛開始接觸的人來說,看完好像懂了,但就是不知道怎麼用,hog和svm如何配合,而且那些東西對我們的初期的學期完全沒用,好處就是會用hog了,再回過頭去看原理,才有收穫,那些資料網上一堆,這裡就不畫蛇添足了。 另外值得一提的是在計算胞元特徵的時候,需要向各個bin投影,這個投影裡面大有文章,師兄畢業論文裡就提到了,取名叫‘三維一次線性插值’,如果想深入瞭解hog的可以仔細琢磨去。 ************************************************************************************************** 繼續華麗的分割 下面說一下libsvm和CvSVM的使用,我覺得libsvm更好用,不過cvsvm也是基於libsvm2.6(沒記錯的話)改寫的,這兩個的區別就是libsvm訓練得到的是一個model,而cvsvm是xml檔案,在計算最後的wx+b=0中的w向量的時候,對於libsvm直接處理model檔案即可,但是對於cvsvm則可以跳過產生xml檔案,直接使用cvsvm的物件中的屬性即可(這裡說的有點模糊,二者選一個即可,關係倒不是很大) 歡迎大家批評指正、交流學習
相關推薦
目標檢測的影象特徵提取 HOG特徵
方向梯度直方圖(Histogram of Oriented Gradient, HOG)特徵是一種在計算機視覺和影象處理中用來進行物體檢測的特徵描述子。它通過計算和統計影象區域性區域的梯度方向直方圖來構成特徵。Hog特徵結合SVM分類器已經被廣泛應用於影象識別中,尤其在行人檢測中獲得了極大的成
影象處理之特徵提取-ORP特徵匹配
1、演算法介紹 ORB(Oriented FAST and Rotated BRIEF)是一種快速特徵點提取和描述的演算法。ORB演算法分為兩部分,分別是特徵點提取和特徵點描述。 特徵提取是由FAST(Features from Accelerated Segment
人臉檢測(1)——HOG特徵
一、概述 前面一個系列,我們對車牌識別的相關技術進行了研究,但是車牌識別相對來說還是比較簡單的,後續本人會對人臉檢測、人臉識別,人臉姿態估計和人眼識別做一定的學習和研究。其中人臉檢測相對來說比較簡單,譬如Dlib庫中直接封裝了現成的庫函式 frontal_face_detector 供相關人員使用,但是D
提取HOG特徵訓練SVM分類器(一)HOG篇
利用hog特徵訓練svm分類器的總體思路:1、提取正負樣本hog特徵 2、投入svm分類器訓練,得到model3、由model生成檢測子4、利用檢測子檢測負樣本,得到hardexample 5、提取hardexample的hog特徵並結合第一步中的特徵一起投入訓練,得到最終
Dlib提取Hog特徵
效果如圖… 關鍵點: 1.設定cell大小 2.其他的看程式碼 3.Dlib配置見: 地址 程式碼: #include <dlib/gui_widgets.h> #include <dlib/image_io.h> #include
pytorch 目標檢測 影象預處理
Faster RCNN 和Retinanet在將影象資料輸送到網路之前,要對影象資料進行預處理。大致上與部落格提到的相同。 事實上還可以採取第三步,將圖片的寬和高擴充套件為32的整倍數,正如在Retinanet使用的。下面是一個簡單的Pytorch資料預處理模組: class Resizer():
特徵提取、特徵描述、特徵匹配的通俗解釋
特徵匹配(Feature Match)是計算機視覺中很多應用的基礎,比如說影象配準,攝像機跟蹤,三維重建,物體識別,人臉識別,所以花一些時間去深入理解這個概念是不為過的。本文希望通過一種通俗易懂的方式來闡述特徵匹配這個過程,以及在過程中遇到的一些問題。 首先我通過幾張圖片來
目標檢測+影象分割專案
【深度學習:目標檢測】RCNN學習筆記(10):SSD:Single Shot MultiBox Detector 2016年10月06日 19:00:10 蓀蓀 閱讀數:40730更多 之前一直想總結下SSD,奈何時間緣故一直沒有整理,在我的認知當中,S
使用TensorFlow進行特徵提取(中層特徵)以及mat檔案轉為tfrecord方法
在學習TensorFlow這個Google公司的神器一年之後,因為課題的需求,需要提取卷積神經網路的某一層的特徵,也就是我們所說的中層特徵,似乎中文網站沒有關於這方面的介紹,在經過摸索之後,終於搞清楚了流程,給大家分享一下。 我的GitHub地址是https://githu
機器學習中的特徵提取與特徵轉換 [將線性不可分轉換為線性可分]
機器學習中,神經網路是如何將線性不可分的樣本,進行很好的分類的? 如上圖所示,左圖中的藍色的圓圈和紅色的叉叉是線性不可分的。 如上圖中右圖所示,我們發現它們是可以被一個圓分開的。假設黑色圓圈的公式為: x1^2 + x2^2 + 0.6 = 0,則可以使用如下公式將藍色的圓圈和紅色
特徵提取,特徵選擇,降維
特徵提取就是將機器學習演算法不理解的原始資料抽取特徵出來,這些特徵可以描述原始的資料,使得這些特徵可以被機器學習演算法所理解,這些特徵也就作為機器學習演算法的輸入。在machine learning中,
【目標檢測】基於SVM+HoG目標檢測
最近正在做一個基於目標檢測的專案,裡面涉及到行人檢測、跟蹤,這裡記錄專案歷程,以備後期研習。 【00】前言 巴拉巴拉---在做這個之前,看的論文也比較少,主要是百度、必應一些關鍵詞 行
Opencv之二幀差法運動目標檢測與輪廓提取
Opencv學習之——二幀差法運動目標檢測與輪廓提取 這是我的第一篇CSDN博文。 程式碼是從網上摘抄學習的,加了好多註釋,感覺就像邊看書邊做筆記一樣,給人以滿足的享受。Let’s do this! #include "highgui.h" #incl
目標檢測的影象特徵提取之(四)OpenCV中BLOB特徵提取與幾何形狀分類
OpenCV中BLOB特徵提取與幾何形狀分類一:方法二值影象幾何形狀提取與分離,是機器視覺中重點之一,在CT影象分析與機器人視覺感知等領域應用廣泛,OpenCV中提供了一個對二值影象幾何特徵描述與分析最有效的工具 - SimpleBlobDetector類,使用它可以實現對二
關於影象目標檢測的HOG\LBP\Harr特徵的部落格
不知道部落格主人讓不讓轉載呢,所以這裡只給出部落格的連結。以後用得上。 目標檢測的影象特徵提取之(一)HOG特徵 http://blog.csdn.net/zouxy09/article/details/7929348 目標檢測的影象特徵提取之(二)LBP特徵
目標檢測的影象特徵提取之(三)Haar特徵+積分圖+盒式濾波器Box Filter
原文http://blog.csdn.net/zouxy09/article/details/7929570 (Haar-like特徵值無非就是兩個矩陣畫素和的差,同樣可以在常數時間內完成。所以矩形特徵的特徵值計算,只與此特徵矩形的端點的積分圖有關,所以不管
OpenCV之影象特徵提取與檢測(十) HOG特徵檢測
用於人像的識別,動物識別。需要提前錄入訓練資料,才能進行對比識別,OpenCV中已經錄入了行人的訓練資料 HOG(Histogram of Oriented Gradient)特徵描述子提取: 灰
python進階之目標檢測的影象特徵提取之Haar特徵
目標檢測的影象特徵提取之(三)Haar特徵 1、Haar-like特徵 Haar-like特徵最早是由Papageorgiou等應用於人臉表示,Viola和Jones在此基礎上,使用3種類型4種形式的特徵。 Haar特徵分為三類:邊緣特徵、線性特徵、
影象處理之特徵提取(一)之HOG特徵 特徵數的計算
對於64128的影象而言,每88的畫素組成一個cell,每22個cell組成一個塊,也就是說,64128的圖片,總共有36715=3780個特徵。 單個cell的9個特徵,每個block(掃描視窗)包含22個cell也就是229=36個特徵,一個64128大小的
影象處理之特徵提取(一):HOG特徵
HOG方向梯度直方圖: (1)具體在HOG中方向梯度的實現:首先用[-1,0,1]梯度運算元對原影象做卷積運算,得到x方向(水平方向,以向右為正方向)的梯度分量gradscalx,然後用[1,0,-1]T梯度運算元對原影象做卷積運算,得到y方向(豎直方向,以向上為正方向)的