项目名称
动手教你学人脸识别:OpenCv+CNN深度学习网络实现人脸识别(含完整代码)
项目介绍
背景
最近在进行视觉方面的研究,发现人脸识别方向是一个非常火的方向。于是在网络上找了一些Demo来进行实现,但是找了很多Demo发现要么环境版本给的不全,导致到处都是错误,要么效果很差。因此想将自己成功实现的Demo整个环境以及代码的相关讲解记录下来,帮助大家快速实现人脸识别。如果大家没有最基础的相关知识,需要帮助,也可以私信或者评论,我看到了就会回复。
项目概览
该项目主要是使用Opencv完成人脸检测以及识别,Opencv是计算机视觉领域非常优秀的集成库,在Python中我们可以直接调用相关函数就可以完成读取图片,灰度转换以及图像显示等相关功能。
项目功能展示
功能名称
基本环境介绍
- Python3.6 + Win系统
- Opencv(使用pip install opencv-python安装即可)
- scipy (使用pip install scipy==1.2.1安装即可)
- tensorflow (pip install tensorflow==1.7.1 安装即可)
- keras (pip install keras 安装即可)
- sklearn (pip install sklearn 安装即可)
- h5py (pip install h5py==2.10.0 安装即可 注意该版本如果不对,则可能导致使用识别函数时无法读取模型文件)
- 摄像头一枚
数据集
每个人只要使用摄像头收集200张图片即可,在采集图片时会打开摄像头,一定要保持一个比较好的正面形象,不然后续训练出来的模型识别效果会比较差。文件名为get_face.py,代码如下:
def CatchPICFromVideo(window_name, camera_idx, catch_pic_num, path_name):
cv2.namedWindow(window_name)
cap = cv2.VideoCapture(camera_idx)
data_path = "haarcascade_frontalface_default.xml"
classfier = cv2.CascadeClassifier(data_path)
color = (0, 255, 0)
num = 0
while cap.isOpened():
ok, frame = cap.read()
if not ok:
break
grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
if len(faceRects) > 0:
for faceRect in faceRects:
x, y, w, h = faceRect
img_name = '%s/%d.jpg ' %(path_name, num)
image = frame[y - 10: y + h + 10, x - 10: x + w + 10]
cv2.imwrite(img_name, image)
num += 1
if num > catch_pic_num:
break
cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 2)
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(frame ,'num:%d' % (num) ,(x + 30, y + 30), font, 1, (255 ,0 ,255) ,4)
if num > catch_pic_num:
break
cv2.imshow(window_name, frame)
c = cv2.waitKey(10)
if c & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
该代码需要修改一处保存的文件路径,如下:
save_path = ".\Face_data\your_name"
CatchPICFromVideo("Cut Face", 0, 199, save_path)
训练模型
该模型使用三个卷积和一个全连接层实现,该部分文件为train.py。具体概念大家可以自行搜索,构建网络的代码如下:
def build_model(self, dataset, nb_classes=2):
self.model = Sequential()
self.model.add(Convolution2D(32, 3, 3, border_mode='same',
input_shape=dataset.input_shape))
self.model.add(Activation('relu'))
self.model.add(MaxPooling2D(pool_size=(2, 2)))
self.model.add(Dropout(0.25))
self.model.add(Convolution2D(64, 3, 3, border_mode='same'))
self.model.add(Activation('relu'))
self.model.add(MaxPooling2D(pool_size=(2, 2)))
self.model.add(Dropout(0.25))
self.model.add(Flatten())
self.model.add(Dense(512))
self.model.add(Activation('relu'))
self.model.add(Dropout(0.5))
self.model.add(Dense(nb_classes))
self.model.add(Activation('softmax'))
self.model.summary()
训练模型的函数如下:
sgd = SGD(lr=0.01, decay=1e-6,
momentum=0.9, nesterov=True)
self.model.compile(loss='categorical_crossentropy',
optimizer=sgd,
metrics=['accuracy'])
我们在训练分类的深度网络模型时,会给数据一个标签,如0为A,1为B。这样我们的模型才能知道识别的是什么。该处程序也有需要修改的位置,如下:
labels = np.array([0 if label.endswith('your_name') else 1 for label in labels])
接下来我们需要修改训练文件的主函数部分,需要指明数据集地址以及训练好的模型的保存地址:
dataset = Dataset('D:\PyCharm-Community\Workplace\Face_Recognition\\face_data')
dataset.load()
model = Model()
model.build_model(dataset)
model.train(dataset)
model.save_model(file_path='D:\PyCharm-Community\Workplace\Face_Recognition\\face_data\model\your_name_face_model.h5')
model.evaluate(dataset)
人脸识别
模型训练好之后,我们就可以调用训练好的模型进行测试了。文件名为:Face_recognition.py,代码如下,下面的模型地址以及人脸分类器地址都需要改为我们自己的模型地址:
if __name__ == '__main__':
model = Model()
model.load_model(file_path='D:\PyCharm-Community\Workplace\Face_Recognition\model\jianxin_face_model.h5')
color = (0, 255, 0)
cap = cv2.VideoCapture(0)
cascade_path = "D:\opencv\\build\etc\haarcascades\haarcascade_frontalface_default.xml"
while True:
ret, frame = cap.read()
if ret is True:
frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
else:
continue
cascade = cv2.CascadeClassifier(cascade_path)
faceRects = cascade.detectMultiScale(frame_gray, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
if len(faceRects) > 0:
for faceRect in faceRects:
x, y, w, h = faceRect
image = frame[y - 10: y + h + 10, x - 10: x + w + 10]
faceID = model.face_predict(image)
print("faceID", faceID)
if faceID == 0:
cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, thickness=2)
cv2.putText(frame, 'your_name',
(x + 30, y + 30),
cv2.FONT_HERSHEY_SIMPLEX,
1,
(255, 0, 255),
2)
else:
cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, thickness=2)
cv2.putText(frame, 'Nobody',
(x + 30, y + 30),
cv2.FONT_HERSHEY_SIMPLEX,
2,
(255, 0, 0),
2)
pass
cv2.imshow("Face Recognition", frame)
k = cv2.waitKey(10)
if k & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
该代码有三处需要修改,第一处是加载模型地址:
model = Model()
model.load_model(file_path='D:\PyCharm-Community\Workplace\Face_Recognition\model\jianxin_face_model.h5')
第二处是xml文件地址,改为你自己的地址:
cascade_path = "D:\opencv\\build\etc\haarcascades\haarcascade_frontalface_default.xml"
第三处是识别显示的名称,将your_name改为你想显示的名称即可:
if faceID == 0:
cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, thickness=2)
cv2.putText(frame, 'your_name',
(x + 30, y + 30),
cv2.FONT_HERSHEY_SIMPLEX,
1,
(255, 0, 255),
2)
运行效果如下:
源码下载地址
完整代码下载地址
|