快速指南:使用OpenCV預處理神經網絡中的面部圖像的

2021-03-01 OpenCV學堂

本期將介紹臉部檢測、眼睛檢測;圖像拉直、裁剪、調整大小、歸一化等內容

目前,涉及面部分類的計算機視覺問題,通常都需要使用深度學習。因此在將圖像輸入神經網絡之前,需要經過一個預處理階段,以便達到更好的分類效果。

圖像預處理通常來說非常簡單,只需執行幾個簡單的步驟即可輕鬆完成。但為了提高模型的準確性,這也是一項非常重要的任務。對於這些問題,我們可以使用OpenCV完成:一個針對(實時)計算機視覺應用程式的高度優化的開源庫,包括C ++,Java和Python語言。

接下來我們將一起探索可能會應用在每個面部分類或識別問題上應用的基本原理,示例和代碼。

注意:下面使用的所有圖像均來自memes.。

圖片載入

我們使用該imread()函數加載圖像,並指定文件路徑和圖像模式。第二個參數對於運行基本通道和深度轉換很重要。

img = cv2.imread('path/image.jpg', cv2.IMREAD_COLOR)

要查看圖像可以使用imshow()功能:

cv2.imshow(img)

如果使用的type(img)話,將顯示該圖像的尺寸包括高度、重量、通道數。

彩色圖像有3個通道:藍色,綠色和紅色(在OpenCV中按此順序)。

我們可以很輕鬆查看單個通道:

# Example for green channel
img[:, :, 0]; img[:, :, 2]; cv2.imshow(img)

Grayscale version

灰度圖像

為了避免在人臉圖像分類過程中存在的幹擾,通常選擇黑白圖像(當然也可以使用彩圖!請小夥伴們自行嘗試兩者並比較結果)。要獲得灰度圖像,我們只需要在圖像加載函數中通過將適當的值作為第二個參數傳遞來指定它:

img = cv2.imread('path/image.jpg', cv2.IMREAD_GRAYSCALE)

現在,我們的圖像只有一個灰度通道了!

面部和眼睛檢測

在處理人臉分類問題時,我們可能需要先對圖形進行裁剪和拉直,再進行人臉檢測以驗證是否有人臉的存在。為此,我們將使用OpenCV中自帶的的基於Haar特徵的級聯分類器進行對象檢測。

首先,我們選擇用於面部和眼睛檢測的預訓練分類器。以下時可用的XML文件列表:

1)對於面部檢測,OpenCV提供了這些(從最松的先驗到最嚴格的先驗):

• haarcascade_frontalface_default.xml

• haarcascade_frontalface_alt.xml

• haarcascade_frontalface_alt2.xml

• haarcascade_frontalface_alt_tree.xml

2)對於眼睛檢測,我們可以選擇以下兩種:

• haarcascade_eye.xml

• haarcascade_eye_tree_eyeglasses.xml(正在嘗試處理眼鏡!)

我們以這種方式加載預訓練的分類器:

face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 『haarcascade_frontalface_default.xml』)eyes_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 『haarcascade_eye.xml』)

我們可以測試幾種組合,但我們要記住一點,沒有一種分類器在所有情況下都是最好的(如果第一個分類失敗,您可以嘗試第二個分類,甚至嘗試所有分類)。

對於人臉檢測,我們可使用以下代碼:

faces_detected = face_cascade.detectMultiScale(img, scaleFactor=1.1, minNeighbors=5)

結果是一個數組,其中包含所有檢測到的臉部特徵的矩形位置。我們可以很容易地繪製它:

(x, y, w, h) = faces_detected[0]
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 1);
cv2.imshow(img)

對於眼睛,我們以類似的方式進行,但將搜索範圍縮小到剛剛提取出來的面部矩形框內:

eyes = eyes_cascade.detectMultiScale(img[y:y+h, x:x+w])for (ex, ey, ew, eh) in eyes:
   cv2.rectangle(img, (x+ex, y+ey), (x+ex+ew, y+ey+eh),
                 (255, 255, 255), 1)

儘管這是預期的結果,但是很多時候再提取的過程中我們會遇到一些難以解決的問題。比如我們沒有正面清晰的人臉視圖。

不能正確檢測的案例

臉部旋轉

通過計算兩隻眼睛之間的角度,我們就可以拉直面部圖像(這很容易)。計算之後,我們僅需兩個步驟即可旋轉圖像:

rows, cols = img.shape[:2]
M = cv2.getRotationMatrix2D((cols/2, rows/2), <angle>, 1)
img_rotated = cv2.warpAffine(face_orig, M, (cols,rows))

裁臉

為了幫助我們的神經網絡完成面部分類任務,最好去除外界無關信息,例如背景,衣服或配件。在這些情況下,面部裁切非常方便。

我們需要做的第一件事是再次從旋轉後的圖像中獲取面部矩形。然後我們需要做出決定:我們可以按原樣裁剪矩形區域,也可以添加額外的填充,以便在周圍獲得更多空間。這取決於要解決的具體問題(按年齡,性別,種族等分類);也許我們需要保留頭髮,也許不需要。

最後進行裁剪(p用於填充):

cv2.imwrite('crop.jpg', img_rotated[y-p+1:y+h+p, x-p+1:x+w+p])

現在這張臉的圖像是非常單一的,基本可用於深度學習:

圖像調整大小

神經網絡需要的所有輸入圖像具有相同的形狀和大小,因為GPU應用相同的指令處理一批相同大小圖像,可以達到較快的速度。我們雖然可以隨時調整它們的大小,但這並不是一個好主意,因為需要在訓練期間將對每個文件執行幾次轉換。因此,如果我們的數據集包含大量圖像,我們應該考慮在訓練階段之前實施批量調整大小的過程。

在OpenCV中,我們可以與同時執行縮小和升頻resize(),有幾個插值方法可用。指定最終大小的示例:

cv2.resize(img, (<width>, <height>), interpolation=cv2.INTER_LINEAR)

要縮小圖像,OpenCV建議使用INTER_AREA插值法,而放大圖像時,可以使用INTER_CUBIC(慢速)或INTER_LINEAR(更快,但效果仍然不錯)。最後,這是質量和時間之間的權衡。

我對升級進行了快速比較:

前兩個圖像似乎質量更高(但是您可以觀察到一些壓縮偽像)。線性方法的結果顯然更平滑(沒有對比度)並且噪點更少(黑白圖像證明)。最後一個像素化。

歸一化

我們可以使用normalize()功能使視覺圖像標準化,以修復非常暗/亮的圖像(甚至可以修復低對比度)。該歸一化類型是在函數參數指定:

norm_img = np.zeros((300, 300))
norm_img = cv2.normalize(img, norm_img, 0, 255, cv2.NORM_MINMAX)

例子:

當使用圖像作為深度卷積神經網絡的輸入時,無需應用這種歸一化(上面的結果對我們來說似乎不錯,但是並不針對他們的眼睛)。在實踐中,我們將對每個通道進行適當的歸一化,例如減去均值並除以像素級別的標準差(這樣我們得到均值0和偏差1)。如果我們使用轉移學習,最好的方法總是使用預先訓練的模型統計信息。

結論

當我們處理面部分類/識別問題時,如果輸入的圖像不是護照照片時,檢測和分離面部是一項常見的任務。

OpenCV是一個很好的圖像預處理任務庫,不僅限於此。對於許多計算機視覺應用來說,它也是一個很好的工具……

https://www.youtube.com/watch?v=GebcshN4OdE

https://www.youtube.com/watch?v=z1Cvn3_4yGo

https://github.com/vjgpt/Face-and-Emotion-Recognition

相關焦點

  • 使用Python+OpenCV實現神經網絡預處理人臉圖像的快速指南
    這通常意味著需要應用深度學習,因此在將圖像注入到我們的神經網絡之前需要一個特殊的預處理階段。為了提高我們的模型精度,這是一項非常重要的任務,通過以下幾個簡單的步驟可以很好地完成。對於本文,我們使用OpenCV:一個高度優化的計算機視覺開源庫,在C++、java和Python中都可用。這是一篇簡短的文章,包含了一些基本的指導原則、示例和代碼,你可以根據需求將它們應用到人臉分類或識別問題上。
  • opencv-python圖像預處理-濾波
    為了消除外界環境對圖像採集的幹擾,增強圖像的邊緣及灰度跳變的部分,使圖像變得清晰以及提高圖像處理速度需要對圖像進行預處理操作,主要是對圖像進行濾波和增強操作。使用的方法可以分為空間域處理和頻率域處理兩類。空間域指圖像平面本身,這類圖像處理方法用各種模板直接與圖像進行卷積運算,實現對圖像的處理。
  • Python+OpenCV的基礎圖像處理操作匯總
    圖像處理是對圖像進行的技術操作與分析,比如為了得到增強的圖像或提取一些有用的信息而進行的一系列操作。隨著我們的發展,許多應用程式使用圖像/幀/視頻作為輸入,對它們進行預處理,並將其輸入到設備或軟體或腳本中。圖像處理也可以是娛樂性的,可以用於許多應用。
  • OpenCV對圖片做識別前的預處理
    識別前用OpenCV預處理圖片以減少背景噪音對文字的幹擾可以提高圖片文字的識別率和正確率。OpenCV的話題自己可以成一本書,這裡我們只是最淺層地使用它的功能函數。第三方模塊opencv-python幫助我們在python程序中應用openCV,老規矩:先安裝(opencv-python)後引進(import cv2)。
  • OpenCV入門及應用案例:手把手教你做DNN圖像分類
    )模塊的背景知識,讓讀者可以快速認識OpenCV,消除神秘感,同時對計算機視覺從傳統算法到深度學習算法的演進歷史有所了解。為了不影響OpenCV核心模塊的穩定性,這些新功能模塊會發布到opencv_contrib中。等到模塊足夠成熟並且在社區得到了足夠的關注和使用之後,這個模塊便會被移到OpenCV核心庫,這意味著核心庫開發團隊將會對該模塊進行全面的測試,保證這個模塊具有產品級的質量。例如,對於DNN這個模塊,OpenCV 3.1開始出現在opencv_contrib中,到了3.3版本才移到了OpenCV核心庫。
  • OpenCV+深度學習預訓練模型,簡單搞定圖像識別 | 教程
    另外,新版本中使用預訓練深度學習模型的API同時兼容C++和Python,讓系列操作變得非常簡便:從硬碟加載模型;對輸入圖像進行預處理;將圖像輸入網絡,獲取輸出的分類。當然,我們不能、也不該用OpenCV訓練深度學習模型,但這個新版本讓我們能把用深度學習框架訓練好了的模型拿來,高效地用在OpenCV之中。
  • 手把手教你使用圖像處理利器OpenCV
    因此,我們需要首先分析它,執行必要的預處理,然後使用它——特別推薦《數據準備和特徵工程》,此書即為這方面最佳讀物。例如,我們正在嘗試構建一個關於貓的分類器。我們的程序會把一個圖像作為輸入,然後告訴我們這個圖像是否包含一隻貓。構建這個分類器的第一步是收集數百張含有貓的圖片。
  • 用OpenCV和Python模糊和匿名化人臉
    然後,我們將回顧我們的項目結構,並使用OpenCV實現兩種面部模糊方法:使用高斯模糊對圖像和視頻流中的人臉進行匿名化將「像素模糊」效果應用於圖像和視頻中的匿名人臉考慮到我們的兩個實現,我們將創建Python腳本來將這些面部模糊方法應用於圖像和視頻。  然後我們將回顧我們的面部模糊和匿名化方法的結果。
  • 使用Python+OpenCV實現圖像數據採集
    在Anaconda或命令提示符中鍵入conda create -n opencv python=3.6這將在Python版本3.6中創建一個名為opencv的新環境,可以用正在使用的任何版本替換它。下一步,輸入pip install opencv-python你已經成功安裝了cv2! 現在你可以開始拍照了。
  • 使用Python,Keras和OpenCV進行實時面部活體檢測
    你可以在網際網路上找到的大多數面部識別算法和研究論文都受到照片攻擊。這些方法在檢測和識別來自網絡攝像頭的圖像、視頻和視頻流中的人臉方面非常有效。然而,他們不能區分活人的臉和照片上的臉。這是因為這些算法適用於2D frames。現在讓我們想像一下,我們想要實現一個面部識別開門器。
  • 使用OpenCV深度學習模塊在圖像分類下的應用實踐
    下文對書中圖像分類部分內容進行摘錄:圖像分類是計算機視覺領域的基礎任務之一,在各種基於視覺的人工智慧應用中,圖像分類都扮演著重要的角色。例如,在智慧機器人應用中,我們需要對所採集的視頻中的每一幀進行主要物體的檢測和分類,並以此作為進一步決策的基礎。近些年,圖像分類與深度學習的飛速發展有著密不可分的關係。
  • 基於OpenCV的圖像分割處理!
    圖像閾值化分割是一種傳統的最常用的圖像分割方法,因其實現簡單、計算量小、性能較穩定而成為圖像分割中最基本和應用最廣泛的分割技術。它特別適用於目標和背景佔據不同灰度級範圍的圖像。它不僅可以極大的壓縮數據量,而且也大大簡化了分析和處理步驟,因此在很多情況下,是進行圖像分析、特徵提取與模式識別之前的必要的圖像預處理過程。閾值處理是指剔除圖像內像素值高於閾值或者低於閾值得像素點。例如,設定閾值為127,將圖像內所有像素值大於127的像素點的值設為255;將圖像內所有像素值小於127的像素點的值設為0。
  • 使用Tensorflow+OpenCV構建會玩石頭剪刀布的AI
    ct和maxCt是用來保存圖像的起始索引和最終索引,剩下的是標準的OpenCV代碼,用於獲取網絡攝像頭源並將圖像保存到目錄中。需要注意的一點是,我所有的圖片維數都是300 x 300的。運行此目錄樹後,我的目錄樹如下所示。C:.
  • opencv學習—03圖像運算(一)
    >a + b ≤ 255:cv2.add(a, b) = a+ba + b >255:cv2.add(a, b) = 255注意使用函數cv2.add( )中的參數有以下三種參數形式:cv2.add(圖像1,圖像2):兩個參數都是圖像,但必須保持圖像的大小和類型一致cv2.add
  • 監控視頻中的圖像預處理技術
    這涉及到監控系統中的多個環節,從上遊的實際場景,到中間的傳輸網絡,再到下遊的用戶終端,主要包括圖像的採集、壓縮處理、傳輸或存儲、解壓縮和顯示等部分,其中任何一個上遊環節出了問題,對圖像質量的影響都不是下遊環節能夠糾正或補救的。視頻信號的預處理處在系統最上遊,是針對主處理而言的,如圖1所示。
  • ...網絡用|圖像處理|圖像傳感器|光電二極體|ai晶片|神經網絡|傳感器
    維也納大學研究人員們試圖通過減少中間步驟來加快機器視覺,他們直接在圖像傳感器中實現了人工神經網絡(ANN)。▲ 輸入信息在視覺傳感器內進行計算,實現智能,高效的預處理傳統AI視覺傳感器的處理過程如圖(a)所示,傳感器收集信號,通過模數轉換器(ADC)將模擬信號轉換為數位訊號,放大後輸入到外部人工神經網絡(ANN),經參數調優訓練神經網絡。
  • 基於opencv 的圖像處理入門教程
    前言雖然計算機視覺領域目前基本是以深度學習算法為主,但實際上很多時候對圖片的很多處理方法,並不需要採用深度學習的網絡模型,採用目前成熟的圖像處理庫即可實現,比如 OpenCV 和 PIL ,對圖片進行簡單的調整大小、裁剪、旋轉,或者是對圖片的模糊操作。
  • 使用神經網絡為圖像生成標題
    我們都知道,神經網絡可以在執行某些任務時複製人腦的功能。神經網絡在計算機視覺和自然語言生成方面的應用已經非常引人注目。本文將介紹神經網絡的一個這樣的應用,並讓讀者了解如何使用CNNs和RNNs (LSTM)的混合網絡實際為圖像生成標題(描述)。
  • Python 圖像處理 OpenCV (1):入門
    新系列第一件事兒當然是資源推薦,下面是一些有關 OpenCV 的資源連結:資源連結:官方網站:https://opencv.org/GitHub:https://github.com/opencv/opencv官方文檔:https://docs.opencv.org/中文文檔(非官方):http://www.woshicver.com
  • 世界上最好的語言PHP:OpenCV與計算機視覺已在我掌控之下
    在 PHP 中,類似的是一個多維數組,但又與多維數組有所不同,該對象可以進行多種快速操作,例如,所有元素同時除以一個數。在 Python 中,當加載圖像時,會返回「NumPy」對象。小心原有的默認操作!它會發生這樣的情況,imread(在 php、c ++ 和 python 中)不是以 RGB 格式加載圖像,而是 BGR 格式。