当前位置: 首页 > news >正文

【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摄像头调用方法

  1. VMware怎么调中文

网上的教程大多都说右键快捷方式打开属性,然后再vmware.exe后加一个空格再加上–locale zh_CN,我开始测试时不管用,后来换成两个空格,即
快捷方式末尾添加两个空格然后加

--locale zh_CN

在这里插入图片描述

  1. 调整虚拟机USB设置

    • 进入虚拟机设置。
    • 转至硬件选项,选择USB控制器。
    • 在USB兼容性选项中,设置为USB3.1。
      在这里插入图片描述
  2. 在VMware Workstation中配置虚拟机摄像头

    • 打开虚拟机,找到虚拟机(M)。
    • 移动鼠标到可移动设置,找到图像设备。
    • 在图像设备中,确保摄像头选项已启用。
      在这里插入图片描述
  3. 进行虚拟机设置

    • 打开终端并输入以下命令:
      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创建,主要用于计算机视觉和人脸识别等各种任务。以下是每个模型及其特点的简要总结:

  1. dlib_face_recognition_resnet_model_v1.dat.bz2:

    • 描述:一个具有29个卷积层的ResNet网络,改编自ResNet-34架构。从头开始训练,使用了约300万张脸部图像,数据来自多个来源,包括face scrub、VGG数据集和从互联网上抓取的图像。
    • 用途:人脸识别。
    • 性能:在LFW基准测试中,平均误差为0.993833,标准差为0.00272732。
  2. mmod_dog_hipsterizer.dat.bz2:

    • 描述:基于Columbia Dogs数据集训练,用于狗的品种分类和部位定位。
    • 用途:狗的品种分类以及可能与狗图像相关的其他任务。
  3. mmod_human_face_detector.dat.bz2:

    • 描述:在包括ImageNet、AFLW、Pascal VOC、VGG数据集、WIDER和face scrub在内的多个公开可用图像数据集中找到的人脸图像创建的数据集。标注是使用dlib的imglab工具创建的。
    • 用途:人脸检测。
  4. resnet34_1000_imagenet_classifier.dnn.bz2:

    • 描述:在ImageNet数据集上训练。
    • 用途:通用图像分类。
  5. shape_predictor_5_face_landmarks.dat.bz2:

    • 描述:一个5点面部标记模型,用于识别眼睛角和鼻子底部。使用从互联网下载的图像并使用dlib的imglab工具进行标注创建的数据集进行训练。
    • 用途:面部特征定位,与dlib的HOG人脸检测器和CNN人脸检测器兼容。
  6. shape_predictor_68_face_landmarks.dat.bz2:

    • 描述:在ibug 300-W数据集上训练,用于精确的面部特征定位,最适合与dlib的HOG人脸检测器一起使用。
  7. shape_predictor_68_face_landmarks_GTX.dat.bz2:

    • 描述:具有增强的面部检测器鲁棒性的68点面部标记模型。
    • 用途:精确的面部特征定位,优化用于方形边界框。
  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:

    • 描述:使用约20万张不同脸部图像的私有数据集训练的性别分类器。
    • 用途:从面部图像进行性别预测。
  11. dnn_age_predictor_v1.dat.bz2:

    • 描述:基于ResNet-10架构训练的年龄预测器,使用约11万张不同标记图像进行训练,性能超越了最新的结果。
    • 用途:从面部图像进行年龄估计。
  12. resnet50_1000_imagenet_classifier.dnn.bz2:

    • 描述:使用ResNet50模型定义在resnet.h中,在ImageNet数据集上进行训练。
    • 用途:通用图像分类。
  13. 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定位方面非常强大,主要支持的功能包括:

  1. 人脸检测 - 使用CNN模型进行快速且准确的人脸检测。
  2. 人脸关键点定位 - 基于68点或5点模型,定位人脸的关键结构点,如眉毛、眼睛、鼻子、嘴巴等。
  3. 人脸识别 - 通过提取人脸特征,实现面部比对识别不同人脸。
  4. 人脸校准 - 对人脸图像进行校准,实现平移、旋转和缩放调整。
  5. 头部姿态估计 - 通过面部关键点分析头部的3D方向和姿态。
  6. 微笑检测 - 通过观察嘴巴形状变化判断是否微笑。
  7. 眨眼检测 - 通过眼睛形状分析判断是否眨眼。
  8. 情绪识别 - 利用面部表情判断人脸情绪,如生气、高兴、悲伤等。
  9. 年龄/性别预测 - 基于人脸图像判断年龄阶段和性别。
  10. 3D人脸重建 - 通过2D图片生成3D人脸模型。

dlib提供了非常方便的人脸分析API,包括数据训练和预训练模型,是人脸相关任务不可多得的强大工具库。

shape_predictor_68_face_landmarks.dat 这个人脸68点标志模型不仅可以实现眨眼检测,结合计算机视觉和机器学习算法,还可以扩展实现更多的面部分析任务:

  1. 微笑检测:通过观察嘴角上扬的关键点坐标变化来判断是否微笑。
  2. 情绪识别:观察眉毛、眼睛、嘴巴等关键点形变来判断面部表达的情绪。
  3. 年龄/性别预测:建立回归/分类模型,以关键点坐标和相对位置关系作为特征,预测年龄和性别。
  4. 头部姿态分析:根据关键点构成的人脸轮廓变化推断头部的三维旋转和平移信息。
  5. 面部交换:结合图片变形,可以在不同人脸之间交换表情。

基于该模型提取的特征非常丰富,可以支持构建各种面部理解和分析的机器学习模型。需要注意商业授权限制,但对研究用途非常有价值。掌握了计算机视觉和机器学习技巧,可以开发出很多有趣的人脸应用。

写给自己(关闭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模型探究

前言 随着金秋时节的来临&#xff0c;国庆和中秋的双重喜庆汇聚成一片温暖的节日氛围。在这个美好的时刻&#xff0c;我们有幸共同迎来一次长达8天的假期&#xff0c;为心灵充电&#xff0c;为身体放松&#xff0c;为未来充实自己。今年的国庆不仅仅是家国团聚的时刻&#xff…...

(二)详解观察者模式

一.使用场景 当我们需要一个类&#xff0c;在他的内部元素发生变化的时候可以主动通知其他类的时候&#xff0c;同时要保持良好的可拓展性&#xff0c;可以采用观察者模式。 二.核心 观察者模式出版者订阅者 我们拥有一个主题对象&#xff0c;和一些其他对象&#xff0c;包…...

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石④

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石④ 第十九章 驱动程序基石④19.7 工作队列19.7.1 内核函数19.7.1.1 定义 work19.7.1.2 使用 work&#xff1a;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 模板&#xff0c;卡卡云模板&#xff0c;首页美化&#xff0c;登陆页美化&#xff0c;修复了 PC 端购物车页面显示不正常的问题。 使用教程 将这俩个数据库文件导入数据库&#xff1b; 其他的直接导入网站根目录覆盖就好&#xff1b; 若首页显示不正常&a…...

【AI视野·今日NLP 自然语言处理论文速览 第四十一期】Tue, 26 Sep 2023

AI视野今日CS.NLP 自然语言处理论文速览 Tue, 26 Sep 2023 Totally 75 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Physics of Language Models: Part 3.1, Knowledge Storage and Extraction Authors Zeyuan Allen Zhu, Yuanz…...

【iptables 实战】05 iptables设置网络转发实验

一、网络架构 实验效果&#xff0c;通过机器B的转发功能&#xff0c;将机器A的报文转发到机器C 本实验准备三台机器分别配置如下网络 机器A ip:192.168.56.104 机器C ip:10.1.0.10 机器B 两张网卡&#xff0c;分别的ip是192.168.56.106和10.1.0.11 如图所示 如下图所示 二、…...

pygame - 贪吃蛇小游戏

蛇每吃掉一个身体块&#xff0c;蛇身就增加一个长度。为了统一计算&#xff0c;界面的尺寸和游戏元素的位置都是身体块长度的倍数 1. 上下左右方向键&#xff08;或者ASDW键&#xff09;控制蛇的移动方向 2. 空格键暂停和继续蛇的身体图片文件&#xff0c;复制到项目的asset\im…...

基于 QT 实现 Task Timer,高效利用时间

一、开发环境 Ubuntu 20.04 QT6.0 二、新建 Qt Wigets Application 这里的基类选择 Wigets&#xff0c; pro 配置文件添加 sql 模块&#xff0c;需要用到 sqlite&#xff0c; 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是一种常用的计算机视觉图形检验方法&#xff0c;霍夫变换一…...

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&#xff08;但括号较少且没有分号&#xff09;&#xff0c;结构类似Oberon-2编译为本机代码&#xff08;没有JVM&#xff09;没有类&#xff0c;但有带有方法的结构接口没有实现继承。不过有type嵌入。函数是一等公民函数可以返…...

Grander因果检验(格兰杰)原理+操作+解释

笔记来源&#xff1a; 1.【传送门】 2.【传送门】 前沿原理介绍 Grander因果检验是一种分析时间序列数据因果关系的方法。 基本思想在于&#xff0c;在控制Y的滞后项 (过去值) 的情况下&#xff0c;如果X的滞后项仍然有助于解释Y的当期值的变动&#xff0c;则认为 X对 Y产生…...

Python-Flask:编写自动化连接demo脚本:v1.0.0

主函数&#xff1a; # _*_ 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依赖即可&#xff1a; <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka_2.13</artifactId><version>3.4.0</version></depend…...

Apache Doris 行列转换可以这样玩

行列转换在做报表分析时还是经常会遇到的&#xff0c;今天就说一下如何实现行列转换吧。 行列转换就是如下图所示两种展示形式的互相转换 1. 行转列 我们来看一个简单的例子&#xff0c;我们要把下面这个表的数据&#xff0c;转换成图二的样式 image-20230914151818953.png …...

【Qt图形视图框架】自定义QGraphicsItem和QGraphicsView,实现鼠标(移动、缩放)及键盘事件、右键事件

自定义QGraphicsItem和QGraphicsView 说明示例myitem.hmyitem.cppmyview.hmyview.cpp调用main.cpp 效果 说明 在使用Qt的图形视图框架实现功能时&#xff0c;一般会在其基础上进行自定义功能实现。 如&#xff1a;滚轮对场景的缩放&#xff0c;鼠标拖动场景中的项&#xff0c;…...

C语言结构体指针学习

结构体变量存放内存中&#xff0c;也有起始地址&#xff0c;定义一个变量来存放这个地址&#xff0c;那这个变量就是结构体指针&#xff1b; typedef struct mydata{int a1;int a2;int a3; }mydata;void CJgtzzView::OnDraw(CDC* pDC) {CJgtzzDoc* pDoc GetDocument();ASSERT…...

华为云云耀云服务器L实例评测|部署在线轻量级备忘录 memos

华为云云耀云服务器L实例评测&#xff5c;部署在线轻量级备忘录 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:电脑驱动更新工具的利器还是多余的软件?

亲爱的读者朋友们&#xff0c;你是不是经常为电脑的驱动问题而烦恼&#xff1f;如果是的话&#xff0c;你可能会对这款软件——Avast Driver Updater 电脑驱动更新工具感兴趣。但在你决定尝试之前&#xff0c;不妨先和我一起深入探讨一下它的优点、缺点以及它适用的使用场景。 …...

大数据Flink(九十五):DML:Window TopN

文章目录 DML:Window TopN DML:Window TopN Window TopN 定义(支持 Streaming):Window TopN 是一种特殊的 TopN,它的返回结果是每一个窗口内的 N 个最小值或者最大值。 应用场景...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能

指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...

《Offer来了:Java面试核心知识点精讲》大纲

文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...

leetcode73-矩阵置零

leetcode 73 思路 记录 0 元素的位置&#xff1a;遍历整个矩阵&#xff0c;找出所有值为 0 的元素&#xff0c;并将它们的坐标记录在数组zeroPosition中置零操作&#xff1a;遍历记录的所有 0 元素位置&#xff0c;将每个位置对应的行和列的所有元素置为 0 具体步骤 初始化…...

PydanticAI快速入门示例

参考链接&#xff1a;https://ai.pydantic.dev/#why-use-pydanticai 示例代码 from pydantic_ai import Agent from pydantic_ai.models.openai import OpenAIModel from pydantic_ai.providers.openai import OpenAIProvider# 配置使用阿里云通义千问模型 model OpenAIMode…...

网页端 js 读取发票里的二维码信息(图片和PDF格式)

起因 为了实现在报销流程中&#xff0c;发票不能重用的限制&#xff0c;发票上传后&#xff0c;希望能读出发票号&#xff0c;并记录发票号已用&#xff0c;下次不再可用于报销。 基于上面的需求&#xff0c;研究了OCR 的方式和读PDF的方式&#xff0c;实际是可行的&#xff…...