ControlNet
ControlNet, metinden görüntüye difüzyon modellerine uzamsal kontrol ekleyerek kenar haritaları, derinlik haritaları veya poz iskeletleriyle düzeni yönlendirir. Nasıl çalıştığını kodla öğren.
ControlNet, Stable Diffusion gibi önceden eğitilmiş bir metinden görüntüye difüzyon modeline uzamsal kontrol ekleyen bir sinir ağı mimarisidir. Metin isteminin yanı sıra kenar haritası, derinlik haritası, insan pozu iskeleti veya bölütleme haritası gibi bir koşul görüntüsü alır. Oluşturulan görüntü bu yapıyı izlerken istem içeriği ve tarzı belirler. Örneğin "gümüş zırhlı bir şövalye" istemi bir poz iskeletiyle birleştirildiğinde, şövalye tam olarak bu pozda oluşturulur. Stanford Üniversitesi'nden Lvmin Zhang, Anyi Rao ve Maneesh Agrawala, ControlNet'i 2023'te Metinden Görüntüye Difüzyon Modellerine Koşullu Kontrol Ekleme başlıklı makalelerinde tanıttı. Makale, ICCV 2023'te en iyi makale için Marr Ödülü'nü paylaştı. Temel modelin ağırlıkları dondurulmuş kalır; bu nedenle ControlNet, modelin zaten bildiklerini bozmadan kontrol olanağı ekler.
ControlNet Nasıl Çalışır?#
Stable Diffusion, bir U-Net kullanarak gizil temsili tekrar tekrar gürültüden arındırıp görüntü oluşturur. ControlNet bu U-Net'i dondurur ve 12 kodlama bloğu ile orta bloktan oluşan kodlayıcısının eğitilebilir bir kopyasını oluşturur. Küçük bir evrişimli ağ, 512×512 boyutundaki koşul görüntüsünü önce gizil temsille eşleşen 64×64 boyutunda bir özellik haritasına dönüştürür. Eğitilebilir kopya, gizil temsili bu koşul özellikleriyle birlikte işler; çıktıları dondurulmuş U-Net'in 12 atlama bağlantısına ve orta bloğuna eklenir. Böylece dondurulmuş kod çözücü kontrol sinyalini alır:
Kopya, dondurulmuş modele yalnızca sıfır evrişimleri üzerinden bağlanır: ağırlıkları ve yanlılıkları sıfırdan başlayan 1×1 evrişimler. İlk eğitim adımında sıfır çıktısı verirler; dolayısıyla birleşik model, özgün modelle birebir aynı davranır ve önceden eğitilmiş katmanlara rastgele gürültü ulaşmaz. Çıktıdaki sıfır evrişimi, girdisi sıfır olmadığı için sıfırdan farklı bir ağırlık gradyanı alır. Böylece ilk güncelleme onu sıfırdan uzaklaştırır ve kontrol sinyali büyümeye başlar. Bu PyTorch kodu bir bloğu gösteriyor:
import copy
import torch
from torch import nn
# A frozen block from the pretrained model and a trainable copy of it
torch.manual_seed(0)
locked = nn.Conv2d(64, 64, 3, padding=1).requires_grad_(False)
trainable = copy.deepcopy(locked).requires_grad_(True)
# Zero convolutions: 1x1 convolutions whose weights and biases start at zero
zero_in, zero_out = nn.Conv2d(64, 64, 1), nn.Conv2d(64, 64, 1)
for conv in (zero_in, zero_out):
nn.init.zeros_(conv.weight)
nn.init.zeros_(conv.bias)
x = torch.randn(1, 64, 32, 32) # features entering the block
condition = torch.randn(1, 64, 32, 32) # encoded edge, depth, or pose map
y = locked(x) + zero_out(trainable(x + zero_in(condition)))
# At step 0 the output equals the frozen block's, and only the outer zero conv gets a gradient
print(torch.equal(y, locked(x)))
y.sum().backward()
print(f"zero_in grad: {zero_in.weight.grad.norm():.1f}, zero_out grad: {zero_out.weight.grad.norm():.1f}")True ve zero_in grad: 0.0, zero_out grad: 2040.6 değerlerini yazdırır. Bloğun çıktısı dondurulmuş modelin çıktısıyla aynıdır; dıştaki sıfır evrişimi, girdisi sıfır olmadığı için gradyan alır. İçteki evrişim ise dıştaki sıfır evrişimi sıfırdan uzaklaştıktan sonra öğrenmeye başlar.
Koşul Türleri#
Özgün makalede Canny kenarları, derinlik haritaları, yüzey normali haritaları, M-LSD düz çizgileri, HED yumuşak kenarları, ADE20K bölütleme haritaları, OpenPose insan pozları ve kullanıcı çizimleri için ayrı ControlNet modelleri eğitildi. Her koşul görüntüsü, OpenCV'nin Canny kenar algılayıcısı veya bir derinlik tahmini ağı gibi kullanıma hazır bir modelle referans fotoğraftan çıkarılır. Her biri kendi ağırlığına sahip birkaç ControlNet aynı anda uygulanabilir. Ultralytics YOLO26 poz tahmini modelleri bu tür poz koşullarını çıkarır ve her kişi için 17 COCO kilit noktası tahmin eder. Bu noktalar boş bir tuvale iskelet olarak çizilebilir:
import cv2
import numpy as np
from ultralytics import YOLO
# Kişi başına 17 kilit noktası tahmin eden bir YOLO26 poz modeli yükle
model = YOLO("yolo26n-pose.pt")
results = model("https://ultralytics.com/images/bus.jpg")
result = results[0]
# Yalnızca iskeletleri, fotoğraf boyutlarında siyah bir tuval üzerine çiz
skeletons = result.plot(img=np.zeros_like(result.orig_img), boxes=False)
cv2.imwrite("pose_condition.png", skeletons)Kaydedilen görüntüde her kişinin uzuvları siyah zemin üzerinde renkli çizgiler olarak görünür; fotoğrafın renkleri, dokuları ve arka planı kaldırılmıştır.
ControlNet ve İlgili Yöntemler#
- LoRA: Bir modele yeni bir tarzı, karakteri veya nesneyi öğretmek için eklenen az sayıdaki ağırlığa ince ayar yapar. LoRA modelin ne çizeceğini değiştirirken ControlNet nesnelerin nerede olacağını belirler; bu iki yöntem sıklıkla birlikte kullanılır.
- T2I-Adapter: Yaklaşık 77 milyon parametreli, daha hafif bir alternatiftir. Kodlayıcının tam bir kopyasını çalıştırmak yerine, koşul özelliklerini dondurulmuş U-Net'in kodlayıcı özelliklerine ekler. Farklı koşullara yönelik bağdaştırıcılar üretim sırasında birleştirilebilir.
- Görüntüden görüntü üretimi: Gürültü eklenmiş bir girdi fotoğrafı üzerinden gürültü giderme işlemini başlatır; böylece çıktı o fotoğrafın renklerini ve genel yerleşimini devralır. ControlNet yalnızca kenarlar gibi çıkarılan yapıyı sınırlar; renkleri ve dokuları isteme bırakır.
- Görüntü içi boyama: Bir görüntünün maskelenmiş bölümünü, geri kalanıyla eşleşecek biçimde yeniden oluşturur. Hangi bölgenin değişeceğini bu yöntem, oluşturulan yapıyı ise ControlNet kontrol eder.
Gerçek Dünya Uygulamaları#
- Mimari ve iç tasarım: Bir odanın çizimleri, CAD çizgi çizimleri veya M-LSD çizgi haritaları, aynı geometriyi koruyarak farklı malzeme ve tarzlarda fotogerçekçi görsellere dönüştürülür.
- Karakter çizimi ve animasyon: Poz iskeletleri, tarz değişiklikleri boyunca karakterin duruşunu sabit tutar. Referans videodan çıkarılan kare başına pozlar da tutarlı animasyon dizileri oluşturur.
- Ürün ve pazarlama görselleri: Ürün çekiminin derinlik veya kenar haritaları, istem ortamı, aydınlatmayı ve arka planı değiştirirken ürünün şeklini ve yerleşimini korur.
- Sentetik veri: Bölütleme haritalarından veya pozlardan görüntü oluşturmak, etiketleri önceden belirli yeni eğitim görüntüleri üretir; çünkü yerleşim, üretimden önce tanımlanmıştır.
ControlNet Eğitimi#
Eğitim için görüntü çiftleri ve koşul haritaları gerekir; bunlar, koşul çıkarıcının açıklama eklenmiş bir görüntü veri kümesi üzerinde çalıştırılmasıyla otomatik olarak üretilir. Dondurulmuş ağırlıklar için gradyan güncellemesi gerekmez. Bu nedenle her eğitim yinelemesi, ControlNet kullanılmadan Stable Diffusion'ı optimize etmeye kıyasla yalnızca yaklaşık %23 daha fazla GPU belleği ve %34 daha fazla zaman gerektirir. Makalede, 50.000'in altından bir milyonun üzerine kadar görüntü içeren veri kümelerinde sağlam eğitim sonuçları bildiriliyor. Eğitim sırasında ayrıca "ani yakınsama" görülüyor: model binlerce adım boyunca koşulu yok sayıyor, ardından genellikle 10.000 optimizasyon adımı içinde koşulu izlemeye aniden başlıyor; makaledeki örnekte bu, 6.133. adımda gerçekleşiyor.










