SVM算法应用综合练习
- 一.SVM算法应用综合练习
- 1.将libsvm加入新建项目
- 2.在libsvm文件夹中打开svm-toy.exe
- 3.运行
- 4.line.txt 线性模型;poly.txt多项式模型;RBF.txt 高斯核模型
- 二.人脸识别
- 1.拍摄20张脸部图片
- 2.特征点采集
- 3.人脸识别
- 三.参考
一.SVM算法应用综合练习
1.将libsvm加入新建项目
2.在libsvm文件夹中打开svm-toy.exe
3.运行
4.line.txt 线性模型;poly.txt多项式模型;RBF.txt 高斯核模型
二.人脸识别
1.拍摄20张脸部图片
拍照
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59import cv2 import dlib import os import sys import random output_dir = 'D:/myworkspace/JupyterNotebook/People/person/631907060526' size = 64 if not os.path.exists(output_dir): os.makedirs(output_dir) def relight(img, light=1, bias=0): w = img.shape[1] h = img.shape[0] #image = [] for i in range(0,w): for j in range(0,h): for c in range(3): tmp = int(img[j,i,c]*light + bias) if tmp > 255: tmp = 255 elif tmp < 0: tmp = 0 img[j,i,c] = tmp return img detector = dlib.get_frontal_face_detector() camera = cv2.VideoCapture(0) index = 1 while True: if (index <= 20): print('Being processed picture %s' % index) success, img = camera.read() gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) dets = detector(gray_img, 1) for i, d in enumerate(dets): x1 = d.top() if d.top() > 0 else 0 y1 = d.bottom() if d.bottom() > 0 else 0 x2 = d.left() if d.left() > 0 else 0 y2 = d.right() if d.right() > 0 else 0 face = img[x1:y1,x2:y2] face = relight(face, random.uniform(0.5, 1.5), random.randint(-50, 50)) face = cv2.resize(face, (size,size)) cv2.imshow('image', face) cv2.imwrite(output_dir+'/'+str(index)+'.jpg', face) index += 1 key = cv2.waitKey(30) & 0xff if key == 27: break else: print('Finished!') camera.release() cv2.destroyAllWindows() break
2.特征点采集
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68from cv2 import cv2 as cv2 import os import dlib from skimage import io import csv import numpy as np path_images_from_camera = "D:/myworkspace/JupyterNotebook/People/person/" detector = dlib.get_frontal_face_detector() predictor = dlib.shape_predictor("D:/shape_predictor_68_face_landmarks.dat") face_rec = dlib.face_recognition_model_v1("D:/dlib_face_recognition_resnet_model_v1.dat") 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" % ("检测到人脸的图像 / image with faces detected:", path_img), 'n') if len(faces) != 0: shape = predictor(img_gray, faces[0]) face_descriptor = face_rec.compute_face_descriptor(img_gray, shape) else: face_descriptor = 0 print("no face") return face_descriptor 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)): print("%-40s %-20s" % ("正在读的人脸图像 / image to read:", path_faces_personX + "/" + photos_list[i])) features_128d = return_128d_features(path_faces_personX + "/" + photos_list[i]) if features_128d == 0: i += 1 else: features_list_personX.append(features_128d) i1=str(i+1) add="D:/myworkspace/JupyterNotebook/People/feature/face_feature"+i1+".csv" print(add) with open(add, "w", newline="") as csvfile: writer1 = csv.writer(csvfile) writer1.writerow(features_128d) else: print("文件夹内图像文件为空 / Warning: No images in " + path_faces_personX + '/', 'n') if features_list_personX: features_mean_personX = np.array(features_list_personX).mean(axis=0) else: features_mean_personX = '0' return features_mean_personX people = os.listdir(path_images_from_camera) people.sort() with open("D:/myworkspace/JupyterNotebook/People/feature/features2_all.csv", "w", newline="") as csvfile: writer = csv.writer(csvfile) for person in people: print("##### " + person + " #####") features_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))
3.人脸识别
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232# 摄像头实时人脸识别 import os import winsound # 系统音效 from playsound import playsound # 音频播放 import dlib # 人脸处理的库 Dlib import csv # 存入表格 import time import sys import numpy as np # 数据处理的库 numpy from cv2 import cv2 as cv2 # 图像处理的库 OpenCv import pandas as pd # 数据处理的库 Pandas # 人脸识别模型,提取128D的特征矢量 # face recognition model, the object maps human faces into 128D vectors # Refer this tutorial: http://dlib.net/python/index.html#dlib.face_recognition_model_v1 facerec = dlib.face_recognition_model_v1("D:/dlib_face_recognition_resnet_model_v1.dat") # 计算两个128D向量间的欧式距离 # compute the e-distance between two 128D features def return_euclidean_distance(feature_1, feature_2): feature_1 = np.array(feature_1) feature_2 = np.array(feature_2) dist = np.sqrt(np.sum(np.square(feature_1 - feature_2))) return dist # 处理存放所有人脸特征的 csv path_features_known_csv = "D:/myworkspace/JupyterNotebook/People/feature/features2_all.csv" csv_rd = pd.read_csv(path_features_known_csv, header=None) # 用来存放所有录入人脸特征的数组 # the array to save the features of faces in the database features_known_arr = [] # 读取已知人脸数据 # print known faces for i in range(csv_rd.shape[0]): features_someone_arr = [] for j in range(0, len(csv_rd.iloc[i, :])): features_someone_arr.append(csv_rd.iloc[i, :][j]) features_known_arr.append(features_someone_arr) print("Faces in Database:", len(features_known_arr)) # Dlib 检测器和预测器 # The detector and predictor will be used detector = dlib.get_frontal_face_detector() predictor = dlib.shape_predictor('D:/shape_predictor_68_face_landmarks.dat') # 创建 cv2 摄像头对象 # cv2.VideoCapture(0) to use the default camera of PC, # and you can use local video name by use cv2.VideoCapture(filename) cap = cv2.VideoCapture(0) # cap.set(propId, value) # 设置视频参数,propId 设置的视频参数,value 设置的参数值 cap.set(3, 480) # cap.isOpened() 返回 true/false 检查初始化是否成功 # when the camera is open while cap.isOpened(): flag, img_rd = cap.read() kk = cv2.waitKey(1) # 取灰度 img_gray = cv2.cvtColor(img_rd, cv2.COLOR_RGB2GRAY) # 人脸数 faces faces = detector(img_gray, 0) # 待会要写的字体 font to write later font = cv2.FONT_HERSHEY_COMPLEX # 存储当前摄像头中捕获到的所有人脸的坐标/名字 # the list to save the positions and names of current faces captured pos_namelist = [] name_namelist = [] # 按下 q 键退出 # press 'q' to exit if kk == ord('q'): break else: # 检测到人脸 when face detected if len(faces) != 0: # 获取当前捕获到的图像的所有人脸的特征,存储到 features_cap_arr # get the features captured and save into features_cap_arr features_cap_arr = [] for i in range(len(faces)): shape = predictor(img_rd, faces[i]) features_cap_arr.append(facerec.compute_face_descriptor(img_rd, shape)) # 遍历捕获到的图像中所有的人脸 # traversal all the faces in the database for k in range(len(faces)): print("##### camera person", k+1, "#####") # 让人名跟随在矩形框的下方 # 确定人名的位置坐标 # 先默认所有人不认识,是 unknown # set the default names of faces with "unknown" name_namelist.append("unknown") # 每个捕获人脸的名字坐标 the positions of faces captured pos_namelist.append(tuple([faces[k].left(), int(faces[k].bottom() + (faces[k].bottom() - faces[k].top())/4)])) # 对于某张人脸,遍历所有存储的人脸特征 # for every faces detected, compare the faces in the database e_distance_list = [] for i in range(len(features_known_arr)): # 如果 person_X 数据不为空 if str(features_known_arr[i][0]) != '0.0': print("with person", str(i + 1), "the e distance: ", end='') e_distance_tmp = return_euclidean_distance(features_cap_arr[k], features_known_arr[i]) print(e_distance_tmp) e_distance_list.append(e_distance_tmp) else: # 空数据 person_X e_distance_list.append(999999999) # 找出最接近的一个人脸数据是第几个 # Find the one with minimum e distance similar_person_num = e_distance_list.index(min(e_distance_list)) print("Minimum e distance with person", int(similar_person_num)+1) # 计算人脸识别特征与数据集特征的欧氏距离 # 距离小于0.4则标出为可识别人物 if min(e_distance_list) < 0.4: # 这里可以修改摄像头中标出的人名 # Here you can modify the names shown on the camera # 1、遍历文件夹目录 folder_name = 'D:/myworkspace/JupyterNotebook/People/person' # 最接近的人脸 sum=similar_person_num+1 key_id=1 # 从第一个人脸数据文件夹进行对比 # 获取文件夹中的文件名:1wang、2zhou、3... file_names = os.listdir(folder_name) for name in file_names: # print(name+'->'+str(key_id)) if sum ==key_id: #winsound.Beep(300,500)# 响铃:300频率,500持续时间 name_namelist[k] = name[0:]#人名删去第一个数字(用于视频输出标识) key_id += 1 # 播放欢迎光临音效 #playsound('D:/myworkspace/JupyterNotebook/People/music/welcome.wav') # print("May be person "+str(int(similar_person_num)+1)) # -----------筛选出人脸并保存到visitor文件夹------------ for i, d in enumerate(faces): x1 = d.top() if d.top() > 0 else 0 y1 = d.bottom() if d.bottom() > 0 else 0 x2 = d.left() if d.left() > 0 else 0 y2 = d.right() if d.right() > 0 else 0 face = img_rd[x1:y1,x2:y2] size = 64 face = cv2.resize(face, (size,size)) # 要存储visitor人脸图像文件的路径 path_visitors_save_dir = "D:/myworkspace/JupyterNotebook/People/visitor/known" # 存储格式:2019-06-24-14-33-40wang.jpg now_time = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime()) save_name = str(now_time)+str(name_namelist[k])+'.jpg' # print(save_name) # 本次图片保存的完整url save_path = path_visitors_save_dir+'/'+ save_name # 遍历visitor文件夹所有文件名 visitor_names = os.listdir(path_visitors_save_dir) visitor_name='' for name in visitor_names: # 名字切片到分钟数:2019-06-26-11-33-00wangyu.jpg visitor_name=(name[0:16]+'-00'+name[19:]) # print(visitor_name) visitor_save=(save_name[0:16]+'-00'+save_name[19:]) # print(visitor_save) # 一分钟之内重复的人名不保存 if visitor_save!=visitor_name: cv2.imwrite(save_path, face) print('新存储:'+path_visitors_save_dir+'/'+str(now_time)+str(name_namelist[k])+'.jpg') else: print('重复,未保存!') else: # 播放无法识别音效 #playsound('D:/myworkspace/JupyterNotebook/People/music/sorry.wav') print("Unknown person") # -----保存图片------- # -----------筛选出人脸并保存到visitor文件夹------------ for i, d in enumerate(faces): x1 = d.top() if d.top() > 0 else 0 y1 = d.bottom() if d.bottom() > 0 else 0 x2 = d.left() if d.left() > 0 else 0 y2 = d.right() if d.right() > 0 else 0 face = img_rd[x1:y1,x2:y2] size = 64 face = cv2.resize(face, (size,size)) # 要存储visitor-》unknown人脸图像文件的路径 path_visitors_save_dir = "D:/myworkspace/JupyterNotebook/People/visitor/unknown" # 存储格式:2019-06-24-14-33-40unknown.jpg now_time = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime()) # print(save_name) # 本次图片保存的完整url save_path = path_visitors_save_dir+'/'+ str(now_time)+'unknown.jpg' cv2.imwrite(save_path, face) print('新存储:'+path_visitors_save_dir+'/'+str(now_time)+'unknown.jpg') # 矩形框 # draw rectangle for kk, d in enumerate(faces): # 绘制矩形框 cv2.rectangle(img_rd, tuple([d.left(), d.top()]), tuple([d.right(), d.bottom()]), (0, 255, 255), 2) print('n') # 在人脸框下面写人脸名字 # write names under rectangle for i in range(len(faces)): cv2.putText(img_rd, name_namelist[i], pos_namelist[i], font, 0.8, (0, 255, 255), 1, cv2.LINE_AA) print("Faces in camera now:", name_namelist, "n") #cv2.putText(img_rd, "Press 'q': Quit", (20, 450), font, 0.8, (84, 255, 159), 1, cv2.LINE_AA) cv2.putText(img_rd, "Face Recognition", (20, 40), font, 1, (0, 0, 255), 1, cv2.LINE_AA) cv2.putText(img_rd, "Visitors: " + str(len(faces)), (20, 100), font, 1, (0, 0, 255), 1, cv2.LINE_AA) # 窗口显示 show with opencv cv2.imshow("camera", img_rd) # 释放摄像头 release camera cap.release() # 删除建立的窗口 delete all the windows cv2.destroyAllWindows()
三.参考
基于LibSVM得到决策函数
最后
以上就是耍酷大侠最近收集整理的关于SVM算法应用综合练习的全部内容,更多相关SVM算法应用综合练习内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复