06-機器學習(Haar+Adaboost實現人臉、人眼檢測)

機器學習是什么?
機器學習=訓練樣本+特征+分類器,通過讓機器學習的方式,來達到某種功能的過程
深度學習是什么?
深度學習=海量的學習樣本+人工神經網絡

機器學習需要:樣本、特征、分類器、對訓練后的數據進行預測或檢驗
人臉樣本+haar特征+adaboost分類器===>就可以實現人臉識別
haar是由一系列模板組成
adaboost分類器是由三級極點組成,(強分類器、弱分類器、node結點)組成

hog特征+svm支持向量機===>實現小獅子的識別

一、視頻分解圖片

實現步驟:
1,將視頻加載進去load
2,讀取視頻的info信息
3,對視頻信息進行解碼parse,拿到單幀視頻
4,可以通過imshow進行展示,也可以通過imwrite進行保存

(flag,frame) = cap.read()
讀取每一幀,人眼可分辨每秒看到16幀
參數一:flag表示讀取是否成功
參數二:frame表示圖片的內容

將1.mp4視頻文件分解成圖片

import cv2
cap = cv2.VideoCapture("E:\Jupyter_workspace\study\DL\data/1.mp4")# 獲取一個視頻打開cap 1 file name
isOpened = cap.isOpened# 判斷是否打開‘
print(isOpened)
fps = cap.get(cv2.CAP_PROP_FPS)#幀率:視頻每秒可以展示的圖片
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))#視頻的寬度信息
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))#視頻的高度信息
print(fps,width,height)
i = 0
while(isOpened):if i == 10:breakelse:i = i+1(flag,frame) = cap.read()# 讀取每一張 flag frame fileName = 'E:\Jupyter_workspace\study\DL\data/image'+str(i)+'.jpg'print(fileName)if flag == True:cv2.imwrite(fileName,frame,[cv2.IMWRITE_JPEG_QUALITY,100])
print('end!')

二、圖片合成視頻

將視頻寫入進去,對寫入對象的創建
cv2.VideoWriter('2.mp4',-1,5,size)
參數一:圖片合成視頻
參數二:-1表示使用一個支持的解碼器
參數三:每秒處理的幀數,5幀
參數四:圖片視頻格式的大小

將一系列imagei(1<i<10)圖片合成2.mp4視頻

import cv2
img = cv2.imread('E:\Jupyter_workspace\study\DL\data/image1.jpg')
imgInfo = img.shape
size = (imgInfo[1],imgInfo[0])
print(size)
videoWrite = cv2.VideoWriter('2.mp4',-1,5,size)# 寫入對象 1 file name
# 2 編碼器 3 幀率 4 size
for i in range(1,11):fileName = 'E:\Jupyter_workspace\study\DL\data/image'+str(i)+'.jpg'img = cv2.imread(fileName)videoWrite.write(img)
print('end!')

三、Haar特征原理

什么是Haar特征?
特征:圖像某個區域的像素點,經過某種四則運算之后得到的結果,言而與之:像素進行運算所得到的結果;這個結果有可能是一個具體的值、向量、矩陣、多維

Haar是個具體的值,是經過白色方塊和黑色方塊之后相減得到的,故Haar特征得到的是一個值

如何利用特征區分目標?
通過閾值判決

如何得到判決?
通過機器學習得到判決文獻,讓機器知道什么是特征;通過機器學習獲取判決;利用計算的特征獲得閾值判決

計算公式:

特征=白色-黑色
特征=整個區域權重 + 黑色權重
特征=(p1-p2-p3+p4)*w

推導Haar特征公式:
黑色和白色的整體權重為-1;白色部分的權重值為1,黑色部分的權重值為-2
特征 = 整個區域 * 權重1 + 黑色 * 權重2 = (黑+白)* 1 + 黑 * (-2) = 黑+白 - 2 * 黑 = 白-黑

四、Haar特征遍歷原理

需要將haar模板從上到下,從左到右進行遍歷,也需要知道圖片的大小以及模板的大小,若原圖像大小為100100,harr模板大小為1010,則需要100次才可以將整個圖片遍歷完畢
原圖100100 模板1010 步長10 使用模板滑動
模板不僅可以進行滑動,還可以進行模板的縮放;例如原先的模板為1010,每次縮放10%,則下次的模板大小為1111,若為20級,則進行20次的縮放
舉例:原圖像為1080720大小,模板步長step為2,原始模板大小為1010
要想計算整個圖像上的haar特征當前的計算量為:14(14個模板) * 20(20級縮放,也就是20次縮放) * (1080/2 * 720/2)(需要這么多的模板) * (10 * 10這一百個點的加減運算) = 50-100億次的運算
若要求計算機處理每秒不得低于15幀,則 50-100億次 * 15 = 基本上為1000億次的運算量,故運算量太大,國外有個大神研究出了積分圖的概念,可以極大的減小運算量。

五、積分圖

在這里插入圖片描述
A為1,B為1 2,C為1 3,D為1 2 3 4
若求第4部分 = A-B-C+D = (1) - (1+2) - (1+3) + (1+2+3+4) = 4

六、Adaboost分類器

例如檢測:

蘋果、蘋果、蘋果、香蕉
0.1 — 0.1 — 0.1 — 0.5

則通過檢測的結果可以區分種類,此時需要一個終止條件
訓練終止條件:
1、迭代的最大次數
2、每次迭代完之后有個檢測概率p,即最小的誤差概率,例如三個蘋果,一個香蕉,此時的檢測概率為75%

分類器的結構、Adaboost分類器的計算過程、opencv自帶的人臉分類器的文檔xml結構

分類器的結構:設定一個閾值T,若haar特征>閾值T,則認為是蘋果,否則認為是香蕉,這是一級分類器,但效果不太好
haar>T1 and haar>T2,此時可以使用兩級分類器,兩個閾值。對于每一級的分類器規定為強分類器,則這是兩個強分類器組成;正常情況下Adaboost有15-20個強分類器所組成,若一個目標連續通過15-20這些閾值,則認為是準確目標。
在這里插入圖片描述
Adaboost分類器的計算過程
如上圖,三個強分類器組成:第一個強分類器特征為x1,閾值為t1、第二個強分類器特征為x2,閾值為t2、第三個強分類器特征為x3,閾值為t3
進行判決的時候x1>t1表明已經通過了第一個強分類器,同理,最后需要都通過這些強分類器,即:x1>t1 and x2>t2 and x3>t3 三個強分類器都通過時,則認為是目標

強分類器作用:判斷當前的閾值與當前的特征是否吻合,從而達到目標判決的效果
弱分類器作用:計算強分類器的特征,即計算當前的x1,x2,x3

例如:弱分類器計算的特征為y1,y2,y2;第二個強分類器的閾值x2 = sum(y1,y2,y3)由三個弱分類器計算的特征進行累加從而得到強分類器的特征x2

弱分類器特征y1,y2,y3的計算:每個弱分類器是由若干個Node結點組成,最后的弱分類器的特征的計算還得歸結于特征節點Node的計算
Node結點計算弱分類器特征:在opencv中一個弱分類器最多支持3個haar特征,每一個haar特征構成一個Node結點
例如Node1對應haar特征1,若haar特征1 > Node結點1的閾值判決(haar1 > Node1 T),則把當前的結點特征z1 = α1
若haar特征1 < Node結點1的閾值判決(haar1 < Node1 T),則把當前的結點特征z1 = α2

這是Node1,同理可計算出z2、z3
Z = sum(z1,z2,z3),若Z>判決文獻T,則弱分類器的計算特征y1=AA
Z = sum(z1,z2,z3),若Z<判決文獻T,則弱分類器的計算特征y1=BB
將所有弱分類器的計算特征求和,可得強分類器x,x=sum(y1,y2,y3)
強分類器在和強分類器的閾值文獻T進行比較,x >T1
若連續通過三個強分類器的閾值判決文獻,則認為是目標

Adaboost訓練步驟
1,完成初始化數據的權值分布

蘋果 蘋果 蘋果 香蕉
0.1—0.1—0.1—0.1

2、遍歷閾值,計算出一系列的誤差概率P,選取一個最小的誤差概率minP,其對應的權值為t
3、計算權重G1(x)
4、更新訓練數據的權重分布

蘋果 蘋果 蘋果 香蕉
0.2—0.2—0.2—0.8

檢測人臉和人眼,并描繪出來

步驟:
1、加載xml文件
2、加載圖片
3、計算圖片的haar特征和對圖像進行灰度處理,haar特征的計算opencv已經封裝好了,調用即可;其中用戶自需要對圖像進行灰度處理即可,因為opencv中的所有haar特征都是基于灰度圖片來進行計算的
4、進行檢測,檢測出當前haar特征的人臉以及人臉上的特征,例如:人臉和眼睛
5、對檢測出來的結果進行遍歷,并繪制出檢測出來的方框

face_xml.detectMultiScale(gray,1.3,5)
參數一:需要進行人臉檢測的灰度圖
參數二:縮放系數,即比例縮放
參數三:人臉目標大小

import cv2
import numpy as np
# xml文件的引入
face_xml = cv2.CascadeClassifier('E:\Jupyter_workspace\study\DL\data/haarcascade_frontalface_default.xml')
eye_xml = cv2.CascadeClassifier('E:\Jupyter_workspace\study\DL\data/haarcascade_eye.xml')
# 加載含有人臉的圖片
img = cv2.imread('E:\Jupyter_workspace\study\DL\data/aa.jpg')
cv2.imshow('src',img)
# 計算haar特征和對圖像進行灰度轉化gray
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 人臉識別的檢測
faces = face_xml.detectMultiScale(gray,1.3,5)
print('face=',len(faces))#檢測當前的人臉個數
# 繪制人臉,為檢測到的每個人臉進行畫方框繪制
for (x,y,w,h) in faces:cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)#人臉識別roi_face = gray[y:y+h,x:x+w]#灰色人臉數據roi_color = img[y:y+h,x:x+w]#彩色人臉數據# 1 grayeyes = eye_xml.detectMultiScale(roi_face)#眼睛識別,圖片類型必須是灰度圖print('eye=',len(eyes))#打印檢測出眼睛的個數for (e_x,e_y,e_w,e_h) in eyes:#繪制眼睛方框到彩色圖片上cv2.rectangle(roi_color,(e_x,e_y),(e_x+e_w,e_y+e_h),(0,255,0),2)cv2.imshow('dst',img)
cv2.waitKey(0)

效果圖如下:
在這里插入圖片描述

檢測人臉,將人臉進行ROI提取,并保存

# 1 load xml 2 load jpg 3 haar gray 4 detect 5 draw
import cv2
import numpy as np
# load xml 1 file name
face_xml = cv2.CascadeClassifier('E:\Jupyter_workspace\study\DL\data/haarcascade_frontalface_default.xml')
eye_xml = cv2.CascadeClassifier('E:\Jupyter_workspace\study\DL\data/haarcascade_eye.xml')
# load jpg
img = cv2.imread('E:\Jupyter_workspace\study\DL\data/face.jpg')
cv2.imshow('src',img)
# haar gray
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# detect faces 1 data 2 scale 3 5
faces = face_xml.detectMultiScale(gray,1.3,5)
print('face=',len(faces))
# draw
index = 0
for (x,y,w,h) in faces:cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)roi_face = gray[y:y+h,x:x+w]roi_color = img[y:y+h,x:x+w]fileName = "E:\Jupyter_workspace\study\DL\data/"+str(index)+'.jpg'cv2.imwrite(fileName,roi_color)index = index + 1# 1 grayeyes = eye_xml.detectMultiScale(roi_face)print('eye=',len(eyes))#for (e_x,e_y,e_w,e_h) in eyes:#cv2.rectangle(roi_color,(e_x,e_y),(e_x+e_w,e_y+e_h),(0,255,0),2)
cv2.imshow('dst',img)
cv2.waitKey(0)

在這里插入圖片描述
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378537.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378537.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378537.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php xml表格形式輸出,PHP XML如何輸出nice格式

這里是代碼&#xff1a;$doc new DomDocument(1.0);// create root node$root $doc->createElement(root);$root $doc->appendChild($root);$signed_values array(a > eee, b > sd, c > df);// process one row at a timeforeach ($signed_values as $key &…

Opencv實戰【3】——圖像修復與圖像銳化(darling in the franxx)

目錄前言圖像修復圖像銳化darling in the franxx圖片總結前言 前天&#xff0c;在群里看見有人發了這張表情包&#xff1a; 感覺女主有點好看&#xff0c;然后問室友是啥番劇&#xff08;darling in the franxx&#xff09;&#xff0c;然后就去補番了&#xff0c;然后從晚上…

python 示例_Python date isoweekday()方法與示例

python 示例Python date.isoweekday()方法 (Python date.isoweekday() Method) date.isoweekday() method is used to manipulate objects of date class of module datetime. date.isoweekday()方法用于處理模塊日期時間的日期類的對象。 It uses a date class object and r…

07-機器學習(Hog+SVM實現小獅子識別)

一、SVM支持向量機 什么是SVM支持向量機&#xff1f; SVM支持向量機本質仍是一個分類器&#xff0c;其核心為尋求一個最優超平面最終實現分類&#xff0c;實現分類問題 在尋求超平面的時候有多種方式&#xff0c;可以使用若干條直線或曲線進行分類&#xff0c;這里使用的是直線…

Net Remoting基礎篇

一、Remoting基礎 什么是Remoting&#xff0c;簡而言之&#xff0c;我們可以將其看作是一種分布式處理方式。從微軟的產品角度來看&#xff0c;可以說Remoting就是DCOM的一種升 級&#xff0c;它改善了很多功能&#xff0c;并極好的融合到.Net平臺下。Microsoft .NET Remoting …

Maven3.0.5代理nexus

Nexus簡介 Nexus是Sonatype推出的強大Maven倉庫管理器產品&#xff0c;要比以前TSS上介紹的Artifactory要好使用的多&#xff0c;也是一個拆箱即用的Java App&#xff0c;內嵌Jetty容器和Java Wrapper做Windows服務&#xff0c;安裝簡單到解壓然后雙擊install即可。更詳細的幫助…

8253譯碼電路設計以及初始化編程講解

先驗知識回顧&#xff1a;知識點不清晰的時候可以查詢相關知識點。 https://blog.csdn.net/qq_42604176/article/details/105810973 需掌握的主要知識點 1、譯碼電路設計 2、初始化編程 例題1 在以 8086構成的最大方式系統中&#xff0c;有一片8254的端口地址分別為301H、3…

java安卓寫文件路徑,如何使用gradle作為構建系統,平臺Android配置Protobuf(Java)文件的輸出路徑?...

我正在努力解決以下問題&#xff1a;我有2個基于maven的java項目和1個基于gradle的Android項目 . 布局如下&#xff1a;Workspace/├── MavenProj1/├── MavenProj2/├── AndroidGradleProject1/├── Protos/所有這些的包結構很常見&#xff0c;比方說 com.example.* 所…

Java System類exit()方法及示例

系統類exit()方法 (System class exit() method) exit() method is available in java.lang package. exit()方法在java.lang包中可用。 exit() method is used to exit the currently running JVM (Java Virtual Machine). exit()方法用于退出當前正在運行的JVM(Java虛擬機)。…

基于圖像處理的數碼印花噴墨墨滴形狀規范的研究(Python+OpenCV+Mysql)

大體思路&#xff1a;由于墨滴的不同參數會對墨滴的形態產生一定的影響&#xff0c;故如果通過研究墨滴的形態則通過海量的數據就可以大概確定墨滴的各項參數指標的范圍。通過OpenCV對墨滴的噴出的形狀進行圖像處理&#xff0c;對墨滴圖像進行一系列的分析&#xff0c;通過一系…

ASP.NET 主題(Themes)FAQ

1、主題是什么 主題由一組元素組成&#xff1a;外觀、級聯樣式表 (CSS)、圖像和其他資源。主題將至少包含外觀。主題是在網站或 Web 服務器上的特殊目錄中定義的。主題是一組Web Control的屬性設置的集合&#xff0c;提供一種簡單的方法設置控件的樣式屬性。 主題只在Web Contr…

Head First HTML與CSS、XHTML++筆記(第四章 WEB鎮之旅 第五章 認識媒體)

第四章 鏈接&#xff08;詳解<a>元素&#xff09; 目標錨 在目標位置 <h2><a id"chai">contentTest</a></h2> 在需要鏈接位置 <a href"index.html#chai">See</a> 鏈接到自身的目標錨 <a href"#top"…

Opencv實戰【4】——圖片動漫化處理

博主聯系方式&#xff1a; QQ:1540984562 微信&#xff1a;wxid_nz49532kbh9u22 QQ交流群&#xff1a;750313950 目錄動漫化風格的特點處理手段代碼實現效果總結動漫化風格的特點 &#xff08;1&#xff09;動漫中的細節相對少&#xff1b; &#xff08;2&#xff09;動漫中的邊…

nextshort_Java掃描儀的nextShort()方法與示例

nextshort掃描器類的nextShort()方法 (Scanner Class nextShort() method) Syntax: 句法&#xff1a; public short nextShort();public short nextShort(int rad);nextShort() method is available in java.util package. nextShort()方法在java.util包中可用。 nextShort() …

php 生成css文件怎么打開,php生成html文件的多種步驟介紹

//定義日期函數functiongetdatetime(){$datetimegetdate();$strReturn$datetime["year"]."-";$strReturn$strReturn.$datetime["mon"]."-";$strReturn$strReturn.$datetime["mday"];return$strReturn;}//定義時間函數(文件名…

08-KNN手寫數字識別

標簽下載地址 文件內容備注train-images-idx3-ubyte.gz訓練集圖片&#xff1a;55000張訓練圖片&#xff0c;5000張驗證圖片train-labels-idx1-ubyte.gz訓練集圖片對應的數字標簽t10k-images-idx3-ubyte.gz測試集圖片&#xff1a;10000張圖片t表示test&#xff0c;測試圖片&…

MFC odbc訪問遠程數據庫

首先&#xff0c;MFC通過ODBC訪問數據庫&#xff0c;主要使用兩個類&#xff0c;一個是CDataBase&#xff0c;一個是CRecordset。第一個是用于建立數據庫連接的&#xff0c;第二個是數據集&#xff0c;用來查詢的。步驟如下&#xff1a;1.實例化一個CDataBase對象&#xff0c;并…

微機原理——擴展存儲器設計

目錄【1】存儲器的層次結構【2】存儲器的分類【3】SRAM1、基本原理&#xff1a;2、結構&#xff1a;3、芯片參數與引腳解讀&#xff1a;4、CPU與SRAM的連接方式【4】DRAM1、基本原理&#xff1a;2、結構3、芯片引腳解讀&#xff1a;【5】存儲器系統設計【6】存儲器擴展設計&…

floatvalue 重寫_Java Number floatValue()方法與示例

floatvalue 重寫Number類floatValue()方法 (Number Class floatValue() method) floatValue() method is available in java.lang package. floatValue()方法在java.lang包中可用。 floatValue() method is used to return the value denoted by this Number object converted …

array_column php什么版本可以用,array_column兼容php5.5以下版本

gistfile1.txt// ----------------------------------------------------------------------// |獲取二維數組中指定的一列&#xff0c;PHP5.5以后有專用函數array_column()// ----------------------------------------------------------------------// |param array $arr// …