【python】dlib人脸识别初步

news2024/12/25 9:12:18

文章目录

    • 安装与初步使用
    • HOG算法人脸识别
    • CNN人脸识别
    • CNN车辆识别

安装与初步使用

dlib也是从C++转过来的Python模块,正常安装非常痛苦,需要下载cmake还有boost,所以这里推荐用conda来安装,一行代码轻松搞定

conda install -c conda-forge dlib

安装之后就可以使用了,dlib最常用的功能就是人脸识别,下面通过调用HOG算法和CNN算法来实现这一功能。

HOG算法人脸识别

import numpy as np
import matplotlib.pyplot as plt
import dlib
img = plt.imread("test.jpg")

detector = dlib.get_frontal_face_detector()
rect = detector(img, 1)[0]
def drawDetector(img, rect):
    p0 = rect.bl_corner()
    cnrs = [rect.bl_corner(), rect.br_corner(), 
        rect.tr_corner(), rect.tl_corner(), 
        rect.bl_corner()]
    xs = [c.x for c in cnrs]
    ys = [c.y for c in cnrs]
    plt.imshow(img)
    plt.plot(xs, ys, c='g')
    plt.axis('off')
    plt.show()

drawDetector(img, rect)

其中,detector为人脸检测器,其返回值是一个矩形,通过提取矩形的四个点,并连成线之后,就可以把检测到的人脸框选出来,最后得到的效果如下

在这里插入图片描述

get_frontal_face_detectordlib默认的人脸检测器,使用的是HOG算法,其基本思想是计算图像的梯度和方向,然后用直方图对梯度值进行统计得到特征,并将这些特征送入SVM,从而实现分类,并检测出人脸。

CNN人脸识别

提到CNN算法,就基本可以断定想实现某种功能,是需要一个预先训练好的模型才能工作,接下来需要用到的CNN模型,在这里下载mmod_human_face_detector.dat.bz2文件。

下载完成后,解压并调用

p = r"mmod_human_face_detector.dat"     # 模型路径
cnnDetector = dlib.cnn_face_detection_model_v1(p)

在检测器创建后,其调用方法与内置检测器是完全相同的,但返回值对Rectangle类型进行了二次封装,需要进行调用,代码如下,其识别结果与内置的HOG是相同的。

cnnRect = cnnDetector(img, 1)[0]
drawDetector(img, cnnRect.rect)

CNN车辆识别

车辆识别

除了人脸识别模型之外,dlib还提供了车辆模型

  • mmod_front_and_rear_end_vehicle_detector.dat
  • mmod_rear_end_vehicle_detector.dat

接下来测试一下这两个模型的识别效果

p1 = r"mmod_front_and_rear_end_vehicle_detector.dat"
p2 = r"mmod_rear_end_vehicle_detector.dat"
fD = dlib.cnn_face_detection_model_v1(p1)
rD = dlib.cnn_face_detection_model_v1(p2)

然后打开一张车辆的图像进行识别

img = plt.imread(r"C:\Users\Laser\Downloads\test.jpg")
fRects = fD(img)
rRects = rD(img)

由于图像中有多个车辆,所以重做一个展示函数

def getXY(rect):
    cnrs = [rect.bl_corner(), rect.br_corner(), 
        rect.tr_corner(), rect.tl_corner(), 
        rect.bl_corner()]
    xs = [c.x for c in cnrs]
    ys = [c.y for c in cnrs]
    return xs, ys
    


def drawDetector(img, rects, ax):
    for r in rects:
        xs, ys = getXY(r.rect)
        ax.plot(xs, ys)
    ax.imshow(img)
    plt.axis('off')

然后绘图

fig = plt.figure()
ax = fig.add_subplot(1,2,1)
drawDetector(img, fRects, ax)
ax = fig.add_subplot(1,2,2)
drawDetector(img, rRects, ax)
plt.show()

效果如下

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/698256.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Rust简介

Rust简介 为什么要用Rust与其他语言比较Rust 特别擅长的领域Rust 与 FireFoxRust 的用户和案例![在这里插入图片描述](https://img-blog.csdnimg.cn/b1e0a39c53ba45d1a3c93d0dd73408fe.png)Rust 优缺点 ref: https://www.bilibili.com/video/BV1hp4y1k7SV 为什么要用Rust 与其…

构建便捷高效的宠物医疗预约服务平台:基于Spring Boot的实现

本文介绍了基于Spring Boot的宠物医疗预约服务平台的设计与实现。通过使用Spring Boot框架和相关技术,我们建立了一个功能丰富的平台,为宠物主人提供了便捷的宠物医疗预约服务。本文将详细介绍平台的架构设计和关键功能模块,并提供相关代码示例以展示技术实现的深度。 宠物…

内网渗透解析

1|0一、前言 阅读本文前需要先搞懂NAT、PAT、端口映射几个概念,内网宽带中的主机可以访问公网宽带主机,反之不可以访问;公网宽带主机可以和公网宽带主机双向访问;内网宽带中的主机和内网宽带中的主机互相无法访问。那么内网宽带中…

前端JavaScript入门-day05

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 对象 1. 对象是什么 对象(object):JavaScript里的一种数据类型 可以理解为是一…

Elasticsearch和Kibana的安装

Elasticsearch和Lucene的关系 Elasticsearch是一个高度可扩展的、开源的、基于 Lucene 的全文搜索和分析引擎。它允许您快速,近实时地存储,搜索和分析大量数据,并支持多租户。 Elasticsearch也使用Java开发并使用 Lucene 作为其核心来实现所…

Docker Compose基础与实战

一、是什么 Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。 二、能做什么 Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project&…

单链表的简介与实现(Java)

一、前言 线性结构的链式存储是用若干地址分散的存储单元存储数据元素,逻辑上相邻的两个数据元素在物理位置上并不一定相邻,必须采用附加信息来表示数据元素之间的顺序关系。因此存储一个数据元素的数据单元至少包含两部分------数据域和地址域 上述的结…

java简易计算器的设计

简易计算器的设计 1.1实训内容 模仿Windows自带的标准版计算器,设计并用Java语言实现简易的计算器(根据自己的能力,可以适当地增加或删除部分功能)。 最低要求: 计算器运行界面如下图所示,包含二个文本框…

Android Binder通信原理(七):java 下的C-S

源码基于:Android R 0. 前言 在之前的几篇博文中,对Android binder 的通信原理进行的深入的剖析,这些博文包括:binder 简介、servicemanager启动、service注册、service获取、Java 端的service 注册和获取。 在前一文中&#xf…

PostgreSQL处理JSON数据

源:https://blog.csdn.net/c_zyer/article/details/130968257?ops_request_misc&request_id&biz_id102&utm_termPostgreSQL%20%E7%9A%84JSON%20%E5%A4%84%E7%90%86&utm_mediumdistribute.pc_search_result.none-task-blog-2allsobaiduweb~default-…

pgsql:纵列字段转为横列字段

问题: 想要将查询出来的数据纵列字段转为横列字段。如以下是24小时内每个小时的数据表: SELECT deviceid,press_avg, hh FROM site_data 想要转换后的效果如下,将24小时内所有数据横向展示: 解决方案: 实现的sql查询…

Spring事务的介绍和使用

目录 一、Spring事务作用 二、代码实现 三、Spring事务相关配置 1、事务配置 2、事务传播行为 一、Spring事务作用 事务作用:在数据层保障一系列的数据库操作同成功同失败 Spring事务作用:在数据层或业务层保障一系列的数据库操作同成功同失败 二、…

分散输入和集中输出(Scatter-Gather I/O):readv()和writev()

readv()和writev()系统调用分别实现了分散输入和集中输出的功能。 NAMEreadv, writev, preadv, pwritev - read or write data into multiple buffersSYNOPSIS#include <sys/uio.h>ssize_t readv(int fd, const struct iovec *iov, int iovcnt);ssize_t writev(int fd, c…

蓝桥杯专题-试题版-【数字游戏】【城市建设】【最大子阵】【蚂蚁感冒】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

数字人解决方案——基于真人视频的三维重建数字人源码与训练方法

前言 1.真人视频三维重建数字人源码是基于NeRF改进的RAD-NeRF&#xff0c;NeRF&#xff08;Neural Radiance Fields&#xff09;是最早在2020年ECCV会议上的Best Paper&#xff0c;其将隐式表达推上了一个新的高度&#xff0c;仅用 2D 的 posed images 作为监督&#xff0c;即…

MongoDB存储引擎

1、前言 存储引擎是数据库的组成部分&#xff0c;负责管理数据存储。 MongoDB支持的以下存储引擎&#xff1a; 存储引擎 描述 WiredTiger存储引擎 从MongoDB 3.2开始默认的存储引擎&#xff0c;新的版本MongoDB推荐使用WiredTiger存储引擎。 MMAPv1存储引擎 MMAPv1是Mon…

微信小程序使用vant组件样式未生效解决办法

1.删除小程序自带的样式 首先在app.json里面删除这一行 2.清除缓存 重新编译 3.重新构建npm 重新编译 在工具里面

nginx之rewrite

一、Rewrite跳转的场景二、Rewrite跳转实现三、Rewrite实际场景四、常用的 Nginx 正则表达式五、Rewrite命令、语法格式六、location的分类七、location的优先级八、rewrite与location的区别九、rewrite示例9.1 基于域名的跳转9.2 基于客户端 IP 访问跳转9.3 基于旧域名跳转到新…

chatgpt赋能python:Python迭代运算:概述、应用及效果分析

Python迭代运算&#xff1a;概述、应用及效果分析 在Python编程领域中&#xff0c;迭代运算是一项基础性操作。它不仅适用于循环遍历数据&#xff0c;还支持函数式编程中的高阶函数应用&#xff08;例如map、filter等&#xff09;。本文将从多个方面探讨Python迭代运算的应用和…

高性能计算开发软件培训班-选猿代码科技IT培训机构!

学习CPU并行程序性能优化的意义&#xff1a; 学习CPU计算是现代计算机科学中不可或缺的一部分。掌握CPU计算原理和应用&#xff0c;能够提高我们的编程技能和解决问题的能力&#xff0c;帮助我们更好地应对计算机科学领域中的挑战和机遇。此外&#xff0c;CPU计算在计算机体系结…