0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

AI头发分割模块、头发换色、颜色增强与修正模块等技术原理

DPVg_AI_era 来源:未知 作者:李倩 2018-08-03 09:27 次阅读

如今,在类似天天P图、美图秀秀等手机APP中,给指定照片或视频中的人物更换头发颜色已经是再正常不过的事情了。那么本文便介绍了该功能背后如AI头发分割模块、头发换色、颜色增强与修正模块等技术原理(附代码)。

首先,为照片或视频中人物换发色的算法流程如下图所示:

AI头发分割模块

基于深度学习的目标分割算法已经比较成熟,比较常用的有FCN,SegNet,UNet,PspNet,DenseNet等等。这里我们使用Unet网络来进行头发分割,具体可以参考如下链接:点击打开链接Unet头发分割代码如下:

defget_unet_256(input_shape=(256,256,3),num_classes=1):inputs=Input(shape=input_shape)#256down0=Conv2D(32,(3,3),padding='same')(inputs)down0=BatchNormalization()(down0)down0=Activation('relu')(down0)down0=Conv2D(32,(3,3),padding='same')(down0)down0=BatchNormalization()(down0)down0=Activation('relu')(down0)down0_pool=MaxPooling2D((2,2),strides=(2,2))(down0)#128down1=Conv2D(64,(3,3),padding='same')(down0_pool)down1=BatchNormalization()(down1)down1=Activation('relu')(down1)down1=Conv2D(64,(3,3),padding='same')(down1)down1=BatchNormalization()(down1)down1=Activation('relu')(down1)down1_pool=MaxPooling2D((2,2),strides=(2,2))(down1)#64down2=Conv2D(128,(3,3),padding='same')(down1_pool)down2=BatchNormalization()(down2)down2=Activation('relu')(down2)down2=Conv2D(128,(3,3),padding='same')(down2)down2=BatchNormalization()(down2)down2=Activation('relu')(down2)down2_pool=MaxPooling2D((2,2),strides=(2,2))(down2)#32down3=Conv2D(256,(3,3),padding='same')(down2_pool)down3=BatchNormalization()(down3)down3=Activation('relu')(down3)down3=Conv2D(256,(3,3),padding='same')(down3)down3=BatchNormalization()(down3)down3=Activation('relu')(down3)down3_pool=MaxPooling2D((2,2),strides=(2,2))(down3)#16down4=Conv2D(512,(3,3),padding='same')(down3_pool)down4=BatchNormalization()(down4)down4=Activation('relu')(down4)down4=Conv2D(512,(3,3),padding='same')(down4)down4=BatchNormalization()(down4)down4=Activation('relu')(down4)down4_pool=MaxPooling2D((2,2),strides=(2,2))(down4)#8center=Conv2D(1024,(3,3),padding='same')(down4_pool)center=BatchNormalization()(center)center=Activation('relu')(center)center=Conv2D(1024,(3,3),padding='same')(center)center=BatchNormalization()(center)center=Activation('relu')(center)#centerup4=UpSamepling2D((2,2))(center)up4=Concatenate([down4,up4],axis=3)up4=Conv2D(512,(3,3),padding='same')(up4)up4=BatchNormalization()(up4)up4=Activation('relu')(up4)up4=Conv2d(512,(3,3),padding='same')(up4)up4=BatchNormalization()(up4)up4=Activation('relu')(up4)#16up3=UpSamepling2D((2,2))(up4)up3=Concatenate([down4,up4],axis=3)up3=Conv2D(256,(3,3),padding='same')(up3)up3=BatchNormalization()(up3)up3=Activation('relu')(up3)up3=Conv2d(256,(3,3),padding='same')(up3)up3=BatchNormalization()(up3)up3=Activation('relu')(up3)#32up2=UpSamepling2D((2,2))(up3)up2=Concatenate([down4,up4],axis=3)up2=Conv2D(128,(3,3),padding='same')(up2)up2=BatchNormalization()(up2)up2=Activation('relu')(up2)up2=Conv2d(128,(3,3),padding='same')(up2)up2=BatchNormalization()(up2)up2=Activation('relu')(up2)#64up1=UpSamepling2D((2,2))(up2)up1=Concatenate([down4,up4],axis=3)up1=Conv2D(64,(3,3),padding='same')(up1)up1=BatchNormalization()(up1)up1=Activation('relu')(up1)up1=Conv2d(64,(3,3),padding='same')(up1)up1=BatchNormalization()(up1)up1=Activation('relu')(up1)#128up0=UpSamepling2D((2,2))(up1)up0=Concatenate([down4,up4],axis=3)up0=Conv2D(32,(3,3),padding='same')(up0)up0=BatchNormalization()(up0)up0=Activation('relu')(up0)up0=Conv2d(32,(3,3),padding='same')(up0)up0=BatchNormalization()(up0)up0=Activation('relu')(up0)#256classify=Con2D(num_classes,(1,1)),activation='sigmoid')(up0)model=Model(input=inputs,outputs=classify)#model.compile(optimizer=RMSprop(lr=0.0001),loss=bce_dice_loss,metrices=[dice_coeff])returnmodel

分割效果举例如下:

使用的训练和测试数据集合大家自己准备即可。

发色更换模块

这个模块看起来比较简单,实际上却并非如此。这个模块要细分为:

①头发颜色增强与修正模块;

②颜色空间染色模块;

③头发细节增强;

发色增强与修正模块

为什么要对头发的颜色进行增强与修正? 先看下面一组图,我们直接使用HSV颜色空间对纯黑色的头发进行染色,目标色是紫色,结果如下:

大家可以看到,针对上面这张原图,头发比较黑,在HSV颜色空间进行头发换色之后,效果图中很不明显,只有轻微的颜色变化。

为什么会出现这种情况?原因如下:我们以RGB和HSV颜色空间为例,首先来看下HSV和RGB之间的转换公式:

设 (r, g, b)分别是一个颜色的红、绿和蓝坐标,它们的值是在0到1之间的实数。设max等价于r, g和b中的最大者。设min等于这些值中的最小者。要找到在HSL空间中的 (h, s, l)值,这里的h ∈ [0, 360)度是角度的色相角,而s, l ∈ [0,1]是饱和度和亮度,计算为:

我们假设头发为纯黑色,R=G=B=0,那么按照HSV计算公式可以得到H = S = V = 0;

假设我们要把头发颜色替换为红色(r=255,g=0,b=0);

那么,我们先将红色转换为对应的hsv,然后保留原始黑色头发的V,红色头发的hs,重新组合新的hsV,在转换为RGB颜色空间,即为头发换色之后的效果(hs是颜色属性,v是明度属性,保留原始黑色头发的明度,替换颜色属性以达到换色目的);

HSV转换为RGB的公式如下:

对于黑色,我们计算的结果是H=S=V=0,由于V=0,因此,p=q=t=0,不管目标颜色的hs值是多少,rgb始终都是0,也就是黑色;

这样,虽然我们使用了红色,来替换黑色头发,但是,结果却依旧是黑色,结论也就是hsv/hsl颜色空间,无法对黑色换色。

下面,我们给出天天P图和美妆相机对应紫色的换发色效果:

与之前HSV颜色空间的结果对比,我们明显可以看到,天天P图和美妆相机的效果要更浓,更好看,而且对近乎黑色的头发进行了完美的换色;

由于上述原因,我们这里需要对图像中的头发区域进行一定的增强处理:提亮,轻微改变色调;

这一步通常可以在PS上进行提亮调色,然后使用LUT来处理;

经过提亮之后的上色效果如下图所示:

可以看到,基本与美妆相机和天天P图类似了。

HSV/HSL/YCbCr颜色空间换色

这一步比较简单,保留明度分量不变,将其他颜色、色调分量替换为目标发色就可以了。

这里以HSV颜色空间为例:

假如我们要将头发染发为一半青色,一般粉红色,那么我们构建如下图所示的颜色MAP:

对于头发区域的每一个像素点P,我们将P的RGB转换为HSV颜色空间,得到H/S/V;

根据P在原图头发区域的位置比例关系,我们在颜色MAP中找到对应位置的像素点D,将D的RGB转换为HSV颜色空间,得到目标颜色的h/s/v;

根据目标颜色重组hsV,然后转为RGB即可;

这一模块代码如下:

#h=[0,360],s=[0,1],v=[0,1]voidRGBToHSV(intR,intG,intB,float*h,float*s,float*v){floatmin,max;floatr=R/255.0f;floatg=G/255.0f;floatb=B/255.0f;min=MIN2(r,MIN2(g,b));max=MAX2(r,MAX2(g,b));if(max==min)*h=0;if(max==r&&g>=b)*h=60.0f*(g-b)/(max-min);if(max==r&&g< b)        *h = 60.0f * (g-b) / (max-min) + 360.0f;    if(max == g)        *h = 60.0f * (b-r) / (max-min) + 120.0f;    if(max == b)        *h = 60.0f * (r-g) / (max-min) + 240.0f;    if(max == 0)        *s = (max-min) / max;    *v = max;    };void HSVToRGB(float h, float s,float v, int* R,int *G,int *B){    float q=0,p=0,t=0,r=0,g=0,b=0;    int hN=0;    if(h<0)        h=260+h;    hN=(int)(h/60);    p=v*(1.0f-s);    q=v*(1.0f-(h/60.0f-hN)*s);    t=v*(1.0f-(1.0f-(h/60.0f-hN))*s);    switch(hN)    {    case 0:        r=v;        q=t;        b=p;        break;    case 1:        r=q;        q=v;        b=p;        break;    case 2:        r=p;        g=v;        b=t;        break;    case 3:        r=p;        g=q;        b=v;        break;    case 4:        r=t;        g=p;        b=v;        break;    case 5:        r=v;        g=p;        b=q;        break;    default:        break;    }    *R=(int)CLIP3((r*255.0f),0,255);    *G=(int)CLIP3((g*255.0f),0,255);    *B=(int)CLIP3((b*255.0f),0,255);};

效果图如下:

本文算法对比美妆相机效果如下:

头发区域增强

这一步主要是为了突出头发丝的细节,可以使用锐化算法,如Laplace锐化,USM锐化等等。上述过程基本是模拟美妆相机染发算法的过程,给大家参考一下,最后给出本文算法的一些效果举例:

本文效果除了实现正常的单色染发,混合色染发之外,还实现了挑染,如最下方一组效果图所示。

对于挑染的算法原理:

计算头发纹理,根据头发纹理选取需要挑染的头发束,然后对这些头发束与其他头发分开染色即可,具体逻辑这里不再累赘,大家自行研究,这里给出解决思路供大家参考。

最后,本文算法理论上实时处理是没有问题的,头发分割已经可以实时处理,所以后面基本没有什么耗时操作,使用opengl实现实时染发是没有问题的。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • AI
    AI
    +关注

    关注

    87

    文章

    29665

    浏览量

    267997
  • 深度学习
    +关注

    关注

    73

    文章

    5459

    浏览量

    120863

原文标题:【AI超级美发师】深度学习算法打造染发特效(附代码)

文章出处:【微信号:AI_era,微信公众号:新智元】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    小车上安一个无线摄像头发给电脑,需要什么模块配件?

    想在自己小车上按一个无线摄像头发给笔记本,可以看清小车前面的图像,以前没接触过无线模块,都不太清楚需要什么,想问问需要买什么模块,我自己用51做了个避障小车,这样,还望赐教
    发表于 02-26 18:12

    头发茂密的FPGA工程师吗

    刚入行,看到网上的头发级别好担忧哇这年头有头发茂密的FPGA工程师吗?级别.jpg
    发表于 09-07 15:52

    摄像头发送数据时WIFI信号消失的原因?

    cam_start信号 ,当其为高时,模拟摄像头发送数据现在的问题是:之前WIFI搜索,TCP连接都正常,但当cam_start置高,FPGA发送数据的一瞬间,WIFI信号找不到了,然后只要FPGA工作,WIFI信号就搜索不到,请问一下,这是什么原因呢?
    发表于 02-15 08:04

    6LED背光模块光学特性

    6LED背光模块光学特性:使用6 LED 背光模块的液晶显示器,可以显示以往3 原色ED 背光模块液晶显示器不易达成的
    发表于 09-22 08:07 26次下载

    变电设备接头发热的原因与解决方案

    变电设备接头发热的原因与解决方案 1 运行中变电设备接头发热的原因 (1)接头联接安装工艺不当。联接安装过程中,错误使用砂纸打磨铝质母线接
    发表于 04-11 18:27 2976次阅读

    基于显著性特征进行密度修正的均值漂移分割算法

    针对固定空间和色彩带宽的均值漂移分割算法无法解决的错分割问题,提出一种基于显著性特征进行密度修正的均值漂移分割算法。首先基于密度估计的主颜色
    发表于 12-22 10:58 0次下载

    充电器的头特别烫手_充电头发烫有危险吗

    本文开始介绍了充电器的定义与工作原理,其次阐述了充电器插头发烫原因及分析了充电器的头特别烫手是否正常,最后分析了充电头发烫是否有危险以及正确的选购充电器方法。
    的头像 发表于 03-13 16:51 30w次阅读
    充电器的头特别烫手_充电<b class='flag-5'>头发</b>烫有危险吗

    MIT提出语义分割技术,电影特效自动化生成

    来自 MIT CSAIL 的研究人员开发了一种精细程度远超传统语义分割方法的「语义软分割技术,连头发都能清晰地在分割掩码中呈现。
    的头像 发表于 08-23 14:18 3827次阅读

    3D打印毛囊突破性进展!“头发工厂”将成秃顶的救星

    人到中年,最让人头疼的就是脱发和秃顶。当前的技术,仅限于头发植入,并不能满足大面积秃顶人士的需求。
    的头像 发表于 07-08 10:01 5839次阅读
    3D打印毛囊突破性进展!“<b class='flag-5'>头发</b>工厂”将成秃顶的救星

    追觅高速吹风机,一款可以养护头发的吹发神器

    在冬天这个季节,应该每个家庭都会用到吹风机吧。天气太冷,洗完头发之后都需要用吹风机吹干头发,之前我用的一直是几十块钱的普通吹风机,每次洗完头发都要很久才能吹干,温度也很难控制,一味的吹热风,感觉会
    的头像 发表于 12-17 10:51 2025次阅读

    戴森持续深耕头发科学,从源头呵护头发健康

    作为美发护发行业的领导者,戴森持续深入探索头发科学领域,从戴森 Superson不断创新和无法复制的科技,从用户的真实需求出发,发现并解决被人们所忽略的头发问题。 2012年11月1日戴森正式进入
    发表于 12-15 14:35 293次阅读
    戴森持续深耕<b class='flag-5'>头发</b>科学,从源头呵护<b class='flag-5'>头发</b>健康

    如何评估头发柔顺度、头发顺滑度

    如何评估头发柔顺度、头发顺滑度
    发表于 01-18 09:11 3次下载

    保圣头发顺滑度梳理仪规格书

    人体头发的外层由许多细小的毛鳞片重叠而成。如果毛鳞片受损、翘起、不规则,会直接影响头发的光泽度和顺滑度,造成头发毛糙、干枯、分叉情况。 市场上有很多护发产品宣称能够修复毛鳞片,
    发表于 01-18 09:57 4次下载

    戴森头发护理品类重塑大众造型理念

    戴森头发护理品类重塑大众造型理念,以颠覆科技实现“零负担”日常造型
    发表于 02-28 17:07 273次阅读
    戴森<b class='flag-5'>头发</b>护理品类重塑大众造型理念

    根据光模块拉环颜色区分光模块

    常用的光模块有四种波长,850nm,1310nm,1490nm,1550nm。其中千兆SPF光模块850nm对应的拉环颜色为黑色,1310nm对应的 拉环颜色为蓝色,1490nm的拉
    发表于 05-17 10:24 1次下载
    根据光<b class='flag-5'>模块</b>拉环<b class='flag-5'>颜色</b>区分光<b class='flag-5'>模块</b>