<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          項目實踐|如何在較暗環(huán)境進行人臉檢測?

          共 5903字,需瀏覽 12分鐘

           ·

          2021-09-08 06:14

          點擊上方小白學視覺”,選擇加"星標"或“置頂

          重磅干貨,第一時間送達

          本文轉自|Datawhale

          計算機視覺在人臉檢測領域的應用已經較為成熟,但依然存在較多難點。其中一大難點是光照問題,由于人臉的3D結構,光照投射出的陰影,會加強或減弱原有的人臉特征。如何解決光照問題對人臉檢測帶來的影響呢?

          (本圖在較暗環(huán)境下拍攝,利用LBP特征的人臉檢測后,有效識別了圖片中的小姐姐)
          LBP特征是常用的方法之一,該方法對諸如光照變化等造成的灰度變化具有較強的魯棒性,可以減弱光照不均勻對于人臉識別的影響。很多學者都采用adaboost+LBP的方式解決人臉識別問題,被譽為“萬能算法”。具體本文將詳細講解:

          本文目錄:   

              1. 基本LBP

            1.1 概念理解

            1.2 主要步驟

              2. 圓形領域的LBP算子

            2.1 概念理解

            2.2 計算方法

              3. 旋轉不變的LBP算子

              4. 統(tǒng)一化的LBP算子

            4.1 理論基礎

            4.2 統(tǒng)一化的意義

            4.3 收集箱個數(shù)計算

              5. 案例實戰(zhàn)

            5.1 讀取圖片

            5.2 加載級聯(lián)文件

            5.3 人臉檢測

            5.4 處理臟數(shù)據(jù)


          一、基本LBP

          1.1概念理解

          LBP算子的基本思想是將中心像素的灰度值作為一個閾值,將其鄰域內的像素點灰度值進行比較,從而得到二進制編碼表示,來表示局部紋理特征。

          鄰域的類型可分為四鄰域、D鄰域、八鄰域。

          • 四鄰域:該像素點的上下左右四個位置;

          • D領域:該像素點斜對角線上的四個相鄰位置。

          • 八鄰域:四鄰域與D鄰域的并集。

          • 基本的LBP算子考慮的是像素的八鄰域。
          LBP表示方法有一個較為明顯的特點,它不容易收到圖像整體灰度線性變化的影響。也就是說,當圖像由于光線的影響使得整體灰度值發(fā)生線性均勻變化時,其LBP特征編碼是不變的。換句話說,它并不在意整體的灰度變化,而是關注像素之間的相對灰度改變。

          例如,在某些情況下,陽光照射強度更低,導致拍攝圖像的整體亮度降低,但是實際上每個像素之間的差值仍然是固定的。那么在這種情況下,在圖片亮度對LBP特征編碼無影響。


          1.2主要步驟


          使用一個3*3的矩形,處理待判斷像素點及其鄰域之間的關系。

          步驟1:二值化過程
          將像素點A的值與其八鄰域處的像素點逐一比較:
          1. 如果A的像素值大于其鄰近點的像素值,則得到0。
          2. 如果A的像素值小于其鄰近點的像素值,則得到1。

          此過程以中心像素的灰度值為閾值,與鄰域的8個灰度值進行比較。
          最后,根據(jù)順時針方向,將像素點A與周圍8個像素點比較所得到的0、1值連接起來,得到一個8位的二進制序列,然后將該二進制序列轉換為十進制數(shù)字作為點A的LBP值。

          如下圖LBP原理示意圖所示,在左側的區(qū)域中,中心點的像素為76,并設置它為此次的閾值。然后現(xiàn)在我們對該中心點的8鄰域做進一步的處理。

          • 將中心點周圍的8個位置中灰度值大于76的像素點處理為1。例如,其鄰域中像素值為128、251、99、213的點,都被處理為1,填入對應的像素點位置上。

          • 將中心點周圍的8個位置中灰度值值小于76的像素點處理為0。例如,其鄰域中像素值為36、9、11、48的點,都被處理為0,填入對應的像素點位置上。

          • 最后得到的二值結果如右圖所示。

          步驟2:中心點處理

          完成上述的二值化過程之后,例如從像素點的正上方開始將得到的二值結果進行序列化,所以在上述例子中,二進制序列結果為“01011001”。
          最后再將該二進制序列結果轉換為對應的十進制數(shù)“89”,作為當前中心點的像素值,如下圖所示。

          步驟3:整合處理
          上述過程僅僅是對一個像素點的處理過程,結果是一個LBP“編碼”。所以對于某幅圖像而言,需要進行逐行掃描完成每個像素點數(shù)值的更新。我們將采用分塊的形式進行編碼。其編碼過程如下:

          假設此時有一幅100*100大小的圖像。

          1. 在初始化時,將該圖劃分為10*10個Block,其中每個Block的大小為10*10。
          2. 對每個Block的像素點提取其LBP特征,并建立一個計算某個“數(shù)字”出現(xiàn)的頻率統(tǒng)計直方圖。
          3. 結束時,將生成10*10個統(tǒng)計直方圖,選擇性地對直方圖進行規(guī)范化處理。
          4. 連接所有小塊的(規(guī)范化的)直方圖,整合后構成了整個窗口的特征向量,用來描述這幅圖片。
          5. 得到特征向量之后,就可以使用各類算法對該圖像進行特定的處理了。


          二、圓形領域的LBP算子

          2.1概念的理解


          基本LBP算子可以被進一步推廣到使用不同大小和形狀的鄰域。采用圓形的鄰域并結合雙線性插值運算使得我們可以獲得任意半徑和任意數(shù)目的鄰域像素點。該圓形鄰域可以用表示,其中P表示圓形鄰域內參與運算的像素點個數(shù),R表示鄰域的半徑。

          2.2計算方法


          假設此時給出了一個半徑為2的8鄰域像素的圓形鄰域,圖中每個方格對應一個像素。

          1. 處在方格中心的鄰域點(左、上、右、下4個黑點):以該點所在方格的像素值作為它的值
          2. 不在方格中心的鄰域點(斜45°方向的4個黑點):線性插值法確定其值。

          如下圖所示,若現(xiàn)在我們想計算左上角空心點的值,此時它并不在任何像素點內:

          可以發(fā)現(xiàn),在空心點的上方,距處,有一個十叉點1,下方還有一個十叉點2。所以我們應首先分別計算這兩個十叉點1和2的水平插值。
          其中點1的值根據(jù)與之處于同一行的以及的線形插值得到。

          同理計算出點2的值如下:

          再計算出點1和點2豎直的線性插值。

          如此,計算出各鄰域像素點的灰度值之后,仍然使用基礎LBP算子的方法,得到二進制序列后轉換為十進制數(shù)等操作。

          三、旋轉不變的LBP算子

          根據(jù)上述介紹發(fā)現(xiàn),像素點的二進制序列將由于圖像的旋轉而改變,因此它并不具有旋轉不變性。那么,應該如何解決這樣的情況呢?
          此后,Maenpaa等人又將 LBP 算子進行了擴展,提出了具有旋轉不變性的 LBP 算子,即不斷旋轉圓形鄰域得到一系列初始定義的 LBP 值,取其最小值作為該鄰域的 LBP 值。

          如下圖所示,黑點代表0,白點代表1,假設初始的灰度值為255。經過7次旋轉,得到7個不同的二進制序列,并分別轉換為相應的十進制數(shù),最后取到最小值“15”為最終中心點的LBP值,且序列為“00001111”。

          四、統(tǒng)一化LBP算子


          4.1理論基礎
          由于LBP直方圖大多都是針對圖像中的各個分區(qū)分別計算的,對于一個普通大小的分塊區(qū)域,標準LBP算子得到的二進模式數(shù)目(LBP直方圖收集箱數(shù)目)較多,而實際的位于該分塊區(qū)域中的像素數(shù)目卻相對較少,這將會得到一個過于稀疏的直方圖,使得該直方圖失去統(tǒng)計的意義。
          例如,在5×5鄰域內對20個像素點進行采樣,有種二進制模式,數(shù)量過于龐大了。所以,我們想到了一種特殊的方法,來減少一些冗余的LBP模式。
          研究者們提出了統(tǒng)一化模式(Uniform Patterns),再次改進了LBP算子的理論。
          1. 跳變:

          二進制序列中存在從1到0或者0到1的轉變,可以稱作是一次跳變。下面我們將舉例說明跳變次數(shù)的計算:

          2. 統(tǒng)一化模式:

          對于一個局部二進制模型而言,在將其二進制位串視為循環(huán)的情況下,如果其中包含的從0到1或者從1到0的轉變不多于2個,則稱為統(tǒng)一化模式。所以上例中的模式“01010000”就不屬于統(tǒng)一化模式。

          3. 混合模式:

          序列中包含的跳變?yōu)?次以上的,可以稱為混合模式。

          4.2 統(tǒng)一化的意義

          在隨后的LBP直方圖的計算過程中,只為統(tǒng)一化模式分配單獨的直方圖收集箱,而所有的非統(tǒng)一化模式都被放入一個公用收集箱中,使得LBP特征的數(shù)目大大減少。
          一般來說,保留的統(tǒng)一化的模式往往是反映重要信息的那些模式,而那些非統(tǒng)一化模式中過多的轉變往往由噪聲引起,沒有良好的統(tǒng)計意義。

          假設圖像分塊區(qū)域大小為,則像素的總數(shù)為360個。如果采用8鄰域像素的標準LBP算子,收集箱(特征)數(shù)目為個,平均到每個收集箱的像素數(shù)目還不到2個。但是在統(tǒng)一化LBP算子的收集箱數(shù)目為59個(58個統(tǒng)一化模式收集箱加上1個非統(tǒng)一化模式收集箱),平均每個收集箱中將含有6個左右的像素點,因此更具有統(tǒng)計意義。


          4.3收集個數(shù)計算

          將模式進行統(tǒng)一化后,實現(xiàn)了模式數(shù)量的降維,從之前的轉換成為了。筆者翻看了很多博客,并沒有詳細的說明最后的維度是怎么計算的,也就是我們收集箱的個數(shù)計算。那么這節(jié)我們就來討論一下。
          接下來對8位二進制序列下的收集箱個數(shù)進行計算:
          • 0個轉變(2個):

          11111111,00000000。
          • 1個轉變(7 x 2 = 14):01111111,00111111,00011111,00001111,00000111,00000011,00000001。
          • 2個轉變(42):

          6 x 2:01000000,00100000,00010000,00001000,00000100,00000010
          5 x 2:01100000,00110000,00011000,00001100,00000110
          4 x 2:01110000,00111000,00011100,00001110
          3 x 2:01111000,00111100,00011110
          2 x 2:01111100,00111110

          1 x 2:01111110

          值得注意的是,上面的“ ”中的2表示有兩種情況,即反碼和原碼兩種,這樣便得到了58種統(tǒng)一化的編碼,比原來的256種減少了很多。

          總結一下,經過上面的計算知道,這種統(tǒng)一化后的編碼個數(shù)可以用公式(4)表示。

          五、案例實踐

          5.1讀取圖片

          這次仍然是把待讀取的照片放入img包中,圖片名為cv_3.jpeg。

          import cv2import matplotlib.pyplot as plt
          filepath = "../img/cv_3.jpeg"
          # 讀取圖片,路徑不能含有中文名,否則圖片讀取不出來image = cv2.imread(filepath)# 顯示圖片plt.imshow('image', image)plt.show()

          這次的待檢測圖片:

          5.2加載級聯(lián)文件

          # 需要是Anaconda虛擬環(huán)境下的絕對路徑cascade_path = "/Users/sonata/opt/anaconda3/share/opencv4/lbpcascades/lbpcascade_frontalface_improved.xml"# 下載到了本地使用
          # 加載人臉級聯(lián)文件faceCascade = cv2.CascadeClassifier(cascade_path)
          5.3人臉檢測

          OpenCV給我們使用特征數(shù)據(jù)的方法:

          def detectMultiScale(self, image, scaleFactor=None, minNeighbors=None, flags=None, minSize=None, maxSize=None)

          params:
          1. scaleFactor: 指定每個圖像比例縮小多少圖像
          2. minNeighbors: 指定每個候選矩形必須保留多少個鄰居,值越大說明精度要求越高
          3. minSize:檢測到的最小矩形大小
          4. maxSize: 檢測到的最大矩形大小

          所以我們使用此方法檢測圖片中的人臉

          # 灰度轉換gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
          # 人臉檢測faces = faceCascade.detectMultiScale(gray, 1.1, 2, minSize=(100, 100))print(faces) # 識別的人臉信息
          # 循環(huán)處理每一張臉for x, y, w, h in faces: cv2.rectangle(img, pt1=(x, y), pt2=(x+w, y+h), color=[0, 0, 255], thickness=2)
          img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)plt.imshow(img)plt.show()

          得到檢測結果如下:

          5.4處理臟數(shù)據(jù)


          我們發(fā)現(xiàn)除了檢測到人臉數(shù)據(jù),還有一些其他的臟數(shù)據(jù),這個時候可以打印檢測出的人臉數(shù)據(jù)位置和大小結果如下:

          從大小中我們看到最大的兩個矩形,剛好是人臉數(shù)據(jù),其余都是臟數(shù)據(jù),那么繼續(xù)修改函數(shù)參數(shù)

          faces = faceCascade.detectMultiScale(gray, 1.1, 2, minSize=(150, 150))# 把最小矩形大小改成150

          這樣我們就可以把臟數(shù)據(jù)給除去了:


          好消息,小白學視覺團隊的知識星球開通啦,為了感謝大家的支持與厚愛,團隊決定將價值149元的知識星球現(xiàn)時免費加入。各位小伙伴們要抓住機會哦!


          下載1:OpenCV-Contrib擴展模塊中文版教程
          在「小白學視覺」公眾號后臺回復:擴展模塊中文教程,即可下載全網第一份OpenCV擴展模塊教程中文版,涵蓋擴展模塊安裝、SFM算法、立體視覺、目標跟蹤、生物視覺、超分辨率處理等二十多章內容。

          下載2:Python視覺實戰(zhàn)項目52講
          小白學視覺公眾號后臺回復:Python視覺實戰(zhàn)項目,即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內容提取、面部識別等31個視覺實戰(zhàn)項目,助力快速學校計算機視覺。

          下載3:OpenCV實戰(zhàn)項目20講
          小白學視覺公眾號后臺回復:OpenCV實戰(zhàn)項目20講,即可下載含有20個基于OpenCV實現(xiàn)20個實戰(zhàn)項目,實現(xiàn)OpenCV學習進階。

          交流群


          歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學影像、GAN、算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關微信群。請勿在群內發(fā)送廣告,否則會請出群,謝謝理解~


          瀏覽 152
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩电车痴汉伦理片黄色视频播放 | 人人射影院 | 加勒比综合在线 | 国产在线精品播放 | 日韩中文在线观看视频 |