基于HOG+LBP完成特征工程,基于机器学习模型同时完成人脸识别+表情识别

news2024/11/20 6:32:33

这周前两天有时间我写了一篇博文,基于LBP和HOG实现人脸好表情特征的提取计算,之后分别训练了人脸识别模型和表情识别模型,在推理阶段实现了单张图像一次性人脸识别和表情识别的计算分析,但这个我前面就说了这个还是间接的实现方式,不是像深度学习那样可以通过构建训练一个多任务分类识别的模型可以实现单个模型同时完成多个任务,我在写上篇文章的时候突然想到了机器学习也有类似的技术,就是多标签分类的构建方式,这里我就是基于这样地构建形式来实现类似于深度学习模型的构建方式,能够实现单个模型同时完成多个任务。

上篇文章如下,感兴趣的话可以自行阅读:

《基于HOG、LBP完成特征工程,基于SVM/RF/XGBOOST/GBDT/CNN/DNN完成人脸识别+表情识别》

 本文使用到的数据集与上文完全一致,这里就不再赘述了。

这里借助于多标签分类任务的构建方式来同时实现人脸识别和表情识别,所以就不再分别基于LBP和HOG来进行人脸特征提取和表情特征提取,而是仅仅需要对同一份图像数据集进行分别进行一次LBP特征提取和HOG特征提取即可,相应的方法与前文完全相同,这里不再赘述了。

接下来是构建数据集的和核心操作,我们需要基于数据集种图像的id和对应的所属类别label构建映射字典,之后将两部分的数据标签进行编码与合并处理。

对于表情数据表情处理核心实现如下:

emotion_dict = {}
emotion_labels = os.listdir(emotionDir)
for one_emo in os.listdir(emotionDir):
    oneDir = emotionDir + one_emo + "/"
    for one_pic in os.listdir(oneDir):
        one_label_list = [0] * len(emotion_labels)
        one_index = emotion_labels.index(one_emo)
        one_label_list[one_index] = 1
        emotion_dict[one_pic] = one_label_list

对于人脸数据集的处理也是一样的,核心实现如下所示:

face_dict = {}
face_labels = os.listdir(faceDir)
for one_face in os.listdir(faceDir):
    oneDir = faceDir + one_face + "/"
    for one_pic in os.listdir(oneDir):
        one_label_list = [0] * len(face_labels)
        one_index = face_labels.index(one_face)
        one_label_list[one_index] = 1
        face_dict[one_pic] = one_label_list

上面两部分分别完成了表情数据标签映射和人脸数据标签映射数据的构建处理,接下来就是需要将LBP和HOG提取的特征和label数据进行拼接,我这里主要实现了三种特征数据和标签数据构建方式,分别如下:

1、LBP特征+label数据
2、HOG特征+label数据
3、LBP+HOG特征+label数据

接下来分别看下每种方法的核心实现:

方法一:LBP特征+label数据

X, y = [], []
for one_pic in lbpFeature:
    one_vec = lbpFeature[one_pic]
    one_emo_label = emotion_dict[one_pic]
    one_face_label = face_dict[one_pic]
    one_label = one_emo_label + one_face_label
    X.append(one_vec)
    y.append(one_label)
lbp = {}
lbp["X"], lbp["y"] = X, y
with open("lbp.json", "w") as f:
    f.write(json.dumps(lbp))

方法二:HOG特征+label数据

X, y = [], []
for one_pic in hogFeature:
    one_vec = hogFeature[one_pic]
    one_emo_label = emotion_dict[one_pic]
    one_face_label = face_dict[one_pic]
    one_label = one_emo_label + one_face_label
    X.append(one_vec)
    y.append(one_label)
hog = {}
hog["X"], hog["y"] = X, y
with open("hog.json", "w") as f:
    f.write(json.dumps(hog))

方法三:HOG+LBP特征+label数据

X, y = [], []
for one_pic in hogFeature:
    if one_pic in lbpFeature:
        one_hog_vec = hogFeature[one_pic]
        one_lbp_vec = lbpFeature[one_pic]
        one_vec = one_hog_vec + one_lbp_vec
        one_emo_label = emotion_dict[one_pic]
        one_face_label = face_dict[one_pic]
        one_label = one_emo_label + one_face_label
        X.append(one_vec)
        y.append(one_label)
total = {}
total["X"], total["y"] = X, y
with open("total.json", "w") as f:
    f.write(json.dumps(total))

生成结果文件如下所示:

 后续搭建训练机器学习模型就会使用后续拼接得到的多标签任务数据集了。

接下来我分别使用了决策树DT模型、随机森林RF模型和多层感知机MLP模型来分别进行模型搭建训练和测试评估。核心实现如下所示:

def mainModel():
    """
    DT  RF  MLP
    """
    X,y=loadData()
    model=initModel()
    X_train, X_test, y_train ,y_test = train_test_split(X, y, test_size=0.2)
    DT = DecisionTreeClassifier()
    DT.fit(X_train, y_train)
    y_pred = DT.predict(X_test)
    dict1=evaluation(y_test, y_pred)
    RF = RandomForestClassifier()
    RF.fit(X_train, y_train)
    y_pred = RF.predict(X_test)
    dict2=evaluation(y_test, y_pred)
    MLP=MLPClassifier()
    MLP.fit(X_train, y_train)
    y_pred = MLP.predict(X_test)
    dict3=evaluation(y_test, y_pred)
    #对比可视化
    comparePloter(dict1, dict2, dict3, save_path="evaluation.png")

这里分别计算了:准确率、精确率、召回率、F1值、汉明得分,zero_one_loss几种评估指标,结果如下:

{
	"DT": {
		"accuracy": 0.31007751937984509,
		"precision": 0.43023255813953489,
		"recall": 0.43023255813953489,
		"f1": 0.43023255813953489,
		"hamming": 0.31007751937984498,
		"01loss": 0.9302325581395349
	},
	"RF": {
		"accuracy": 0.9302325581395349,
		"precision": 0.9534883720930233,
		"recall": 0.9302325581395349,
		"f1": 0.937984496124031,
		"hamming": 0.9302325581395349,
		"01loss": 0.09302325581395354
	},
	"MLP": {
		"accuracy": 0.6395348837209303,
		"precision": 0.9767441860465116,
		"recall": 0.6395348837209303,
		"f1": 0.7519379844961244,
		"hamming": 0.6395348837209303,
		"01loss": 0.6976744186046512
	}
}

为了更加直观地呈现不同模型的效果,这里对其进行了可视化,如下所示:

 可以看到:随机森林模型相对效果还是很不错的。

为了能够实际测试使用,这里编写了对应的推理模块,核心实现如下:

def singlePredict(image_path="test.png"):
    """
    模型预测
    """
    one_img = cv2.imread(image_path)
    gray = cv2.cvtColor(one_img, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)
    x, y, w, h = faces[0]
    f = cv2.resize(gray[y : (y + h), x : (x + w)], (200, 200))
    cv2.imwrite("temp.jpg", f)
    hog_vec = HOGVEC(pic="temp.jpg")
    lbp_vec = LBPVEC(pic="temp.jpg")
    # 模型
    dt_result = dtModel.predict([lbp_vec]).tolist()[0]
    print("dt_result: ", dt_result)
    os.remove("temp.jpg")
    # 结果解码
    pred_list = []
    for i in range(len(dt_result)):
        if i - int(dt_result[i]) == i:
            pass
        else:
            pred_list.append(labels[i])
    print("pred_list: ", pred_list)
    print("EmotionRecognitionResult: ", map_dict[pred_list[0]])
    print("FaceRecognitionResult: ", pred_list[1])
    

这里跟上文一样同样开发了对应的界面模块如下:

 上传所需要测试计算的图像如下所示:

 点击识别计算,如下所示:

 这里将前面开发的DT、RF和MLP三种模型都给集成进来了。可以看到:随机选取的一张图片三种模型的测试结果都是一致的。

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

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

相关文章

关于GC原理和性能调优实践,看这一篇就够了

前言 本文介绍 GC 基础原理和理论,GC 调优方法思路和方法,基于 Hotspot jdk1.8,学习之后你将了解如何对生产系统出现的 GC 问题进行排查解决。 正文 本文的内容主要如下: GC 基础原理,涉及调优目标,GC 事…

Redis原理篇—数据结构

Redis原理篇—数据结构 笔记整理自 b站_黑马程序员Redis入门到实战教程 底层数据结构 动态字符串SDS 我们都知道 Redis 中保存的 Key 是字符串,value 往往是字符串或者字符串的集合。可见字符串是 Redis 中最常用的一种数据结构。 不过 Redis 没有直接使用C语言中…

Python圣诞树

目录 一、前言 二、创意名 三、效果展示 四、实现步骤 五、编码实现 一、前言 一年一度的圣诞节又要来喽~在这么浪漫的节日里怎么能少的了一个浪漫的程序员呢~让我们一起画个圣诞树,送给你喜欢的那个人吧~ 二、创意名 Python浪漫圣诞树,具体源码见&…

嘿ChatGPT,来帮我写代码

最近 ChatGPT 发行了,这是由 OpenAI 开发的AI聊天机器人,专门研究对话。它的目标是使AI系统更自然地与之互动,但是在编写代码时也可以为您提供帮助。您可以让 ChatGPT 做你的编程助理,甚至更多!在过去的几天里&#xf…

腾讯云轻量应用服务器使用 SRS 应用镜像搭建个人直播间、视频转播、本地录制!

SRS 是一个开源的流媒体集群,主要应用在直播和 WebRTC,支持 RTMP、WebRTC、HLS、HTTP-FLV 和 SRT 等常用协议。 轻量应用服务器提供了 SRS 应用镜像,使您无需再关注繁杂的部署操作,即可通过该镜像在轻量应用服务器上一键搭建个人…

安卓/华为手机恢复出厂设置后如何恢复照片

绝大多数安卓用户都会经历过手机恢复出厂设置,部分用户可能没有意识到手机恢复出厂设置可能会导致数据丢失。但是,当您在 云盘上进行备份或在设备上进行本地备份时,情况就会有所不同,并且当您将 安卓手机恢复出厂设置时&#xff0…

LeetCode HOT 100 —— 581. 最短无序连续子数组

题目 给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。 请你找出符合题意的 最短 子数组,并输出它的长度。 思路 方法一:双指针 排序 最终目的是让…

大气湍流自适应光学校正算法matlab仿真,包括涡旋光束,大气湍流影响,不同轨道角动量OAM态之间的串扰,校正等

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 涡旋光束是一种具有螺旋波前的光束,在涡旋光束中,决定涡旋光束特性的角量子数可以是任意一个自然数,其不同设置所产生的涡旋光束之间存在正交关系。目前&#…

Android NDK 中堆栈日志 add2line 的分析实践

文章目录目的常用的辅助工具分析步骤参考目的 Android NDK 中出现的 crash 日志分析定位,使用 addr2line 对库中定位so 动态库崩溃位置,定位到某个函数的具体的代码行。 常用的辅助工具 add2line,objdump,ndkstack 等等。本文主要…

一文深度揭开Redis的磁盘持久化机制

前言 Redis 是内存数据库,数据都是存储在内存中,为了避免进程退出导致数据的永久丢失,需要定期将 Redis 中的数据以数据或命令的形式从内存保存到本地磁盘。当下次 Redis 重启时,利用持久化文件进行数据恢复。Redis 提供了 RDB 和…

在linux上安装并初始化配置MariaDB支持远程登录

在linux上安装并初始化配置MariaDB支持远程登录一、环境准备二、启动MariaDB三、初始化MariaDB四、配置远程访问五、补充一些额外的MySql用户赋权限的语句一、环境准备 本文环境是Redhat7上自带的MariaDB, 在安装redhat系统时已经自动安装好了,如果需要自行安装的话…

Selenium 常用函数总结

Seleninum作为自动化测试的工具,自然是提供了很多自动化操作的函数, 下面列举下个人觉得比较常用的函数,更多可见官方文档: 官方API文档: http://seleniumhq.github.io/selenium/docs/api/py/api.html 1) 定位元素 f…

【源码共读】axios的46个工具函数

所有工具函数 还是老样子,先看看axios的工具函数有哪些,先心里有个印象,然后再逐个分析。 直接拉到最下面,可以看到axios的工具函数都是统一导出的: export default {isArray, // 判断是否是数组isArrayBuffer, // …

[机缘参悟-95] :不同人生和社会问题的本质

事情的本质是物极必反(轮回、周期) 社会的本质是优胜劣汰(迭代、发展) 道德的本质是伦理秩序(未定、秩序) 战争的本质是资源占用(弱肉、强食) 商业的本质是价值交换 金钱的本质…

同事这样用Redis,把我害惨了

首先说下问题现象:内网sandbox环境API持续1周出现应用卡死,所有api无响应现象 刚开始当测试抱怨环境响应慢的时候 ,我们重启一下应用,应用恢复正常,于是没做处理。但是后来问题出现频率越来越频繁,越来越多…

MySQL实现主从复制(Windows)的明细操作步骤

文章目录一、教学视频地址二、设计思路三、具体步骤一、教学视频地址 视频地址:视频链接 二、设计思路 准备两个5.7版本的MySQL,一个用作主数据库,另一个用作从数据库。 把主数据库做为写入数据库,从数据库作为读数据库。 三…

【云原生 Kubernetes】基于 KubeAdmin 搭建k8s集群

一、前言 在上一篇,我们基于minikube搭建了一个单节点的k8s集群,作为学习和练习使用的话问题不大,但如果想深入学习和了解k8s的相关技术体系,还是需要搭建真正的集群才能更接近生产环境的应用,本篇将基于KubeAdmin&…

深度学习炼丹-数据预处理和增强

前言一,Normalization 概述 1.1,Normalization 定义1.2,什么情况需要 Normalization1.3,Data Normalization 方法1.4,示例代码 二,normalize images 2.1,图像 normalization 定义2.2&#xff0c…

Spring-Cloud-Gateway-07

前言 1、什么是网关 网关是微服务最边缘的服务,直接暴露给用户,用来做用户和微服务的桥梁 没有网关:客户端直接访问我们的微服务,会需要在客户端配置很多的ip:port,如果user-service并发比较大&#xff0c…

深度学习YoloV3案例

目录1 数据获取2 TFrecord文件2.1 什么是TFrecord文件2.2 将数据转换为TFRecord文件2.3 读取TFRecord文件2.4 数据处理3 模型构建4 模型训练4.1 损失函数的计算4.2 正负样本的设定4.3 模型训练4.3.1 获取数据集4.3.2 加载模型4.3.3 模型训练5 模型预测6 总结1 数据获取 根据要…