看清是还是不是微笑,  需求调用的sklearn库

  3.3.2 模型练习

   图片 1

  干活内容主要以下两大块:提取人脸特征 ML建模

    项目的率先步,是内需变更单个手写体图像。

   介绍了采取sklearn的多少个机器学习模型举办手写体识别。 

 1. Get_features.py : **

   图片 2

          图5 
手写体识其他质量分析(在样本数为50的动静下)

 利用三种机器学习模型进行建模,达到一个二分类(分类有/无笑脸)的目标,然后分析模型识别精度和属性,并且可以辨认给定图片的人脸是否微笑;

3.编程进程

 

 

    三种模型的测试结果如图5所示,可知除了SVM达到84.7%的精度之外,其余都在60-七成左右。

  3.3.3 测试结果

  然后调用Get.features.py中的returnfeatures()函数进行特征提取,拿到给定图像的40维特征数组single_features;

先是步必要对CSV文件中的数据举办领取,利用pd.read_csv进行读取。写入CSV时,前60名列60维的特征向量,第⑥1列为输出标记1-9。  

   25张的测试结果图6所示,二种机器学习的模型的测试精度都达到了十分之九左右。

 1 # ML_smiles
 2 # 2018-1-27
 3 # By TimeStamp
 4 # cnblogs: http://www.cnblogs.com/AdaminXie/
 5 
 6 
 7 detector = dlib.get_frontal_face_detector()
 8 predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
 9 
10 # 输入图像文件所在路径,返回一个41维数组(包含提取到的40维特征和1维输出标记)
11 def returnfeatures(path_pic, XXXpic, features_csv):
12 
13     # 输入:  path_pic:    图像文件所在目录
14     #       XXXpic:      图像文件名
15 
16     # 输出:  features_csv 41维度的数组,前40维为(提取的20个特征点坐标的40个值),第41维为标记output
17 
18     # 比如 path_pic + XXXpic = "F:/code/test.jpg" 精确到jpg
19     img = cv2.imread(path_pic + XXXpic)
20     # 取灰度
21     img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
22 
23     # 计算68点坐标
24     pos_68 = []
25     rects = detector(img_gray, 0)
26     landmarks = np.matrix([[p.x, p.y] for p in predictor(img, rects[0]).parts()])
27     for idx, point in enumerate(landmarks):
28         # 68点的坐标
29         pos = (point[0, 0], point[0, 1])
30         pos_68.append(pos)
31 
32     # 将点49-68写入csv
33     # 即pos_68[48]-pos_68[67]
34     for i in range(48, 68):
35         features_csv.append(pos_68[i][0])
36         features_csv.append(pos_68[i][1])
37 
38     #print(features_csv)
39     return features_csv

          图6 
手写体识其余质量分析(在样本数为100的场馆下)

  3.3.1 特征数据加工

 

 

1 from sklearn.linear_model import LogisticRegression     #线性模型中的Logistic回归模型
2 from sklearn.linear_model import SGDClassifier          #线性模型中的随机梯度下降模型
3 from sklearn.svm import LinearSVC                       #SVM模型中的线性SVC模型
4 from sklearn.neural_network import MLPClassifier        #神经网络模型中的多层网络模型

  会拿到贰个41列的CSV文件,前40名列40维的输入特征,第肆1名列笑脸标记。   

 

 

 

  **3.2 **提取特征向量写入CSV

    三种模型的测试结果如图5所示,可知除了SVM达到84.7%的精度之外,其余都在60-7/10左右。

 

  须要调用的sklearn库:

 

#
请尊重外人劳动成果,转发可能应用源码请表明出处:
http://www.cnblogs.com/AdaminXie

   日增样本数到100,即生成了100张单个手写体图像,75张用来磨炼,25张用来测试。

 

 

  利用sklearn库的 train_test_split函数 将数据开展划分,

             (b)提取60维特征

   
今后大家早就建好机器学习模型,在2.2.2中能够使用sklearn机器学习模型的score函数拿到模型精度,可是只要想检测给定图像的笑颜,需求开展该有的工作:path_test_pic+XXXpic就是急需开展检测的文本路径,须要规范到图像文件,比如“F:/pic/test.pic”;

 #转发或是使用图片代码请体贴我劳动成果,注解出处,感谢

  1 from sklearn.preprocessing import StandardScaler
  2 
  3 from sklearn.linear_model import LogisticRegression     #线性模型中的Logistic回归模型
  4 from sklearn.linear_model import SGDClassifier          #线性模型中的随机梯度下降模型
  5 from sklearn.svm import LinearSVC                       #SVM模型中的线性SVC模型
  6 from sklearn.neural_network import MLPClassifier        #神经网络模型中的多层网络模型
  7 
  8 # LR
  9 def con_lr():
 10 
 11     X_train_LR = X_train
 12     y_train_LR = y_train
 13 
 14     X_test_LR = X_test
 15     y_test_LR = y_test
 16 
 17     ss = StandardScaler()
 18     X_train_LR = ss.fit_transform(X_train_LR)
 19     X_test_LR = ss.transform(X_test_LR)
 20 
 21     # 初始化LogisticRegression
 22     lr = LogisticRegression()
 23 
 24     # 调用LogisticRegression中的fit()来训练模型参数
 25     lr.fit(X_train_LR, y_train_LR)
 26 
 27     # 使用训练好的模型lr对X_test进行预测,结果储存在lr_y_predict中
 28     global y_predict_LR
 29     y_predict_LR = lr.predict(X_test_LR)
 30 
 31     # 性能分析
 32     print('Accuarcy of LR Classifier2:', lr.score(X_test_LR, y_test_LR))
 33     print (classification_report(y_test_LR, y_predict_LR))
 34 
 35 #SGD
 36 def con_sgd():
 37 
 38     X_train_SC = X_train
 39     y_train_SC = y_train
 40 
 41     X_test_SC = X_test
 42     y_test_SC = y_test
 43 
 44     # 标准化数据
 45     ss = StandardScaler()
 46     X_train_SC = ss.fit_transform(X_train_SC)
 47     X_test_SC = ss.transform(X_test_SC)
 48 
 49     # 初始化SGDClassifier
 50     sgdc = SGDClassifier()
 51 
 52     # 调用SGDClassifier中的fit函数用来训练模型参数
 53     sgdc.fit(X_train_SC, y_train_SC)
 54 
 55     # 使用训练好的模型sgdc对X_test进行预测,结果储存在sgdc_y_predict中
 56     global y_predict_SC
 57     y_predict_SC = sgdc.predict(X_test_SC)
 58 
 59     print ('Accarcy of SGD Classifier:', sgdc.score(X_test_SC, y_test_SC))
 60     print(classification_report(y_test_SC,y_predict_SC))
 61 
 62 #SVM方法
 63 def con_svm():
 64 
 65     X_train_SVM = X_train
 66     y_train_SVM = y_train
 67 
 68     X_test_SVM = X_test
 69     y_test_SVM = y_test
 70 
 71     ss = StandardScaler()
 72     X_train_SVM = ss.fit_transform(X_train_SVM)
 73     X_test_SVM = ss.transform(X_test_SVM)
 74 
 75     #调用线性SVC实例化
 76     lsvc = LinearSVC()
 77     lsvc.fit(X_train_SVM, y_train_SVM)
 78 
 79     global y_predict_SVM
 80     y_predict_SVM = lsvc.predict(X_test_SVM)
 81 
 82     print("The accurary:", lsvc.score(X_test_SVM, y_test_SVM))
 83     print(classification_report(y_test_SVM, y_predict_SVM))  # , target_names=digits.target_names.astype(str)))
 84 
 85 #神经网络
 86 def con_MLPClass():
 87 
 88     X_train_MLP = X_train
 89     y_train_MLP = y_train
 90 
 91     X_test_MLP = X_test
 92     y_test_MLP = y_test
 93 
 94     ss = StandardScaler()
 95     X_train_MLP = ss.fit_transform(X_train_MLP)
 96     X_test_MLP = ss.transform(X_test_MLP)
 97 
 98     #调用MLP实例化
 99     MLP = MLPClassifier(hidden_layer_sizes=(13,13,13), max_iter=500)
100     MLP.fit(X_train_MLP, y_train_MLP)
101 
102     global y_predict_MLP
103     y_predict_MLP = MLP.predict(X_test_MLP)
104 
105     print("The accurary:", MLP.score(X_test_MLP, y_test_MLP))
106     print(classification_report(y_test_MLP, y_predict_MLP))  # , target_names=digits.target_names.astype(str)))

  2.2.3 测试单张图片

               图1 全体的框架设计

    拿到陶冶集数据:X_train,
y_train

 

1 from sklearn.linear_model import LogisticRegression     #线性模型中的Logistic回归模型
2 from sklearn.linear_model import SGDClassifier          #线性模型中的随机梯度下降模型
3 from sklearn.svm import LinearSVC                       #SVM模型中的线性SVC模型
4 from sklearn.neural_network import MLPClassifier        #神经网络模型中的多层网络模型

  工程的目的,是想使用机械学习模型去陶冶识别生成的即兴验证码图像(单个数字1-9),通过以下四个步骤完毕:

  总体的规划流程如下图所示:

 

               图1 全部的框架设计

 

   图片 3

  通过 data.shape()
可以拿走data的维度,此时出口结果(100,61),表示有一百个样本,6壹个维度,其中伍拾九个维度时特征值,第四拾一个维度为出口标记值1-9。

 1 # pd读取CSV
 2 import pandas as pd
 3 
 4 # 分割数据
 5 from sklearn.model_selection import train_test_split
 6 
 7 # 用于数据预加工标准化
 8 from sklearn.preprocessing import StandardScaler
 9 
10 from sklearn.linear_model import LogisticRegression     # 线性模型中的Logistic回归模型
11 from sklearn.neural_network import MLPClassifier        # 神经网络模型中的多层网络模型
12 from sklearn.svm import LinearSVC                       # SVM模型中的线性SVC模型
13 from sklearn.linear_model import SGDClassifier          # 线性模型中的随机梯度下降模型

 

    Python使用相比受欢迎原因之一就是代码的可读性相比高,那段模型实例化的代码相比简单,两种机器学习模型的接纳实例化的代码也分外像样。

*  *way_LPAJERO() ,    Logistic
Regression,           (线性模型)中的逻辑斯特回归

  工程的目标,是想行使机械学习模型去练习识别生成的自由验证码图像(单个数字1-9),通过以下多少个步骤达成:

  图片 4

# 互换学习能够沟通邮箱 coneypo@foxmail.com

   图片 5

          图6 
手写体识其余质量分析(在样本数为100的意况下)

  输入图像文件所在路径,再次来到的的是数组features_csv(前三十七个为特征点坐标值,第肆1个为标志(1代表有笑容,0代表无笑脸))

  python:  3.6.3

    不过因为只有四10个样本点,小样本的景色下测试精度的偶然性误差相比大。


    随机生成数字1-9,然后拔取PIL的画笔工具举办画图,然后依照随便数的实在标记1-9,保存到对应文件夹内,然后用标记+序号命名。重心在介绍机器学习模型的使用,验证码生成那里不再过多介绍。

    这一步是领取图像中的特征。生成的单个图像是30*30即900个像素点的。

 

 1     def get_feature(img):
 2         # 提取特征
 3         # 30*30的图像,
 4 
 5         width, height = img.size
 6 
 7         global pixel_cnt_list
 8         pixel_cnt_list=[]
 9 
10         height = 30
11         for y in range(height):
12             pixel_cnt_x = 0
13             for x in range(width):
14                 # print(img.getpixel((x,y)))
15                 if img.getpixel((x, y)) == 0:  # 黑点
16                     pixel_cnt_x += 1
17 
18             pixel_cnt_list.append(pixel_cnt_x)
19 
20         for x in range(width):
21             pixel_cnt_y = 0
22             for y in range(height):
23                 if img.getpixel((x, y)) == 0:  # 黑点
24                     pixel_cnt_y += 1
25 
26             pixel_cnt_list.append(pixel_cnt_y)
27 
28         return pixel_cnt_list

 

   图3 人脸提取特征部分流程图 

    得到练习集数据:X_train,
y_train

1.费用条件

1 from sklearn.linear_model import LogisticRegression

 

 

 关于Github源码的采纳表达:

 

    项目标首先步,是索要扭转单个手写体图像。

  2.2 ML建模和测试

    1.生成多张单个验证码图像

0.引言

  图6 检测到没微笑

  图片 6

    随机生成数字1-9,然后选择PIL的画笔工具举办画图,然后依照随便数的诚实标记1-9,保存到相应文件夹内,然后用标记+序号命名。重心在介绍机器学习模型的应用,验证码生成那里不再过多介绍。

 而是通过机械学习模型,让模型去学学人脸嘴唇的坐标和判断笑脸的涉及

  **3.3 sklearn模型磨练和测试**

  须要调用的sklearn库:

      Python 3 利用 Dlib 19.7 举办人脸70个特征点的标定:

 

  图片 7

  python:  3.6.3

透过前边一各类的预备干活做完,那士大夫式开班利用sklearn的机器学习模型,利用陶冶多少对模型举办练习,然后使用测试数据举办品质测试。

 1 with open("D:/***/" + "***.csv", "w", newline="") as csvfile:
 2     writer = csv.writer(csvfile)
 3     # 访问文件夹 1-9
 4     for i in range(1, 10):
 5         namedir = os.listdir("D:/***/single/single_test/" + str(i))
 6         # 访问逐个图像文件
 7         for j in range(0, (len(namedir))):
 8             img = Image.open("D:/***/single/single_test/" + str(i) + "/" + namedir[j])
 9             get_feature(img)
10             
11             # 写入csv
12             pixel_cnt_list.append(namedir[j][0])
13             writer.writerow(pixel_cnt_list)

  
返回ss_L景逸SUV和L途乐,要求那八个再次回到值,是因为从此要运用它们对给定图像的展开检测,之后2.2.3节会介绍;

    为了下落维度,没有采取900个像素点每点的灰度作为输入,而是精选了30行每行的黑点数,和30列每列的黑点数作为输入,那样降到了60维。

   扩张样本数到100,即生成了100张单个手写体图像,75张用来陶冶,25张用来测试。

    http://www.cnblogs.com/AdaminXie/p/7905888.html

2.完好无缺陈设思路

  

    二种建模方法在sklearn中落到实处的代码类似,所以在此只介绍 LENVISION,
logistic regression, 逻辑斯特回归分类
,它是属于线性模型一种;

    在样本数 sample_num=50
的意况下,锻练四分之三多少,用肆分一的数目即11个样本进行测试。  

脾气的领到也相比简单,逐行逐列总结然后计数求和:

 图片 8图片 9

  3.3.3 测试结果

    3.sklearn模型练习和测试

 1 # ML_smiles
 2 # created: 2018-1-27
 3 # updated: 2018-1-31
 4 # By TimeStamp
 5 # cnblogs: http://www.cnblogs.com/AdaminXie/
 6 # way_LR() in ML_ways.py
 7 
 8 # LR, logistic regression, 逻辑斯特回归分类(线性模型)
 9 def way_LR():
10 
11     X_train_LR = X_train
12     y_train_LR = y_train
13 
14     X_test_LR = X_test
15     y_test_LR = y_test
16 
17     # 数据预加工
18     ss_LR = StandardScaler()
19     X_train_LR = ss_LR.fit_transform(X_train_LR)
20     X_test_LR = ss_LR.transform(X_test_LR)
21 
22     # 初始化LogisticRegression
23     LR = LogisticRegression()
24 
25     # 调用LogisticRegression中的fit()来训练模型参数
26     LR.fit(X_train_LR, y_train_LR)
27 
28     # 使用训练好的模型lr对X_test进行预测
29     # 结果储存在y_predict_LR中
30     global y_predict_LR
31     y_predict_LR = LR.predict(X_test_LR)
32 
33     # 评分函数
34     global score_LR
35     score_LR = LR.score(X_test_LR, y_test_LR)
36     print("The accurary of LR:", score_LR)
37 
38     return ss_LR, LR

   图片 10

            (a)提取900维特征

 **识别**精度在95%左右(使用的多少汇总69张没笑脸,65张有笑容);

 1 with open("D:/***/" + "***.csv", "w", newline="") as csvfile:
 2     writer = csv.writer(csvfile)
 3     # 访问文件夹 1-9
 4     for i in range(1, 10):
 5         namedir = os.listdir("D:/***/single/single_test/" + str(i))
 6         # 访问逐个图像文件
 7         for j in range(0, (len(namedir))):
 8             img = Image.open("D:/***/single/single_test/" + str(i) + "/" + namedir[j])
 9             get_feature(img)
10             
11             # 写入csv
12             pixel_cnt_list.append(namedir[j][0])
13             writer.writerow(pixel_cnt_list)

 #转载或是使用图片代码请尊重作者劳动成果,声明出处,感谢

4.总结

特色的提取也比较简单,逐行逐列统计然后计数求和:

    在此之前的预备干活都做完事后,就可以使用sklearn的机械学习模型举办建模处理。

      

   

 1     def get_feature(img):
 2         # 提取特征
 3         # 30*30的图像,
 4 
 5         width, height = img.size
 6 
 7         global pixel_cnt_list
 8         pixel_cnt_list=[]
 9 
10         height = 30
11         for y in range(height):
12             pixel_cnt_x = 0
13             for x in range(width):
14                 # print(img.getpixel((x,y)))
15                 if img.getpixel((x, y)) == 0:  # 黑点
16                     pixel_cnt_x += 1
17 
18             pixel_cnt_list.append(pixel_cnt_x)
19 
20         for x in range(width):
21             pixel_cnt_y = 0
22             for y in range(height):
23                 if img.getpixel((x, y)) == 0:  # 黑点
24                     pixel_cnt_y += 1
25 
26             pixel_cnt_list.append(pixel_cnt_y)
27 
28         return pixel_cnt_list
 1 # ML_smiles
 2 # 2018-1-27
 3 # By TimeStamp
 4 # cnblogs: http://www.cnblogs.com/AdaminXie/
 5 # Get_features.py
 6 
 7 
 8 # 读取图像所在的路径
 9 path_pic_smile = "F:/code/python/P_ML_smile/pic/database/smile/"
10 path_pic_nosmile = "F:/code/python/P_ML_smile/pic/database/no/"
11 
12 # 获取路径下的图像文件
13 namedir_smile = os.listdir(path_pic_smile)
14 namedir_nosmile = os.listdir(path_pic_nosmile)
15 
16 # 存储提取特征数据的CSV的路径
17 path_csv = "F:/code/python/P_ML_smile/data_csv/"
18 
19 def writeintoCSV():
20     with open(path_csv+"data.csv", "w", newline="") as csvfile:
21         writer = csv.writer(csvfile)
22 
23         # 处理带笑脸的图像
24         print("######## with smiles #########")
25         for i in range(len(namedir_smile)):
26             print("pic:", path_pic_smile, namedir_smile[i])
27 
28             # 用来存放41维特征
29             features_csv_smiles = []
30 
31             # 利用 returnfeatures 函数提取特征
32             returnfeatures(path_pic_smile, namedir_smile[i], features_csv_smiles)
33             features_csv_smiles.append(1)
34             print("features:", features_csv_smiles, "\n")
35 
36             # 写入CSV
37             writer.writerow(features_csv_smiles)
38 
39         # 处理不带笑脸的图像
40         print("######## no smiles #########")
41         for i in range(len(namedir_nosmile)):
42             print("pic:", path_pic_nosmile, namedir_nosmile[i])
43 
44             # 用来存放41维特征
45             features_csv_nosmiles = []
46 
47             # 利用 returnfeatures 函数提取特征
48             returnfeatures(path_pic_nosmile, namedir_nosmile[i], features_csv_nosmiles)
49             features_csv_nosmiles.append(0)
50             print("features:", features_csv_nosmiles, "\n")
51 
52             # 写入CSV
53             writer.writerow(features_csv_nosmiles)

1.支付环境

   图片 11

 借助Dlib进行 人脸嘴部21个性子点坐标(40维特征)的领到,然后依照那 40维输入特征 作为模型输入, 1维特征(1意味着有微笑 /
0代表没微笑)作为输出,进行ML建模;

    图片 12   

率先步必要对CSV文件中的数据进行领取,利用pd.read_csv进行读取。写入CSV时,前60名列60维的特征向量,第四1名列输出标记1-9。  

  本项目中只行使其中嘴部拾7个特征点的坐标作为特色输入,拾九个点的序号如下图所示:  

          图5 
手写体识其余品质分析(在样本数为50的事态下)

  python:  3.6.3

  然后就遍历多个存放有/无笑脸的文件夹,读取图像文件,然后接纳returnfeatures()函数得到特征值,写入CSV中:

  通过 data.shape()
可以赢得data的维度,此时出口结果(100,61),表示有玖拾8个样本,63个维度,其中伍拾几个维度时特征值,第52个维度为出口标记值1-9。

 

  18个特征点三十九个坐标值,和输出标记的得到,由returnfeatures函数落成;

  3.3.1 特征数据加工

  

    图2 总体设计流程图

                图2 全体的设计流程

  **3.2 **提取特征向量写入CSV

  图片 13

 

  **3.3 sklearn模型陶冶和测试**

  使用的人脸来自于 The MUCT Face
Database
(Link:http://www.milbo.org/muct/),在此十分多谢!

0.引言

    为了降低维度,没有拔取900个像素点每点的灰度作为输入,而是精选了30行每行的黑点数,和30列每列的黑点数作为输入,那样降到了60维。

   
小编先在档次目录下创设七个公文夹,分别存放有笑容的人脸,和无笑脸的人脸,那样未来读取的时候就足以精通人脸的符号有/无人脸;

   介绍了运用sklearn的多少个机械学习模型举办手写体识别。 

 

 

            (a)提取900维特征

    图片 14   

   已经陶冶好的特点数据存放在了CSV中;

  

  3.3.2 模型练习

  dlib:    19.7

    

    图片 15               
  图片 16

 

             图4 提取图像特点

    所以大家接下去须求做的干活是,遍历访问以前放入single文件夹中子文件夹1-9中的全数图像文件,举办特征提取,然后写入csv文件中:

 
(link: http://www.cnblogs.com/AdaminXie/p/7905888.html);

 

3.编程进度

    writeintoCSV():  将40维特征输入和1维的输出标记(1意味着有微笑/0代表没微笑)写入CSV文件中;

    可是因为唯有四十八个样本点,小样本的情事下测试精度的偶然性误差比较大。

        图7  差别样本数量下的七种模型的测试精度

  关于利用dlib举办人脸70个特征点的领到,在小编之前另一篇博客里面介绍过:

    3.sklearn模型陶冶和测试

    2.提取特征向量写入CSV

图片 17 图片 18

        图3 生成的多张单个验证码图像

                图2 全体的陈设性流程

 

   25张的测试结果图6所示,二种机器学习的模子的测试精度都完毕了9/10左右。

 

0.引言

    Python使用比较受欢迎原因之一就是代码的可读性相比高,那段模型实例化的代码比较简单,三种机器学习模型的使用实例化的代码也相当近似。

  3.1 生成多张单个验证码图像

  作者的数据集里面是69张没笑脸,65张有笑容,测试精度如下,精度在95%附近:

             (b)提取60维特征

    

 

    所以大家接下去必要做的办事是,遍历访问以前放入single文件夹中子文件夹1-9中的全数图像文件,举办特征提取,然后写入csv文件中:

  利用sklearn库的 train_test_split函数 将数据举办划分,

 源码上传到了 GitHub,自我也在相连保证更新源码,欢迎star协助本人: https://github.com/coneypo/ML_smiles

  图片 19

1 draw = ImageDraw.Draw(im)  # 画笔工具

    http://www.cnblogs.com/AdaminXie/p/8249858.html

1 draw = ImageDraw.Draw(im)  # 画笔工具

   图片 20

  笑容检测模型的数目集测试精度在95%左右,相比可观;

    此前的预备干活都做完之后,就足以运用sklearn的机器学习模型进行建模处理。

    得到测试集数据:X_test,
y_test

 源码py文件:

        图7  差别样本数量下的各个模型的测试精度

        图3 生成的多张单个验证码图像

   用到的二种机器学习分类模型:

 

  PIL,cv2, pandas, numpy, os, csv, random

#
源码上传到了GitHub,我也在时时刻刻更新优化,假如对您有帮扶恐怕感兴趣欢迎Star协理本人:
 https://github.com/coneypo/ML_smiles

  1 from sklearn.preprocessing import StandardScaler
  2 
  3 from sklearn.linear_model import LogisticRegression     #线性模型中的Logistic回归模型
  4 from sklearn.linear_model import SGDClassifier          #线性模型中的随机梯度下降模型
  5 from sklearn.svm import LinearSVC                       #SVM模型中的线性SVC模型
  6 from sklearn.neural_network import MLPClassifier        #神经网络模型中的多层网络模型
  7 
  8 # LR
  9 def con_lr():
 10 
 11     X_train_LR = X_train
 12     y_train_LR = y_train
 13 
 14     X_test_LR = X_test
 15     y_test_LR = y_test
 16 
 17     ss = StandardScaler()
 18     X_train_LR = ss.fit_transform(X_train_LR)
 19     X_test_LR = ss.transform(X_test_LR)
 20 
 21     # 初始化LogisticRegression
 22     lr = LogisticRegression()
 23 
 24     # 调用LogisticRegression中的fit()来训练模型参数
 25     lr.fit(X_train_LR, y_train_LR)
 26 
 27     # 使用训练好的模型lr对X_test进行预测,结果储存在lr_y_predict中
 28     global y_predict_LR
 29     y_predict_LR = lr.predict(X_test_LR)
 30 
 31     # 性能分析
 32     print('Accuarcy of LR Classifier2:', lr.score(X_test_LR, y_test_LR))
 33     print (classification_report(y_test_LR, y_predict_LR))
 34 
 35 #SGD
 36 def con_sgd():
 37 
 38     X_train_SC = X_train
 39     y_train_SC = y_train
 40 
 41     X_test_SC = X_test
 42     y_test_SC = y_test
 43 
 44     # 标准化数据
 45     ss = StandardScaler()
 46     X_train_SC = ss.fit_transform(X_train_SC)
 47     X_test_SC = ss.transform(X_test_SC)
 48 
 49     # 初始化SGDClassifier
 50     sgdc = SGDClassifier()
 51 
 52     # 调用SGDClassifier中的fit函数用来训练模型参数
 53     sgdc.fit(X_train_SC, y_train_SC)
 54 
 55     # 使用训练好的模型sgdc对X_test进行预测,结果储存在sgdc_y_predict中
 56     global y_predict_SC
 57     y_predict_SC = sgdc.predict(X_test_SC)
 58 
 59     print ('Accarcy of SGD Classifier:', sgdc.score(X_test_SC, y_test_SC))
 60     print(classification_report(y_test_SC,y_predict_SC))
 61 
 62 #SVM方法
 63 def con_svm():
 64 
 65     X_train_SVM = X_train
 66     y_train_SVM = y_train
 67 
 68     X_test_SVM = X_test
 69     y_test_SVM = y_test
 70 
 71     ss = StandardScaler()
 72     X_train_SVM = ss.fit_transform(X_train_SVM)
 73     X_test_SVM = ss.transform(X_test_SVM)
 74 
 75     #调用线性SVC实例化
 76     lsvc = LinearSVC()
 77     lsvc.fit(X_train_SVM, y_train_SVM)
 78 
 79     global y_predict_SVM
 80     y_predict_SVM = lsvc.predict(X_test_SVM)
 81 
 82     print("The accurary:", lsvc.score(X_test_SVM, y_test_SVM))
 83     print(classification_report(y_test_SVM, y_predict_SVM))  # , target_names=digits.target_names.astype(str)))
 84 
 85 #神经网络
 86 def con_MLPClass():
 87 
 88     X_train_MLP = X_train
 89     y_train_MLP = y_train
 90 
 91     X_test_MLP = X_test
 92     y_test_MLP = y_test
 93 
 94     ss = StandardScaler()
 95     X_train_MLP = ss.fit_transform(X_train_MLP)
 96     X_test_MLP = ss.transform(X_test_MLP)
 97 
 98     #调用MLP实例化
 99     MLP = MLPClassifier(hidden_layer_sizes=(13,13,13), max_iter=500)
100     MLP.fit(X_train_MLP, y_train_MLP)
101 
102     global y_predict_MLP
103     y_predict_MLP = MLP.predict(X_test_MLP)
104 
105     print("The accurary:", MLP.score(X_test_MLP, y_test_MLP))
106     print(classification_report(y_test_MLP, y_predict_MLP))  # , target_names=digits.target_names.astype(str)))

    在样本数 sample_num=50
的景色下,磨练百分之七十五多少,用肆分一的数据即13个样本进行测试。  

 1 # ML_smiles
 2 # 2018-1-27
 3 # By TimeStamp
 4 # cnblogs: http://www.cnblogs.com/AdaminXie/
 5 # pre_data() in ML_ways.py
 6 
 7 
 8 # 从CSV读取数据
 9 def pre_data():
10 
11     # 41维表头
12     column_names = []
13     for i in range(0, 40):
14         column_names.append("feature_" + str(i+1))
15     column_names.append("output")
16 
17     path_csv = "F:/***/P_ML_smile/data_csv/"
18 
19     rd_csv = pd.read_csv(path_csv+"data.csv", names=column_names)
20 
21     # 输出CSV文件的维度
22     print("shape:", rd_csv.shape)
23 
24     global X_train, X_test, y_train, y_test
25     X_train, X_test, y_train, y_test = train_test_split(
26         rd_csv[column_names[0:40]],
27         rd_csv[column_names[40]],
28         test_size=0.25,
29         random_state=33)

    2.领到特征向量写入CSV

 

    
 项目落成的笑颜识别,并不是因此 计量嘴唇角度,满意一定弧度认定为笑脸进行判定

 1 import pandas as pd
 2 from sklearn.model_selection import train_test_split
 3 
 4 # 设定的生成样本个数
 5 sample_num = 100
 6 
 7 column_names = []
 8 
 9 # 前60列为60维特征
10 for i in range(0, 60):
11     column_names.append("feature_"+str(i))
12 # 第61列为输出标记
13 column_names.append("true_number")
14 
15 data = pd.read_csv("D:/***/data/test_"+str(sample_num)+".csv"
16                    , names=column_names)
17 
18 # print(data.shape)
19 
20 # 得到训练集X—train和y_train,测试集X_test和y_test,此处取75%和25%分割
21 X_train, X_test, y_train, y_test = train_test_split(
22                                                       data[column_names[0:60]],
23                                                       data[column_names[60]],
24                                                       test_size=0.25,
25                                                       random_state=33
26                                                     )
 1 import pandas as pd
 2 from sklearn.model_selection import train_test_split
 3 
 4 # 设定的生成样本个数
 5 sample_num = 100
 6 
 7 column_names = []
 8 
 9 # 前60列为60维特征
10 for i in range(0, 60):
11     column_names.append("feature_"+str(i))
12 # 第61列为输出标记
13 column_names.append("true_number")
14 
15 data = pd.read_csv("D:/***/data/test_"+str(sample_num)+".csv"
16                    , names=column_names)
17 
18 # print(data.shape)
19 
20 # 得到训练集X—train和y_train,测试集X_test和y_test,此处取75%和25%分割
21 X_train, X_test, y_train, y_test = train_test_split(
22                                                       data[column_names[0:60]],
23                                                       data[column_names[60]],
24                                                       test_size=0.25,
25                                                       random_state=33
26                                                     )

 2. ML_ways.py:

    这一步是提取图像中的特征。生成的单个图像是30*30即900个像素点的。

2.总体统筹思路

  图5 同一人差距表情的笑脸检测结果

  

通过前边一文山会海的备选干活做完,那太师式开始使用sklearn的机器学习模型,利用练习多少对模型进行陶冶,然后使用测试数据进行质量测试。

 3. test_single_pic.py:

    得到测试集数据:X_test,
y_test

             图4 提取图像特点

  得到 训练集:X_train, y_train测试集:X_test, y_test

    图片 21               
  图片 22

   图片 23

  图7 检测到有微笑

 

   

    returnfeatures():  输入人脸图像路径,利用dlib的“shape_predictor_68_face_landmarks.dat”提取嘴部1七个特征点坐标的四十个特征值;

  PIL,cv2, pandas, numpy, os, csv, random

 

  OpenCv, numpy, sklearn, pandas, os, csv等

  3.1 生成多张单个验证码图像

    1.生成多张单个验证码图像

图片 24

2.规划流程

3.效果

   倘诺想直接测试单张图像的笑颜,更改test_single_pic.py中的图像文件路径,然后运转该py文件即可拿到检测结果;

 

 

   Python 3 利用机械学习模型举办手写体识别:

  way_Linear SVC() ,Support Vector
Classification,      (协助向量机)中的线性扶助向量分类 

1.支出条件

1 import dlib         # 人脸识别的库dlib
2 import numpy as np  # 数据处理的库numpy
3 import cv2          # 图像处理的库OpenCv
4 import os           # 读取文件
5 import csv          # csv操作

 

    (关于SGDC官网的分解:Linear classifiers (SVM, logistic
regression, a.o.) with SGD training.
)

  自个儿近来时常采纳dlib做人脸识别那块,又在就学机器学习,两者结合尝试成功笑容检测那块;

 

 

  Get_features.py中调用的库:

   pre_data(), 读取CSV中的数据,然后提取出陶冶集X_train和测试集X_test**

   Python 3 利用 Dlib 19.7 进行人脸识别:

 

 1 # ML_smiles
 2 # created: 2018-1-27
 3 # updated: 2018-1-31
 4 # By TimeStamp
 5 # cnblogs: http://www.cnblogs.com/AdaminXie
 6 # test_single_pic.py
 7 
 8 import cv2
 9 
10 from ML_ways import pre_data
11 from ML_ways import way_LR
12 from ML_ways import way_MLPC
13 from ML_ways import way_LSVC
14 from ML_ways import way_SGDC
15 
16 # 获得单张人脸的特征点
17 path_test_pic = "F:/code/python/P_ML_smile/pic/"
18 
19 XXXpic = "test4.jpg"
20 
21 # 训练LR模型
22 pre_data()
23 
24 # 使用标准化参数和ML模型
25 ss_LR, LR = way_LR()
26 ss_SGDC, SGDC = way_SGDC()
27 ss_LSVC, LSVC = way_LSVC()
28 ss_MLPC, MLPC = way_MLPC()
29 
30 # 提取单张40维度特征
31 from Get_features import returnfeatures
32 single_features = []
33 returnfeatures(path_test_pic, XXXpic, single_features)
34 
35 print("single_136_features: ", len(single_features), " ", single_features)
36 
37 # opencv读取
38 img = cv2.imread(path_test_pic+XXXpic)
39 
40 # 标68个特征点
41 pos_tmp = []
42 for i in range(0, len(single_features), 2):
43     # 利用cv2.circle标注嘴部特征点,共20个
44     pos = tuple([single_features[i], single_features[i+1]])
45     cv2.circle(img, pos, 3, color=(0, 255, 0))
46 
47 ############## LR模型预测 ##############
48 
49 # 特征数据预加工
50 X_single_LR = ss_LR.transform([single_features])
51 # 利用训练好的LR模型预测
52 y_predict_LR_single = LR.predict(X_single_LR)
53 
54 con_LR = str(y_predict_LR_single[0]).replace("1", "smiles").replace("0", "no_smiles")
55 print("LR:", con_LR)
56 
57 ############## MLPC模型预测 ##############
58 
59 # 特征数据预加工
60 X_single_MLPC = ss_MLPC.transform([single_features])
61 # 利用训练好的MLPC模型预测
62 y_predict_MLPC_single = MLPC.predict(X_single_MLPC)
63 
64 con_MLPC = str(y_predict_MLPC_single[0]).replace("1", "smiles").replace("0", "no_smiles")
65 print("MLPC:", con_MLPC)
66 
67 ############## LSVC模型预测 ##############
68 
69 # 特征数据预加工
70 X_single_LSVC = ss_LSVC.transform([single_features])
71 # 利用训练好的LSVC模型预测
72 y_predict_LSVC_single = LSVC.predict(X_single_LSVC)
73 
74 con_LSVC = str(y_predict_LSVC_single[0]).replace("1", "smiles").replace("0", "no_smiles")
75 print("LSVC:", con_LSVC)
76 
77 ############## SGDC模型预测 ##############
78 
79 # 特征数据预加工
80 X_single_SGDC = ss_SGDC.transform([single_features])
81 # 利用训练好的SGDC模型预测
82 y_predict_SGDC_single = SGDC.predict(X_single_SGDC)
83 
84 con_SGDC = str(y_predict_SGDC_single[0]).replace("1", "smiles").replace("0", "no_smiles")
85 print("SGDC:", con_SGDC)
86 
87 # cv2.putText在图像上标注文字
88 font = cv2.FONT_HERSHEY_SIMPLEX
89 
90 cv2.putText(img, "LR: "+con_LR, (20, 30), font, 1, (0, 0, 255), 1, cv2.LINE_AA)
91 cv2.putText(img, "MLPC: "+con_MLPC, (20, 120), font, 1, (0, 0, 255), 1, cv2.LINE_AA)
92 cv2.putText(img, "LSVC: "+con_LSVC, (20, 90), font, 1, (0, 0, 255), 1, cv2.LINE_AA)
93 cv2.putText(img, "SGDC: "+con_SGDC, (20, 60), font, 1, (0, 0, 255), 1, cv2.LINE_AA)
94 
95 cv2.namedWindow("img", 2)
96 cv2.imshow("img", img)
97 cv2.waitKey(0)

 

  图片 25

   ML_ways.py中调用的库:

 

   
利用pands.read_csv读取CSV文件,然后使用train_test_split进行数据分割;

  

    该片段的规划流程图:

  2.1 提取人脸特征:

  2.2.2 机器学习建模

  way_SGDC() ,  Stochastic Gradient Descent
Classification,(线性模型)随机梯度法求解

  (The MUCT database was prepared by Stephen Milborrow, John Morkel,
and Fred Nicolls in December 2008 at the University Of Cape Town. We
would like to send out a thanks to the people who allowed their faces to
be used.
)

The accurary of LR: 0.941176470588
The accurary of SGD: 0.882352941176
The accurary of SVM: 0.941176470588
The accurary of MLP: 0.970588235294

图片 26

  2.2.1 数据预加工

  其实人脸笑容检测的话,光靠嘴部特征去判断不太合适,要结成整张人脸特征点举行陶冶,革新的话也相比不难;

 利用机械学习的法子锻练微笑检测模型,输入一张人脸照片,判断是或不是微笑;

    图1 测试图像与检测结果

  数据集中有无笑脸是温馨开展归类的,而且有写的神采不太好界定,所以采纳的是有个别笑脸相比较鲜明的相片用作有笑容,所以恐怕出来模型在检测一些微笑上有误差;

    http://www.cnblogs.com/AdaminXie/p/8137580.html

  尽管想行使L宝马X3模型测试,接受way_L揽胜()的回到值ss_LR和LR,利用ss_LR对single_features进行标准化处理,然后调用L福睿斯.predict举办预测;然后生成图像窗口,将三种模型的结果突显在图像上。

  way_MLPC() ,   Multi-Layer Perceptron Classification,  
(神经网络)多层感知机分类

  输入给定测试图像,用ML模型检测其有/无笑脸;

    图4 dlib标定的嘴部特征点序号

    那部分机器学习模型使用相比简单,此前的特征提取已经完成,写入了CSV文件中;接下去就是要从CSV大校想要的数据集提取出来,利用sklearn进行机器学习建模。

 

  (达成多少相比较复杂,感兴趣的可以结合此前博客看看:

 

 图片 27

   利用LR.fit训练数据:LR.fit(X_train_LR, y_train_LR),利用LR.predict预测标记:y_predict_LR = LR_predict(X_test_LR);

相关文章