博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自己做的一个肤色检测模型
阅读量:6688 次
发布时间:2019-06-25

本文共 2520 字,大约阅读时间需要 8 分钟。

hot3.png

肤色检测

在人像美化中,肤色检测有助于防止磨掉头发、胡子等需要保持细节的部分,也可以使美白算法仅作用于皮肤,不对人像周边环境产生影响。

网上找了一下肤色检测模型,效果都太差,换了一种思维,找个训练集,自己做一个。
训练结果,正确率大概85%,运行起来,确实还是比网上找的公式好,勉强可用了。

模型

算法最终反映为 opengl 的一个片断着色器,直接看shader代码吧。

varying vec2 textureCoordinate;uniform sampler2D inputImageTexture;const vec3 CbC = vec3(0.5,-0.4187,-0.0813);const vec3 CrC = vec3(-0.1687,-0.3313,0.5);void main(){    vec3 color = texture2D(inputImageTexture, textureCoordinate).rgb;    float x0 = color.r;    float x1 = color.g;    float x2 = color.b;    float x3 = dot(CbC, color);    float x4 = dot(CrC, color);    float pos = 0.0;    pos = float(x4 <=-0.0615369 ? (x3 <=0.0678488 ? (x3 <=0.0352417 ? 0 : (x2 <=0.686631 ? 0 : 1)) : (x3 <=0.185183 ? 1 : 0)) : (x4 <=-0.029597 ? (x3 <=0.0434402 ? 0 : (x1 <=0.168271 ? 0 : 1)) : 0));    gl_FragColor = vec4(pos);}

肤色检测结果

这里写图片描述

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

训练方法

准备数据集

找到这个网站:

下载了一组肤色检测的数据,用python脚本将其转换为机器学习所需的矩阵数据。提取 r、g、b、y、cb、cr分量值。

训练

机器学习库

机器学习算法库是自己造的轮子,使用C++开发,特别重视Cache命中率,部分地方引入OpenCL加速,性能可以说是一流的。

使用的代码如下:

#include "learn/ALLearnFactory.h"#include "core/ALExpanderFactory.h"#include "core/ALILabeldMethod.h"#include "core/ALLabeldMethodFactory.h"#include "learn/ALDecisionTree.h"#include "loader/ALStandardLoader.h"#include "learn/ALLogicalRegress.h"#include 
#include
#include
#include
#include "learn/ALRegressor.h"using namespace std;int main(){ ALSp
c = ALStandardLoader::load("../../Data/Face_Dataset/train.data"); ALSp
X; ALSp
Y; ALStandardLoader::divide(c.get(), X, Y, 0); //ALSp
learner = new ALLogicalRegress(10000, 1.0); ALSp
learner = new ALDecisionTree(10, 0.01, 3);//决策树深限制为3 //ALSp
learner = new ALRegressor; ALSp
detected = learner->vLearn(X.get(),Y.get()); ALSp
YP = ALFloatMatrix::create(Y->width(), Y->height()); detected->vPredict(X.get(), YP.get()); size_t po = 0; size_t pp = 0; size_t fo = 0; size_t fp = 0; /*验证正确率*/ for (size_t i=0; i
height(); ++i) { auto y = *(Y->vGetAddr(0, i)); auto yp = *(YP->vGetAddr(0, i)); if (yp > 0.5 && y > 0.5) { pp++; } if (yp <=0.5 && y <=0.5) { fp++; } if (y > 0.5) { po++; } else { fo++; } } printf("PP/PO: %ld/%ld, %f, FP/FO: %ld/%ld, %f\n", pp, po, (double)pp/(double)po, fp, fo, (double)fp/(double)fo); ofstream of("model_logical"); /*打印模型*/ detected->vPrint(of); return 0;}

模型选择

一开始本来用的是逻辑回归,因为这个出来的预测公式很简单,shader上运行速度快,但它的效果实在不行。后面改用了决策树,限制树深,以免模型太大。

至于为什么不用SVM:SVM出来的模型在shader上根本没法运行啊。。。

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://my.oschina.net/jxt1234and2010/blog/517740

你可能感兴趣的文章
处理logs,进行分析web展示。
查看>>
8月第二周B2B类网站排名:金泉网跃升第四
查看>>
9月第3周游戏运营类网站/频道:91.com下降7位
查看>>
Memcached Multiget
查看>>
1月第二周.COM增7.1万 亚洲域名.ASIA净减2.4万
查看>>
Swift的学习Day03(操作符)
查看>>
3月第2周全球域名商TOP15:中国占据3个席位
查看>>
yii2.0 修改默认控制器
查看>>
解决apache无法启动:undefined symbol: apr_ldap_ssl_init
查看>>
Linux网络字节序
查看>>
myeclipse的字体背景色设置
查看>>
一次开发、多端分发,阿里巴巴发布AliOS车载小程序
查看>>
TalkingData的Spark On Kubernetes实践
查看>>
DB2的归档模式设置方法
查看>>
ubuntu下搭建wordpress博客系统
查看>>
人的差别在于业余时间
查看>>
网游通讯加密的方案设计
查看>>
2. 工厂模式
查看>>
【老孙随笔】永生
查看>>
感冒没状态
查看>>