Xinzhiyuan önerilir
Kaynak: OpenCV Academy
Yazar: Huyao Wu
Xin Zhiyuan Rehberi Günümüzde Tiantian Ptu ve Meitu Xiuxiu gibi mobil uygulamalarda belirtilen fotoğraf veya videolardaki karakterlerin saç renginin değiştirilmesi normaldir. Daha sonra bu makale, AI saç bölümleme modülü, saç rengi değişimi, renk geliştirme ve düzeltme modülü (kodlu) gibi işlevin arkasındaki teknik ilkeleri tanıtmaktadır.
Öncelikle bir fotoğraf veya videodaki bir kişinin saç rengini değiştirmeye yönelik algoritma akışı aşağıdaki şekilde gösterilmektedir:
AI saç segmentasyon modülü
Derin öğrenmeye dayalı hedef segmentasyon algoritması nispeten olgunlaşmıştır, Daha yaygın olarak kullanılanlar FCN, SegNet, UNet, PspNet, DenseNet vb. . Burada saç segmentasyonu için Unet ağını kullanıyoruz.Ayrıntılar için lütfen aşağıdaki bağlantıya bakın: Unet saç segmentasyon kodu bağlantısını açmak için tıklayın:
def get_unet_256 (girdi _shape = (256,256,3),
sınıf_sayısı = 1):
inputs = Girdi (şekil = input_shape)
# 256
down0 = Conv2D (32, (3,3), dolgu = 'aynı') (girişler)
down0 = Toplu Normalleştirme (down0)
down0 = Etkinleştirme ('relu') (down0)
down0 = Conv2D (32, (3,3), dolgu = 'aynı') (aşağı0)
down0 = Toplu Normalleştirme (down0)
down0 = Etkinleştirme ('relu') (down0)
down0_pool = MaxHavuz2D ((2,2), adımlar = (2,2)) (aşağı0)
# 128
down1 = Conv2D (64, (3,3), padding = 'aynı') (down0_pool)
down1 = Toplu Normalleştirme (down1)
down1 = Etkinleştirme ('relu') (down1)
down1 = Conv2D (64, (3,3), padding = 'aynı') (down1)
down1 = Toplu Normalleştirme (down1)
down1 = Etkinleştirme ('relu') (down1)
down1_pool = MaxPooling2D ((2,2), adımlar = (2,2)) (aşağı1)
# 64
down2 = Conv2D (128, (3,3), padding = 'aynı') (down1_pool)
down2 = Toplu Normalleştirme (down2)
down2 = Etkinleştirme ('relu') (down2)
down2 = Conv2D (128, (3,3), padding = 'aynı') (down2)
down2 = Toplu Normalleştirme (down2)
down2 = Etkinleştirme ('relu') (down2)
down2_pool = MaxPooling2D ((2,2), adımlar = (2,2)) (down2)
# 32
down3 = Conv2D (256, (3,3), padding = 'aynı') (down2_pool)
down3 = Toplu Normalleştirme (down3)
down3 = Etkinleştirme ('relu') (down3)
down3 = Conv2D (256, (3,3), dolgu = 'aynı') (down3)
down3 = Toplu Normalleştirme (down3)
down3 = Etkinleştirme ('relu') (down3)
down3_pool = MaxPooling2D ((2,2), adımlar = (2,2)) (down3)
# 16
down4 = Conv2D (512, (3,3), dolgu = 'aynı') (down3_pool)
down4 = Toplu Normalleştirme (down4)
down4 = Etkinleştirme ('relu') (down4)
down4 = Conv2D (512, (3,3), dolgu = 'aynı') (aşağı4)
down4 = Toplu Normalleştirme (down4)
down4 = Etkinleştirme ('relu') (down4)
down4_pool = MaxPooling2D ((2,2), adımlar = (2,2)) (down4)
# 8
center = Conv2D (1024, (3,3), padding = 'aynı') (down4_pool)
center = Toplu Normalleştirme (merkez)
center = Aktivasyon ('relu') (merkez)
center = Conv2D (1024, (3,3), padding = 'aynı') (merkez)
center = Toplu Normalleştirme (merkez)
center = Aktivasyon ('relu') (merkez)
#center
up4 = UpSamepling2D ((2,2)) (merkez)
up4 = Birleştir (, eksen = 3)
up4 = Conv2D (512, (3,3), dolgu = 'aynı') (up4)
up4 = Toplu Normalleştirme (up4)
up4 = Etkinleştirme ('relu') (up4)
up4 = Conv2d (512, (3,3), dolgu = 'aynı') (up4)
up4 = Toplu Normalleştirme (up4)
up4 = Etkinleştirme ('relu') (up4)
# 16
up3 = UpSamepling2D ((2,2)) (up4)
up3 = Birleştir (, eksen = 3)
up3 = Conv2D (256, (3,3), dolgu = 'aynı') (up3)
up3 = Toplu Normalleştirme (up3)
up3 = Etkinleştirme ('relu') (up3)
up3 = Conv2d (256, (3,3), dolgu = 'aynı') (up3)
up3 = Toplu Normalleştirme (up3)
up3 = Etkinleştirme ('relu') (up3)
# 32
up2 = UpSamepling2D ((2,2)) (up3)
up2 = Birleştir (, eksen = 3)
up2 = Conv2D (128, (3,3), dolgu = 'aynı') (up2)
up2 = Toplu Normalleştirme (up2)
up2 = Etkinleştirme ('relu') (up2)
up2 = Conv2d (128, (3,3), padding = 'aynı') (up2)
up2 = Toplu Normalleştirme (up2)
up2 = Etkinleştirme ('relu') (up2)
# 64
up1 = UpSamepling2D ((2,2)) (up2)
up1 = Birleştir (, eksen = 3)
up1 = Conv2D (64, (3,3), dolgu = 'aynı') (up1)
up1 = Toplu Normalleştirme (up1)
up1 = Etkinleştirme ('relu') (up1)
up1 = Conv2d (64, (3,3), padding = 'aynı') (up1)
up1 = Toplu Normalleştirme (up1)
up1 = Etkinleştirme ('relu') (up1)
# 128
up0 = UpSamepling2D ((2,2)) (up1)
up0 = Birleştir (, eksen = 3)
up0 = Conv2D (32, (3,3), padding = 'aynı') (up0)
up0 = Toplu Normalleştirme (up0)
up0 = Etkinleştirme ('relu') (up0)
up0 = Conv2d (32, (3,3), padding = 'aynı') (up0)
up0 = Toplu Normalleştirme (up0)
up0 = Etkinleştirme ('relu') (up0)
# 256
classify = Con2D (num_classes, (1,1)), aktivasyon = 'sigmoid') (up0)
model = Model (girdi = girdiler, çıktılar = sınıflandır)
# model.compile (optimize edici = RMSprop (lr = 0.0001), kayıp = bce_dice_loss, metrices =)
dönüş modeli
Segmentasyon etkilerinin örnekleri aşağıdaki gibidir:
Kullanacağınız eğitim ve test veri setlerini kendiniz hazırlayabilirsiniz.
Saç rengi değiştirme modülü
Bu modül nispeten basit görünüyor, ama aslında öyle değil. Bu modül şu alt bölümlere ayrılmalıdır:
Saç rengi geliştirme ve düzeltme modülü;
Renk alanı boyama modülü;
Saç detay geliştirme;
Saç rengi geliştirme ve düzeltme modülü
Saç rengi neden geliştirilmeli ve düzeltilmelidir? İlk önce aşağıdaki resim setine bakın, saf siyah saçları boyamak için doğrudan HSV renk alanını kullanıyoruz, hedef renk mor, sonuçlar aşağıdaki gibidir:
Gördüğünüz gibi, yukarıdaki orijinal resim için saç nispeten koyudur HSV renk uzayında saç rengi değiştirildikten sonra, efekt görüntüsü belirgin değildir, sadece hafif bir renk değişikliği.
Bu neden oluyor? Sebepler şu şekildedir: RGB ve HSV renk uzaylarını örnek olarak alalım. İlk olarak, HSV ve RGB arasındaki dönüşüm formülüne bakalım:
(R, g, b) bir rengin kırmızı, yeşil ve mavi koordinatları ve değerleri 0 ile 1 arasında gerçek sayılar olsun. Max r, g ve b'nin en büyüğüne eşit olsun. Min bu değerlerin en küçüğüne eşit olsun. HSL uzayında (h, s, l) değerini bulmak için, burada h