<label id="jgr5k"></label>
    <legend id="jgr5k"><track id="jgr5k"></track></legend>

    <sub id="jgr5k"></sub>
  1. <u id="jgr5k"></u>
      久草国产视频,91资源总站,在线免费看AV,丁香婷婷社区,久久精品99久久久久久久久,色天使av,无码探花,香蕉av在线
      您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號安全和更好的產(chǎn)品體驗,強烈建議使用更快更安全的瀏覽器
      此為臨時鏈接,僅用于文章預(yù)覽,將在時失效
      人工智能開發(fā)者 正文
      發(fā)私信給汪思穎
      發(fā)送

      3

      圖像學(xué)習(xí)之如何理解方向梯度直方圖(Histogram Of Gradient)

      本文作者: 汪思穎 2017-08-18 19:01
      導(dǎo)語:本文講述了如何計算方向梯度直方圖

      雷鋒網(wǎng)按:本文作者Slyne_D,原文載于作者的簡書主頁,雷鋒網(wǎng)經(jīng)授權(quán)發(fā)布。

      本文主要翻譯了Histogram of Oriented Gradients一文。

      特征描述子(Feature Descriptor)

      特征描述子就是圖像的表示,抽取了有用的信息,丟掉了不相關(guān)的信息。通常特征描述子會把一個w*h*3(寬高3,3個channel)的圖像轉(zhuǎn)換成一個長度為n的向量/矩陣。比如一副64*128*3的圖像,經(jīng)過轉(zhuǎn)換后輸出的圖像向量長度可以是3780。

      什么樣子的特征是有用的呢?假設(shè)我們想要預(yù)測一張圖片里面衣服上面的扣子,扣子通常是圓的,而且上面有幾個洞,那你就可以用邊緣檢測(edge detector),把圖片變成只有邊緣的圖像,然后就可以很容易的分辨了,那么對于這張圖邊緣信息就是有用的,顏色信息就是沒有用的。而且好的特征應(yīng)該能夠區(qū)分紐扣和其它圓形的東西的區(qū)別。

      方向梯度直方圖(HOG)中,梯度的方向分布被用作特征。沿著一張圖片X和Y軸的方向上的梯度是很有用的,因為在邊緣和角點的梯度值是很大的,我們知道邊緣和角點包含了很多物體的形狀信息。

      (HOG特征描述子可以不局限于一個長度,也可以用很多其他的長度,這里只記錄一種計算方法。)

      怎么計算方向梯度直方圖呢?

      我們會先用圖像的一個patch來解釋。

      第一步:預(yù)處理

      Patch可以是任意的尺寸,但是有一個固定的比例,比如當(dāng)patch長寬比1:2,那patch大小可以是100*200, 128*256或者1000*2000但不可以是101*205。

      這里有張圖是720*475的,我們選100*200大小的patch來計算HOG特征,把這個patch從圖片里面摳出來,然后再把大小調(diào)整成64*128。

      圖像學(xué)習(xí)之如何理解方向梯度直方圖(Histogram Of Gradient)

      hog_preprocess

      第二步:計算梯度圖像

      首先我們計算水平和垂直方向的梯度,再來計算梯度的直方圖。可以用下面的兩個kernel來計算,也可以直接用OpenCV里面的kernel大小為1的Sobel算子來計算。

      圖像學(xué)習(xí)之如何理解方向梯度直方圖(Histogram Of Gradient)

      horizontal_vertical_gradient_kernel

      調(diào)用OpenCV代碼如下:

      // C++ gradient calculation.
      // Read image
      Mat img = imread("bolt.png");
      img.convertTo(img, CV_32F, 1/255.0);

      // Calculate gradients gx, gy
      Mat gx, gy;
      Sobel(img, gx, CV_32F, 1, 0, 1);
      Sobel(img, gy, CV_32F, 0, 1, 1);

      # Python gradient calculation 

      # Read imageim = cv2.imread('bolt.png')
      im = np.float32(im) / 255.0

      # Calculate gradient
      gx = cv2.Sobel(img, cv2.CV_32F, 1, 0, ksize=1)
      gy = cv2.Sobel(img, cv2.CV_32F, 0, 1, ksize=1)

      接著,用下面的公式來計算梯度的幅值g和方向theta:

      圖像學(xué)習(xí)之如何理解方向梯度直方圖(Histogram Of Gradient)

      gradient_direction_formula

      可以用OpenCV的cartToPolar函數(shù)來計算:

      // C++ Calculate gradient magnitude and direction (in degrees)
      Mat mag, angle;
      cartToPolar(gx, gy, mag, angle, 1);

      # Python Calculate gradient magnitude and direction ( in degrees )
      mag, angle = cv2.cartToPolar(gx, gy, angleInDegrees=True)

      計算得到的gradient圖如下:

      圖像學(xué)習(xí)之如何理解方向梯度直方圖(Histogram Of Gradient)

      左邊:x軸的梯度絕對值 中間:y軸的梯度絕對值 右邊:梯度幅值

      從上面的圖像中可以看到x軸方向的梯度主要凸顯了垂直方向的線條,y軸方向的梯度凸顯了水平方向的梯度,梯度幅值凸顯了像素值有劇烈變化的地方。(注意:圖像的原點是圖片的左上角,x軸是水平的,y軸是垂直的)

      圖像的梯度去掉了很多不必要的信息(比如不變的背景色),加重了輪廓。換句話說,你可以從梯度的圖像中輕而易舉的發(fā)現(xiàn)有個人。

      在每個像素點,都有一個幅值(magnitude)和方向,對于有顏色的圖片,會在三個channel上都計算梯度。那么相應(yīng)的幅值就是三個channel上最大的幅值,角度(方向)是最大幅值所對應(yīng)的角。

      第三步:在8*8的網(wǎng)格中計算梯度直方圖

      在這一步,上面的patch圖像會被分割成8*8大小的網(wǎng)格(如下圖),每個網(wǎng)格都會計算一個梯度直方圖。那為什么要分成8*8的呢?用特征描述子的一個主要原因是它提供了一個緊湊(compact)/壓縮的表示。一個8*8的圖像有8*8*3=192個像素值,每個像素有兩個值(幅值magnitude和方向direction,三個channel取最大magnitude那個),加起來就是8*8*2=128,后面我們會看到這128個數(shù)如何用一個9個bin的直方圖來表示成9個數(shù)的數(shù)組。不僅僅是可以有緊湊的表示,用直方圖來表示一個patch也可以更加抗噪,一個gradient可能會有噪音,但是用直方圖來表示后就不會對噪音那么敏感了。

      圖像學(xué)習(xí)之如何理解方向梯度直方圖(Histogram Of Gradient)

      這個patch的大小是64*128,分割成8*8的cell,那么一共有64/8 * 128/8 = 8*16=128個網(wǎng)格

      對于64*128的這幅patch來說,8*8的網(wǎng)格已經(jīng)足夠大來表示有趣的特征比如臉,頭等等。

      直方圖是有9個bin的向量,代表的是角度0,20,40,60.....160。

      我們先來看看每個8*8的cell的梯度都是什么樣子:

      圖像學(xué)習(xí)之如何理解方向梯度直方圖(Histogram Of Gradient)

      中間: 一個網(wǎng)格用箭頭表示梯度 右邊: 這個網(wǎng)格用數(shù)字表示的梯度

      中間這個圖的箭頭是梯度的方向,長度是梯度的大小,可以發(fā)現(xiàn)箭頭的指向方向是像素強度變化方向,幅值是強度變化的大小。

      右邊的梯度方向矩陣中可以看到角度是0-180度,不是0-360度,這種被稱之為"無符號"梯度("unsigned" gradients),因為一個梯度和它的負(fù)數(shù)是用同一個數(shù)字表示的,也就是說一個梯度的箭頭以及它旋轉(zhuǎn)180度之后的箭頭方向被認(rèn)為是一樣的。那為什么不用0-360度的表示呢?在事件中發(fā)現(xiàn)unsigned gradients比signed gradients在行人檢測任務(wù)中效果更好。一些HOG的實現(xiàn)中可以讓你指定signed gradients。

      下一步就是為這些8*8的網(wǎng)格創(chuàng)建直方圖,直方圖包含了9個bin來對應(yīng)0,20,40,...160這些角度。

      下面這張圖解釋了這個過程。我們用了上一張圖里面的那個網(wǎng)格的梯度幅值和方向。根據(jù)方向選擇用哪個bin, 根據(jù)副值來確定這個bin的大小。先來看藍(lán)色圓圈圈出來的像素點,它的角度是80,副值是2,所以它在第五個bin里面加了2,再來看紅色的圈圓圈圈出來的像素點,它的角度是10,副值是4,因為角度10介于0-20度的中間(正好一半),所以把幅值一分為二地放到0和20兩個bin里面去。

      圖像學(xué)習(xí)之如何理解方向梯度直方圖(Histogram Of Gradient)

      梯度直方圖

      這里有個細(xì)節(jié)要注意,如果一個角度大于160度,也就是在160-180度之間,我們知道這里角度0,180度是一樣的,所以在下面這個例子里,像素的角度為165度的時候,要把幅值按照比例放到0和160的bin里面去。

      圖像學(xué)習(xí)之如何理解方向梯度直方圖(Histogram Of Gradient)

      角度大于160的情況

      把這8*8的cell里面所有的像素點都分別加到這9個bin里面去,就構(gòu)建了一個9-bin的直方圖,上面的網(wǎng)格對應(yīng)的直方圖如下:

      圖像學(xué)習(xí)之如何理解方向梯度直方圖(Histogram Of Gradient)

      8*8網(wǎng)格直方圖

      這里,在我們的表示中,Y軸是0度(從上往下)。你可以看到有很多值分布在0,180的bin里面,這其實也就是說明這個網(wǎng)格中的梯度方向很多都是要么朝上,要么朝下。

      第四步: 16*16塊歸一化

      上面的步驟中,我們創(chuàng)建了基于圖片的梯度直方圖,但是一個圖片的梯度對于整張圖片的光線會很敏感。如果你把所有的像素點都除以2,那么梯度的幅值也會減半,那么直方圖里面的值也會減半,所以這樣并不能消除光線的影響。所以理想情況下,我們希望我們的特征描述子可以和光線變換無關(guān),所以我們就想讓我們的直方圖歸一化從而不受光線變化影響。

      先考慮對向量用l2歸一化的步驟是:
      v = [128, 64, 32]
      [(128^2) + (64^2) + (32^2) ]^0.5=146.64
      把v中每一個元素除以146.64得到[0.87,0.43,0.22]
      考慮另一個向量2*v,歸一化后可以得到向量依舊是[0.87, 0.43, 0.22]。你可以明白歸一化是把scale給移除了。

      你也許想到直接在我們得到的9*1的直方圖上面做歸一化,這也可以,但是更好的方法是從一個16*16的塊上做歸一化,也就是4個9*1的直方圖組合成一個36*1的向量,然后做歸一化,接著,窗口再朝后面挪8個像素(看動圖)。重復(fù)這個過程把整張圖遍歷一遍。

      圖像學(xué)習(xí)之如何理解方向梯度直方圖(Histogram Of Gradient)

      hog-16x16-block-normalization

      第五步:計算HOG特征向量

      為了計算這整個patch的特征向量,需要把36*1的向量全部合并組成一個巨大的向量。向量的大小可以這么計算:

      1. 我們有多少個16*16的塊?水平7個,垂直15個,總共有7*15=105次移動。

      2. 每個16*16的塊代表了36*1的向量。所以把他們放在一起也就是36*105=3780維向量。

      可視化HOG

      通常HOG特征描述子是畫出8*8網(wǎng)格中9*1歸一化的直方圖,見下圖。你可以發(fā)現(xiàn)直方圖的主要方向捕捉了這個人的外形,特別是軀干和腿。

      圖像學(xué)習(xí)之如何理解方向梯度直方圖(Histogram Of Gradient)

      visualizing_histogram

      雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知

      圖像學(xué)習(xí)之如何理解方向梯度直方圖(Histogram Of Gradient)

      分享:
      相關(guān)文章

      編輯

      關(guān)注AI學(xué)術(shù),例如論文
      當(dāng)月熱門文章
      最新文章
      請?zhí)顚懮暾埲速Y料
      姓名
      電話
      郵箱
      微信號
      作品鏈接
      個人簡介
      為了您的賬戶安全,請驗證郵箱
      您的郵箱還未驗證,完成可獲20積分喲!
      請驗證您的郵箱
      立即驗證
      完善賬號信息
      您的賬號已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
      立即設(shè)置 以后再說
      主站蜘蛛池模板: 国产男女猛烈无遮挡免费视频网站| 日本一卡二卡三卡四卡五卡六卡| 人妻中文字幕精品系列| 91免费精品国偷自产在线在线| 国产精品自在自线视频| 69堂在线观看线无码视频一| 婷婷综合另类小说色区| 国产超高清麻豆精品传媒麻豆精品| 午夜精品久久久久久久无码软件| 久久久久高潮毛片免费全部播放| 伊人网狼人| 日韩无码专区| 男人天堂手机在线| 特黄A级毛片免费视频| 亚洲一区二区三区av链接| 国产中年熟女大集合| 亚洲成av人影院| 蒲城县| 一本色道久久综合亚洲精品| 亚洲无码色| 蜜臀AV一区二区三区有限公司| 18av千部影片| 亚洲熟妇中文字幕五十中出| 人妻 丝袜美腿 中文字幕 | 亚洲熟妇av日韩熟妇在线 | 亚洲一区av无码专区在线观看| 亚洲欧洲av| 亚洲偷偷自拍码高清视频| 人妻av一区二区三区av免费| 久久综合亚洲色hezyo社区| 国产日韩av在线播放| 国产精品欧美一区二区三区| 中文字幕精品无码一区二区三区| 国产资源网| 久久国产av影片| 91在线观看免费高清| 国产精品卡一卡二| 久久波多野结衣av| 亚洲日本视频一区二区三区| 国产成人午夜在线视频极速观看 | 久久精品视频18|