fhog特徵講解
一、概述
前面一個系列,我們對車牌識別的相關技術進行了研究,但是車牌識別相對來說還是比較簡單的,後續本人會對人臉檢測、人臉識別,人臉姿態估計和人眼識別做一定的學習和研究。其中人臉檢測相對來說比較簡單,譬如Dlib庫中直接封裝了現成的庫函式 frontal_face_detector 供相關人員使用,但是Dlib的執行速率並不是很高,另外於仕琪老師的 libfaceDetection 庫具有較高的識別率和相對較快的執行速度,具體可以從github 上獲取 https://github.com/ShiqiYu/libfacedetection 。但是該庫並沒有提供原始碼分析,只有現成的lib庫可以直接使用。
從學習和研究的角度來說,我們還是希望能夠直接從原始碼中進行相關學習,因此此處我們通過Dlib庫程式碼解讀,來對人臉檢測的相關技術做一定的分析。Dlib是一個機器學習的C++庫,包含了許多機器學習常用的演算法,並且文件和例子都非常詳細。 Dlib官網地址: http://www.dlib.net 。下面我們通過一個簡單的例子,來看下人臉檢測是如何工作的,程式碼如下所示:
View Code如上圖所示,frontal_face_detector 將影象中所有的人臉都檢測了出來,從程式碼中也可以看到,該方法的使用過程及其簡單,當然人臉檢測的內部邏輯是極其複雜的。
二、程式碼分析
下面我們一步步跟蹤下程式碼,看看Dlib人臉檢測內部究竟是如何工作的。
object_detector
typedef object_detector<scan_fhog_pyramid<pyramid_down<6> > > frontal_face_detector;
類 frontal_face_detector 是Dlib庫中定義的,位於 “frontal_face_detector.h” 中,可以看到類 frontal_face_detector 是類 object_detector的一種特殊情況;具體關於object_detector的內容後面再詳細介紹。
定義Scanner,用於掃描圖片並提取特徵
類scan_fhog_pyramid
template <typename Pyramid_type, typename Feature_extractor_type =default_fhog_feature_extractor>
class scan_fhog_pyramid : noncopyable{...}
類模板中引數Pyramid_type表示影象金字塔的型別,本文使用的是pyramid_down<6>,表示影象金字塔進行下采樣的比率為5/6,即對原影象不斷縮小5/6,構成多級金字塔。當影象的大小小於掃描視窗大小的時候,停止下采樣。
引數 Feature_extractor_type 表示特徵提取器,預設情況下使用 "fhog.h"中的extract_fhog_feature() 提取特徵,函式原型為:
template <typename image_type, typename T, typename mm> void extract_fhog_features( const image_type& img, array2d<matrix<T,31,1>,mm>& hog, int cell_size = 8, int filter_rows_padding = 1, int filter_cols_padding = 1 ) { impl_fhog::impl_extract_fhog_features(img, hog, cell_size, filter_rows_padding, filter_cols_padding); }
此函式提取的HOG特徵來自於Felzenszwalb 版本的HOG [1] (簡稱fhog)它是對每個8*8畫素大小的cell提取31維的 fhog運算元,然後儲存到上述hog array中供後續計算使用。
HOG的發明者是Navneet Dalal,在2005年其在CVPR上發表了《Histograms of Oriented Gradients forHuman Detection》這一篇論文,HOG一戰成名。當然ND大神也就是我們經常使用的Inria資料集的締造者。其博士的畢業論文《Finding People in Images and Videos》更是HOG研究者的一手資料。
HOG演算法思想:
在計算機視覺以及數字影象處理中梯度方向直方圖(HOG)是一種能對物體進行檢測的基於形狀邊緣特徵的描述運算元,它的基本思想是利用梯度資訊能很好的反映影象目標的邊緣資訊並通過區域性梯度的大小將影象區域性的外觀和形狀特徵化。
HOG特徵的提取可以用下面過程表示: 顏色空間的歸一化是為了減少光照以及背景等因素的影響;劃分檢測視窗成大小相同的細胞單元(cell),並分別提取相應的梯度資訊;組合相鄰的細胞單元成大的相互有重疊的塊(block),這樣能有效的利用重疊的邊緣資訊,以統計整個塊的直方圖;並對每個塊內的梯度直方圖進行歸一化,從而進一步減少背景顏色及噪聲的影響;最後將整個視窗中所有塊的HOG特徵收集起來,並使用特徵向量來表示其特徵。
顏色空間歸一化:
在現實的情況,影象目標會出現在不同的環境中,光照也會有所不一樣,顏色空間歸一化就是對整幅影象的顏色資訊作歸一化處理從而減少不同光照及背景的影響,也為了提高檢測的魯棒性,引入影象Gamma和顏色空間歸一化來作為特徵提取的預處理手段。ND大神等人也對不同的影象畫素點的表達方式包括灰度空間等進行了評估,最終驗證RGB還有LAB色彩空間能使檢測結果大致相同且能起到積極的影響,且另一方面,ND大神等人在研究中分別在每個顏色通道上使用了兩種不同的Gamma歸一化方式,取平方根或者使用對數法,最終驗證這一預處理對檢測的結果幾乎沒有影響,而不能對影象進行高斯平滑處理,因平滑處理會降低影象目標邊緣資訊的辨識度,影響檢測結果。
梯度計算:
邊緣是由影象區域性特徵包括灰度、顏色和紋理的突變導致的。一幅影象中相鄰的畫素點之間變化比較少,區域變化比較平坦,則梯度幅值就會比較小,反之,則梯度幅值就會比較大。梯度在影象中對應的就是其一階導數。模擬影象f(x,y)中任一畫素點(x,y)的梯度是一個向量:
其中,Gx是沿x方向上的梯度,Gy是沿y方向上的梯度,梯度的幅值及方向角可表示如下:
數字影象中畫素點的梯度是用差分來計算的:
一維離散微分模板在將影象的梯度資訊簡單、快速且有效地計算出來,其公式如下:
式中,Gx,Gy,H(x,y)分別表示的是畫素點(x,y)在水平方向上及垂直方向上的梯度以及畫素的灰度值,其梯度的幅值及方向計算公式如下:
計算細胞單元的梯度直方圖:
對於整個目標視窗,我們需要將其分成互不重疊大小相同的細胞單元(cell),然後分別計算出每個cell的梯度資訊,包括梯度大小和梯度方向。ND大神等人實驗指出,將畫素的梯度方向在0-180°區間內平均劃分為9個bins,超過9個時不僅檢測效能沒有明顯的提高反而增加了檢測運算量, 每個cell內的畫素為其所在的梯度方向直方圖進行加權投票,加權的權值可以是畫素本身的梯度幅值,也可以是幅值的平方或平方根等,而若使用平方或平方根,實驗的檢測效能會有所降低,ND大神等人也驗證,使用梯度幅值的實驗效果更可靠。
對組合成塊的梯度直方圖作歸一化:
從梯度計算公式中可以看出,梯度幅值絕對值的大小容易受到前景與背景對比度及區域性光照的影響,要減少這種影響得到較準確的檢測效果就必須對區域性細胞單元進行歸一化處理。歸一化方法多種多樣,但整體思想基本上是一致的:將幾個細胞單元(cell)組合成更大的塊(block),這時整幅影象就可看成是待檢測視窗,將更大的塊看成是滑動視窗,依次從左到右從上到下進行滑動,得到一些有重複細胞單元的塊及一些相同細胞單元(cell)在不同塊(block)中的梯度資訊,再對這些塊(block)資訊分別作歸一化處理,不同的細胞單元尺寸大小及不同塊的尺寸大小會影響最終的檢測效果。
介紹完HOG運算元的基本概念,這邊分析下31維的 fhog運算元具體是從何而來呢?
其中,31D fhog=18D+9D+4D。
- 18D來自於對cell做18個bin的梯度方向直方圖,即將360°劃分為18個bin,然後令cell中的每個畫素根據其梯度方向加權投影到直方圖相應的bin中,這樣就得到了18維有符號的fhog梯度。
- 9D來自於對cell做9個bin的梯度方向直方圖,此時是將180°劃分為9個bin,則得到無符號的9維fhog梯度。
- 最後的4D是來自於當前cell和其對角線臨域的4個領域cell的歸一化操作。具體地,取block=2*2 cell,則得到無符號fhog梯度4*9維,將其看成矩陣做按行按列累加可得到1D特徵,4個領域則可得到4個block,共4維特徵。
最終,每個cell的31維fhog特徵就來自於上述三部分的串聯。
參考連線:http://www.360doc.com/content/13/0313/10/2036337_271200039.shtml
相關推薦
fhog特徵講解
一、概述 前面一個系列,我們對車牌識別的相關技術進行了研究,但是車牌識別相對來說還是比較簡單的,後續本人會對人臉檢測、人臉識別,人臉姿態估計和人眼識別做一定的學習和研究。其中人臉檢測相對來說比較簡單,譬如Dlib庫中直接封裝了現成的庫函式 frontal_face_detector 供相關人員使用,但是Dl
事務四大特徵講解
本篇講訴資料庫中事務的四大特性(ACID),並且將會詳細地說明事務的隔離級別。 如果一個數據庫聲稱支援事務的操作,那麼該資料庫必須要具備以下四個特性: ⑴原子性(Atomicity) 原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,這和前面兩篇部落格介紹事務的功能
CNN入門講解:卷積層是如何提取特徵的?
各位看官老爺們 好久不見 這裡是波波給大家帶來的CNN卷積神經網路入門講解 每週我將給大家帶來絕對原創,腦洞大開,幽默風趣的深度學習知識點入門講解 希望大家多多支援,多多關注 本人微信公眾號:follow_b
FPN(feature pyramid networks)特徵金字塔網路 演算法講解
轉自:https://blog.csdn.net/u014380165/article/details/72890275/ 這篇論文是CVPR2017年的文章,採用特徵金字塔做目標檢測,有許多亮點,特來分享。 論文:feature pyramid networks for object de
機器學習入門講解:什麼是特徵和特徵選擇
首先我們來看看中文字典裡是怎麼解釋特徵的:一事物異於其他事物的特點。 那我們再來看看英文字典裡是怎麼解釋feature的:A feature of something is an interesting or important part or characteristic of it.
2.3 基於寬度優先搜索的網頁爬蟲原理講解
什麽 每一個 empty 目錄 except open 要求 and ref 上一節我們下載並使用了寬度優先的爬蟲,這一節我們來具體看一下這個爬蟲的原理。 首先,查看HTML.py的源代碼。 第一個函數: def get_html(url): try:
實例講解webpack的基本使用第二篇
文件的 分享 fig .com size 如何 try 基本 bpa 這一篇來講解一下如何設置webpack的配置文件webpack.config.js 我們新建一個webpack-demo的項目文件夾,然後安裝webpack 執行如下命令 在項目文件夾下,
HTTP結構講解——《HTTP權威指南》系列
expire 本地 發布者 步驟 ont 資源 都是 comm pid HTTP結構 第二部分的5章主要介紹了HTTP服務器,代理,緩存,網關和機器人應用程序,這些都是Web系統架構的構造模塊。 Web服務器 第五章 Web服務器會對HTTP請求進行處理並提供響應。術語"w
實例講解webpack的基本使用第三篇
ont conf logs .config 結合 pac sta 現在 fig 這一篇來講解一下webpack的htmlWebpackHtml插件的使用。 先來思考一個實際問題:我們現在在index.html引用的js文件是寫死的。但是我們每次打包後的文件都是動態的,那麽
SQL註入原理講解及防範
ant htm part 無效 快樂 日常 field users lib 原文地址:http://www.cnblogs.com/rush/archive/2011/12/31/2309203.html 1.1.1 摘要 日前,國內最大的程序員社區CSDN網站
實例講解webpack的基本使用第四篇
load prefix fig 圖片 onf com 引用 下載 基本 這一篇來講解一下webpack的loader的使用,用webpack打包文件,css,img,icon等都需要下載安裝對應的loader文件,並且寫好配置項,才可以進行打包,廢話不多說,直接開始實戰。
樹講解(2)——樹的輸入,重心,直徑
str 樹的直徑 names n) ostream push main define span one.樹的輸入 1.輸入每個節點父親節點的編號 #include<vector> #include<stdio.h> #include<
樹講解(6)——讓我們異或吧
!= 情侶 rst back cst getch 能夠 代碼 st表 洛谷——P2420 讓我們異或吧 題目描述 異或是一種神奇的運算,大部分人把它總結成不進位加法. 在生活中…xor運算也很常見。比如,對於一個問題的回答,是為1
樹講解(7)——沒有上司的舞會
一個 哪些 們的 一定的 如果 參加 大學 增加 計算 題目描述 某大學有N個職員,編號為1~N。他們之間有從屬關系,也就是說他們的關系就像一棵以校長為根的樹,父結點就是子結點的直接上司。現在有個周年慶宴會,宴會每邀請來一個職員都會增加一定的快樂指數Ri,但是呢,如
vue實例講解之axios的使用
bsp 目錄 引入 .proto 拓展 技術 調用 地址 import 本篇來講解一下axios插件的使用,axios是用來做數據交互的插件。 這篇將基於vue實例講解之vue-router的使用這個項目的源碼進行拓展。 axios的使用步驟: 1.安裝axios n
[iOS]關於 App 混合(Hybrid)開發的優化,包括H5、Weex等(本篇博客主要針對 iOS 應用講解,但該思想同樣適用於Android)
color 數據 後臺 lib 新版 生成 下載地址 代碼 版本 我們知道混合開發,可以節省很多成本(時間成本,經濟成本等等),所以有很多公司比較鐘愛這種開發形式,今天所講的優化方式,也是我在我們公司的應用中實際用了的,而且我寫的這個優化的 SDK 已經開源到 gith
樹講解——牧場行走( lca )
dfs ++ turn www col 整數 string pan mem 大視野 1602: [Usaco2008 Oct]牧場行走 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1947 Solved: 1021
C# 泛型的簡單講解和應用
出現 ava 問題 this bsp div arc 但是 int 泛型 什麽是泛型 泛型是 2.0 版 C# 語言和公共語言運行庫 (CLR) 中的一個新功能。泛型將類型參數的概念引入 .NET Framework,類型參數使得設計如下類和方法成為可能:這些類和方
Servlet之Filter詳細講解
卸載 response n) 被調用 指定 負責 傳遞 isp quest web.xml中元素執行的順序listener->filter->struts攔截器->servlet。 Java中的Filter過濾器 Filter簡介 Java中的Fil
火柴排隊(NOIP2013)(附樹狀數組專題講解(其實只是粗略。。。))
blog 規律 混亂 ace urn ets gets value update 原題傳送門。。(9018上不去。明天再來搞。) 首先,這道題目是一道神奇的題。 看到這道題,第一眼就覺得2個數組排個序,然後一一對應的時候一定差值最小。 由於我們可以將這2個數列同時進行調換。