【OpenCV-Torch-dlib-ubuntu】Vm虚拟机linux环境摄像头调用方法与dilb模型探究
前言
随着金秋时节的来临,国庆和中秋的双重喜庆汇聚成一片温暖的节日氛围。在这个美好的时刻,我们有幸共同迎来一次长达8天的假期,为心灵充电,为身体放松,为未来充实自己。今年的国庆不仅仅是家国团聚的时刻,更是展现自我的舞台。我在这个特殊的假期里,决定探究dlib模型用法,并将在这篇文章中分享我的学习过程和心得体会。
在上一篇文章中,我们成功跨平台成功配置了dlib库
全面横扫:dlib Python API在Linux和Windows的配置方案
本文基于人脸识别系统项目继续拓展,尝试添加dlib库相关功能进行二合一
Retinaface+FaceNet人脸识别系统-Gradio界面设计
文章目录
- 前言
- VMware摄像头调用方法
- 运行环境配置
- 13个模型逐个分析
- 模型下载
- 13个模型的示例程序
- 1.dlib_face_recognition_resnet_model_v1.dat
- 2. **mmod_dog_hipsterizer.dat.bz2**
- 3. **mmod_human_face_detector.dat.bz2:**
- 4. **resnet34_1000_imagenet_classifier.dnn.bz2:**
- 5. **shape_predictor_5_face_landmarks.dat.bz2:**
- 6. **shape_predictor_68_face_landmarks.dat.bz2:**
- 7. **shape_predictor_68_face_landmarks_GTX.dat.bz2:**
- 8. **mmod_rear_end_vehicle_detector.dat.bz2:**
- 9. **mmod_front_and_rear_end_vehicle_detector.dat.bz2:**
- 10. **dnn_gender_classifier_v1.dat.bz2:**
- 11. **dnn_age_predictor_v1.dat.bz2:**
- 12. **resnet50_1000_imagenet_classifier.dnn.bz2:**
- 13. **dcgan_162x162_synth_faces.dnn.bz2:**
- 实用技巧
- 眨眼次数记录
- 下一步尝试
- 写给自己(关闭gpu加速仅在cpu上加载模型)
- 总结
VMware摄像头调用方法
- VMware怎么调中文
网上的教程大多都说右键快捷方式打开属性,然后再vmware.exe后加一个空格再加上–locale zh_CN,我开始测试时不管用,后来换成两个空格,即
快捷方式末尾添加两个空格然后加
--locale zh_CN
-
调整虚拟机USB设置:
- 进入虚拟机设置。
- 转至硬件选项,选择USB控制器。
- 在USB兼容性选项中,设置为USB3.1。
-
在VMware Workstation中配置虚拟机摄像头:
- 打开虚拟机,找到虚拟机(M)。
- 移动鼠标到可移动设置,找到图像设备。
- 在图像设备中,确保摄像头选项已启用。
-
进行虚拟机设置:
- 打开终端并输入以下命令:
sudo apt-get install cheese cheese
- 测试摄像头是否连接成功,在终端输入命令,如果看到video0,表示连接成功:
ls /dev/video0
- 安装ffmpeg:
sudo apt-get install ffmpeg
- 使用以下命令测试摄像头:
ffplay -i /dev/video0
- 打开终端并输入以下命令:
以上步骤确保了你的虚拟机摄像头能够成功连接,并且通过ffmpeg进行测试。
运行环境配置
打包方式基于
半自动化使用.bat手动打包迁移python项目
- Python 3.8
- OpenCV
- Pytorch
- dlib
- gradio
rem 创建虚拟环境
python -m venv venv
call venv\Scripts\activate.bat
python -m pip install -i https://mirrors.aliyun.com/pypi/simple/ --upgrade pip setuptools
pip install dlib-19.19.0-cp38-cp38-win_amd64.whl
pip install -i https://mirrors.aliyun.com/pypi/simple/ opencv-python==4.5.3.56
pip install torch-1.7.1+cu110-cp38-cp38-win_amd64.whl
pip install torch==1.7.1+cu110 torchvision==0.8.2+cu110 torchaudio==0.7.2 -f https://download.pytorch.org/whl/torch_stable.html
pip install -i https://mirrors.aliyun.com/pypi/simple/ gradio
pip install -i https://mirrors.aliyun.com/pypi/simple/ scikit-learn
pip install -i https://mirrors.aliyun.com/pypi/simple/ -r requirements.txt
requirements.txt
scipy==1.7.1
numpy==1.21.2
matplotlib==3.4.3
opencv_python==4.5.3.56
torch==1.7.1
torchvision==0.8.2
tqdm==4.62.2
Pillow==8.3.2
h5py==2.10.0
我搜集了python3.7-3.9各种版本的dlib安装包你可以关注我然后回复我dlib获取
dlib
我搜集了python3.7-3.9各种版本的dlib安装包
dlib-19.17.99-cp37-cp37m-win_amd64.whl
dlib-19.24.2-cp37-cp37m-win_amd64.whl
dlib-19.19.0-cp38-cp38-win_amd64.whl
dlib-19.21.99-cp38-cp38-win_amd64.whl
dlib-19.22.99-cp39-cp39-win_amd64.whl
这里我们使用dlib-19.19.0-cp38-cp38-win_amd64.whl测试
rem 创建虚拟环境
python -m venv venv
call venv\Scripts\activate.bat
python -m pip install -i https://mirrors.aliyun.com/pypi/simple/ --upgrade pip setuptools
pip install dlib-19.19.0-cp38-cp38-win_amd64.whl
13个模型逐个分析
官方GitHub连接
dlib
dlib-models
"dlib-models"仓库中的训练模型由Davis King创建,主要用于计算机视觉和人脸识别等各种任务。以下是每个模型及其特点的简要总结:
-
dlib_face_recognition_resnet_model_v1.dat.bz2:
- 描述:一个具有29个卷积层的ResNet网络,改编自ResNet-34架构。从头开始训练,使用了约300万张脸部图像,数据来自多个来源,包括face scrub、VGG数据集和从互联网上抓取的图像。
- 用途:人脸识别。
- 性能:在LFW基准测试中,平均误差为0.993833,标准差为0.00272732。
-
mmod_dog_hipsterizer.dat.bz2:
- 描述:基于Columbia Dogs数据集训练,用于狗的品种分类和部位定位。
- 用途:狗的品种分类以及可能与狗图像相关的其他任务。
-
mmod_human_face_detector.dat.bz2:
- 描述:在包括ImageNet、AFLW、Pascal VOC、VGG数据集、WIDER和face scrub在内的多个公开可用图像数据集中找到的人脸图像创建的数据集。标注是使用dlib的imglab工具创建的。
- 用途:人脸检测。
-
resnet34_1000_imagenet_classifier.dnn.bz2:
- 描述:在ImageNet数据集上训练。
- 用途:通用图像分类。
-
shape_predictor_5_face_landmarks.dat.bz2:
- 描述:一个5点面部标记模型,用于识别眼睛角和鼻子底部。使用从互联网下载的图像并使用dlib的imglab工具进行标注创建的数据集进行训练。
- 用途:面部特征定位,与dlib的HOG人脸检测器和CNN人脸检测器兼容。
-
shape_predictor_68_face_landmarks.dat.bz2:
- 描述:在ibug 300-W数据集上训练,用于精确的面部特征定位,最适合与dlib的HOG人脸检测器一起使用。
-
shape_predictor_68_face_landmarks_GTX.dat.bz2:
- 描述:具有增强的面部检测器鲁棒性的68点面部标记模型。
- 用途:精确的面部特征定位,优化用于方形边界框。
-
mmod_rear_end_vehicle_detector.dat.bz2:
- 描述:在包括车辆仪表板摄像头图像的后端车辆图像上手动注释的数据集上进行训练。
- 用途:后端车辆检测。
-
mmod_front_and_rear_end_vehicle_detector.dat.bz2:
- 描述:在包括车辆仪表板摄像头图像的前端和后端车辆图像上手动注释的数据集上进行训练。
- 用途:前端和后端车辆检测。
-
dnn_gender_classifier_v1.dat.bz2:
- 描述:使用约20万张不同脸部图像的私有数据集训练的性别分类器。
- 用途:从面部图像进行性别预测。
-
dnn_age_predictor_v1.dat.bz2:
- 描述:基于ResNet-10架构训练的年龄预测器,使用约11万张不同标记图像进行训练,性能超越了最新的结果。
- 用途:从面部图像进行年龄估计。
-
resnet50_1000_imagenet_classifier.dnn.bz2:
- 描述:使用ResNet50模型定义在resnet.h中,在ImageNet数据集上进行训练。
- 用途:通用图像分类。
-
dcgan_162x162_synth_faces.dnn.bz2:
- 描述:使用深度卷积生成对抗网络(DCGAN)架构训练的DCGAN面部合成模型,用于生成逼真的合成彩色面部图像。
请注意,这些模型的使用和许可可能会有所不同,因此务必仔细阅读提供的信息,并确保遵守任何提到的限制。这些模型可以用于各种计算机视觉任务,是宝贵的资源。
模型下载
我们直接使用git
git clone https://github.com/davisking/dlib-models.git
当使用dlib的dlib_face_recognition_resnet_model_v1.dat
模型进行人脸识别时,你需要安装dlib库并加载该模型。以下是一个Python示例代码,演示如何使用该模型进行简单的人脸识别:
首先,确保你已经安装了dlib库。你可以使用以下命令安装:
pip install dlib
然后,你可以使用以下Python代码进行人脸识别:
import dlib
from skimage import io# 加载dlib_face_recognition_resnet_model_v1.dat模型
detector = dlib.get_frontal_face_detector()
sp = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat") # 这里你也可以使用其他人脸关键点模型
facerec = dlib.face_recognition_model_v1("dlib_face_recognition_resnet_model_v1.dat")# 加载测试图像
img = io.imread("test_image.jpg")# 在图像中检测人脸
dets = detector(img, 1)# 如果检测到多个人脸,可以迭代处理每一个人脸
for i, d in enumerate(dets):shape = sp(img, d) # 获取关键点face_descriptor = facerec.compute_face_descriptor(img, shape) # 获取人脸描述符# 在这里,你可以与数据库中的人脸描述符进行比对,实现人脸识别# 例如,计算当前人脸描述符与数据库中存储的描述符的欧氏距离,找到最接近的匹配# 打印人脸描述符print(f"Face Descriptor for Face {i + 1}:")print(face_descriptor)# 在这里,你可以根据你的需求进行人脸识别匹配
请注意,上述示例中使用的是shape_predictor_68_face_landmarks.dat
模型来获取人脸关键点,然后使用dlib_face_recognition_resnet_model_v1.dat
模型来计算人脸描述符。你可以根据需要使用不同的关键点模型和匹配算法来进行人脸识别。还需要将test_image.jpg
替换为你要测试的图像文件的路径。
13个模型的示例程序
1.dlib_face_recognition_resnet_model_v1.dat
当使用dlib的dlib_face_recognition_resnet_model_v1.dat
模型进行人脸识别时,你需要安装dlib库并加载该模型。以下是一个Python示例代码,演示如何使用该模型进行简单的人脸识别:
首先,确保你已经安装了scikit-image库。你可以使用以下命令安装:
pip install scikit-image
文件夹结构: 将用户图像存储在以用户名称命名的文件夹中,这样可以更轻松地组织用户数据。例如,用户1的图像存储在名为 user1 的文件夹中,用户2的图像存储在名为 user2 的文件夹中。
1. 注册用户的人脸描述符生成代码:
import dlib
import numpy as np
import os
from skimage import io
import pickle# 加载dlib_face_recognition_resnet_model_v1.dat模型
detector = dlib.get_frontal_face_detector()
sp = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat") # 这里你也可以使用其他人脸关键点模型
facerec = dlib.face_recognition_model_v1("dlib_face_recognition_resnet_model_v1.dat")# 初始化一个字典来存储已注册用户的人脸描述符
registered_faces = {}# 指定用户图像所在的文件夹
user_images_folder = "user_images"# 遍历用户图像文件夹
for user_folder in os.listdir(user_images_folder):if os.path.isdir(os.path.join(user_images_folder, user_folder)):user_name = user_folder # 使用文件夹名称作为用户名称# 初始化一个列表来存储当前用户的人脸描述符user_face_descriptors = []# 遍历用户文件夹中的图像文件for user_image_file in os.listdir(os.path.join(user_images_folder, user_folder)):if user_image_file.endswith(".jpg"):user_image_path = os.path.join(user_images_folder, user_folder, user_image_file)# 从用户图像中读取图像user_img = io.imread(user_image_path)# 在图像中检测人脸dets = detector(user_img, 1)# 如果检测到一个人脸,假设只有一个人脸if len(dets) == 1:shape = sp(user_img, dets[0]) # 获取关键点face_descriptor = facerec.compute_face_descriptor(user_img, shape) # 获取人脸描述符user_face_descriptors.append(np.array(face_descriptor))# 存储用户的人脸描述符到已注册用户的字典registered_faces[user_name] = user_face_descriptors# 将已注册用户的人脸描述符保存到本地文件
with open("registered_faces.pkl", "wb") as f:pickle.dump(registered_faces, f)print("Registration completed.")
2. 人脸识别代码:
import dlib
import numpy as np
from skimage import io
import pickle
import cv2# 加载dlib_face_recognition_resnet_model_v1.dat模型
detector = dlib.get_frontal_face_detector()
sp = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat") # 这里你也可以使用其他人脸关键点模型
facerec = dlib.face_recognition_model_v1("dlib_face_recognition_resnet_model_v1.dat")# 加载已注册用户的人脸描述符
with open("registered_faces.pkl", "rb") as f:registered_faces = pickle.load(f)# 设定一个阈值,用于确定匹配是否成功,阈值越小,匹配越严格
threshold = 0.6# 加载测试图像
test_image_path = "test.jpg"
img = io.imread(test_image_path)# 在图像中检测人脸
dets = detector(img, 1)# 初始化一个列表来存储匹配结果
matches = []# 遍历检测到的人脸描述符
for i, d in enumerate(dets):shape = sp(img, d) # 获取关键点face_descriptor = facerec.compute_face_descriptor(img, shape) # 获取人脸描述符# 初始化最佳匹配信息best_match_name = "Unknown"best_match_distance = float("inf")# 遍历已注册用户的数据库for name, registered_descriptors in registered_faces.items():for registered_descriptor in registered_descriptors:# 计算当前人脸描述符与已注册用户的欧氏距离distance = np.linalg.norm(np.array(face_descriptor) - np.array(registered_descriptor))# 如果距离小于阈值,并且比当前最佳匹配距离更近if distance < threshold and distance < best_match_distance:best_match_name = namebest_match_distance = distance# 将匹配结果添加到列表matches.append({"face_id": i + 1, "user_name": best_match_name, "distance": best_match_distance})# 在图像上绘制匹配结果
for match in matches:face_id = match["face_id"]user_name = match["user_name"]distance = match["distance"]# 绘制人脸框x, y, w, h = d.left(), d.top(), d.width(), d.height()cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)# 在人脸框上方显示匹配结果text = f"Face {face_id}: {user_name} ({distance:.2f})"cv2.putText(img, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)# 显示带有匹配结果的图像
cv2.imshow("Face Recognition", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
确保根据你的需求将这些代码片段中的变量和文件路径进行适当的替换。这两段代码现在应该能够正常运行并进行人脸识别。如果你有其他问题或需要进一步的帮助,请随时提问。
2. mmod_dog_hipsterizer.dat.bz2
import dlib
import cv2
from skimage import io# 加载 dlib_face_recognition_resnet_model_v1.dat 模型用于关键点检测
shape_predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")# 加载测试图像
img = io.imread("test.jpg")# 加载 mmod_dog_hipsterizer.dat 模型
detector = dlib.get_frontal_face_detector()
hip_detector = dlib.cnn_face_detection_model_v1("mmod_dog_hipsterizer.dat")# 使用检测器检测狗的品种和部位
detections = hip_detector(img, 1)# 遍历检测结果并绘制矩形框
for detection in detections:x, y, w, h = detection.rect.left(), detection.rect.top(), detection.rect.width(), detection.rect.height()# 绘制矩形框cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)# 使用关键点检测器获取部位关键点landmarks = shape_predictor(img, detection.rect)# 遍历关键点并绘制for point in landmarks.parts():cv2.circle(img, (point.x, point.y), 2, (0, 0, 255), -1)# 显示带有检测结果和关键点的图像
cv2.imshow("Dog Hipsterizer", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
import dlib
from skimage import io# 加载模型
detector = dlib.cnn_face_detection_model_v1("mmod_dog_hipsterizer.dat")# 加载要分类的狗的图像
dog_image = io.imread("dog2.jpg")# 运行分类器来检测品种
detections = detector(dog_image)# 打印每个检测到的品种
for detection in detections:# 检测到的品种的置信度可以通过矩形的面积来估计confidence = detection.rect.area()print(f"品种:{detection.rect}, 置信度:{confidence}")# 如果需要,可以进一步解析品种的标签以获得可读的结果
3. mmod_human_face_detector.dat.bz2:
import dlib
import cv2# 加载模型
detector = dlib.cnn_face_detection_model_v1("mmod_human_face_detector.dat")# 加载要进行人脸检测的图像
image = cv2.imread("test.jpg")# 将图像转换为灰度图像(dlib要求输入为灰度图像)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 使用模型进行人脸检测
detections = detector(gray)# 在原图上绘制检测到的人脸矩形框
for detection in detections:x, y, w, h = (detection.rect.left(), detection.rect.top(), detection.rect.width(), detection.rect.height())cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)# 显示带有人脸检测结果的图像
cv2.imshow("Face Detection", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
4. resnet34_1000_imagenet_classifier.dnn.bz2:
暂未找到python调用方法
5. shape_predictor_5_face_landmarks.dat.bz2:
import dlib
import cv2# 加载面部特征定位模型
predictor = dlib.shape_predictor("shape_predictor_5_face_landmarks.dat")# 加载图像
image = cv2.imread("test.jpg")# 将图像转换为灰度
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 使用dlib的HOG人脸检测器检测人脸
detector = dlib.get_frontal_face_detector()
faces = detector(gray)# 对每个检测到的人脸进行面部特征定位
for face in faces:landmarks = predictor(gray, face)# 获取并绘制每个关键点for n in range(5): # 此模型仅包含5个关键点x = landmarks.part(n).xy = landmarks.part(n).ycv2.circle(image, (x, y), 2, (0, 255, 0), -1)# 显示带有关键点的图像
cv2.imshow("Facial Landmarks", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
6. shape_predictor_68_face_landmarks.dat.bz2:
import dlib
import cv2# 加载面部特征定位模型
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")# 加载图像
image = cv2.imread("test.jpg")# 将图像转换为灰度
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 使用dlib的HOG人脸检测器检测人脸
detector = dlib.get_frontal_face_detector()
faces = detector(gray)# 对每个检测到的人脸进行面部特征定位
for face in faces:landmarks = predictor(gray, face)# 获取并绘制每个关键点for n in range(68): # 此模型包含68个关键点x = landmarks.part(n).xy = landmarks.part(n).ycv2.circle(image, (x, y), 2, (0, 255, 0), -1)# 显示带有关键点的图像
cv2.imshow("Facial Landmarks", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
7. shape_predictor_68_face_landmarks_GTX.dat.bz2:
import dlib
import cv2# 加载面部特征定位模型
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks_GTX.dat")# 加载图像
image = cv2.imread("test.jpg")# 将图像转换为灰度
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 使用dlib的HOG人脸检测器检测人脸
detector = dlib.get_frontal_face_detector()
faces = detector(gray)# 对每个检测到的人脸进行面部特征定位
for face in faces:landmarks = predictor(gray, face)# 获取并绘制每个关键点for n in range(68): # 此模型包含68个关键点x = landmarks.part(n).xy = landmarks.part(n).ycv2.circle(image, (x, y), 2, (0, 255, 0), -1)# 显示带有关键点的图像
cv2.imshow("Facial Landmarks", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
8. mmod_rear_end_vehicle_detector.dat.bz2:
暂未找到python调用方法
9. mmod_front_and_rear_end_vehicle_detector.dat.bz2:
暂未找到python调用方法
10. dnn_gender_classifier_v1.dat.bz2:
暂未找到python调用方法
11. dnn_age_predictor_v1.dat.bz2:
暂未找到python调用方法
12. resnet50_1000_imagenet_classifier.dnn.bz2:
暂未找到python调用方法
13. dcgan_162x162_synth_faces.dnn.bz2:
暂未找到python调用方法
实用技巧
眨眼次数记录
import dlib
import cv2
import numpy as np# 计算眼睛长宽比
def eye_aspect_ratio(eye):A = np.linalg.norm(eye[1] - eye[5])B = np.linalg.norm(eye[2] - eye[4])C = np.linalg.norm(eye[0] - eye[3])ear = (A + B) / (2.0 * C)return ear# 获取最大的人脸
def largest_face(dets):if len(dets) == 1:return 0face_areas = [(det.right() - det.left()) *(det.bottom() - det.top()) for det in dets]largest_area = face_areas[0]largest_index = 0for index in range(1, len(dets)):if face_areas[index] > largest_area:largest_index = indexlargest_area = face_areas[index]return largest_index# 初始化探测器和预测器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")# 获取视频流
cap = cv2.VideoCapture(0)# 初始化帧计数器和眨眼计数器
frame_counter = 0
blink_counter = 0while True:# 获取当前帧ret, frame = cap.read()if not ret:break# 转换为灰度图gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 检测人脸faces = detector(gray, 0)# 检测到人脸if len(faces) > 0:# 获取最大的人脸index = largest_face(faces)face = faces[index]# 获取特征点landmarks = np.matrix([[p.x, p.y] for p in predictor(frame, face).parts()])# 提取左右眼点left_eye = landmarks[42:48]right_eye = landmarks[36:42]# 计算EARleft_ear = eye_aspect_ratio(left_eye)right_ear = eye_aspect_ratio(right_eye)ear = (left_ear + right_ear) / 2.0# 判断是否眨眼if ear < 0.21:frame_counter += 1status = "Blinking"else:# 眨眼次数判断if frame_counter >= 3:blink_counter += 1frame_counter = 0status = "Open"# 显示眨眼结果cv2.putText(frame, "Blinks: {}".format(blink_counter), (10, 30),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)cv2.putText(frame, "EAR: {:.2f}".format(ear), (300, 30),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)cv2.putText(frame, "Status: {}".format(status), (10, 60),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2)# 显示画面cv2.imshow("Frame", frame)# 按Q退出key = cv2.waitKey(1) & 0xFFif key == ord('q'):break# 释放资源并关闭窗口
cap.release()
cv2.destroyAllWindows()
下一步尝试
dlib库在人脸检测和面部landmark定位方面非常强大,主要支持的功能包括:
- 人脸检测 - 使用CNN模型进行快速且准确的人脸检测。
- 人脸关键点定位 - 基于68点或5点模型,定位人脸的关键结构点,如眉毛、眼睛、鼻子、嘴巴等。
- 人脸识别 - 通过提取人脸特征,实现面部比对识别不同人脸。
- 人脸校准 - 对人脸图像进行校准,实现平移、旋转和缩放调整。
- 头部姿态估计 - 通过面部关键点分析头部的3D方向和姿态。
- 微笑检测 - 通过观察嘴巴形状变化判断是否微笑。
- 眨眼检测 - 通过眼睛形状分析判断是否眨眼。
- 情绪识别 - 利用面部表情判断人脸情绪,如生气、高兴、悲伤等。
- 年龄/性别预测 - 基于人脸图像判断年龄阶段和性别。
- 3D人脸重建 - 通过2D图片生成3D人脸模型。
dlib提供了非常方便的人脸分析API,包括数据训练和预训练模型,是人脸相关任务不可多得的强大工具库。
shape_predictor_68_face_landmarks.dat 这个人脸68点标志模型不仅可以实现眨眼检测,结合计算机视觉和机器学习算法,还可以扩展实现更多的面部分析任务:
- 微笑检测:通过观察嘴角上扬的关键点坐标变化来判断是否微笑。
- 情绪识别:观察眉毛、眼睛、嘴巴等关键点形变来判断面部表达的情绪。
- 年龄/性别预测:建立回归/分类模型,以关键点坐标和相对位置关系作为特征,预测年龄和性别。
- 头部姿态分析:根据关键点构成的人脸轮廓变化推断头部的三维旋转和平移信息。
- 面部交换:结合图片变形,可以在不同人脸之间交换表情。
基于该模型提取的特征非常丰富,可以支持构建各种面部理解和分析的机器学习模型。需要注意商业授权限制,但对研究用途非常有价值。掌握了计算机视觉和机器学习技巧,可以开发出很多有趣的人脸应用。
写给自己(关闭gpu加速仅在cpu上加载模型)
根据的错误日志,问题出在加载RetinaFace模型的时候:
File "/home/topeet/rknn/RetinaFace-FaceNet/retinaface.py", line 124, in __init__self.generate()
File "/home/topeet/rknn/RetinaFace-FaceNet/retinaface.py", line 146, in generatestate_dict = torch.load(self.retinaface_model_path)
所以需要在retinaface.py里面加载模型的时候添加map_location参数:
# retinaface.pyimport torchclass RetinaFace():def __init__(self):...def generate(self):...# 原代码# state_dict = torch.load(self.retinaface_model_path) # 修改为state_dict = torch.load(self.retinaface_model_path, map_location=torch.device('cpu'))
用map_location='cpu’告诉torch将模型加载到CPU上。
这样应该就可以避免CUDA不可用的问题了。
另外,为了保证结果的一致性,在加载模型之前可以加上:
torch.cuda.empty_cache()
清空GPU缓存,torch就会把 computation 默认放在CPU上做。
所以完整的修改代码是:
import torchclass RetinaFace():def __init__(self):...def generate(self):...torch.cuda.empty_cache() state_dict = torch.load(self.retinaface_model_path, map_location=torch.device('cpu'))
总结
在国庆和中秋双节的欢庆氛围中,我深入研究了dlib,并在实践中遭遇了种种问题。通过不懈的努力和探索,我成功地克服了挑战,取得了技术上的突破。这个过程不仅让我更深入地理解了活体检测技术的原理,也锻炼了我的问题解决能力。希望通过我的分享,能够为大家提供一些有价值的经验,也希望在未来的技术道路上,我们能够不断探索,共同进步,这篇文章并未完结,我还会继续坚持更新。
相关文章:
【OpenCV-Torch-dlib-ubuntu】Vm虚拟机linux环境摄像头调用方法与dilb模型探究
前言 随着金秋时节的来临,国庆和中秋的双重喜庆汇聚成一片温暖的节日氛围。在这个美好的时刻,我们有幸共同迎来一次长达8天的假期,为心灵充电,为身体放松,为未来充实自己。今年的国庆不仅仅是家国团聚的时刻ÿ…...
(二)详解观察者模式
一.使用场景 当我们需要一个类,在他的内部元素发生变化的时候可以主动通知其他类的时候,同时要保持良好的可拓展性,可以采用观察者模式。 二.核心 观察者模式出版者订阅者 我们拥有一个主题对象,和一些其他对象,包…...
嵌入式Linux应用开发-基础知识-第十九章驱动程序基石④
嵌入式Linux应用开发-基础知识-第十九章驱动程序基石④ 第十九章 驱动程序基石④19.7 工作队列19.7.1 内核函数19.7.1.1 定义 work19.7.1.2 使用 work:schedule_work19.7.1.3 其他函数 19.7.2 编程、上机19.7.3 内部机制19.7.3.1 Linux 2.x的工作队列创建过程19.7.3…...
2023 彩虹全新 SUP 模板,卡卡云模板修复版
2023 彩虹全新 SUP 模板,卡卡云模板,首页美化,登陆页美化,修复了 PC 端购物车页面显示不正常的问题。 使用教程 将这俩个数据库文件导入数据库; 其他的直接导入网站根目录覆盖就好; 若首页显示不正常&a…...
【AI视野·今日NLP 自然语言处理论文速览 第四十一期】Tue, 26 Sep 2023
AI视野今日CS.NLP 自然语言处理论文速览 Tue, 26 Sep 2023 Totally 75 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Physics of Language Models: Part 3.1, Knowledge Storage and Extraction Authors Zeyuan Allen Zhu, Yuanz…...
【iptables 实战】05 iptables设置网络转发实验
一、网络架构 实验效果,通过机器B的转发功能,将机器A的报文转发到机器C 本实验准备三台机器分别配置如下网络 机器A ip:192.168.56.104 机器C ip:10.1.0.10 机器B 两张网卡,分别的ip是192.168.56.106和10.1.0.11 如图所示 如下图所示 二、…...
pygame - 贪吃蛇小游戏
蛇每吃掉一个身体块,蛇身就增加一个长度。为了统一计算,界面的尺寸和游戏元素的位置都是身体块长度的倍数 1. 上下左右方向键(或者ASDW键)控制蛇的移动方向 2. 空格键暂停和继续蛇的身体图片文件,复制到项目的asset\im…...
基于 QT 实现 Task Timer,高效利用时间
一、开发环境 Ubuntu 20.04 QT6.0 二、新建 Qt Wigets Application 这里的基类选择 Wigets, pro 配置文件添加 sql 模块,需要用到 sqlite, QT sql 三、添加数据库连接头文件 // connection.h #ifndef CONNECTION_H #define CONNECTION_…...
图像处理与计算机视觉--第五章-图像分割-霍夫变换
文章目录 1.霍夫变换(Hough Transform)原理介绍2.霍夫变换(Hough Transform)算法流程3.霍夫变换(Hough Transform)算法代码4.霍夫变换(Hough Transform)算法效果 1.霍夫变换(Hough Transform)原理介绍 Hough Transform是一种常用的计算机视觉图形检验方法,霍夫变换一…...
linux下文件操作命令
title: linux下文件操作命令 createTime: 2020-10-29 18:05:52 updateTime: 2020-10-29 18:05:52 categories: linux tags: Linux下文件操作命令 tar命令 使用tar命令一般打包分为两种*.tar ,*.tar.gz 相信大家也使用过tar -zcvf test.tar test/tar -zcvf test.tar.gz test/…...
Golang语法、技巧和窍门
Golang简介 命令式语言静态类型语法标记类似于C(但括号较少且没有分号),结构类似Oberon-2编译为本机代码(没有JVM)没有类,但有带有方法的结构接口没有实现继承。不过有type嵌入。函数是一等公民函数可以返…...
Grander因果检验(格兰杰)原理+操作+解释
笔记来源: 1.【传送门】 2.【传送门】 前沿原理介绍 Grander因果检验是一种分析时间序列数据因果关系的方法。 基本思想在于,在控制Y的滞后项 (过去值) 的情况下,如果X的滞后项仍然有助于解释Y的当期值的变动,则认为 X对 Y产生…...
Python-Flask:编写自动化连接demo脚本:v1.0.0
主函数: # _*_ Coding : UTF-8 _*_ # Time : 13:14 # Author : YYZ # File : Flask # Project : Python_Project_爬虫 import jsonfrom flask import Flask,request,jsonify import sshapi Flask(__name__)# methods: 指定请求方式 接口解析参数host host_info[…...
kafka客户端应用参数详解
一、基本客户端收发消息 Kafka提供了非常简单的客户端API。只需要引入一个Maven依赖即可: <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka_2.13</artifactId><version>3.4.0</version></depend…...
Apache Doris 行列转换可以这样玩
行列转换在做报表分析时还是经常会遇到的,今天就说一下如何实现行列转换吧。 行列转换就是如下图所示两种展示形式的互相转换 1. 行转列 我们来看一个简单的例子,我们要把下面这个表的数据,转换成图二的样式 image-20230914151818953.png …...
【Qt图形视图框架】自定义QGraphicsItem和QGraphicsView,实现鼠标(移动、缩放)及键盘事件、右键事件
自定义QGraphicsItem和QGraphicsView 说明示例myitem.hmyitem.cppmyview.hmyview.cpp调用main.cpp 效果 说明 在使用Qt的图形视图框架实现功能时,一般会在其基础上进行自定义功能实现。 如:滚轮对场景的缩放,鼠标拖动场景中的项,…...
C语言结构体指针学习
结构体变量存放内存中,也有起始地址,定义一个变量来存放这个地址,那这个变量就是结构体指针; typedef struct mydata{int a1;int a2;int a3; }mydata;void CJgtzzView::OnDraw(CDC* pDC) {CJgtzzDoc* pDoc GetDocument();ASSERT…...
华为云云耀云服务器L实例评测|部署在线轻量级备忘录 memos
华为云云耀云服务器L实例评测|部署在线轻量级备忘录 memos 一、云耀云服务器L实例介绍1.1 云服务器介绍1.2 产品优势1.3 应用场景1.4 支持镜像 二、云耀云服务器L实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 memos3.1 memos介绍3.2 Docker 环境搭建…...
详解Avast Driver Updater:电脑驱动更新工具的利器还是多余的软件?
亲爱的读者朋友们,你是不是经常为电脑的驱动问题而烦恼?如果是的话,你可能会对这款软件——Avast Driver Updater 电脑驱动更新工具感兴趣。但在你决定尝试之前,不妨先和我一起深入探讨一下它的优点、缺点以及它适用的使用场景。 …...
大数据Flink(九十五):DML:Window TopN
文章目录 DML:Window TopN DML:Window TopN Window TopN 定义(支持 Streaming):Window TopN 是一种特殊的 TopN,它的返回结果是每一个窗口内的 N 个最小值或者最大值。 应用场景...
使用OKHttpClient访问网络
使用OKHttpClient前要引入依赖: 在build.gradle(Moduel :app)中添加 implementation com.squareup.okhttp3:okhttp:3.14.1 implementation com.squareup.okhttp3:logging-interceptor:3.14.1 implementation com.squareup.okio:okio:1.6.0 1. GET(同步…...
maui 开发AMD CPU踩的坑。
刚换的 amd R7735HS 笔记本,8核16线程,32GB内存。性能得实强悍 。 当需要发布iOS版本时发现,我没有macos ,那就安装个vmware 吧。看了一下Apple 要求以后的发布的APP需要以xcode14.3或以后版本开发的版本,但xcode14.3…...
宝塔反代openai官方API接口详细教程,502 Bad Gateway问题解决
一、前言 宝塔反代openai官方API接口详细教程,实现国内使用ChatGPT502 Bad Gateway问题解决, 此方法最简单快捷,没有复杂步骤,不容易出错,即最简单,零代码、零部署的方法。 二、实现前提 一台海外VPS服务…...
【leetocde】128. 最长连续序列
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入:nums [100,4,200,1,3,2] 输出:4 …...
【Vue3】动态 class 类
如果你想在 Vue.js 中动态设置元素的 class 类名,你可以使用以下两种主要方式: 绑定一个动态的 class 对象:你可以使用 v-bind 或简写的 : 来绑定一个包含类名的对象,其中类名的键是类名字符串,值是一个布尔值或计算属…...
【Redis】redis基本数据类型详解(String、List、Hash、Set、ZSet)
目录 RedisString(字符串)List(列表)Hash(字典)Set(集合)ZSet(有序集合) Redis Redis有5种基本的数据结构,分别为:string(字符串)、list(列表)、set(集合)、hash(哈希&a…...
ubuntu源码安装aria2
github:GitHub - aria2/aria2: aria2 is a lightweight multi-protocol & multi-source, cross platform download utility operated in command-line. It supports HTTP/HTTPS, FTP, SFTP, BitTorrent and Metalink. 发行说明:GitHub - aria2/aria2 at releas…...
【多任务案例:猫狗脸部定位与分类】
【猫狗脸部定位与识别】 1 引言2 损失函数3 The Oxford-IIIT Pet Dataset数据集4 数据预处理4 创建模型输入5 自定义数据集加载方式6 显示一批次数据7 创建定位模型8 模型训练9 绘制损失曲线10 模型保存与预测 1 引言 猫狗脸部定位与识别分为定位和识别,即定位猫狗…...
.Net 锁的介绍
在.NET中,有多种锁机制可用于多线程编程,用来确保线程安全和共享资源的同步。以下是.NET中常见的锁机制: 1. **Monitor(互斥锁):** `Monitor` 是.NET中最基本的锁机制之一。它使用 `lock` 关键字实现,可以确保在同一时刻只有一个线程能够访问被锁定的代码块。`Monitor`…...
Office 2021 小型企业版商用办公软件评测:提升工作效率与协作能力的专业利器
作为一名软件评测人员,我将为您带来一篇关于 Office 2021 小型企业版商用办公软件的评测文章。在这篇评测中,我将从实用性、使用场景、优点和缺点等多个方面对该软件进行客观分析,在专业角度为您揭示它的真正实力和潜力。 一、实用性…...
服务预约网站怎么建设/今天的重要新闻
在存储库和项目之间共享代码对我们产品的成功至关重要。 当您的团队无法共享代码时,您最终会在整个代码库中获得重复的代码-这势必会拖延交付周期并使维护成为一场噩梦,因为每次更改都需要在多个地方进行长时间的重构。 您还浪费了宝贵的时间和精力并重新…...
重庆cms建站模板/上海搜索优化推广
用 wingrub 引导Linux安装详述 作者:北南南北来自:LinuxSir.Org提要:本文主要讲述的是用wingrub 引导Linux的进入安装过程,以通过wingrub引导Fedora 4.0进入安装过程为例,来引导初学者进入精彩的Linux 世界 ࿱…...
可以做网站二维码吗/seo深圳培训班
1、echarts提供了丰富的图标,如提供了saveAsImage保存图片restore 配置项还原dataView数据视图工具dataZoom 数据区域缩放magicType 动态类型切换brush 选择组件的控制按钮等。2、在实际开发过程中,根据需求需要自定义图标及功能3、实现方式:…...
网站开发什么语言比较好/色盲测试图第五版
之企业库推广 阿新 1. 概述 可重用的程序块库,用于解决共性的企业级开发过程中所面临的挑战 l 较低风险(经过实践验证的、精准的) l 降低成本(可充用) l 快速实施的问题(易用&…...
苏州做网站公司有哪些/淘宝关键词优化技巧
Spring Boot 框架快速入门教程以大量示例讲解了 Spring Boot 在各类情境中的应用,让大家可以跟着老师的思维和代码快速理解并掌握。 适用于 Java 开发人员,尤其是初学 Spring Boot 的人员和需要从传统 Spring 转向 Spring Boot 开发的技术人员。 下边…...
wordpress友情链接激活/百度竞价排名规则
简介 zabbix 是一个基于 WEB 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案 zabbix 能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位解决存在的各种问题。 Zabbix 主要特点 安装与配置简…...