项目实战—人脸检测之卷积神经网络实战
现在我们来进行实战,以前的方法中,很大一部分工作是选择滤波器来创建特征,以便尽从图像中可能多地提取信息。随着深度学习和计算能力的提高,这项工作现在可以实现自动化。CNN 的名称就来自我们用一组滤波器卷积初始图像输入的事实。需要选择的参数仍是需要应用的滤波器数量以及尺寸。滤波器的尺寸称为步幅。一般步幅设置在 2 到 5 之间。
在这种特定情况下,CNN 的输出是二分类,如果有人脸,则取值 1,否则取 0。
检测图像上的人脸
一些元素在实现中会发生变化。
第一步是下载预训练模型:https://github.com/davisking/dlib-models/blob/master/mmod_human_face_detector.dat.bz2
将下载后的权重放到文件夹中,并定义 dnnDaceDetector:
dnnFaceDetector = dlib.cnn_face_detection_model_v1("mmod_human_face_detector.dat")
完整代码:
import cv2 import dlib import matplotlib.pyplot as plt dnnFaceDetector = dlib.cnn_face_detection_model_v1('mmod_human_face_detector.dat') gray = cv2.imread('min.jpg', 0) rects = dnnFaceDetector(gray, 1) for (i, rect) in enumerate(rects): x1 = rect.rect.left() y1 = rect.rect.top() x2 = rect.rect.right() y2 = rect.rect.bottom() # Rectangle around the face cv2.rectangle(gray, (x1, y1), (x2, y2), (255, 255, 255), 3) plt.figure(figsize=(12,8)) plt.imshow(gray, cmap='gray') plt.show()
实验结果:
最后,实现实时 CNN 人脸检测:
video_capture = cv2.VideoCapture(0) flag = 0 dnnFaceDetector = dlib.cnn_face_detection_model_v1('mmod_human_face_detector.dat') while True: # Capture frame-by-frame ret, frame = video_capture.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) rects = dnnFaceDetector(gray, 1) for (i, rect) in enumerate(rects): x1 = rect.rect.left() y1 = rect.rect.top() x2 = rect.rect.right() y2 = rect.rect.bottom() # Rectangle around the face cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) # Display the video output cv2.imshow('Video', frame) # Quit video by typing Q if cv2.waitKey(10) & 0xFF == ord('q'): break video_capture.release() cv2.destroyAllWindows()
这些只是卷积神经网络的一些很简单的应用,由于其对硬件资源的依赖较大,所以一般我们用显卡来运算。
至于卷积神经网络的一些其他知识,我们并不详述,其本身属于一个较为复杂的知识体系,如果大家有兴趣,可以看看机器学习的内容,了解神经网络、BP神经网络、优化器、损失函数、各种梯度下降算法、以及各种高级网络模型的搭建等等。
总之不要急着入手深度学习,深度学习本身属于机器学习的一个分支,只要掌握好机器学习的知识,深度学习基本上就是网络模型的搭建,各种层的叠加,大量数据集的“炼丹”过程。在现有的已成熟的深度学习框架TensorFlow以及pytorch的情况下,深度学习也不再复杂,真正的核心反而是机器学习的基础算法。
曾经有人问我,深度学习框架选择哪一个比较好,事实上在我看来,pytorch用来入门更为方便,且由于其构件计算图的方便性,目前在学术界已经占了大比例,Tensorflow更适合工业界生态的部署,但目前这个局面可能正在被打破,也许在未来几年后,Tensorflow的优势可能越来越弱。
以上仅仅是我个人的看法,从全局来讲,这些东西都只是一个框架而已,无论是TensorFlow还是pytorch都属于框架,真正的核心仍然是机器学习算法,掌握了核心的东西,我们在使用各种框架时,通过阅读使用手册,基本上就能做到实战化,基础仍然十分重要。谨记!