[AI]假如重写比阁下装库还快
提要: 难得更新,纯纯因为直接上传的话文件过多,讲不清楚.
本次实验目的
- 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)