0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

AI頭發(fā)分割模塊、頭發(fā)換色、顏色增強(qiáng)與修正模塊等技術(shù)原理

DPVg_AI_era ? 來源:未知 ? 作者:李倩 ? 2018-08-03 09:27 ? 次閱讀

如今,在類似天天P圖、美圖秀秀等手機(jī)APP中,給指定照片或視頻中的人物更換頭發(fā)顏色已經(jīng)是再正常不過的事情了。那么本文便介紹了該功能背后如AI頭發(fā)分割模塊、頭發(fā)換色、顏色增強(qiáng)與修正模塊等技術(shù)原理(附代碼)。

首先,為照片或視頻中人物換發(fā)色的算法流程如下圖所示:

AI頭發(fā)分割模塊

基于深度學(xué)習(xí)的目標(biāo)分割算法已經(jīng)比較成熟,比較常用的有FCN,SegNet,UNet,PspNet,DenseNet等等。這里我們使用Unet網(wǎng)絡(luò)來進(jìn)行頭發(fā)分割,具體可以參考如下鏈接:點(diǎn)擊打開鏈接Unet頭發(fā)分割代碼如下:

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

分割效果舉例如下:

使用的訓(xùn)練和測試數(shù)據(jù)集合大家自己準(zhǔn)備即可。

發(fā)色更換模塊

這個(gè)模塊看起來比較簡單,實(shí)際上卻并非如此。這個(gè)模塊要細(xì)分為:

①頭發(fā)顏色增強(qiáng)與修正模塊;

②顏色空間染色模塊;

③頭發(fā)細(xì)節(jié)增強(qiáng);

發(fā)色增強(qiáng)與修正模塊

為什么要對頭發(fā)的顏色進(jìn)行增強(qiáng)與修正? 先看下面一組圖,我們直接使用HSV顏色空間對純黑色的頭發(fā)進(jìn)行染色,目標(biāo)色是紫色,結(jié)果如下:

大家可以看到,針對上面這張?jiān)瓐D,頭發(fā)比較黑,在HSV顏色空間進(jìn)行頭發(fā)換色之后,效果圖中很不明顯,只有輕微的顏色變化。

為什么會出現(xiàn)這種情況?原因如下:我們以RGB和HSV顏色空間為例,首先來看下HSV和RGB之間的轉(zhuǎn)換公式:

設(shè) (r, g, b)分別是一個(gè)顏色的紅、綠和藍(lán)坐標(biāo),它們的值是在0到1之間的實(shí)數(shù)。設(shè)max等價(jià)于r, g和b中的最大者。設(shè)min等于這些值中的最小者。要找到在HSL空間中的 (h, s, l)值,這里的h ∈ [0, 360)度是角度的色相角,而s, l ∈ [0,1]是飽和度和亮度,計(jì)算為:

我們假設(shè)頭發(fā)為純黑色,R=G=B=0,那么按照HSV計(jì)算公式可以得到H = S = V = 0;

假設(shè)我們要把頭發(fā)顏色替換為紅色(r=255,g=0,b=0);

那么,我們先將紅色轉(zhuǎn)換為對應(yīng)的hsv,然后保留原始黑色頭發(fā)的V,紅色頭發(fā)的hs,重新組合新的hsV,在轉(zhuǎn)換為RGB顏色空間,即為頭發(fā)換色之后的效果(hs是顏色屬性,v是明度屬性,保留原始黑色頭發(fā)的明度,替換顏色屬性以達(dá)到換色目的);

HSV轉(zhuǎn)換為RGB的公式如下:

對于黑色,我們計(jì)算的結(jié)果是H=S=V=0,由于V=0,因此,p=q=t=0,不管目標(biāo)顏色的hs值是多少,rgb始終都是0,也就是黑色;

這樣,雖然我們使用了紅色,來替換黑色頭發(fā),但是,結(jié)果卻依舊是黑色,結(jié)論也就是hsv/hsl顏色空間,無法對黑色換色。

下面,我們給出天天P圖和美妝相機(jī)對應(yīng)紫色的換發(fā)色效果:

與之前HSV顏色空間的結(jié)果對比,我們明顯可以看到,天天P圖和美妝相機(jī)的效果要更濃,更好看,而且對近乎黑色的頭發(fā)進(jìn)行了完美的換色;

由于上述原因,我們這里需要對圖像中的頭發(fā)區(qū)域進(jìn)行一定的增強(qiáng)處理:提亮,輕微改變色調(diào);

這一步通??梢栽赑S上進(jìn)行提亮調(diào)色,然后使用LUT來處理;

經(jīng)過提亮之后的上色效果如下圖所示:

可以看到,基本與美妝相機(jī)和天天P圖類似了。

HSV/HSL/YCbCr顏色空間換色

這一步比較簡單,保留明度分量不變,將其他顏色、色調(diào)分量替換為目標(biāo)發(fā)色就可以了。

這里以HSV顏色空間為例:

假如我們要將頭發(fā)染發(fā)為一半青色,一般粉紅色,那么我們構(gòu)建如下圖所示的顏色MAP:

對于頭發(fā)區(qū)域的每一個(gè)像素點(diǎn)P,我們將P的RGB轉(zhuǎn)換為HSV顏色空間,得到H/S/V;

根據(jù)P在原圖頭發(fā)區(qū)域的位置比例關(guān)系,我們在顏色MAP中找到對應(yīng)位置的像素點(diǎn)D,將D的RGB轉(zhuǎn)換為HSV顏色空間,得到目標(biāo)顏色的h/s/v;

根據(jù)目標(biāo)顏色重組hsV,然后轉(zhuǎn)為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

效果圖如下:

本文算法對比美妝相機(jī)效果如下:

頭發(fā)區(qū)域增強(qiáng)

這一步主要是為了突出頭發(fā)絲的細(xì)節(jié),可以使用銳化算法,如Laplace銳化,USM銳化等等。上述過程基本是模擬美妝相機(jī)染發(fā)算法的過程,給大家參考一下,最后給出本文算法的一些效果舉例:

本文效果除了實(shí)現(xiàn)正常的單色染發(fā),混合色染發(fā)之外,還實(shí)現(xiàn)了挑染,如最下方一組效果圖所示。

對于挑染的算法原理:

計(jì)算頭發(fā)紋理,根據(jù)頭發(fā)紋理選取需要挑染的頭發(fā)束,然后對這些頭發(fā)束與其他頭發(fā)分開染色即可,具體邏輯這里不再累贅,大家自行研究,這里給出解決思路供大家參考。

最后,本文算法理論上實(shí)時(shí)處理是沒有問題的,頭發(fā)分割已經(jīng)可以實(shí)時(shí)處理,所以后面基本沒有什么耗時(shí)操作,使用opengl實(shí)現(xiàn)實(shí)時(shí)染發(fā)是沒有問題的。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • AI
    AI
    +關(guān)注

    關(guān)注

    87

    文章

    28877

    瀏覽量

    266228
  • 深度學(xué)習(xí)
    +關(guān)注

    關(guān)注

    73

    文章

    5422

    瀏覽量

    120593

原文標(biāo)題:【AI超級美發(fā)師】深度學(xué)習(xí)算法打造染發(fā)特效(附代碼)

文章出處:【微信號:AI_era,微信公眾號:新智元】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    小車上安一個(gè)無線攝像頭發(fā)給電腦,需要什么模塊配件?

    想在自己小車上按一個(gè)無線攝像頭發(fā)給筆記本,可以看清小車前面的圖像,以前沒接觸過無線模塊,都不太清楚需要什么,想問問需要買什么模塊,我自己用51做了個(gè)避障小車,這樣,還望賜教
    發(fā)表于 02-26 18:12

    頭發(fā)茂密的FPGA工程師嗎

    剛?cè)胄?,看到網(wǎng)上的頭發(fā)級別好擔(dān)憂哇這年頭有頭發(fā)茂密的FPGA工程師嗎?級別.jpg
    發(fā)表于 09-07 15:52

    攝像頭發(fā)送數(shù)據(jù)時(shí)WIFI信號消失的原因?

    cam_start信號 ,當(dāng)其為高時(shí),模擬攝像頭發(fā)送數(shù)據(jù)現(xiàn)在的問題是:之前WIFI搜索,TCP連接都正常,但當(dāng)cam_start置高,F(xiàn)PGA發(fā)送數(shù)據(jù)的一瞬間,WIFI信號找不到了,然后只要FPGA工作,WIFI信號就搜索不到,請問一下,這是什么原因呢?
    發(fā)表于 02-15 08:04

    6LED背光模塊光學(xué)特性

    6LED背光模塊光學(xué)特性:使用6 LED 背光模塊的液晶顯示器,可以顯示以往3 原色ED 背光模塊液晶顯示器不易達(dá)成的
    發(fā)表于 09-22 08:07 ?26次下載

    變電設(shè)備接頭發(fā)熱的原因與解決方案

    變電設(shè)備接頭發(fā)熱的原因與解決方案 1 運(yùn)行中變電設(shè)備接頭發(fā)熱的原因 (1)接頭聯(lián)接安裝工藝不當(dāng)。聯(lián)接安裝過程中,錯(cuò)誤使用砂紙打磨鋁質(zhì)母線接
    發(fā)表于 04-11 18:27 ?2920次閱讀

    基于顯著性特征進(jìn)行密度修正的均值漂移分割算法

    針對固定空間和色彩帶寬的均值漂移分割算法無法解決的錯(cuò)分割問題,提出一種基于顯著性特征進(jìn)行密度修正的均值漂移分割算法。首先基于密度估計(jì)的主顏色
    發(fā)表于 12-22 10:58 ?0次下載

    充電器的頭特別燙手_充電頭發(fā)燙有危險(xiǎn)嗎

    本文開始介紹了充電器的定義與工作原理,其次闡述了充電器插頭發(fā)燙原因及分析了充電器的頭特別燙手是否正常,最后分析了充電頭發(fā)燙是否有危險(xiǎn)以及正確的選購充電器方法。
    的頭像 發(fā)表于 03-13 16:51 ?30w次閱讀
    充電器的頭特別燙手_充電<b class='flag-5'>頭發(fā)</b>燙有危險(xiǎn)嗎

    MIT提出語義分割技術(shù),電影特效自動化生成

    來自 MIT CSAIL 的研究人員開發(fā)了一種精細(xì)程度遠(yuǎn)超傳統(tǒng)語義分割方法的「語義軟分割技術(shù),連頭發(fā)都能清晰地在分割掩碼中呈現(xiàn)。
    的頭像 發(fā)表于 08-23 14:18 ?3773次閱讀

    3D打印毛囊突破性進(jìn)展!“頭發(fā)工廠”將成禿頂?shù)木刃?/a>

    人到中年,最讓人頭疼的就是脫發(fā)和禿頂。當(dāng)前的技術(shù),僅限于頭發(fā)植入,并不能滿足大面積禿頂人士的需求。
    的頭像 發(fā)表于 07-08 10:01 ?5771次閱讀
    3D打印毛囊突破性進(jìn)展!“<b class='flag-5'>頭發(fā)</b>工廠”將成禿頂?shù)木刃? />    </a>
</div>                            <div   id=

    追覓高速吹風(fēng)機(jī),一款可以養(yǎng)護(hù)頭發(fā)的吹發(fā)神器

    在冬天這個(gè)季節(jié),應(yīng)該每個(gè)家庭都會用到吹風(fēng)機(jī)吧。天氣太冷,洗完頭發(fā)之后都需要用吹風(fēng)機(jī)吹干頭發(fā),之前我用的一直是幾十塊錢的普通吹風(fēng)機(jī),每次洗完頭發(fā)都要很久才能吹干,溫度也很難控制,一味的吹熱風(fēng),感覺會
    的頭像 發(fā)表于 12-17 10:51 ?1997次閱讀

    戴森持續(xù)深耕頭發(fā)科學(xué),從源頭呵護(hù)頭發(fā)健康

    作為美發(fā)護(hù)發(fā)行業(yè)的領(lǐng)導(dǎo)者,戴森持續(xù)深入探索頭發(fā)科學(xué)領(lǐng)域,從戴森 Superson不斷創(chuàng)新和無法復(fù)制的科技,從用戶的真實(shí)需求出發(fā),發(fā)現(xiàn)并解決被人們所忽略的頭發(fā)問題。 2012年11月1日戴森正式進(jìn)入
    發(fā)表于 12-15 14:35 ?279次閱讀
    戴森持續(xù)深耕<b class='flag-5'>頭發(fā)</b>科學(xué),從源頭呵護(hù)<b class='flag-5'>頭發(fā)</b>健康

    如何評估頭發(fā)柔順度、頭發(fā)順滑度

    如何評估頭發(fā)柔順度、頭發(fā)順滑度
    發(fā)表于 01-18 09:11 ?3次下載

    保圣頭發(fā)順滑度梳理儀規(guī)格書

    人體頭發(fā)的外層由許多細(xì)小的毛鱗片重疊而成。如果毛鱗片受損、翹起、不規(guī)則,會直接影響頭發(fā)的光澤度和順滑度,造成頭發(fā)毛糙、干枯、分叉情況。 市場上有很多護(hù)發(fā)產(chǎn)品宣稱能夠修復(fù)毛鱗片,
    發(fā)表于 01-18 09:57 ?4次下載

    戴森頭發(fā)護(hù)理品類重塑大眾造型理念

    戴森頭發(fā)護(hù)理品類重塑大眾造型理念,以顛覆科技實(shí)現(xiàn)“零負(fù)擔(dān)”日常造型
    發(fā)表于 02-28 17:07 ?249次閱讀
    戴森<b class='flag-5'>頭發(fā)</b>護(hù)理品類重塑大眾造型理念

    根據(jù)光模塊拉環(huán)顏色區(qū)分光模塊

    常用的光模塊有四種波長,850nm,1310nm,1490nm,1550nm。其中千兆SPF光模塊850nm對應(yīng)的拉環(huán)顏色為黑色,1310nm對應(yīng)的 拉環(huán)顏色為藍(lán)色,1490nm的拉
    發(fā)表于 05-17 10:24 ?1次下載
    根據(jù)光<b class='flag-5'>模塊</b>拉環(huán)<b class='flag-5'>顏色</b>區(qū)分光<b class='flag-5'>模塊</b>