文档章节

自己做的一个肤色检测模型

jxt1234
 jxt1234
发布于 2015/10/15 18:06
字数 677
阅读 667
收藏 5

肤色检测

在人像美化中,肤色检测有助于防止磨掉头发、胡子等需要保持细节的部分,也可以使美白算法仅作用于皮肤,不对人像周边环境产生影响。
网上找了一下肤色检测模型,效果都太差,换了一种思维,找个训练集,自己做一个。
训练结果,正确率大概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);
}

肤色检测结果

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

训练方法

准备数据集

找到这个网站:
http://blog.csdn.net/wangkr111/article/details/44514097
下载了一组肤色检测的数据,用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 <fstream>
#include <iostream>
#include <sstream>
#include <math.h>
#include "learn/ALRegressor.h"
using namespace std;
int main()
{
    ALSp<ALFloatDataChain> c = ALStandardLoader::load("../../Data/Face_Dataset/train.data");
    ALSp<ALFloatMatrix> X;
    ALSp<ALFloatMatrix> Y;
    ALStandardLoader::divide(c.get(), X, Y, 0);
    //ALSp<ALISuperviseLearner> learner = new ALLogicalRegress(10000, 1.0);
    ALSp<ALISuperviseLearner> learner = new ALDecisionTree(10, 0.01, 3);//决策树深限制为3
    //ALSp<ALISuperviseLearner> learner = new ALRegressor;
    ALSp<ALIMatrixPredictor> detected = learner->vLearn(X.get(),Y.get());
    ALSp<ALFloatMatrix> 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<YP->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上根本没法运行啊。。。

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

© 著作权归作者所有

jxt1234
粉丝 5
博文 36
码字总数 41634
作品 0
杭州
私信 提问
人脸识别系列之人脸检测--训练基于肤色特征的检测

前言: 基于特征的方法是利用人脸的先验知识导出的规则进行人脸检测。 一般来说,常用的特征包括人脸和人脸器官典型的边缘和形状特征(如人脸轮廓、虹膜轮廓、嘴唇轮廓等)、纹理特征(纹理是...

ittazp
2018/08/16
0
0
广州颜鉴信息科技--即将亮相移动美妆开发包

1引言 古人曰,女为悦己者容。在化妆技术日益成熟的今天,化妆的目的已经不仅于此,社会的文明程度越高,化妆就越显示出其必要性。化妆是人们为了适应实用,场合、环境、 礼仪和特定的情景需...

colorreco
2016/09/29
0
0
拍个自拍,让Python告诉你,军训过后你黑了几度?

     大数据文摘出品   作者:曹培信、宁静   一年一度的大学开学季,一年一度的军训季。   在六月中旬高考结束之后,万千学子迎来了他们人生中最长也是最无忧无虑的假期,到了八月...

大数据文摘
09/23
0
0
[图]调查:黑人比白人更容易和自动驾驶汽车发生事故

固然存在诸多优势,但是自动驾驶技术也引发了很多担忧。除了担心他们的安全级别,如何处理复杂的城市交通环境,在发生交通事故后划分责任,是否会让现有的交通变得更糟糕等等之外,我们还需要...

稿源:
03/07
0
0
Win8 Metro(C#)数字图像处理--2.35图像肤色检测算法

原文:Win8 Metro(C#)数字图像处理--2.35图像肤色检测算法  [函数名称] 肤色检测函数SkinDetectProcess(WriteableBitmap src) [算法说明] 这个算法是一篇学术论文算法的实现,论文名字为“...

杰克.陈
2018/03/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
11分钟前
1
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
3
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
12
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
13
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部