1. 程式人生 > >【特徵檢測】HOG特徵演算法

【特徵檢測】HOG特徵演算法

簡介

        HOGHistogram of Oriented Gridients的簡寫)特徵檢測演算法,最早是由法國研究員Dalal等在CVPR-2005上提出來的,一種解決人體目標檢測的影象描述子,是一種用於表徵影象區域性梯度方向和梯度強度分佈特性的描述符。其主要思想是:在邊緣具體位置未知的情況下,邊緣方向的分佈也可以很好的表示行人目標的外形輪廓。

        Dalal等提出的HOG+SVM演算法,在進行行人檢測取得了極大地成功後,更多新演算法不斷湧現,不過大都是以HOG+SVM的思路為主線。

HOG特徵演算法

        HOG特徵檢測演算法的幾個步驟:顏色空間歸一化—>梯度計算

—>梯度方向直方圖—>重疊塊直方圖歸一化—>HOG特徵。下面分別對其進行介紹。

1、顏色空間歸一化

        由於影象的採集環境、裝置等因素,採集到的人臉影象效果可能不是很好,容易出現誤檢或漏檢的情況,所以需要對採集到的人臉進行影象預處理,主要是處理光線太暗或太強的情況,這裡有兩次處理:影象灰度化、Gamma校正。

①影象灰度化

       對於彩色影象,將RGB分量轉化成灰度影象,其轉化公式為:


②Gamma校正

       在影象照度不均勻的情況下,可以通過Gamma校正,將影象整體亮度提高或降低。在實際中可以採用兩種不同的方式進行Gamma標準化,平方根、對數法。這裡我們採用平方根的辦法,公式如下(其中γ=0.5

):


程式碼:

int main()
{
	Mat picture = imread("test.jpg", 0);//灰度
	Mat img;
	picture.convertTo(img, CV_32F);	//轉換成浮點
	sqrt(img, img);					//gamma校正
	normalize(img, img, 0, 255, NORM_MINMAX, CV_8UC1);//歸一化畫素值[0,255]
	imshow("原圖", picture);
	imshow("Gamma校正", img);
	waitKey();

	return 0;
}

結果:


2、梯度計算

對經過顏色空間歸一化後的影象,求取其梯度及梯度方向。分別在水平和垂直方向進行計算,梯度運算元為:


程式碼:

/*****************************************
Copyright (c) 2015 Jingshuang Hu

@filename:demo.cpp
@datetime:2015.08.06
@author:HJS
@e-mail:[email protected]
@blog:http://blog.csdn.net/hujingshuang
*****************************************/

#include <iostream>
#include <cv.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace cv;
using namespace std;

int main()
{
	Mat picture = imread("test.jpg", 0);//灰度
	Mat img;

	picture.convertTo(img, CV_32F);	//轉換成浮點
	sqrt(img, img);					//gamma校正
	normalize(img, img, 0, 255, NORM_MINMAX, CV_32F);//歸一化[0,255]浮點數

	Mat gradient = Mat::zeros(img.rows, img.cols, CV_32F);//梯度
	Mat theta = Mat::zeros(img.rows, img.cols, CV_32F);//角度

	for (int i = 1; i < img.rows - 1; i++)
	{
		for (int j = 1; j < img.cols - 1; j++)
		{
			float Gx, Gy;

			Gx = img.at<float>(i, j + 1) - img.at<float>(i, j - 1);
			Gy = img.at<float>(i + 1, j) - img.at<float>(i - 1, j);

			gradient.at<float>(i, j) = sqrt(Gx * Gx + Gy * Gy);//梯度模值
			theta.at<float>(i, j) = float(atan2(Gy, Gx) * 180 / CV_PI);//梯度方向[-180°,180°]
		}
	}

	normalize(gradient, gradient, 0, 255, NORM_MINMAX, CV_8UC1);//歸一化[0,255] 無符號整型
	normalize(img, img, 0, 255, NORM_MINMAX, CV_8UC1);

	imshow("原圖", picture);
	imshow("Gamma校正", img);
	imshow("梯度圖", gradient);
	waitKey();

    return 0;
}

結果:

3、梯度方向直方圖

        將影象劃分成若干個cells(單元),8x8=64個畫素為一個cell相鄰的cell之間不重疊。在每個cell內統計梯度方向直方圖,將所有梯度方向劃分為9bin(即9維特徵向量),作為直方圖的橫軸,角度範圍所對應的梯度值累加值作為直方圖縱軸,每個bin的角度範圍如下。


4、重疊塊直方圖歸一化

        以下有關計算,請認真分析假設有一幅影象大小為220x310,將其劃分成若干個8x8cells,顯然220÷8=27.5、310÷8=38.75不是整數,也就是說劃分之後依然還有多餘畫素不能構成cell。處理辦法是將影象縮放成能被8整除的長寬(如216x304),再劃分。216÷8=27304÷8=38,因此,216x304的影象可以得到27x38cells,沒有重疊。

Mat picture = imread("test.jpg", 0);//灰度
resize(picture, picture, cvSize(int(picture.cols / 8) * 8, int(picture.rows / 8) * 8));//轉化成能被8除盡的行、列
        由於影象中光照情況和背景的變化多樣,梯度值的變化範圍會比較大,因而良好的特徵標準化對於檢測率的提高相當重要。標準化的方法多種多樣,大多數的都是將celll放在block中,然後標準化每個block

        以上述縮放後的影象為例,共得到27x38cell,也就是將影象劃分成了27x38個單元;將上下左右相鄰的2x2cells當做一個block整體,如下所示(為方便觀察,每個顏色框故意錯開了一點),黑色8x8畫素為一個cell粉紅框都是一個block,即每個框內2x2cell組成一個block。故27x38cell可劃分成26x37block,每個block16x16畫素。相鄰block之間是有重疊的,這樣有效的利用了相鄰畫素資訊,對檢測結果有很大的幫助。


接下分別對每個block進行標準化,一個block內有4cell,每個cell9維特徵向量,故每個block就由4x9=36維特徵向量來表徵。


由於L2-norm簡單且在檢測中效果相對較好,故一般採用它。

        經過上述對有重疊部分block的直方圖歸一化之後,將所有block的特徵向量都組合起來,則形成26x37x36=34632維特徵向量,這就是HOG特徵,這個特徵向量就可以用來表徵整個影象了。

        實際上,在運用的時候,我們通常是選取一幅影象中的一個視窗來進行特徵提取,依然以上述220X310大小影象為例,經過縮放處理後為216x304,但並不直接提取整個影象的HOG特徵,而是用一個固定大小的視窗在影象上滑動,滑動的間隔為8個畫素,opencv中預設的視窗大小為128x64(高128,寬64),即有(128÷8)x(64÷8)=16x8cell,也即有15x7block,這樣一來一幅影象就可以取到(27-16)x(38-8)=11x30=330(27-15)x(38-7)=12x31=372個視窗(更正於:2018-04-15)。現在提取每個視窗的HOG特徵,則可得到105x36=3780HOG特徵向量。

        將這3303780維的HOG特徵當做測試樣本,用支援向量機(SVM)分類器來判別出,這些視窗的HOG特徵是否有行人,有行人的用矩形框標記起來。HOG行人特徵及所對應的SVM分類器的引數,在opencv中已經訓練好了,我們只需要得到HOG特徵,然後呼叫SVM即可得到判別結果。

以上是個人對HOG演算法的理解,若理解不到位或者有誤的,請多多指教!

程式碼:

/*****************************************
Copyright (c) 2015 Jingshuang Hu

@filename:demo.cpp
@datetime:2015.08.06
@author:HJS
@e-mail:[email protected]
@blog:http://blog.csdn.net/hujingshuang
*****************************************/

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
	Mat image = imread("test.jpg");
	// 1. 定義HOG物件
	HOGDescriptor hog(Size(64,128),Size(16,16),Size(8,8),Size(8,8),9);//HOG檢測器,用來計算HOG描述子的
	// 2. 設定SVM分類器
	hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());   // 採用已經訓練好的行人檢測分類器
	// 3. 在測試影象上檢測行人區域
	vector<cv::Rect> regions;
	hog.detectMultiScale(image, regions, 0, Size(8,8), Size(32,32), 1.05, 1);
	// 顯示
	for (size_t i = 0; i < regions.size(); i++)
	{
		rectangle(image, regions[i], Scalar(0,0,255), 2);
	}
	imshow("HOG行人檢測", image);
	waitKey();

	return 0;
}

結果:



從圖中可以看出,依然是有漏檢的情況。

原始碼分析:

參考資料:

3、基於多特徵的粒子濾波行人跟蹤演算法研究[M],張廣西,2013.

4、基於HOG特徵的人臉識別系統研究[M],穆春雷,2013.

5、基於HOG特徵的目標識別演算法研究[M],尚俊,2012.

相關推薦

特徵檢測HOG特徵演算法

簡介        HOG(Histogram of Oriented Gridients的簡寫)特徵檢測演算法,最早是由法國研究員Dalal等在CVPR-2005上提出來的,一種解決人體目標檢測的影象

目標檢測HOG特徵學習記錄

HOG特徵即方向梯度直方圖(Histgram of Oriented,HOG),最初是用來檢測行人的特徵描述子,現在也廣泛用於計算機視覺和影象處理中進行物體檢測。 通過計算和統計影象區域性區域的梯度方向直方圖來構成特徵。 影象的梯度主要存在於物體的邊緣,而區域性目標和

特徵檢測ORB特徵提取演算法

簡介         ORB的全稱是ORiented Brief,是文章ORB: an efficient alternative to SIFT or SURF中提出的一種新的角點檢測與特徵描述演算

特徵檢測BRISK特徵提取演算法

// construct the image pyramids(構造影象金字塔) void BriskScaleSpace::constructPyramid(const cv::Mat& image) { // set correct size: pyramid_.clear();

特徵檢測FAST特徵檢測演算法

簡介        在區域性特徵點檢測快速發展的時候,人們對於特徵的認識也越來越深入,近幾年來許多學者提出了許許多多的特徵檢測演算法及其改進演算法,在眾多的特徵提取演算法中,不乏湧現出佼佼者。     

目標檢測LBP特徵學習記錄

LBP(Local Binary Patterns,區域性二值模式)是用來描述影象區域性紋理特徵的描述子。它最早在1994年被提出,2002年由作者整理和改進後重新發表。 T為影象的區域性紋理,將其表示為: 其中,gc是中心點的灰度值,gp(p=0,...,P-1)是

目標檢測SIFT特徵學習記錄

一、生成尺度空間 尺度空間定義為 其中I(x,y)是輸入影象,*是卷積運算,可變尺度的高斯函式 二維高斯函式畫出來是下面這樣的, 卷積過程是在影象上進行滑窗,核函式和影象點乘相加。 1.1 建立高斯金字塔LOG 首先對影象做降取樣,根據不同的降

目標檢測FAST特徵學習記錄

一、FAST演算法流程 它的演算法流程是: 1. 影象中任意一點p,該點是我們要識別的是否為感興趣的點,假設其亮度為Ip; 2. 設定一個亮度閾值T; 3. 設定半徑為3,選擇p周圍的16個畫素; 4. 16個畫素中的N個相鄰畫素(作者設定N=12)的亮度小

目標檢測Faster RCNN演算法詳解

Ren, Shaoqing, et al. “Faster R-CNN: Towards real-time object detection with region proposal networks.” Advances in Neural Information P

目標檢測Fast RCNN演算法詳解

Girshick, Ross. “Fast r-cnn.” Proceedings of the IEEE International Conference on Computer Vision. 2015. 繼2014年的RCNN之後,Ross Girshick在15年

目標檢測Mask RCNN演算法詳解

1 總體架構及與faster RCNN的比較 其中黑色部分為原來的 Faster-RCNN,紅色部分為在 Faster網路上的修改,總體流程如下: 1)輸入影象; 2)將整張圖片輸入CNN,進行特徵提取; 3)用FPN生成建議視窗(propo

機器學習--SVM+Hog特徵描述進行影象分類

Hog特徵描述子作為深度學習之前比較火的人工特徵描述子,往往和svm結合應用於行人檢測等分類領域,在機器學習中仍具有比較好的應用。 具體在opencv使用步驟如下: Hog特徵的資料集與標籤資料集製作處理。 訓練svm分類器 載入分類器進行預測 手寫數字的識別是

機器學習HOG+SVM進行車輛檢測的流程及原始碼

在進行機器學習檢測車道線時,參考了這篇博文,基於LBP+SVM實現了車道線檢測的初步效果。覺得講解很到位,程式碼也容易理解和修改,故在此分享,供更多人學習。原地址:https://www.cnblogs.com/louyihang-loves-baiyan/p/4658478.html HOG

學習筆記合成特徵與離群值

Dataset庫我還有問題沒有解決清楚,因此先用feed_dict方法。 首先問題1是需要我們合成特徵: 建立一個名為 rooms_per_person 的特徵。 df = pd.read_csv('california_housing_train.csv') df['

目標檢測FastRCNN演算法詳解

摘自沈曉璐 有待補充自己的理解. 繼2014的RCNN之後,推出了FastRCNN ,構思精巧,流程更為緊湊,大幅提升了目標檢測的速度。 同樣使用最大規模的網路,FastRCNN 和RCNN相比,訓練時間從84小時減少為9.5小時,測試時間從47秒,減少為

目標檢測SSD演算法--損失函式的詳解(tensorflow實現)

SSD的損失函式包含用於分類的log loss 和用於迴歸的smooth L1,並對正負樣本比例進行了控制,可以提高優化速度和訓練結果的穩定性。 總的損失函式是分類和迴歸的誤差的帶權加和。α表示兩者的權重,N表示匹配到default box的數量 1 loc的損失函式

sklearn例項4--特徵工程之離散值編碼

離散特徵 離散特徵變數型別可以分為有序類和無序類。 無序類,價值相等且可區分,沒有等級、順序、排序、好壞等邏輯關係,各變數相互獨立:性別(男/女)、顏色(赤橙黃綠青藍紫)、登機口(A/B/C); 有序類:各變數有級別大小等邏輯關係:尺碼(L/XL/XXL)、學歷(高/中/低) 為何要

目標檢測RCNN演算法詳解

Girshick, Ross, et al. “Rich feature hierarchies for accurate object detection and semantic segmentation.” Proceedings of the IE

目標檢測NMS(Non-maximum suppression,非極大值抑制)演算法

NMS廣泛應用於目標檢測演算法中。其目的是為了消除多餘的候選框,找到最佳的物體檢測位置。 現在假設有有一個候選的boxes的集合B和其對應的scores集合S: 1. 找出分數最高的M; 2. 將M對應的box從B中刪除; 3. 將刪除的box新增到集合D中;

基於深度學習的目標檢測演算法綜述

        目標檢測一直是計算機視覺的基礎問題,在 2010 年左右就開始停滯不前了。自 2013 年一篇論文的發表,目標檢測從原始的傳統手工提取特徵方法變成了基於卷積神經網路的特徵提取,從此一發不可收拾。本文將跟著歷史的潮流,簡要地探討「目標檢測」演算法的兩種思想和這些