人类微笑表情识别(HOG算法)
文章目錄
- 1、關于HOG
- 2、代碼實現部分
- 2.1、基礎代碼完善
- 2.2、結果測試
- 3、總結
1、關于HOG
????1、簡介:梯度直方圖特征(HOG) 是一種對圖像局部重疊區域的密集型描述符, 它通過計算局部區域的梯度方向直方圖來構成特征。Hog特征結合SVM分類器已經被廣泛應用于圖像識別中,尤其在行人檢測中獲得了極大的成功。需要提醒的是,HOG+SVM進行行人檢測的方法是法國研究人員Dalal在2005的CVPR上提出的,而如今雖然有很多行人檢測算法不斷提出,但基本都是以HOG+SVM的思路為主。
????2、識別微笑表情的原理圖
????3、特征提取原理: HOG特征是一種局部區域描述符,它通過計算局部區域上的梯度方向直方圖來構成人體特征,能夠很好地描述人體的邊緣,它對光照變化和小量的偏移不敏感。
圖像中像素點(x,y)的梯度為
2、代碼實現部分
2.1、基礎代碼完善
????1、首先導入需要用到的包
# 導入包 import numpy as np import cv2 import dlib import random#構建隨機測試集和訓練集 from sklearn.svm import SVC #導入svm from sklearn.svm import LinearSVC #導入線性svm from sklearn.pipeline import Pipeline #導入python里的管道 import os import joblib#保存模型 from sklearn.preprocessing import StandardScaler,PolynomialFeatures #導入多項式回歸和標準化 import tqdm????2、獲取圖片路徑
folder_path='E:/嵌入式、通信、人工智能/genki4k/' label='labels.txt'#標簽文件 pic_folder='files/'#圖片文件路徑????3、獲得默認的人臉檢測其和訓練好的人臉68特征點檢測器
#獲得默認的人臉檢測器和訓練好的人臉68特征點檢測器 def get_detector_and_predicyor():#使用dlib自帶的frontal_face_detector作為我們的特征提取器detector = dlib.get_frontal_face_detector()"""功能:人臉檢測畫框參數:PythonFunction和in Classesin classes表示采樣次數,次數越多獲取的人臉的次數越多,但更容易框錯返回值是矩形的坐標,每個矩形為一個人臉(默認的人臉檢測器)"""#返回訓練好的人臉68特征點檢測器predictor = dlib.shape_predictor('E:/qq/shape_predictor_68_face_landmarks.dat')return detector,predictor #獲取檢測器 detector,predictor=get_detector_and_predicyor()????4、截取面部的函數
def cut_face(img,detector,predictor): #截取面部img_gry=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)rects = detector(img_gry, 0) if len(rects)!=0:mouth_x=0mouth_y=0landmarks = np.matrix([[p.x, p.y] for p in predictor(img,rects[0]).parts()])for i in range(47,67):#嘴巴范圍mouth_x+=landmarks[i][0,0]mouth_y+=landmarks[i][0,1]mouth_x=int(mouth_x/20)mouth_y=int(mouth_y/20)#裁剪圖片img_cut=img_gry[mouth_y-20:mouth_y+20,mouth_x-20:mouth_x+20]return img_cutelse:return 0#檢測不到人臉返回0????5、提取特征值的函數
#提取特征值 def get_feature(files_train,face,face_feature): for i in tqdm.tqdm(range(len(files_train))):img=cv2.imread(folder_path+pic_folder+files_train[i])cut_img=cut_face(img,detector,predictor)if type(cut_img)!=int:face.append(True)cut_img=cv2.resize(cut_img,(64,64))#padding:邊界處理的paddingpadding=(8,8)winstride=(16,16)hogdescrip=hog.compute(cut_img,winstride,padding).reshape((-1,))face_feature.append(hogdescrip)else:face.append(False)#沒有檢測到臉的face_feature.append(0)????6、篩選函數
def filtrate_face(face,face_feature,face_site): #去掉檢測不到臉的圖片的特征并返回特征數組和相應標簽 face_features=[]#獲取標簽label_flag=[]with open(folder_path+label,'r') as f:lines=f.read().splitlines()#篩選出能檢測到臉的,并收集對應的labelfor i in tqdm.tqdm(range(len(face_site))):if face[i]:#判斷是否檢測到臉#pop之后要刪掉當前元素,后面的元素也要跟著前移,所以每次提取第一位就行了face_features.append(face_feature.pop(0))label_flag.append(int(lines[face_site[i]][0])) else:face_feature.pop(0)datax=np.float64(face_features)datay=np.array(label_flag)return datax,datay????7、多項式核svm和高斯核svm
def PolynomialSVC(degree,c=10):#多項式svmreturn Pipeline([# 將源數據 映射到 3階多項式("poly_features", PolynomialFeatures(degree=degree)),# 標準化("scaler", StandardScaler()),# SVC線性分類器("svm_clf", LinearSVC(C=10, loss="hinge", random_state=42,max_iter=10000))]) #svm高斯核 def RBFKernelSVC(gamma=1.0):return Pipeline([('std_scaler',StandardScaler()),('svc',SVC(kernel='rbf',gamma=gamma))])????8、訓練函數
def train(files_train,train_site):#訓練'''files_train:訓練文件名的集合train_site :訓練文件在文件夾里的位置'''#是否檢測到人臉train_face=[]#人臉的特征數組train_feature=[]#提取訓練集的特征數組get_feature(files_train,train_face,train_feature)#篩選掉檢測不到臉的特征數組train_x,train_y=filtrate_face(train_face,train_feature,train_site)svc=PolynomialSVC(degree=1)svc.fit(train_x,train_y)return svc#返回訓練好的模型????9、測試函數
def test(files_test,test_site,svc):#預測,查看結果集'''files_train:訓練文件名的集合train_site :訓練文件在文件夾里的位置'''#是否檢測到人臉test_face=[]#人臉的特征數組test_feature=[]#提取訓練集的特征數組get_feature(files_test,test_face,test_feature)#篩選掉檢測不到臉的特征數組test_x,test_y=filtrate_face(test_face,test_feature,test_site)pre_y=svc.predict(test_x)ac_rate=0for i in range(len(pre_y)):if(pre_y[i]==test_y[i]):ac_rate+=1ac=ac_rate/len(pre_y)*100print("準確率為"+str(ac)+"%")return ac????10、HOG特征提取器
#設置hog的參數 winsize=(64,64) blocksize=(32,32) blockstride=(16,16) cellsize=(8,8) nbin=9 #定義hog hog=cv2.HOGDescriptor(winsize,blocksize,blockstride,cellsize,nbin) #獲取文件夾里有哪些文件 files=os.listdir(folder_path+pic_folder)????11、數據集中隨機的9/10做為訓練集,剩下的1/10做為測試集,進行十次
ac=float(0) for j in range(10):site=[i for i in range(4000)]#訓練所用的樣本所在的位置train_site=random.sample(site,3600)#預測所用樣本所在的位置test_site=[]for i in range(len(site)):if site[i] not in train_site:test_site.append(site[i])files_train=[]#訓練集,占總數的十分之九for i in range(len(train_site)):files_train.append(files[train_site[i]])#測試集files_test=[]for i in range(len(test_site)):files_test.append(files[test_site[i]])svc=train(files_train,train_site)ac=ac+test(files_test,test_site,svc)save_path='F:/picture/train/second'+str(j)+'(hog).pkl'joblib.dump(svc,save_path) ac=ac/10 print("平均準確率為"+str(ac)+"%")2.2、結果測試
????1、檢測結果
????2、寫入檢測函數
在這里插入代碼片def test1(files_test,test_site,svc):#預測,查看結果集'''files_train:訓練文件名的集合train_site :訓練文件在文件夾里的位置'''#是否檢測到人臉test_face=[]#人臉的特征數組test_feature=[]#提取訓練集的特征數組get_feature(files_test,test_face,test_feature)#篩選掉檢測不到臉的特征數組test_x,test_y=filtrate_face(test_face,test_feature,test_site)pre_y=svc.predict(test_x)tp=0tn=0for i in range(len(pre_y)):if pre_y[i]==test_y[i] and pre_y[i]==1:tp+=1elif pre_y[i]==test_y[i] and pre_y[i]==0:tn+=1f1=2*tp/(tp+len(pre_y)-tn)print(f1)????3、加載剛剛保存本地模型然后調用檢測函數查看結果
svc7=joblib.load('F:/picture/train/second9(hog).pkl') site=[i for i in range(4000)] #訓練所用的樣本所在的位置 train_site=random.sample(site,3600) #預測所用樣本所在的位置 test_site=[] for i in range(len(site)):if site[i] not in train_site:test_site.append(site[i]) #測試集 files_test=[] for i in range(len(test_site)):files_test.append(files[test_site[i]]) test1(files_test,test_site,svc7)測試結果
????4、寫入笑臉檢測函數并進行圖片檢測
def smile_detector(img,svc):cut_img=cut_face(img,detector,predictor)a=[]if type(cut_img)!=int:cut_img=cv2.resize(cut_img,(64,64))#padding:邊界處理的paddingpadding=(8,8)winstride=(16,16)hogdescrip=hog.compute(cut_img,winstride,padding).reshape((-1,))a.append(hogdescrip)result=svc.predict(a)a=np.array(a)return result[0]else :return 2##圖片檢測 pic_path='F:/picture/second/facesmile/mytest/xz3.jpg' img=cv2.imread(pic_path) result=smile_detector(img,svc7) if result==1:img=cv2.putText(img,'smile',(21,50),cv2.FONT_HERSHEY_COMPLEX,2.0,(0,255,0),1) elif result==0:img=cv2.putText(img,'no smile',(21,50),cv2.FONT_HERSHEY_COMPLEX,2.0,(0,255,0),1) else:img=cv2.putText(img,'no face',(21,50),cv2.FONT_HERSHEY_COMPLEX,2.0,(0,255,0),1) cv2.imshow('video', img) cv2.waitKey(0)檢測結果
????5、調用攝像頭實時檢測并保持,按s鍵保存剛剛的識別的圖片,按esc退出
camera = cv2.VideoCapture(0)#打開攝像頭 ok=True flag=0 # 打開攝像頭 參數為輸入流,可以為攝像頭或視頻文件 while ok:ok,img = camera.read()# 轉換成灰度圖像result=smile_detector(img,svc7)if result==1:img=cv2.putText(img,'smile',(21,50),cv2.FONT_HERSHEY_COMPLEX,2.0,(0,255,0),1)elif result==0:img=cv2.putText(img,'no smile',(21,50),cv2.FONT_HERSHEY_COMPLEX,2.0,(0,255,0),1)else:img=cv2.putText(img,'no face',(21,50),cv2.FONT_HERSHEY_COMPLEX,2.0,(0,255,0),1)cv2.imshow('video', img)k = cv2.waitKey(1)if k == X: # press 'ESC' to quitbreakelif k==115:pic_save_path='F:/picture/second/result/'+str(flag)+'.jpg'flag+=1cv2.imwrite(pic_save_path,img) camera.release() cv2.destroyAllWindows()3、總結
????通過人臉微笑的檢測,進一步的加深對HOG算法的學習,了解該算法的優點,同時又對人臉68特征點的采集知識進行了復習。
參考:
https://blog.csdn.net/carson2005/article/details/7782726
https://blog.csdn.net/weixin_56102526/article/details/121926814?spm=1001.2014.3001.5501
總結
以上是生活随笔為你收集整理的人类微笑表情识别(HOG算法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 项目完成
- 下一篇: Pycharm 专业版 导入系统pip安