首页 > 编程知识 正文

人脸识别主流算法,人脸识别技术算法

时间:2023-05-06 13:52:47 阅读:173630 作者:838

【人工智能项目】面部表情识别

这次,使用传统的机械法识别脸部表情。 主要步骤是首先提取人脸表情特征,将特征进行拼接,发送到机器学习模型中,得到最终的检测结果。 那就干吧!

此次用于生成所需图像的数据为fer2013.csv数据,图像以像素值的形式保存在csv文件中,因此需要制成图像。

importpandasaspddf=PD.read _ CSV ('./fer 2013.CSV ' ) df.head ) # encoding 3360 utf-8 importpandasasaspdimportnumpyasportnumpyasv '1':'disgust '3':'happy ','4':'sad ','5':'surprised ', '6':'normal'} defcreatedir(dir ) :ifOS.path.exists(dir ) isfalse:OS.makedirs ) defsaveimager csv文件faces _ data=pata )并遍历CSV文件内容,按分类保存图像数据的forindexinrange(len(faces_data ) )解析各行的CSV文件的内容的emotion _ data=faces # usage _ data=faces _ data.loc [ index ] [2] #将图像数据转换为48*48data_array=list(map ) float, image_data.split () ) data_array=NP.asarray ) data_array ) image=data_array.reshape(48, 48 ) #选择分类文件名dirname=usage _ dataemotionname=emotions [ str (emotion _ data ) ] #用于保存图像的文件夹image path=OS.path.jath emotionname(#分类和表情文件夹createdir(dirname ) create dir (create dir ) imagepath ) )图像文件名imagename=OS.path.join ) imagepath,sth image ) imageCount=index print ) )全部) str ) imagecount )单张图像) ) )。

将生成的图像可视化展示分析。

#可视化图像angerdisgustfearhappynormalsadsurprisedfromtensorflow.keras.preprocessing.imageimportload _ img, img _ to _ arrayimportmatplotlib.pyplotaspltimportosimportwarnings % matplotlibinline #图像的像素大小为48* 48PIC_size=48PLT.FIZE 20 ) CPT=0forexpressioninos.list dir (./training/' ) : foriinrange (1,6 ) : CPT=6 cpt ) img=load _ img ('./training/' expression '/' OS.list dir ('./training/' expression ) ) I,target_

然后,统计训练图像中类别数

#训练图像中每个类别的数量forexpressioninos.list dir ('./training/' ) :print ) str ) OS.listdir )、'./tr

aining/"+expression)))+" " + expression +" images")

95 anger images
436 disgust images
4097 fear images
7215 happy images
4965 normal images
4830 sad images
3171 surprised images

特征提取工作 import osimport numpy as npfrom skimage import feature as skiffrom skimage import io, transformimport randomfrom sklearn.multiclass import OneVsRestClassifierfrom sklearn.svm import SVR <img src="./2.png"> def get_lbp_data(images_data, hist_size=256, lbp_radius=1, lbp_point=8): n_images = images_data.shape[0] hist = np.zeros((n_images, hist_size)) for i in np.arange(n_images): # 使用LBP方法提取图像的纹理特征. lbp = skif.local_binary_pattern(images_data[i], lbp_point, lbp_radius, 'default') # 统计图像的直方图 max_bins = int(lbp.max() + 1) # hist size:256 hist[i], _ = np.histogram(lbp, normed=True, bins=max_bins, range=(0, max_bins)) return hist import osimport cv2anger_imgs_path = "./Training/anger/"anger_hists = []for img_path in os.listdir(anger_imgs_path): img = cv2.imread(os.path.join(anger_imgs_path,img_path)) hist = get_lbp_data(img, hist_size=256, lbp_radius=1, lbp_point=8) anger_hists.append(hist) anger_hists = np.array(anger_hists)print(anger_hists.shape) import numpy as npanger_arr = np.zeros(3995) anger_arr.shape

同理,对其余文件夹中的图片进行相同操作,生成各个表情的特征之后,对其拼接。

x_train = np.vstack((anger_hists,disgust_hists,fear_hists,happy_hists,normal_hists,sad_hists,surprised_hists))y_train = []anger_list = list(anger_arr)disgust_list = list(disgust_arr)fear_list = list(fear_arr)happy_list = list(happy_arr)normal_list = list(normal_arr)sad_list = list(sad_arr)surprised_list = list(surprised_arr)anger_list.extend(disgust_list)anger_list.extend(fear_list)anger_list.extend(happy_list)anger_list.extend(normal_list)anger_list.extend(sad_list)anger_list.extend(surprised_list)y_train = np.array(anger_list) x_train.shapey_train.shape

重新划分

from sklearn.model_selection import train_test_splitx_train,x_test,y_train,y_test = train_test_split(X,y,test_size=0.1,random_state=2019) SVM模型 from sklearn.svm import SVCsvm = SVC(kernel="linear") svm.fit(x_train,y_train)

SVC(C=1.0, break_ties=False, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape=‘ovr’, degree=3, gamma=‘scale’, kernel=‘linear’,
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)

from sklearn.externals import joblibsvm = joblib.load("svm_train_model.m")print ("Donen") from sklearn.metrics import accuracy_score,f1_score,confusion_matrix,classification_reportfrom sklearn.externals import joblibjoblib.dump(svm, "svm_train_model.m")print ("Donen") prediction =svm.predict(x_test)score=accuracy_score(y_test,prediction) import seaborn as snsgarbage_types = ['anger','disgust','fear','happy','normal', 'sad','surprised']labels = {0:'anger',1:'disgust',2:'fear',3:'fear',4:'normal', 5:'sad',6:'surprised'}acc = accuracy_score(y_test,prediction)print(acc)con_matrix = confusion_matrix(y_test, prediction, labels=[0, 1, 2, 3, 4, 5, 6])plt.figure(figsize=(10, 10))plt.title('Prediction of garbage types')plt.ylabel('True label')plt.xlabel('Predicted label')# plt.show(sns.heatmap(con_matrix, annot=True, fmt="d",annot_kws={"size": 7},cmap='Blues',square=True))ax = sns.heatmap(con_matrix, annot=True, fmt="d", annot_kws={"size": 7}, cmap='Blues', square=True)bottom, top = ax.get_ylim()ax.set_ylim(bottom + 0.5, top - 0.5)plt.show() 小节

LBP+SVM人脸识别的准确率相比较深度学习比较一般,不过主要是让大家了解如何提取特征,送入机器学习模型当中。那么本次就到这里了,下次见!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。