提要: 难得更新,纯纯因为直接上传的话文件过多,讲不清楚.

本次实验目的

  • 1.了解人脸识别原理。
  • 2.掌握人脸检测与人数统计技术。
  • 3.掌握人脸识别技术。

Tweets.:AI导论很有趣,具体表现为刚推荐使用vscode,其他科又使用pycharm(不用那么麻烦,感觉弗如IDLE+jupy);上一节课使用torch,下一节课无缝tsflow;上一个实验要新py,这一次实验直接<=3.6(各个环境大小加起来已经达到3A大卓了)

face_recognition

face_recognition库是一个强大、简单、易上手的人脸识别开源项目,并且配备了完整的开发文档和应用案例,特别是兼容树莓派系统。

项目README文件已经被翻译成中文,此项目是世界上最简洁的人脸识别库,你可以使用Python和命令行工具提取、识别、操作人脸。

同时此项目的人脸识别是基于业内领先的C++开源库dlib中的深度学习模型,用Labeled Faces in the Wild人脸数据集进行测试,有高达99.38%的准确率。

没错,cpp.

请下载依赖:CMake dlib(py<=3.6) face_recognition (建议建一个新环境)

(假如py>3.6 还懒得配环境 请下载预编译轮子whl,没有其他方案了)

下载dlib库前,请把CMake按vs2019方式(举个例子)构建,才可以正常build dlib库依赖

最后直接run code就行

deepface

deepface是一个基于深度学习的人脸识别库,它支持多种人脸识别模型,包括VGG-Face,Google FaceNet,OpenFace,Facebook DeepFace,DeepID,ArcFace和Dlib。它的API设计简洁易用.

pip install tensorflow keras opencv-python pandas gdown tqdm numpy pillow flask gevent joblib

facenet-pytorch

只要下载ft就好了,没其他的各种事项,版本问题

重构人脸识别

mport glob # 文件操作库
# import face_recognition # 人脸识别库
import numpy as np
import os
import cv2 as cv # 图像处理库
import facenet_pytorch  # 代替
from facenet_pytorch import MTCNN, InceptionResnetV1 # 人脸检测和特征提取
import torch # 深度学习框架
from torchvision import datasets # 数据集
from PIL import Image # 图像处理库


# 对每一帧图像进行人脸检测处理
def face_id(img, classifier):
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    faces = classifier.detectMultiScale(gray, 1.3, 5)

    # 画出人脸位置
    for (x, y, w, h) in faces:
        img = cv.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)
    # cv.imshow("result", img)
    return faces


def face_recog():
    # 读取注册的人脸特征npy文件
    feature_path = os.path.join("files", "*.npy")
    feature_files = glob.glob(feature_path)
    # 解析文件名称,作为注册人姓名
    feature_names = [item.split(os.sep)[-1].replace(".npy", "") for item in feature_files]
    # print(feature_names)
    face_cascade = cv.CascadeClassifier("./haarcascade_frontalface_alt.xml")
    cap = cv.VideoCapture(0)
    cap.set(cv.CAP_PROP_FRAME_WIDTH, 640)
    cap.set(cv.CAP_PROP_FRAME_HEIGHT, 480)
    cv.namedWindow('result', flags=cv.WINDOW_NORMAL | cv.WINDOW_KEEPRATIO | cv.WINDOW_GUI_EXPANDED)

    features = []
    for f in feature_files:
        feature = np.load(f)
        features.append(feature)

    # AttributeError: 'numpy.ndarray' object has no attribute 'unsqueeze' 所以应该把features转换为tensor

    while True:
        ret, frame = cap.read()  # 读取视频流
        rects = face_id(frame, face_cascade)
        for x, y, w, h in rects:
            crop = frame[y: y + h, x: x + w]  # 截取人脸
            # 将图片转换为PIL格式
            cmtcnn = MTCNN()
            # 特征提取
            img_embedding = cmtcnn(crop)
            if img_embedding is not None:
                # 人脸特征编码
                img_embedding = img_embedding.unsqueeze(0)
                # 与注册的人脸特征进行对比
                features = torch.tensor(features)
                result = torch.cat([torch.cosine_similarity(img_embedding.unsqueeze(0).unsqueeze(-1).unsqueeze(-1),
                                                            feature.unsqueeze(0)) for feature in features], dim=0)
                if True in result:
                    result = int(np.argmax(np.array(result, np.uint8)))
                    if result < len(feature_names):
                        rec_result = feature_names[result]
                        print(rec_result)
                        cv.rectangle(frame, (x, y - 30), (x + w, y), (0, 0, 255), thickness=-1)
                        cv.putText(frame, rec_result, (x, y), cv.FONT_HERSHEY_SIMPLEX, 1.2, (255, 255, 255),
                                   thickness=2)
                    else:
                        cv.rectangle(frame, (x, y - 30), (x + w, y), (0, 0, 255), thickness=-1)
                        cv.putText(frame, 'unkown', (x, y), cv.FONT_HERSHEY_SIMPLEX, 1.2, (255, 255, 255), thickness=2)
                else:
                    cv.rectangle(frame, (x, y - 30), (x + w, y), (0, 0, 255), thickness=-1)
                    cv.putText(frame, 'unkown', (x, y), cv.FONT_HERSHEY_SIMPLEX, 1.2, (255, 255, 255), thickness=2)

            else:
                cv.rectangle(frame, (x, y - 30), (x + w, y), (0, 0, 255), thickness=-1)
                cv.putText(frame, 'unkown', (x, y), cv.FONT_HERSHEY_SIMPLEX, 1.2, (255, 255, 255), thickness=2)
        cv.imshow("result", frame)
        if cv.waitKey(1) & 0xFF == ord('q'):
            break

    cap.release()
    cv.destroyAllWindows()

人脸注册部分小改一下:

            cmtcnn = MTCNN()
            # 特征提取
            image_encoding = cmtcnn(image)
            if len(image_encoding) != 0:
                flag = True
                break
            else:
                print("没有检测到人脸")

true self is without form .

只要代码能跑就行.

分类:

更新时序:

笺評 (issue)