# 從人臉圖像文件中提取人臉特征存入 CSV
#Features extraction from images and save into features_all.csv#return_128d_features() 獲取某張圖像的128D特征#compute_the_mean() 計(jì)算128D特征均值from cv2 import cv2 as cv2
import os
import dlib
from skimage import io
import csv
import numpy as np# 要讀取人臉圖像文件的路徑
path_images_from_camera ="D:/631907060224/person/"#Dlib 正向人臉檢測(cè)器
detector = dlib.get_frontal_face_detector()#Dlib 人臉預(yù)測(cè)器
predictor = dlib.shape_predictor("D:/BaiduNetdiskDownload/shape_predictor_68_face_landmarks.dat")#Dlib 人臉識(shí)別模型#Face recognition model, the object maps human faces into 128D vectors
face_rec = dlib.face_recognition_model_v1("D:/BaiduNetdiskDownload/dlib_face_recognition_resnet_model_v1.dat")# 返回單張圖像的 128D 特征
def return_128d_features(path_img):img_rd = io.imread(path_img)img_gray = cv2.cvtColor(img_rd, cv2.COLOR_BGR2RGB)faces =detector(img_gray,1)print("%-40s %-20s"%("檢測(cè)到人臉的圖像 / image with faces detected:", path_img),'\n')# 因?yàn)橛锌赡芙叵聛?lái)的人臉再去檢測(cè),檢測(cè)不出來(lái)人臉了# 所以要確保是 檢測(cè)到人臉的人臉圖像 拿去算特征iflen(faces)!=0:shape =predictor(img_gray, faces[0])face_descriptor = face_rec.compute_face_descriptor(img_gray, shape)else:face_descriptor =0print("no face")return face_descriptor# 將文件夾中照片特征提取出來(lái), 寫(xiě)入 CSV
def return_features_mean_personX(path_faces_personX):features_list_personX =[]photos_list = os.listdir(path_faces_personX)if photos_list:for i in range(len(photos_list)):# 調(diào)用return_128d_features()得到128d特征print("%-40s %-20s"%("正在讀的人臉圖像 / image to read:", path_faces_personX +"/"+ photos_list[i]))features_128d =return_128d_features(path_faces_personX +"/"+ photos_list[i])#print(features_128d)# 遇到?jīng)]有檢測(cè)出人臉的圖片跳過(guò)if features_128d ==0:i +=1else:features_list_personX.append(features_128d)i1=str(i+1)add="D:/631907060224/feature/face_feature"+i1+".csv"print(add)with open(add,"w", newline="") as csvfile:writer1 = csv.writer(csvfile)writer1.writerow(features_128d)else:print("文件夾內(nèi)圖像文件為空 / Warning: No images in "+ path_faces_personX +'/','\n')# 計(jì)算 128D 特征的均值#N x 128D ->1 x 128Dif features_list_personX:features_mean_personX = np.array(features_list_personX).mean(axis=0)else:features_mean_personX ='0'return features_mean_personX# 讀取某人所有的人臉圖像的數(shù)據(jù)
people = os.listdir(path_images_from_camera)
people.sort()with open("D:/631907060224/feature/features2_all.csv","w", newline="") as csvfile:writer = csv.writer(csvfile)for person in people:print("##### "+ person +" #####")#Get the mean/average features of face/personX, it will be a list with a length of 128Dfeatures_mean_personX =return_features_mean_personX(path_images_from_camera + person)writer.writerow(features_mean_personX)print("特征均值 / The mean of features:",list(features_mean_personX))print('\n')print("所有錄入人臉數(shù)據(jù)存入 / Save all the features of faces registered into: D:/631907060224/feature/features_all2.csv")