人脸追踪案例及机器学习认识
1.人脸追踪机器人初制
用程序控制舵机运动的方法与机械臂项目完全相同。
由于摄像头的安装方式为上下倒转安装,我们在编写程序读取图像时需使用 flip 函数将图像上下翻转。
现在,只需要使用哈尔特征检测得到人脸在图像中的位置,再指示舵机运动,进行追踪即可。由于一次只能追踪一张人脸,我们可以在 detectMultiScale 函数中使用 cv2.CASCADE_FIND_BIGGEST_OBJECT(寻找最大的人脸位置)作为 flags 参数的值。
该程序段中,faces 虽然仍是一个元组,但由于只有一张人脸,其长度始终为 1,因此 for 循环至多只会遍历一次。循环中,通过左上角坐标和宽、高,即可以计算出人脸所在位置的中心坐标。当摄像头正对人脸时,人脸位置的中心坐标应该在整个图像的正中,即(320, 240) 位置。要实现对人脸的实时追踪,只需要让图像中的人脸始终趋于图像正中心即可,即始终让 人脸中心坐标(x0, y0)向 (320, 240) 靠近。 当图像中人脸中心 x 坐标大于 320 时,说明人脸在图像中的右侧,云台应向左转;反 之云台应向右转(注意,我们的摄像头是倒置安装的,flip 函数只将图像的上下翻转了过来, 左右还是反的)。当图像中人脸中心 y 坐标大于 240 时,说明人在图像中的下方,云台应 向下转;反之云台应向上转。控制舵机转向的方式和控制机械臂找物体位置的方式类似,需根据人脸的实时坐标对两个舵机的 PWM 值进行增减。若用 pwm1 和 pwm2 分别表示两个舵机的 PWM 值,则可以这样编写程序:
但每次都调整一个固定值,效果并不理想:若调整值取值太大,容易在中心附近发生剧烈的晃动;若调整值取值太小,当人脸远离中心时,调整速度又太慢。为了解决这一问题,一个较简单的方法是让每次的调整值与实际坐标偏离中心的幅度成正比。
这里,我们让调整值与偏离幅度相关且比值为 6。该值仅供参考,应该根据实际情况进行调整,最终使云台能较快速地追踪目标,并且尽量减少在中心附近的晃动。为了避免云台的小幅晃动现象,我们可以划定 (320, 240) 附近的一个小范围均为“中心”,只要目标处于这一区间,云台就不响应。例如:
至此,我们已经将哈尔特征检测人脸坐标与舵机运动的控制关联起来了,在完整的程序中,应在图像处理的循环中加入调整舵机位置的语句。
人脸追踪机器人是一个典型的控制系统,系统通过计算摄像头中人脸的测量位置(输入值)与中心点坐标(目标值)的误差值调整不同的 PWM 值(输出值),控制舵机运动,进而使得图像中的人脸向目标位置趋近并反复循环这一过程。这种输入值跟随输出值变化并可以重新调整输出的控制系统被称为闭环控制系统。优秀的闭环控制系统是自动控制的关键。
2. 什么是机器学习
计算机如何识别一只猫
首先我们要知道,对人工智能系统而言,其核心的工作过程可以被简化为给定一个输入,经过人工智能的判断,得到一个输出。例如,常见的指纹解锁中,我们将输入的指纹信息交给人工智能系统,人工智能系统经过比对判断给出一个通过或不通过的输出结果。那么人工智能是依据什么进行判断的呢?在简单的情形下,我们可以通过程序给定一套规则(算法),人工智能系统只需要依据这个规则进行判定就行了。例如在避障小车中,我们设定当探测到障碍物距离小于特定值时转向 90°,否则保持直行。这就是一个极其简单的人工智能判定规则。由于计算机具有高速运算能力,人工智能可以快速完成很多对于人类来说很麻烦的事情。但是人类可以轻而易举完成的一些事情,对于计算机来说却有着巨大的障碍,例如从一张图片中识别一只猫
那么机器该怎么分辨一只图片中的猫呢?在现在的人工智能系统中,人们常常会通过一定的方式令机器来“学习”从而自行获得一套进行判断的规则。这种方法被称为“机器学习”,是人工智能的一个重要分支领域。例如在识别猫的例子,人们会给计算机提供大量的图片告诉它这是猫或者不是猫,给它一个模型让它自己去学习、分析,自主形成“猫”的概念。经过一定量的训练后,再给它一张图,它就可以判断图中到底是不是猫了。![]()
机器学习的分类
在机器学习领域,有几种主要的学习方式:监督学习 (supervised learning)、无监督学习 (unsupervised learing)、半监督学习(semi-supervised learning)、强化学习(reinforcement learning) 等。监督学习是指给定有对应关系的输入、输出数据,让人工智能算法找出两组数据之间的对应关系。例如在猫狗分类问题中,我们给出多张猫、狗的图片,并完全告诉人工智能系统这些图片中是猫还是狗,再令系统学习它们的分类模式,这是一种典型的监督学习。在哈尔特征检测中,我们曾提到,可以依靠计算机训练的方式找到人脸与非人脸图像的哈尔特征差异,从而实现对人脸的检测。这种训练便是机器学习中的监督学习,它需要我们提供大量事先标注好的人脸或非人脸的照片。无监督学习 是指只提供输入数据而没有对应的输出数据,让人工智能系统自行寻找数据的关系。例如我们只给出猫、狗的图片却不告诉系统它们的分类,便是无监督学习。通常来说,无监督学习的难度远高于监督学习,但监督学习却需要付出更多的成本(需要人工标注大量的数据)。在实际的人工智能项目中,可以根据实际情况选择采用两种方法中的一个或是混合使用,而这种混合使用又称为“半监督学习”。例如我们既提供已知分类的猫、狗图片,又提供没有分类的图片,便是半监督学习。但是在某些情况下,人们以人工智能为核心系统操控机器人解决实际的复杂问题时,往往只知道需要完成的目标,并不能直接提供输入 / 输出值。此时,我们可以令机器人随机地自行控制动作得到相对应的目标反馈结果。人工智能系统将判断其控制的动作与反馈结果间的关联,进而做出合理的调整,最终不断优化其动作,得到更好的结果。例如训练让机器人投篮入筐或是射门入网,先让它随机做动作,然后根据一定的反馈得知投篮是否进筐或射门是否入网,然后不断调整、优化动作,最终达到百发百中。这种机器自主学习的方式被称为“强化学习”,它可以在自主行动的基础上,根据正负反馈的情况不断强化自身
3.认识人工神经网络
输出值 = 权重 1 × 输入值 1+ 权重 2 × 输入值 2+……+ 权重n × 输入值n






4.识别特定的人脸
人脸识别的问题也是人工智能领域的热门问题,Python 第三方包 FaceRecognition 便利用了开源的训练成果,可以直接将人脸图像转换为 128 个特征信息并用于区分不同人脸。在编写程序之前,首先需要导入一张包含已知人物面部的图片以供检测对比,导入的图片最好只包含一张人脸。如果没有照片,可以先用 OpenCV 拍一张自己的正脸照片。
imwrite 函数可以将图像保存到指定地址,参数分别为存储地址和图像信息。存储地址应包含文件的名称和格式,通常选择 jpg 或 png 格式即可。上面的程序可以实现按下键盘s 键则将当前摄像头帧存储到指定地址。接下来,我们先提取这张图片的人脸特征。使用下面的语句可以非常轻松地对一张图像的信息进行面部检索与编码
OpenCV 中内置的 imread 函数可以读取出一张图片中的图像信息,其参数为图片的存储位置。 face_recognition 包中的 face_encodings 函数可以对图像信息中的人脸进行检索并 转化为前面提到的 128 个特征信息数据,这个转化过程可以被称为编码。face_encodings 函数接受的图像信息需要按照 RGB 的顺序排列,这与 OpenCV 默认的 BGR 顺序不同,因此可以先用 cvtColor 函数进行转换(参数设定为 cv2.COLOR_BGR2RBG)。face_encodings 函数的返回值是一个列表,其包括从图像上找到的所有人脸对应的特征信息序列。在载入已知人脸图像的特征信息后,我们就可以将实时摄像头中捕获到的人脸信息与之对比。在实时检测中,如果对每一帧都使用 face_encodings 函数进行编码,这个进程将非常缓慢,完全失去实时性。为了提高检测速度,我们仍可以先用 HAAR 特征检测找到人脸的位置,再直接对这个区域进行编码
这里,为方便起见,我们假定需要比对的人脸只有一个,因此 detectMultiScale 函数使用了 cv2.CASCADE_FIND_BIGGEST_OBJECT(寻找最大目标)参数,并返回其位置信息,依序由左上角 x 坐标、左上角 y 坐标、宽度、高度构成。face_encodings 函数可以接受第二个参数:人脸的位置。设定这个参数后,face_encodings 函数将不再检测人脸位置而是直接计算出这个位置人脸的特征信息。需要注意的是,face_encodings 函数接受的位置信息需要按照左上角 y 坐标、右下角 x 坐标、右下角 y 坐标、左上角 x 坐标的顺序排列。这些信息可以是一组或多组(即可以指定多个人脸的位置信息)。因此我们需要先把 HAAR 特征人脸检测得到的人脸位置信息转换成 face_encodings 函数能接受的位置信息
注意,这里传入 face_encodings 函数的位置序列处于一个长度为 1 的列表 face_locations 中,我们对它使用 append 函数将需要的位置序列加入其中。此外,传入的位置信息必须为整数型,需先用 int 函数强制转换。现在,我们已经完成了人工智能识别人脸的第三个步骤:特征提取,接下来只需要将特征与已知信息比较,完成特征的匹配与识别即可
face_recognition 包中预置了一个 compare_faces 函数,可以非常方便地进行比较判断,例如:
函数可接收 3 个参数:预置的已知人脸特征信息(可以是一组或多组信息)、待比较的人脸特征信息(只能是一组)、容忍率。已知人脸信息就是我们此前保存的照片编码后得到的信息,待比较的人脸信息则是摄像头实时检测并编码的人脸信息。不过,在我们前面的程序中,face_encodings 函数的返回值是一个长度为 1 的列表,将它传入 compare_faces 函数之前还需要用 for 循环取出其中的元素。容忍率则表示判断的标准,值越大,判断越宽松,但也越可能错判;值越小,判断越严苛,但也越可能漏判。0.5 是针对东亚人脸的参考值,但也可根据实际情况调整。函数的返回值是一个列表,它依序将待比较人脸与所有设定的已知人脸相比较并得到True 或 False 的结果,表示判断是或不是同一个人。本例中,由于已知人脸只有一张,该返回值的长度为 1,若要判断是否是同一人,只需要判断返回之中是否存在 True 即可。在Python 中,“某值 in 某列表或元组”将返回这个列表或元组中是否包含某值的逻辑判断结果。
这里,我们对实时图像中的人脸与已知人脸进行比较,如果成功,则用 face_locations[0] 直接取出该人脸的坐标并绘制矩形框。识别特定人脸的完整的程序如下。import cv2 import face_recognition # 载入包含你面部的图片并对它编码 my_image = cv2.imread("/home/pi/photos/1.jpg") my_image = cv2.cvtColor(my_image, cv2.COLOR_BGR2RGB) my_face_encoding = face_recognition.face_encodings(my_image) # 载入人脸分类器 face_cascade = cv2.CascadeClassifier('/home/pi/cascade/haarcascade_ frontalface_default.xml') cap = cv2.VideoCapture(0) # 开始读取摄像头信号 while cap.isOpened():(ret, frame) = cap.read() # 读取每一帧视频图像为 frameframe = cv2.flip(frame, 0) # 将图像上下镜像翻转gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 将图像转换为灰度图faces = face_cascade.detectMultiScale(gray, minSize=(100, 100), flags=cv2.CASCADE_FIND_BIGGEST_OBJECT) # 检测人脸的位置face_locations = [] # 定义一个列表存储人脸的位置信息for (left, top, width, height) in faces: # 遍历找到的人脸的位置信息# 计算出右下角的坐标right = left + widthbottom = top + height# 为 face_locations 添加一个人脸的位置信息,注意需要强制转换为 int 类型face_locations.append((int(top), int(right), int(bottom), int(left)))rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 得到每一帧的 RGB 图像信息face_encodings = face_recognition.face_encodings(rgb_frame, face_ locations) # 计算特定位置的人脸特征信息for face_encoding in face_encodings: # 遍历得到的所有人脸特征信息matches = face_recognition.compare_faces(my_face_encoding, face_encoding, tolerance=0.5) # 将它与已知的人脸进行比较if True in matches: # 如果检测成功(top, right, bottom, left) = face_locations[0] # 获得该人脸的 位置信息cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2) # 绘制矩形框cv2.imshow("Recognition", frame) # 预览图像cv2.waitKey(5) # 每帧等待 5 毫秒 cap.release() cv2.destroyAllWindows()
相关文章:

人脸追踪案例及机器学习认识
1.人脸追踪机器人初制 用程序控制舵机运动的方法与机械臂项目完全相同。 由于摄像头的安装方式为上下倒转安装,我们在编写程序读取图像时需使用 flip 函数将 图像上下翻转。 现在,只需要使用哈尔特征检测得到人脸在图像中的位置,再指示舵机运…...

鸿蒙开发理论之页面和自定义组件生命周期
1、自定义组件和页面的关系 页面:即应用的UI页面。可以由一个或者多个自定义组件组成,Entry装饰的自定义组件为页面的入口组件,即页面的根节点,一个页面有且仅能有一个Entry。只有被Entry装饰的组件才可以调用页面的生命周期。自…...

docker-compose部署gitlab和jenkins
通过docker-compose部署gitlab和jenkins,方便后续工作 注意: gitlab占用资源较多,最好系统内存在8G以上,CPU4核心以上,否则gitlab有可能报错无法启动。docker版本用最新版本,低版本的docker可能会导致doc…...

Pytorch 复习总结 1
Pytorch 复习总结,仅供笔者使用,参考教材: 《动手学深度学习》 本文主要内容为:Pytorch 张量的常见运算、线性代数、高等数学、概率论。 Pytorch 张量的常见运算、线性代数、高等数学、概率论 部分 见 Pytorch 复习总结 1&…...

谷歌免费开放模糊测试框架OSS-Fuzz(物联网、车联网、供应链安全、C/C++)
目录 模糊测试的智能化和自动化 模糊测试不能代替安全设计原则 AI驱动的漏洞修补...

华为配置内部人员接入WLAN网络示例(802.1X认证)
配置内部人员接入WLAN网络示例(802.1X认证) 组网图形 图1 配置802.1X认证组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 用户接入WLAN网络,使用802.1X客户端进行认证,输入正确的用户名和密…...

EXCEL中如何调出“数据分析”的菜单
今天发现,原来WPS还是和EXCEL比,还是少了“数据分析”这个日常基本做统计的菜单,只好用EXCEL了,但奇怪发现我的EXCEL中没发现这个菜单,然后查了下,才发现,要用如下的方法打开: 1&…...

基于Qt的人脸识别项目(功能:颜值检测,口罩检测,表情检测,性别检测,年龄预测等)
完整代码链接在文章末尾 效果展示 代码讲解(待更新) qt图片文件上传 #include <QtWidgets> #include <QFileDialog>...

书生谱语-大语言模型测试demo
课程内容简介 通用环境配置 开发机 InterStudio 配置公钥 在本地机器上打开 Power Shell 终端。在终端中,运行以下命令来生成 SSH 密钥对: ssh-keygen -t rsa您将被提示选择密钥文件的保存位置,默认情况下是在 ~/.ssh/ 目录中。按 Enter …...

2024-02-12 Unity 编辑器开发之编辑器拓展3 —— EditorGUI
文章目录 1 GUILayout2 EditorGUI 介绍3 文本、层级、标签、颜色拾取3.1 LabelField3.2 LayerField3.3 TagField3.4 ColorField3.5 代码示例 4 枚举选择、整数选择、按下按钮4.1 EnumPopup / EnumFlagsField4.2 IntPopup4.3 DropdownButton4.4 代码示例 5 对象关联、各类型输入…...

shell脚本编译与解析
文章目录 shell变量全局变量(环境变量)局部变量设置PATH 环境变量修改变量属性 启动文件环境变量持久化 ./和. 的区别脚本编写判断 和循环命令行参数传入参数循环读取命令行参数获取用户输入 处理选项处理简单选项处理带值选项 重定向显示并且同时输出到…...

第64讲个人中心用户操作菜单实现
静态页面 <!-- 用户操作菜单开始 --><view class"user_menu"><!-- 订单管理开始 --><view class"order_wrap"><view class"order_title">我的订单</view><view class"order_content"><n…...
线性代数的本质——1 向量
向量是线性代数中最为基础的概念。 何为向量? 从物理上看, 向量就是既有大小又有方向的量,只要这两者一定,就可以在空间中随便移动。 从计算机应用的角度看,向量和列表很接近,可以用来描述某对象的几个不同…...

工业以太网交换机引领现代工厂自动化新潮流
随着科技的飞速发展,现代工厂正迎来一场前所未有的自动化变革,而工业以太网交换机的崭新角色正是这场变革的关键组成部分。本文将深入探讨工业以太网交换机与现代工厂自动化的紧密集成,探讨这一集成如何推动工业生产的智能化、效率提升以及未…...

Linux第46步_通过“添加自定义菜单”来学习menuconfig图形化配置原理
通过“添加自定义菜单”来学习menuconfig图形化配置原理,将来移植linux要用到。 自定义菜单要求如下: ①、在主界面中添加一个名为“My test menu”,此菜单内部有一个配置项。 ②、配置项为“MY TESTCONFIG”,此配置项处于菜单“My test m…...

推荐高端资源素材图库下载平台整站源码
推荐高端图库素材下载站的响应式模板和完整的整站源码,适用于娱乐网资源网。该模板支持移动端,并集成了支付宝接口。 演示地 址 : runruncode.com/tupiao/19692.html 页面设计精美,不亚于大型网站的美工水准,并且用户…...

Redis实现:每个进程每30秒执行一次任务
前言 项目中要实现每一进程每30秒执行一次 代码实现: public class DistributedScheduler {private final RRedisClient redisson;private final String processKeyPrefix; // 例如 "process_"public DistributedScheduler(RRedisClient redisson) {this.redisson…...

【AI之路】使用RWKV-Runner启动大模型,彻底实现大模型自由
文章目录 前言一、RWKV-Runner是什么?RWKV-Runner是一个大语言模型的启动平台RWKV-Runner官方功能介绍 二、使用步骤1. 下载文件 总结 前言 提示:这里可以添加本文要记录的大概内容: ChatGPT的横空出世,打开了AI的大门ÿ…...

Dockerfile和.gitlab-ci.yml文件模板
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...

Linux--基础开发工具篇(2)(vim)(配置白名单sudo)
目录 前言 1. vim 1.1vim的基本概念 1.2vim的基本操作 1.3vim命令模式命令集 1.4vim底行命令 1.5 异常问题 1.6 批量注释和批量去注释 1.7解决普通用户无法sudo的问题 1.8简单vim配置 前言 在前面我们学习了yum,也就是Linux系统的应用商店 Linux--基础开…...

Learn LaTeX 017 - LaTex Multicolumn 分栏
在科学排版中进行分栏操作,能够有效的利用页面中的空间,避免空白位置的浪费。 好的分栏设计能对你的排版增色不少! https://www.ixigua.com/7298100920137548288?id7307237715659981346&logTag949adb699806392430bb...

Android 9.0 禁用adb install 安装app功能
1.前言 在9.0的系统产品定制化开发中,在进行一些定制开发中,对于一些app需要通过属性来控制禁止安装,比如adb install也不允许安装,所以就需要 熟悉adb install的安装流程,然后来禁用adb install安装功能,接下来分析下adb 下的安装流程 2.禁用adb install 安装app功能的…...

华为第二批难题五:AI技术提升六面体网格生成自动化问题
有CAE开发商问及OCCT几何内核的网格方面的技术问题。其实,OCCT几何内核的现有网格生成能力比较弱。 HybridOctree_Hex的源代码,还没有仔细去学习。 “HybridOctree_Hex”的开发者说:六面体网格主要是用在数值模拟领域的,比如汽车…...

【FFmpeg】ffplay 命令行参数 ⑤ ( 设置音频滤镜 -af 参数 | 设置统计信息 -stats 参数 | 设置同步时钟类型 -sync 参数 )
文章目录 一、ffplay 命令行参数 - 音频滤镜1、设置音频滤镜 -af 参数2、常用的 音频滤镜 参数3、音频滤镜链 示例 二、ffplay 命令行参数 - 统计信息1、设置统计信息 -stats 参数2、关闭统计信息 -nostats 参数 三、ffplay 命令行参数 - 同步时钟类型1、设置同步时钟类型 -syn…...

vscode开发FPGA(0)--windows平台搭建
一、从官网下载安装VScode Download Visual Studio Code - Mac, Linux, Windows 二、安装配置插件 1. 安装Chinese(simplified)中文汉化包 2.安装Verilog-HDL/systemVerilog插件(支持verilog语法) 3.配置CTags Support插件(支持代码跳转) 1)在github下…...

Java String源码剖析+面试题整理
由于字符串操作是计算机程序中最常见的操作之一,在面试中也是经常出现。本文从基本用法出发逐步深入剖析String的结构和性质,并结合面试题来帮助理解。 String基本用法 在Java中String的创建可以直接像基本类型一样定义,也可以new一个 Str…...

探索未来:集成存储器计算(IMC)与深度神经网络(DNN)的机遇与挑战
开篇部分:人工智能、深度神经网络与内存计算的交汇 在当今数字化时代,人工智能(AI)已经成为科技领域的一股强大力量,而深度神经网络(DNN)则是AI的核心引擎之一。DNN是一种模仿人类神经系统运作…...

[C/C++] -- CMake使用
CMake(Cross-platform Make)是一个开源的跨平台构建工具,用于自动生成用于不同操作系统和编译器的构建脚本。它可以简化项目的构建过程,使得开发人员能够更方便地管理代码、依赖项和构建设置。 CMake 使用一个名为 CMakeLists.tx…...

笔记本选购配置参数详解
笔记本电脑的选购是一个技术活,涉及到众多的配置参数。本文将为您详细解析笔记本电脑的主要配置参数,帮助您在选购时做出明智的决策。 1. 处理器(CPU) 处理器是笔记本电脑的核心组件,负责执行计算任务…...

临睡之际的生死思索与生命哲学的启示
在人类生存体验中,有一种独特而深邃的感受——当人们准备进入梦乡时,会担忧第二天醒来是否还能感知到生命的律动。这种“入睡即未知”的心理状态,既是生命无常的深刻体现,也是对个体生命价值、生活态度及人生哲学的一种深度拷问。…...