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

肤色检测

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

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

时间: 2024-10-19 23:32:44

自己做的一个肤色检测模型的相关文章

SSE图像算法优化系列十:简单的一个肤色检测算法的SSE优化。

在很多场合需要高效率的肤色检测代码,本人常用的一个C++版本的代码如下所示: void IM_GetRoughSkinRegion(unsigned char *Src, unsigned char *Skin, int Width, int Height, int Stride) { for (int Y = 0; Y < Height; Y++) { unsigned char *LinePS = Src + Y * Stride; // 源图的第Y行像素的首地址 unsigned char

谷歌做了45万次不同类型的文本分类后,总结出一个通用的“模型选择算法”...

谷歌做了45万次不同类型的文本分类后,总结出一个通用的"模型选择算法"... 2018年07月25日 17:43:55 阅读数:6 新智元报道 来源:developers.google.com 编译:肖琴.大明 [导读]谷歌官方推出"文本分类"指南教程.为了最大限度地简化选择文本分类模型的过程,谷歌在进行大约450K的文本分类实验后,总结出一个通用的"模型选择算法",并附上一个完整的流程图,非常实用. 文本分类(Text classificati

肤色空间模型

肤色被证明是一种有效的且鲁棒的人脸检测.定位.跟踪依据.同时皮肤颜色检测也能应用在图像内容过滤.内容感知视频压缩.图像色彩平衡应用等方面. 基于特征的人脸检测方法是用皮肤颜色作为检测依据已经非常实用化.颜色处理允许快速处理且对人脸模式的几何变换非常鲁棒.经验表明人脸皮肤具有特征颜色(很容易被人辨识).使用颜色作为人脸的特征,需要克服三个主要问题:1.选择哪种颜色空间:2.皮肤颜色分布如何模型化;3.如何对人脸颜色分割结果进行处理 - 1.颜色空间介绍: 1.1.RGB空间: RGB空间源于显像管

如果你建造了一个精良的模型却没人用,你肯定不会得到赞誉(转)

注:本文编译自 How to do Data Science ,作者 Brandon Rohrer 为微软高级数据科学家. <哈佛商业评论>曾宣称“数据科学家”是二十一世纪最性感的职业.所谓性感,既代表着难以名状的诱惑,又说明了大家对它又不甚了解. 如何做好数据科学呢? 微软高级数据科学家 Brandon Rohrer 概括了做数据科学的七大步骤,手把手教你做数据科学. 1. 获取更多的数据 数据科学的原材料是数字和名称的集合,测量.价格.日期.时间.产品.标题.行动等,数据科学无所不包.你也

如何开发一个异常检测系统:如何评价一个异常检测算法

利用数值来评价一个异常检测算法的重要性 使用实数评价法很重要,当你用某个算法来开发一个具体的机器学习应用时,你常常需要做出很多决定,如选择什么样的特征等等,如果你能找到如何来评价算法,直接返回一个实数来告诉你算法的好坏,那样你做决定就会更容易一些.如现在有一个特征,要不要将这个特征考虑进来?如果你带上这个特征运行你的算法,再去掉这个特征运行你的算法,得到返回的实数,这个实数直接告诉你加上这个特征算法是变好了还是变坏了,这样你就有一种更简单的算法来确定是否要加上这个特征. 为了更快地开发出一个异常

用DPM(Deformable Part Model,voc-release3.1)算法在INRIA数据集上训练自己的人体检测模型

我的环境 DPM源码版本:voc-release3.1 VOC开发包版本:VOC2007_devkit_08-Jun Matlab版本:MatlabR2012b c++编译器:VS2010 系统:Win7 32位 learn.exe迭代次数:5万次 数据集:INRIA 人体数据集,等 步骤一,首先要使voc-release3.1目标检测部分的代码在windows系统下跑起来: 在Windows下运行Felzenszwalb的Deformable Part Models(voc-release4.

用DPM(Deformable Part Model,voc-release4.01)算法在INRIA数据集上训练自己的人体检测模型

步骤一,首先要使voc-release4.01目标检测部分的代码在windows系统下跑起来: 参考在window下运行DPM(deformable part models) -(检测demo部分) 步骤二,把训练部分代码跑通,在VOC数据集上进行测试,如下文: 在windows下运行Felzenszwalb的Deformable Part Model(DPM)源码voc-release3.1来训练自己的模型 但是其中的learn.cpp代码有误,其中319行check(argc == 8)通不

y combinator 做的一个调查_可以学习一下

RoR: 在网络营运平台企业中,RoR站稳使用率第一的位置.其用户包括:ZenPayroll (人力资源).Asile50 (零售平台).BackerKit (众筹平台).Rainforest (QA测试)等. Ruby on Rails是一种结合Ruby语言与Rails平台的一种网页编程语言,Ruby语言以自然.简洁.快速著称,全面支持面向对象程序设计,而Rails则是Ruby广泛应用方式之一,在Rails平台上设计出一套独特的MVC开发架构,采取模型(Model).外观(View).控制器(

平均精度均值(mAP)——目标检测模型性能统计量

在机器学习领域,对于大多数常见问题,通常会有多个模型可供选择.当然,每个模型会有自己的特性,并会受到不同因素的影响而表现不同. 每个模型的好坏是通过评价它在某个数据集上的性能来判断的,这个数据集通常被叫做“验证/测试”数据集.这个性能由不同的统计量来度量,包括准确率( accuracy ).精确率( precision ).召回率( recall )等等.选择我们会根据某个特定的应用场景来选择相应的统计量.而对每个应用来说,找到一个可以客观地比较模型好坏的度量标准至关重要. 在本文,我们将会讨论