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

news2024/11/24 11:03:49

在我之前的文章中写过很多关于人脸识别和表情识别的文章,今天有一个项目的需求就是需要做两种或者是多种任务,我在开发完对应的模型之后就突然想到了之前做过的人脸识别和表情识别的项目,就想着是否可以基于机器学习/深度学习等方式来同时实现人脸识别和表情识别呢?

答案是可以的,基于深度学习的实现可以直接套用我项目上面开发的模型就可以实现了,但是基于机器学习的方式来实现我倒还没有想到特别好的办法,所以本文实现的方法还是先基于HOG和LBP分别完成对应图像特征的抽取存储,之后分别构建训练了人脸识别模型和表情识别两个模型,之后在推理阶段将对应的逻辑集成到一起,出来的效果的确是输入单张图像,能够同时识别出来是谁以及表情是什么?但是终归是两个独立的模型,目前已经有了初步的想法,后面有时间的话继续按照深度学习模型的实现方式来构建机器学习的多任务模型。

先来看下效果:

 这里使用的是开源的数据集,如下:

【人脸识别数据集】

【表情识别数据集】 

 HOG单样本特征提取实现如下:

def singleImg2Vector(pic="16515631261.jpg"):
    """
    单张图像向量化
    """
    img = io.imread(pic)
    img = color.rgb2gray(img)
    x = filters.sobel_h(img)
    y = filters.sobel_v(img)
    print("img_shape: ", img.shape)
    hog_descriptor = HOG(img, block_size=3)
    hog_vector = hog_descriptor.hog_features()
    print("hog_vector_shape: ", hog_vector.shape)
    return hog_vector.tolist()

LBP单样本特征提取如下:

def singleImg2Vector(pic="16515631261.jpg"):
    """
    单张图像向量化
    """
    img = io.imread(pic)
    img = color.rgb2gray(img)
    print("img_shape: ", img.shape)
    lbp = LBP(img)
    features = lbp.extend_lbp(3, 8)
    vector = lbp.get_lbp_vector(features, 8)
    print("vector_shape: ", vector.shape)
    return vector.tolist()

在实际使用过程中发现:LBP特征提取器的时耗很大,而HOG特征提取器的时耗较小,速度差异还是很明显的,HOG和LBP的对应实现可以直接百度开源实现,这里我就不再赘述了,因为这里我只是调用的封装好的模块的方法。

之后会分别完成对应人脸特征和表情特征的提取存储,如下所示:

 得到的特征文件之后就可以来构建自己的机器学习模型了。

这里做了很多种经典的机器学习模型,诸如:决策树、XGBOOST、GBDT、随机森林、支持向量机、逻辑回归等等,时间限制,这里就不再一一展开介绍了,这里主要以SVM模型的搭建实践为例来进行简单介绍,其他的模型pipeline是一模一样的,没有什么本质的区别。

X_train, X_test, y_train, y_test = split_data(x_list, y_list, ratio=rationum)
try:
    model = loadModel(model_path=model_path)
except:
    model = SVC(
        kernel="linear",
        C=10,
        gamma="auto",
        degree=5,
        tol=0.1,
        decision_function_shape="ovo",
    )
    model.fit(X_train, y_train)
y_predict = model.predict(X_test)
y_pred = y_predict.tolist()
accuracy = model.score(X_test, y_test)
print("SVM model accuracy: ", accuracy)
Precision, Recall, F1 = calThree(y_test, y_pred)
saveModel(model, save_path=model_path)
result = {}
result["accuracy"], result["F_value"] = accuracy, F1
result["precision"], result["recall"] = Precision, Recall

这里分别计算了:accuracy、precision、recall和F1值四种专门用于衡量分类任务模型性能好坏的指标,如下:

【人脸识别指标评估结果】

{
	"lbp": {
		"accuracy": 1.0,
		"F_value": 1.0,
		"precision": 1.0,
		"recall": 1.0
	},
	"hog": {
		"accuracy": 0.984375,
		"F_value": 0.9856410256410257,
		"precision": 0.9857142857142858,
		"recall": 0.9875
	}
}

【表情识别指标评估结果】

{
	"lbp": {
		"accuracy": 0.8153846153846154,
		"F_value": 0.8113511202756054,
		"precision": 0.8309523809523809,
		"recall": 0.8218923933209649
	},
	"hog": {
		"accuracy": 0.7692307692307693,
		"F_value": 0.7667969899283477,
		"precision": 0.766192537621109,
		"recall": 0.780045351473923
	}
}

为了更加直观简洁地呈现结果对比分析,这里对其进行了可视化,如下:

 从对比直方图可以直观地看出来:在两个分类任务上面,LBP效果都比HOG要好,这也印证了LBP方法的特征表达能力更为强悍一些,不过唯一的缺点就是时耗太高了点。

接下来为了更加细粒度地进行对比拆分,我专门划分计算了每个单独类别下面的四种评估指标,这里主要是对测试集进行归类处理一下即可,我就不再赘述了,直接看最终的结果,我将两种特征提取方法得到的评估结果放在了一起方便进行对比分析,如下:

【表情识别】

{
	"HOG": {
		"neutral": {
			"accuracy": 1.0,
			"F_value": 1.0,
			"precision": 1.0,
			"recall": 1.0
		},
		"fear": {
			"accuracy": 0.5454545454545454,
			"F_value": 0.2352941176470588,
			"precision": 0.3333333333333333,
			"recall": 0.1818181818181818
		},
		"happiness": {
			"accuracy": 0.8181818181818182,
			"F_value": 0.3,
			"precision": 0.3333333333333333,
			"recall": 0.27272727272727279
		},
		"anger": {
			"accuracy": 1.0,
			"F_value": 1.0,
			"precision": 1.0,
			"recall": 1.0
		},
		"sadness": {
			"accuracy": 0.6363636363636364,
			"F_value": 0.25925925925925927,
			"precision": 0.3333333333333333,
			"recall": 0.21212121212121214
		},
		"surprise": {
			"accuracy": 0.8888888888888888,
			"F_value": 0.47058823529411766,
			"precision": 0.5,
			"recall": 0.4444444444444444
		},
		"disgust": {
			"accuracy": 0.5714285714285714,
			"F_value": 0.24242424242424244,
			"precision": 0.3333333333333333,
			"recall": 0.19047619047619047
		}
	},
	"LBP": {
		"neutral": {
			"accuracy": 1.0,
			"F_value": 1.0,
			"precision": 1.0,
			"recall": 1.0
		},
		"fear": {
			"accuracy": 0.7272727272727273,
			"F_value": 0.28070175438596497,
			"precision": 0.3333333333333333,
			"recall": 0.24242424242424244
		},
		"happiness": {
			"accuracy": 0.7272727272727273,
			"F_value": 0.28070175438596497,
			"precision": 0.3333333333333333,
			"recall": 0.24242424242424244
		},
		"anger": {
			"accuracy": 1.0,
			"F_value": 1.0,
			"precision": 1.0,
			"recall": 1.0
		},
		"sadness": {
			"accuracy": 0.7272727272727273,
			"F_value": 0.4210526315789474,
			"precision": 0.5,
			"recall": 0.36363636363636367
		},
		"surprise": {
			"accuracy": 1.0,
			"F_value": 1.0,
			"precision": 1.0,
			"recall": 1.0
		},
		"disgust": {
			"accuracy": 0.5714285714285714,
			"F_value": 0.24242424242424244,
			"precision": 0.3333333333333333,
			"recall": 0.19047619047619047
		}
	}
}

结果对比直方图如下所示:

 【人脸识别】

{
	"HOG": {
		"KL": {
			"accuracy": 1.0,
			"F_value": 1.0,
			"precision": 1.0,
			"recall": 1.0
		},
		"TM": {
			"accuracy": 1.0,
			"F_value": 1.0,
			"precision": 1.0,
			"recall": 1.0
		},
		"KM": {
			"accuracy": 1.0,
			"F_value": 1.0,
			"precision": 1.0,
			"recall": 1.0
		},
		"MK": {
			"accuracy": 1.0,
			"F_value": 1.0,
			"precision": 1.0,
			"recall": 1.0
		},
		"KR": {
			"accuracy": 1.0,
			"F_value": 1.0,
			"precision": 1.0,
			"recall": 1.0
		},
		"YM": {
			"accuracy": 1.0,
			"F_value": 1.0,
			"precision": 1.0,
			"recall": 1.0
		},
		"NA": {
			"accuracy": 0.875,
			"F_value": 0.4666666666666667,
			"precision": 0.5,
			"recall": 0.4375
		},
		"KA": {
			"accuracy": 1.0,
			"F_value": 1.0,
			"precision": 1.0,
			"recall": 1.0
		},
		"UY": {
			"accuracy": 1.0,
			"F_value": 1.0,
			"precision": 1.0,
			"recall": 1.0
		},
		"NM": {
			"accuracy": 1.0,
			"F_value": 1.0,
			"precision": 1.0,
			"recall": 1.0
		}
	},
	"LBP": {
		"KL": {
			"accuracy": 1.0,
			"F_value": 1.0,
			"precision": 1.0,
			"recall": 1.0
		},
		"TM": {
			"accuracy": 1.0,
			"F_value": 1.0,
			"precision": 1.0,
			"recall": 1.0
		},
		"KM": {
			"accuracy": 1.0,
			"F_value": 1.0,
			"precision": 1.0,
			"recall": 1.0
		},
		"MK": {
			"accuracy": 1.0,
			"F_value": 1.0,
			"precision": 1.0,
			"recall": 1.0
		},
		"KR": {
			"accuracy": 1.0,
			"F_value": 1.0,
			"precision": 1.0,
			"recall": 1.0
		},
		"YM": {
			"accuracy": 1.0,
			"F_value": 1.0,
			"precision": 1.0,
			"recall": 1.0
		},
		"NA": {
			"accuracy": 1.0,
			"F_value": 1.0,
			"precision": 1.0,
			"recall": 1.0
		},
		"KA": {
			"accuracy": 1.0,
			"F_value": 1.0,
			"precision": 1.0,
			"recall": 1.0
		},
		"UY": {
			"accuracy": 1.0,
			"F_value": 1.0,
			"precision": 1.0,
			"recall": 1.0
		},
		"NM": {
			"accuracy": 1.0,
			"F_value": 1.0,
			"precision": 1.0,
			"recall": 1.0
		}
	}
}

结果对比直方图如下:

两种任务对比来看:两种方法在人脸识别任务上的效果都很不错,在表情识别任务上的效果就稍有逊色了;另外LBP的整体表现和细粒度表现都是要优于HOG的,这个对于后续项目的特征提取器的选择来说可以是一种直接的参考。 

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

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

相关文章

算法训练第五十七天 | LeetCode 647、516动态规划结尾

LeetCode 647回文子串 题目简析: 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。 思路分析: 本题的难点 主要…

【Aptos与Sui智能合约】(Move长话短说) #03 - 智能合约编写与发布

前言:本篇学习如何在Aptos上发布两个自定义的智能合约 0x1 前置条件 安装好Aptos工具,MacOS、Ubuntu、Windows系统的预编译的安装包下载地址 https://github.com/aptos-labs/aptos-core/releases?q=cli&expanded=true 想自己从源码开始编译,你就下载Source Code 安装…

千万不要把Request传递到异步线程里面,有坑

前几天在网上冲浪的时候看到一篇技术文章,讲的是他把一个 request 请求传递到了线程池里面,然后遇到了一个匪夷所思的情况。 他写了这篇文章,把自己针对这个问题的探索过程分享了出来: 《springboot 中如何正确的在异步线程中使用…

艾美捷脂质过氧化检测试剂盒参数说明和文献参考

脂质过氧化的定量对于评估氧化损伤在病理生理学疾病中的作用至关重要。脂质过氧化导致饱和和不饱和脂质的高反应性和不稳定的氢过氧化物的形成。 艾美捷脂质过氧化检测试剂盒直接利用与亚铁离子的氧化还原反应测量过氧化氢,将脂质过氧化氢提取到氯仿中,提…

【python绘制地图——folium的方法和类的介绍(思维导图)】

Python使用folium制作地图并生成png图片 第一章 folium的方法和类的介绍(思维导图) 第二章 使用folium制作地图 第三章 folium实用功能进阶 第三章 使用Html2Image生成png图片 第四章 使用reportlab制作pdf报告 文章目录Python使用folium制作地图并生成…

轮廓图编程-自定义QChartView

目录 一、功能需求 二、实现效果 三、实现方法 一、功能需求 3D测量软件中,需要在轮廓上进行二次编程,需要显示轮廓线,然后可以调节矩形框的范围的获取参数,如华汉的HyperShape3D软件,对轮廓的编程界面如下。 二、实…

【Java基础知识复盘】String、StringBuffer、StringBuilder篇——持续更新中

本人知识复盘系列的博客并非全部原创,大部分摘自网络,只是为了记录在自己的博客方便查阅,往后也会陆续在本篇博客更新本人查阅到的新的知识点,望悉知! String类 在 Java 中字符串属于对象,Java 提供了 Str…

《融合视觉显著性和局部熵的红外弱小目标检测》论文复现

1.复现论文概要 复现的论文为《融合视觉显著性和局部熵的红外弱小目标检测》(赵鹏鹏,李庶中等,中国光学2022,http://www.chineseoptics.net.cn/cn/article/doi/10.37188/CO.2021-0170,以下简称论文)。论文…

【库存控制】基于象鼻虫损害优化算法求解库存控制问题(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

交换机的结构特点及主要功能

什么是交换机? Switch 意为“交换机”,是一种用于转发电 ( 光 ) 信号的网络设备。它可以为访问交换机的任意两个网络节点提供专用的电信号路径。非常常见的 是以太网交换机。其他常见的有电话语音交换机、光纤交换机等。 它的工作原理是什么&#xff1f…

美国藤校Top30大学对IB成绩的要求

众所周知,IB体系是目前全球认可度比较高的国际课程。那么,用IBDP成绩申请美国TOP30大学需要什么样的成绩? 小智今天来带大家好好研究下美国TOP30大学对IB成绩的要求。普林斯顿大学 Princeton University 普林斯顿大学对于IB成绩没有具体要求&…

nginx架构解析:朴实中见真知

目录前言为什么高并发很重要Apache可以做到吗使用nginx会更有优势吗?nginx架构概览代码结构Workers模型nginx进程规则nginx缓存概览nginx配置nginx内部典型的HTTP请求处理循环课程总结前言 nginx(发音“engine x”)是俄国的软件工程师Igor S…

Godzilla(哥斯拉)安装与使用

Godzilla安装与使用1.Godzilla介绍2.Godzliia下载与安装2.1.Godzilla下载2.2.运行环境2.3.Godzilla安装2.3.1.执行文件2.3.2.安装完成3.Godzliia3.1.Godzliia使用3.1.1.生成木马3.1.2.存储木马3.1.3.放入木马3.1.4.访问木马3.1.5.连接木马3.1.6.测试连接3.1.7.连接进入3.2.Godz…

麒麟水乡,IU酒店进驻云南旅游咽喉之地曲靖

曲靖位于云南省东北部,是云南连接内地的重要陆路通道,素有“滇黔锁钥”、“入滇门户”、“云南咽喉”之称,是仅次于昆明的云南第二大城市。曾入选“中国十佳宜居城市”榜单10次的城市,拥有3000多年的文明史,早在三国魏…

Python解题 - CSDN周赛第17期 - 拯救公主

本期又出现了题目测试数据的问题,而且题目和算法关系也不太大,基本就属于用代码代替手工解答算术题的感觉。不禁让人怀疑官方题库是否已经没有高质量的题了,同时也怀疑长期满分却又不更新博客拿奖品的某位选手是不是托。。。 第一题&#xff…

VS系列多通道振弦传感器无线采发仪与参数配置工具连接

VS101~VS432 设备配备了专门的参数配置工具 SETP 来完成设备工作参数的查看和修改工作。 连接前的准备工作 (1)数据接口与计算机连接 使用标配的通讯线与计算机 RS232 接口连接。若需基于手机网络发送数据,请在开机前安装 SIM 卡。 若…

D. Lucky Chains(GCD+素数筛)

input: 4 5 15 13 37 8 9 10009 20000output: 0 1 -1 79题目大意: 如果一个数对(x,y)是幸运的,当且仅当gcd(x,y)1,一条链可以由以下规律的数对组成,(x,y),(x1,y1),(x2,y2)……(xk,yk),如果说一条链是幸运的,当且仅当…

非零基础自学Golang 第16章 正则表达式 16.3 regexp包 16.4 小结 16.5 知识拓展

非零基础自学Golang 文章目录非零基础自学Golang第16章 正则表达式16.3 regexp包16.3.1 MatchString函数16.3.2 FindStringIndex函数16.3.3 ReplaceAllString函数16.4 小结16.5 知识拓展16.5.1 常用正则表达式参考第16章 正则表达式 16.3 regexp包 Go在处理正则表达式时主要使…

拆箱phper最适合入门的go框架beego

beego beego 是一个快速开发 Go 应用的 HTTP 框架,他可以用来快速开发 API、Web 及后端服务等各种应用,是一个 RESTful 的框架,主要设计灵感来源于 tornado、sinatra 和 flask 这三个框架,但是结合了 Go 本身的一些特性&#xff…

路由信息协议RIP(计算机网络)

目录 路由选择协议 路由信息协议 RIP中的距离 RIP协议的具体算法 RIP协议路由表的更新 例题 距离向量算法 RIP 协议的要点 路由选择协议 路由器之间要互相不断交换网络拓扑和状态信息,根据信息求出到所有目的网络的最佳路由 用于交换路由信息,进…