【手把手教学】人脸识别和关键点检测(基于tensorflow和opencv)(一)

1. 前言

之前其实写过这样一个博客,当然那篇博客也是我的第一篇博客,传送门:https://blog.csdn.net/weixin_44936889/article/details/99685238

现在回头看发现代码和文章风格并不是很好,代码也有一些小问题,这里就重新整理一下并做出一些改进,实现一个更好的效果,这一期的代码补充了许多注释,检测效果如图:
在这里插入图片描述
(这就是我!!!哈哈哈)

2. 前期准备

2.1 安装依赖库


库名称 作用及版本号
opencv-python 包括图像视频处理,以及人脸识别模型(3.4.2)
numpy 主要用于矩阵运算(1.16.3)
tensorflow 机器学习框架,用于训练关键点检测模型(1.14.0)
matplotlib 用于绘制Loss曲线等(3.0.3)
pandas 用于读取并解析csv文件(0.24.2)

下载方法是在终端输入:

pip install 库名称==版本号 --user

如:

pip install numpy==1.16.3 --user

版本号不一定需要这么严格安装这个来,但如果版本号差太远的话可能会报错AttributeError: module ‘xxxx’ has no attribute ‘xxxxx’

2.2 下载人脸关键点数据集

数据集主要使用了kaggle上Facial Keypoints Detection比赛提供的数据集。

网址: https://www.kaggle.com/c/facial-keypoints-detection

在这里插入图片描述

该数据集包含包括7,049幅图像,96 x 96像素的灰度图像。预测15个人脸关键点。数据集中每一张图片刚好包含整个人脸,需要检测的15个人脸关键点如下图所示:
在这里插入图片描述

3. 人脸检测程序

import cv2


def ad_threshold(img):

    th2 = cv2.adaptiveThreshold(img, 255, 
            cv2.ADAPTIVE_THRESH_GAUSSIAN_C,                                
                   cv2.THRESH_BINARY, 19, 4) # 自适应二值化
    return th2

def CatchUsbVideo(window_name, camera_index):  
    # 定义主函数  
    cv2.namedWindow(window_name) # 创建摄像头窗口    
    cap = cv2.VideoCapture(camera_index) # 调用摄像头(一般电脑自带摄像头index为0)

    # 调用分类(人脸识别分类器是cv一个预训练的模型,文件名为haarcascade_frontalface_alt2.xml)
    # 在我的电脑里查找就可以找到,找到后复制到当前文件夹内
    # 我的电脑的储存路径是C:\Users\dell\AppData\Roaming\Python\Python37\site-packages\cv2\data    
    classfier = cv2.CascadeClassifier('./haarcascade_frontalface_alt2.xml')    
    # 设置边框颜色(用于框出人脸) 
    color = (0, 255, 0)

    font = cv2.FONT_HERSHEY_SIMPLEX # 创建摄像头前置的文字框

    while cap.isOpened():        
        catch, frame = cap.read()  # 读取每一帧图片  

        if not catch:  
            raise Exception('Check if the camera if on.')          
            break            
        # 转换为灰度图片        
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        gray = ad_threshold(gray) # 自适应二值化处理

        # scaleFactor 为图片缩放比例
        # minNeighbors 是至少检查为3次是人脸才作为标记,适当增大可以有效抗干扰
        # minSize 是检测的最小人脸的大小
        faceRects = classfier.detectMultiScale(
                gray, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))                
        if len(faceRects) > 0:  
            # 历遍每次检测的所有脸          
            for face in faceRects: 

                x, y, w, h = face  # face是一个元祖,返回了分类器的检测结果,包括起始点的坐标和高度宽度    

                image = frame[y-10:y+h+10, x-10:x+w+10] # 对原图片进行裁剪

                cv2.rectangle(frame, (x-5, y-5), (x+w+5, y+h+5), color, 2) # 绘制人脸检测的线框                
                cv2.putText(frame, 'face',(x + 30, y + 30), font, 1, (255, 0, 255), 4)


        cv2.imshow(window_name, frame) # 显示人脸检测结果
        c = cv2.waitKey(10)        

        if c & 0xFF == ord('q'):  
            # 按q退出     
            break

        if cv2.getWindowProperty(window_name, cv2.WND_PROP_AUTOSIZE) < 1:
            # 点x退出
            break            
    # 释放摄像头
    cap.release()
    cv2.destroyAllWindows()    
if __name__ == "__main__":

    CatchUsbVideo("face_detect", camera_index=0)
    # camera_index 是摄像头的编号,其中笔记本前置摄像头编号为0
        

3.1 人脸检测器

人脸检测是opencv已经自带的功能,我们需要在我们的电脑中搜索到haarcascade_frontalface_alt2.xml 这个文件:
在这里插入图片描述
找到之后把它跟我们的源码放在同一个文件夹下:
在这里插入图片描述

3.2 测试代码

在这里插入图片描述
运行之后就是这样啦~

4. 进度

  • 前期准备
  • 人脸检测
  • 训练关键点检测模型
  • 实现关键点检测

下一篇:
手把手教学之——人脸识别与关键点检测(二)搭建和训练模型

对你有帮助的话,记得点赞关注一下哦
在这里插入图片描述

发布了58 篇原创文章 · 获赞 117 · 访问量 6810

猜你喜欢

转载自blog.csdn.net/weixin_44936889/article/details/103756287
今日推荐