Saç boyama efektleri oluşturmak için "AI Süper Kuaför" derin öğrenme algoritması (kod eklidir)

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

Sanhe Klasik Otomobil Müzesi: Yıllar geçtikçe afazi, ancak araba konuşabiliyor
önceki
7 eski Real Madrid koçu altın için toplandı, kötü sonuçlarla Schuster kurtarıcı olamazdı
Sonraki
"Barış-19" çokuluslu denizcilik ortak askeri tatbikatı başlar ve Çin Donanması tüm sürece katılır.
BMW E60 eski otomobilin yeni testi: neden yıkıcı bir iş?
18 yaşındaki dahi Çinli genç, kuantum hızlanma efsanesini yıkmak için klasik bir algoritma kullanıyor!
Great Barrier Reef'te şaşkınlık içinde kalmak, Gold Coast'ta vakit geçirmek, Sydney'de gece manzarasını izlemek ... bu tatil!
Başlangıç fiyatı 100.000'den az, 2017 Haima S7'den hangisi en çok satın almaya değer?
Qingming Festivalinin son gününde, Shandong size bir "Altın Deniz" parçası verecek!
Amazon'un açıklaması: Hükümete ve askeri müşterilere kararlı bir şekilde hizmet verin ve yapay zeka teknolojisini kullanmak için kırmızı çizgi yok
Su, kara ve hava flaş galası! Orange Island'daki on binlerce insanın korosu tutkuyu ateşliyor
2018 IEEE en iyi 47 programlama dili yayınlandı! Python dörtte ilk sırada
MPV'yi kestikten sonra, CX-8 Mazda'nın 7 koltuklu SUV'sinin yükünü kaldırabilir mi?
95 Sonrası Doktora Bodhidharma Akademisi'ne katıldı, 14 yaşında üniversiteye gitti, Ali tarihindeki en genç bilim adamı oldu
Bahar Festivali Halk Takvimi İlk Ayın İlk Ayının Altıncı Günü: Zavallı Tanrıyı Büyük Süpürme
To Top