HOG特徵詳解與行人檢測

2021-03-06 OpenCV學堂

星標或者置頂【OpenCV學堂】

乾貨文章與技術教程第一時間送達

HOG概述

HOG(Histogram of Oriented Gradient)特徵在對象檢測與模式匹配中是一種常見的特徵提取算法,是基於本地像素塊進行特徵直方圖提取的一種算法,對象局部的變形與光照影響有很好的穩定性,最初是用HOG特徵來來識別人像,通過HOG特徵提取+SVM訓練,可以得到很好的效果,OpenCV已經有了。HOG特徵提取的大致流程如下:

詳細解讀

第一步:灰度化
對HOG特徵提取來說第一步是對輸入的彩色圖像轉換為灰度圖像,圖像灰度化的方法有很多,不同灰度化方法之間有一些微小的差異,從彩色到灰度的圖像轉換可以表示如下:

第二步:計算圖像梯度
計算圖像的X方向梯度dx與Y方向梯度dy,根據梯度計算mag與角度,計算梯度時候可以先高斯模糊一下(可選步驟),然後使用sobel或者其它一階導數算子計算梯度值dx、dy、mag、angle:

第三步:Cell分割與Block
對於圖像來說,分成8x8像素塊,每個塊稱為一個Cell,每個2x2大小的Cell稱為一個Block,每個Cell根據角度與權重建立直方圖,每20度為一個BIN,每個Cell得到9個值、每個Block得到36個值(4x9), 圖像如下:

每個Block為單位進行L2數據歸一化,作用是抵消光照/遷移影響,L2的歸一化的公式如下:

第四步:生成描述子
對於窗口64x128範圍大小的像素塊,可以得到8x16個Cell, 使用Block在窗口移動,得到輸出的向量總數為7x15x36=3780特徵向量,每次Block移動步長是八個像素單位,一個Cell大小。

使用HOG特徵數據

HOG特徵本身是不支持旋轉不變性與多尺度檢測的,但是通過構建高斯金字塔實現多尺度的開窗檢測就會得到不同解析度的多尺度檢測支持。OpenCV中HOG多尺度對象檢測API如下:

virtual void cv::HOGDescriptor::detectMultiScale(
    InputArray  img,
    std::vector< Rect > &   foundLocations,
    double  hitThreshold = 0,
    Size    winStride = Size(),
    Size    padding = Size(),
    double  scale = 1.05,
    double  finalThreshold = 2.0,
    bool    useMeanshiftGrouping = false 
)
Img-表示輸入圖像
foundLocations-表示發現對象矩形框
hitThreshold-表示SVM距離度量,默認0表示,表示特徵與SVM分類超平面之間
winStride-表示窗口步長
padding-表示填充
scale-表示尺度空間
finalThreshold-最終閾值,默認為2.0
useMeanshiftGrouping-不建議使用,速度太慢拉

使用OpenCV預訓練SVM行人HOG特徵分類器實現多尺度行人檢測的代碼如下:

import cv2 as cv

if __name__ == '__main__':
    src = cv.imread("D:/images/pedestrian.png")
    cv.imshow("input", src)
    hog = cv.HOGDescriptor()
    hog.setSVMDetector(cv.HOGDescriptor_getDefaultPeopleDetector())
    
    (rects, weights) = hog.detectMultiScale(src,
                                            winStride=(4, 4),
                                            padding=(8, 8),
                                            scale=1.25,
                                            useMeanshiftGrouping=False)
    for (x, y, w, h) in rects:
        cv.rectangle(src, (x, y), (x + w, y + h), (0, 255, 0), 2)

    cv.imshow("hog-detector", src)
    cv.waitKey(0)
    cv.destroyAllWindows()

原圖顯示如下:

運行顯示如下:


伏久者,飛必高
開先者,謝獨早

歡迎掃碼加入【OpenCV研習社】



推薦閱讀

OpenCV學堂-原創精華文章

《tensorflow零基礎入門視頻教程》

基於OpenCV與tensorflow實現實時手勢識別

圖像分割網絡FCN詳解與代碼實現

深度學習中的反向卷積

tensorflow風格遷移網絡訓練與使用

OpenCV SIFT特徵算法詳解與使用

OpenCV中MeanShift算法視頻移動對象分析

基於OpenCV Python實現二維碼檢測與識別

聽說點【好看】會有好運來

相關焦點

  • 訓練SVM進行行人檢測
    訓練好的SVM分類器保存為XML文件,然後根據其中的支持向量和參數生成OpenCV中的HOG描述子可用的檢測子參數,再調用OpenCV中的多尺度檢測函數進行行人檢測。(src,descriptors,Size(8,8));//計算HOG描述子,檢測窗口移動步長(8,8) //cout<<"描述子維數:"<<descriptors.size()<<endl; //處理第一個樣本時初始化特徵向量矩陣和類別矩陣,因為只有知道了特徵向量的維數才能初始化特徵向量矩陣 if( 0 ==
  • 機器視覺之HOG特徵提取(附python和c++代碼)
    HOG所得到的特徵描述符能夠為特徵匹配和目標檢測提供非常重要的信息。在機器視覺實際應用中,我們通常需要確定某個圖像區域是否包含所要識別的對象(即只處理已檢測到對象的區域),如:人們總會在有人圖像區域識別人臉。
  • HOG+SVM實現圖像識別
    所以先提取訓練圖像的輪廓特徵。然後使用SVM支持向量機模型進行學習,從而實現圖像識別。更形象解釋可進入:Sobel等算子(卷積核)進行卷積運算,即通過矩陣運算與像素周邊的點一起做相關的處理(平滑、銳化),提取圖像的梯度特徵。首先把圖片劃分成多個8*8的cell,每個cell包含8*8*2=128個值(梯度和角度),把這128個值用長度為9的數組來表示,這個數組就是梯度直方圖。這種表示方法不僅使得特徵更加緊湊,而且對單個像素值的變化不敏感,也就是能夠抗噪聲幹擾。
  • 你了解HOG特徵嗎?
    作者:晟 沚                  HOG特徵在很多任務中都有應用,如行人檢測,首先對輸入的圖片進行預處理
  • 系統性綜述:特徵點檢測與匹配
    1、圖像特徵點的應用相機標定:棋盤格角點陰影格式固定,不同視角檢測到點可以得到匹配結果,標定相機內參稠密重建:間接使用特徵點作為種子點擴散匹配得到稠密點雲場景理解:詞袋方法,特徵點為中心生成關鍵詞袋(關鍵特徵)進行場景識別2、
  • 特徵點的檢測與匹配--系統總結
    特徵點:檢測子(給一副圖像找到特徵點的位置)+描述子(特徵向量,用於特徵匹配)一、圖像特徵介紹1、圖像特徵點的應用相機標定:棋盤格角點陰影格式固定,不同視角檢測到點可以得到匹配結果,標定相機內參圖像拼接:不同視角匹配恢復相機姿態稠密重建:間接使用特徵點作為種子點擴散匹配得到稠密點雲
  • 目標檢測算法Fast R-CNN詳解
    前面我們一起學了SPP-Net和R-CNN的相關知識,如下:目標檢測算法SPP-Net詳解目標檢測R-CNN通俗詳解由於每期都是逐步改進
  • Tensorflow + OpenCV4 安全帽檢測模型訓練與推理
    在OpenCV DNN中直接調用訓練出來的模型完成自定義對象檢測,這裡需要特別說明一下的,因為在訓練階段我們選擇了模型支持600~1024保持比率的圖像輸入。所以在推理預測階段,我們可以直接使用輸入圖像的真實大小,模型的輸出格式依然是1x1xNx7,按照格式解析即可得到預測框與對應的類別。
  • 基於HOG+SVM的目標檢測與識別
    下面,我以一個人臉目標的檢測為例,使用OpenCV2.4.7做一個HOG+SVM的檢測實例。實例中,使用皮膚檢測分割作為快速目標檢測。HOG參數設置為64X64,Cell:16,Block:32,Bin:9     1、總體設計 HOG是一個圖像的特徵,全稱梯度方向直方圖,是使用圖像局部梯度對圖像進行描述的一種方式。
  • OpenCV特徵提取與檢測6SURF特徵檢測
  • 輕鬆學Pytorch – 行人檢測Mask-RCNN模型訓練與使用
    大家好,這個是輕鬆學Pytorch的第20篇的文章分享,主要是給大家分享一下,如何使用數據集基於Mask-RCNN訓練一個行人檢測與實例分割網絡。這個例子是來自Pytorch官方的教程,我這裡是根據我自己的實踐重新整理跟解讀了一下,分享給大家。前面一篇已經詳細分享了關於模型本身,格式化輸入與輸出的結果。
  • DBnet檢測知識蒸餾+tensorrt推理(文字檢測+條形碼檢測)
    項目 獲取方式關注微信公眾號 datayx  然後回復 DB檢測  即可獲取。條形碼檢測自然語言處理》英、中文版PDF+源碼《21個項目玩轉深度學習:基於TensorFlow的實踐詳解》完整版PDF+附書代碼《深度學習之pytorch》pdf+附書源碼PyTorch深度學習快速實戰入門《pytorch-handbook》【下載】豆瓣評分8.1,《機器學習實戰:基於Scikit-Learn和TensorFlow
  • 輕鬆學 Pytorch:行人檢測 Mask-RCNN 模型訓練與使用
    大家好,這個是輕鬆學Pytorch的第20篇的文章分享,主要是給大家分享一下,如何使用數據集基於Mask-RCNN訓練一個行人檢測與實例分割網絡。這個例子是來自Pytorch官方的教程,我這裡是根據我自己的實踐重新整理跟解讀了一下,分享給大家。前面一篇已經詳細分享了關於模型本身,格式化輸入與輸出的結果。
  • 無人機變身安全小衛士-基於HOG+SVM的臨邊孔洞安全判定系統
    在對臨邊洞口進行安全檢測之前,首先需要獲取臨邊洞口的圖像數據和位置信息,我們使用無人機和Altizure軟體自動獲取建築信息,具有過程簡單、周期短、自動化、安全的優點,還可以對人員無法到達的建築位置進行信息收集,具有不可替代的優越性。
  • SIFT特徵提取分析(附源碼)
    SIFT(Scale-invariant feature transform)是一種檢測局部特徵的算法,該算法通過求一幅圖中的特徵點
  • 【模型訓練】目標檢測實現分享四:詳解 YOLOv4 算法實現
    本文是目標檢測類算法實現分享的第四篇,前面已經寫過三篇,感興趣的同學可以查閱:  (1) 《【模型訓練】目標檢測實現分享一:詳解 YOLOv1 算法實現》;  (2) 《【模型訓練】目標檢測實現分享二
  • 精選目標檢測4——yolo3的loss組成詳解
    詳解的不是代碼,而是訓練思路,主要講的是yolo3需要被減少的loss到底是什麼。當然配合代碼觀看肯定更容易看懂。,三個特徵層分別對應著圖片被分為不同size的網格後,每個網格點上三個先驗框對應的位置、置信度及其種類。