Eski fotoğrafların sepya tonları ve gri tonlamalı geçişleri, zamanda donmuş anları yakalayan eşsiz bir cazibeye sahiptir. Ancak, genellikle orijinal sahnenin canlı anlık görüntüsünden yoksundurlar. Bu değerli anılara hayatın renklerini geri üflediğinizi, solmuş siyah-beyaz bir portreyi konunun dünyasını tam renkli olarak ortaya çıkaran bir pencereye dönüştürdüğünüzü hayal edin. Görüntü renklendirme olarak bilinen bu dönüştürücü süreç, uzun zamandır sanatçıları ve tarihçileri büyülemiştir. Bugün, yapay zekadaki, özellikle derin öğrenmedeki ilerlemelerle desteklenen otomatik renklendirme, bir zamanlar bilim kurgu malzemesi olan sonuçlar elde ediyor.
Gri tonlamalı bir görüntüye renk katmak büyüleyici bir zorluk sunar. Bir görüntü monokrom olarak işlendiğinde önemli miktarda bilgi – orijinal kromatik veri – doğası gereği kaybolur. Bir algoritma, yalnızca parlaklık değerlerinden bir çiçeğin, bir elbisenin veya gökyüzünün gerçek rengini nasıl bilebilir? Cevap, gri tonlamalı görüntünün içine gömülü ince ipuçlarında yatar: dokular, şekiller, bağlam ve ışık ile gölgenin etkileşimi. Tam orijinal rengi belirlemek imkansız olsa da (o gül gerçekten kıpkırmızı mıydı, yoksa belki pembenin bir tonu mu?), hedef makul ve estetik olarak ikna edici bir renklendirme oluşturmaya kayar. Amaç, bir insan gözlemcinin inandırıcı bulacağı, hatta potansiyel olarak orijinal bir renkli fotoğraftan ayırt edilemez bir görüntü üretmektir.
Derin öğrenme modelleri, devasa veri kümeleri içindeki karmaşık kalıpları ve istatistiksel ilişkileri ortaya çıkarmada mükemmeldir. Bu modelleri milyonlarca görüntü üzerinde eğiterek, gri tonlamalı versiyonları orijinal renkli karşılıklarıyla karşılaştırarak, algoritmalar belirli dokuları ve yapıları olası renklerle ilişkilendirmeyi öğrenir. Çimenlerin tipik olarak yeşil olduğunu, gökyüzünün genellikle mavi olduğunu ve belirli dokuların ahşap damarına veya kumaşa karşılık geldiğini öğrenirler. Bu, eğitimli bir tahmine benzer, ancak muazzam bir görsel ansiklopedi tarafından bilgilendirilen bir tahmindir. Algoritma, insan anlamında gerçek rengi ‘bilmez’, ancak öğrenilmiş korelasyonlara dayanarak yüksek olasılıklı tahminler yapabilir.
Renklerin Dili: CIELab ve Sinir Ağları
Renklendirmeyi hesaplamalı olarak ele almak için, rengi temsil etmenin uygun bir yoluna ihtiyacımız var. RGB
(Kırmızı, Yeşil, Mavi) ekranlar için yaygın olsa da, parlaklık (luminance) ve renklilik (chrominance) bilgilerini karıştırır. Bu görev için daha avantajlı bir sistem CIELab
renk uzayıdır. Bu model, rengi zarif bir şekilde üç ayrı bileşene ayırır:
- L (Lightness - Parlaklık): Bu kanal, saf siyahtan saf beyaza kadar değişen gri tonlama bilgilerini temsil eder. Esasen siyah-beyaz bir görüntüde zaten sahip olduğumuz girdi verisidir.
- a: Bu kanal, yeşilden (negatif değerler) kırmızıya (pozitif değerler) kadar olan spektrumu kodlar.
- b: Bu kanal, maviden (negatif değerler) sarıya (pozitif değerler) kadar olan spektrumu kodlar.
CIELab
‘ın güzelliği bu ayrımda yatar. Derin öğrenme modelimiz, yalnızca girdi Parlaklık (‘L’) kanalına dayanarak iki renklilik kanalını (‘a’ ve ‘b’) tahmin etmeye odaklanabilir. Temel görev şu hale gelir: gri tonlama bilgisi (L) verildiğinde, her piksel için en olası karşılık gelen ‘a’ ve ‘b’ değerleri nelerdir?
İlk denemeler genellikle Evrişimli Sinir Ağları (CNN
‘ler) – görüntüler gibi ızgara benzeri verileri işlemede özellikle usta olan bir derin öğrenme mimarisi türü – kullanmıştır. Bu ağlar, her piksel için ‘a’ ve ‘b’ değerlerini doğrudan tahmin etmek üzere büyük görüntü veri kümeleri (örneğin ImageNet
) üzerinde eğitilmiş ve bunu bir regresyon problemi (sürekli değerleri tahmin etme) olarak ele almıştır. Ancak, yaygın bir tuzak ortaya çıktı: sonuçtaki renklendirmeler genellikle doygunluğu azaltılmış veya soluk görünüyordu. Neden? Elma gibi bir nesneyi düşünün. Makul bir şekilde kırmızı, yeşil veya hatta sarı olabilir. Ağ, regresyon sırasında bu olasılıkları ortalamaya çalışırsa, canlı, belirli bir renk yerine donuk, kahverengimsi bir uzlaşmaya karar verebilir. Birden fazla makul renk arasındaki bu ortalama alma etkisi, sonuçları soldurma eğilimindeydi.
Bir Paradigma Kayması: Sınıflandırma Olarak Renklendirme
Doygunluk azalması sorununu aşmak ve daha canlı, gerçekçi renkler üretmek için daha sofistike bir yaklaşım, problemi yeniden çerçeveler. Renk tahminini regresyon olarak ele almak yerine, bir sınıflandırma görevi olarak görülür.
İşte kavramsal değişim:
- Nicelleştirilmiş Renk Uzayı: Olası ‘a’ ve ‘b’ değerlerinin sürekli spektrumu, önceden tanımlanmış temsili renk ‘kovaları’ veya sınıfları kümesine ayrılır. Bunu, geniş bir paleti ‘a’-‘b’ düzlemi içinde yönetilebilir, ancak kapsamlı, belirgin renk seçenekleri kümesine indirgemek gibi düşünün.
- Olasılıkları Tahmin Etme: Girdi gri tonlamalı görüntüdeki her piksel için,
CNN
tek bir ‘a’ ve ‘b’ değeri tahmin etmez. Bunun yerine, nicelleştirilmiş renk kovaları boyunca bir olasılık dağılımı çıkarır. Esasen şöyle der: ‘Bu piksel için, ‘canlı kırmızı kova #5’e ait olma olasılığı %70, ‘soluk kırmızı kova #2’ olma olasılığı %20, ‘kahverengimsi kova #12’ olma olasılığı %5’tir’ vb. - Belirsizliği Ele Alma: Bu olasılıksal yaklaşım, renk belirsizliğini doğası gereği ele alır. Bir nesne birden fazla renk olabiliyorsa (elma gibi), ağ, bu belirsizliği yansıtan birkaç farklı renk kovasına önemli olasılıklar atayabilir ve bunu donuk bir ortalamaya başvurmadan yapar.
- Canlı Renge Kod Çözme: Son adım, bu olasılık dağılımını her piksel için tek, belirli bir renge geri çevirmeyi içerir. Saf bir yaklaşım, en yüksek olasılığa sahip renk kovasını (mod) basitçe seçmek olabilir. Ancak, canlılığı teşvik etmek ve doygunluk azalması sorununu önlemek için, dağılımın tavlanmış ortalamasını (annealed mean) hesaplamak gibi teknikler kullanılır. Bu yöntem, daha az olası ancak daha renkli (daha yüksek doygunluklu) tahminlere daha fazla ağırlık verir, genel tahmin edilen dağılıma hala saygı duyarken canlılık lehine ‘eşitliği bozar’.
Bu sınıflandırma çerçevesi, özellikle renklendirme için kayıp fonksiyonunun (eğitim sırasında modelin performansını değerlendirmek için kullanılan metrik) dikkatli tasarımıyla birleştiğinde, modelin gri tonlama özellikleri ile olası renklerin dağılımı arasındaki karmaşık ilişkiyi öğrenmesini sağlar. Sonuç, yalnızca makul bir şekilde renklendirilmiş değil, aynı zamanda önceki regresyon tabanlı yöntemlerde genellikle eksik olan bir zenginliğe ve görsel çekiciliğe sahip görüntülerdir.
Kaputun Altına Bir Bakış: Pratik Bir Derin Öğrenme İş Akışı
Böyle sofistike bir CNN
‘i sıfırdan eğitmek, muazzam hesaplama kaynakları ve devasa veri kümeleri gerektiren anıtsal bir görev olsa da, önceden eğitilmiş modellerden yararlanmak bu teknolojiyi erişilebilir kılar. Python ve yaygın kütüphaneler kullanılarak uygulanan, görüntü renklendirme için önceden eğitilmiş bir derin öğrenme modelini (özellikle orijinal örnekteki gibi Caffe
çerçevesi kullanılarak oluşturulmuş bir model) kullanmanın kavramsal adımlarını inceleyelim.
1. Araç Setini Birleştirme:
Temel genellikle, veri bilimi ve yapay zekada popüler olan çok yönlü bir programlama dili olan Python’u içerir. Anahtar kütüphaneler önemli roller oynar:
NumPy
: Verimli sayısal işlemler için, özellikle görüntüleri temsil eden çok boyutlu dizileri işlemek için gereklidir.OpenCV
(cv2
): Bilgisayarlı görü görevleri için güçlü bir kütüphane. Görüntüleri okumak, yazmak, işlemek ve görüntülemek için fonksiyonlar sağlar ve kritik olarak,Caffe
,TensorFlow
vePyTorch
gibi çeşitli çerçevelerde eğitilmiş modelleri yükleyebilen ve çalıştırabilen bir Derin Sinir Ağı (DNN
) modülü içerir.Argparse
: Kullanıcıların görüntü dosyası yolu gibi girdi parametrelerini kolayca belirtmelerine olanak tanıyan kullanıcı dostu komut satırı arayüzleri oluşturmak içinstandart bir Python kütüphanesi.OS
: Farklı sistemlerde (Windows, macOS, Linux) çalışan dosya yollarını oluşturmak gibi temel işletim sistemi etkileşimleri için kullanılır.
2. Önceden Eğitilmiş Zekayı Edinme:
Sinir ağını tuğla tuğla inşa etmek yerine, renklendirme için zaten eğitilmiş bir ağı temsil eden dosyaları kullanırız. Bunlar tipik olarak şunları içerir:
- Model Mimarisi Dosyası (
.prototxt
-Caffe
için): Bu dosya sinir ağının yapısını tanımlar – katmanlar, türleri, bağlantıları ve parametreleri. Modelin planıdır. - Eğitilmiş Ağırlıklar Dosyası (
.caffemodel
-Caffe
için): Bu dosya, ağın kapsamlı eğitim süreci sırasında öğrendiği sayısal ağırlıkları içerir. Bu ağırlıklar, modelin gri tonlama özelliklerini renk olasılıklarına eşleme hakkında edindiği ‘bilgiyi’ kapsar. Damıtılmış zekadır. - Renk Nicelleştirme Verileri (
.npy
dosyası): BuNumPy
dosyası genellikle daha önce açıklanan sınıflandırma yaklaşımında kullanılan nicelleştirilmiş renk kovalarının merkez noktalarını saklar. Tahmin edilen renk olasılıkları için referans palet görevi görür.
Bu dosyalar, potansiyel olarak haftalarca veya aylarca güçlü donanımlar üzerinde yapılan eğitimin sonucunu temsil eder.
3. Renklendirme Motorunu Yükleme:
Gerekli dosyalar bulunduğunda, OpenCV
‘nin DNN
modülü, önceden eğitilmiş ağı belleğe yükleme mekanizmasını sağlar. cv2.dnn.readNetFromCaffe
fonksiyonu (veya diğer çerçeveler için eşdeğerleri), mimari ve ağırlık dosyalarını girdi olarak alır ve ağı başlatır, böylece çıkarım (yeni veriler üzerinde tahmin yapma süreci) için hazır hale getirir. .npy
dosyasındaki renk nicelleştirme noktaları da genellikle NumPy
kullanılarak yüklenir.
4. Ağ Bileşenlerinde İnce Ayar (Gerekirse):
Bazen, önceden eğitilmiş ağ içindeki belirli katmanların çıkarımdan önce küçük ayarlamalara ihtiyacı olabilir. Tartışılan sınıflandırma tabanlı renklendirme modeli bağlamında:
- Çıktı Katmanı Ayarlaması: ‘a’ ve ‘b’ kanal tahminlerini (örneğin, referans modelde
class8_ab
olarak adlandırılan) çıkarmaktan sorumlu son katmanın,.npy
dosyasındaki renk kova merkezleriyle açıkça yüklenmesi gerekebilir. Bu, ağın çıktı olasılıklarının önceden tanımlanmış renk paletine doğru şekilde eşlenmesini sağlar. Noktalar genellikle yeniden şekillendirilir ve katmanın ‘blob’larına (Caffe
‘nin veri kapları terimi) atanmadan önce uygun veri türüne (örneğin, float32) dönüştürülür. - Renk Yeniden Dengeleme: Başka bir katman (örneğin,
conv8_313_rh
), çıktıdaki farklı renkler arasındaki dengeyi etkilemek için ayarlanabilir, potansiyel olarak doygunluğu artırabilir veya eğitim sırasında öğrenilen yanlılıkları düzeltebilir. Bu genellikle katmanın blob’larını belirli öğrenilmiş değerlere (orijinal kodda bahsedilen2.606
değeri gibi, muhtemelen ampirik olarak veya eğitim sırasında türetilmiş) ayarlamayı içerir.
Bu adımlar, genel önceden eğitilmiş modeli, sınıflandırma yaklaşımını kullanarak renklendirme görevinin özel nüansları için uyarlar.
5. Girdi Görüntüsünü Hazırlama:
Girdi gri tonlamalı görüntünün sinir ağına beslenmeden önce birkaç ön işleme adımından geçmesi gerekir:
- Yükleme: Görüntü,
cv2.imread
kullanılarak belirtilen dosya yolundan okunur. Gri tonlamalı olsa bile,OpenCV
varsayılan olarak gri değeri kanallar arasında çoğaltarak 3 kanallı birBGR
görüntüsü olarak yükleyebilir. - Normalleştirme: Genellikle 0 ila 255 arasında değişen piksel değerleri, 255.0’a bölünerek genellikle 0.0 ila 1.0 gibi daha küçük bir aralığa ölçeklenir. Bu normalleştirme, ağın öğrenme ve çıkarım sürecini stabilize etmeye yardımcı olur.
- Renk Uzayı Dönüşümü: Görüntü,
cv2.cvtColor
kullanılarak varsayılanBGR
renk uzayındanCIELab
renk uzayına dönüştürülür. Bu, Parlaklık (L) kanalını izole etmek için çok önemlidir. - Yeniden Boyutlandırma: Çoğu önceden eğitilmiş
CNN
, sabit boyutta (örneğin,ImageNet
gibi veri kümelerinden etkilenen yaygın bir standart olan 224x224 piksel) girdi görüntüleri bekler.LAB
görüntüsü,cv2.resize
kullanılarak buna göre yeniden boyutlandırılır. Bu standardizasyon, ağın mimarisiyle uyumluluğu sağlar. - L Kanalı İzolasyonu ve Merkezleme: Parlaklık (L) kanalı, yeniden boyutlandırılmış
LAB
görüntüsünden çıkarılır. Genellikle, değerleri (LAB
‘da tipik olarak 0-100) daha sonra bir ortalama değer (örneğin, 50) çıkarılarak sıfır etrafında merkezlenir. Bu merkezleme, ağ performansını artırabilen başka bir yaygın uygulamadır.
Bu titizlikle önceden işlenmiş L kanalı artık ağa sunulmaya hazırdır.
6. Çıkarım Adımı: Renk Tahmini:
Sihrin gerçekleştiği yer burasıdır:
- Blob Oluşturma: İşlenmiş L kanalı (şimdi 2B bir dizi),
DNN
modülü (cv2.dnn.blobFromImage
) tarafından beklenen 4 boyutlu bir dizi formatı olan bir ‘blob’a dönüştürülür. Bu format tipik olarak toplu iş boyutu, kanallar, yükseklik ve genişlik için boyutları içerir. - İleri Geçiş (Forward Pass): Blob,
net.setInput
kullanılarak yüklenen ağın girdisi olarak ayarlanır. Ardından,net.forward()
yöntemi çağrılır. Bu, hesaplamayı tetikler: girdi verileri, öğrenilmiş ağırlıklar tarafından dikte edilen dönüşümlere uğrayarak ağın katmanlarından akar ve sonuçta tahmin edilen çıktıyı üretir. Renklendirme modelimiz için çıktı, tahmin edilen ‘a’ ve ‘b’ kanallarını (veya daha doğrusu, renk kovaları üzerindeki olasılık dağılımlarını) temsil eder. - Çıktı Yeniden Şekillendirme: Ağdan gelen ham çıktının, ‘a’ ve ‘b’ kanallarına karşılık gelen 2B uzamsal bir formata geri yeniden şekillendirilmesi ve transpoze edilmesi gerekir.
Ağ şimdi, girdi gri tonlamalı görüntüye dayanarak renk bilgisi için en iyi tahminini oluşturmuştur.
7. Renkli Görüntüyü Yeniden Oluşturma:
Son aşama, tahmin edilen renk bilgisini orijinal görüntü verileriyle birleştirmeyi içerir:
- Tahmin Edilen Kanalları Yeniden Boyutlandırma: Tahmin edilen ‘a’ ve ‘b’ kanallarının (şu anda ağ girdisiyle eşleşen 224x224 boyutunda olan)
cv2.resize
kullanılarak girdi görüntüsünün orijinal boyutlarına geri yeniden boyutlandırılması gerekir. Bu, renk bilgisinin orijinal görüntü yapısıyla doğru şekilde hizalanmasını sağlar. - Orijinal Parlaklığı Çıkarma: Kritik olarak, Parlaklık (L) kanalı, orijinal, tam boyutlu
LAB
görüntüsünden (yeniden boyutlandırmadan önce ön işleme sırasında oluşturulan) çıkarılır. Orijinal L kanalını kullanmak, yeniden boyutlandırılmış L kanalı kullanılsaydı bozulacak olan görüntünün orijinal ayrıntısını ve parlaklık yapısını korur. - Birleştirme (Concatenation): Orijinal L kanalı, renk kanalı ekseni boyunca yeniden boyutlandırılmış, tahmin edilen ‘a’ ve ‘b’ kanallarıyla birleştirilir (concatenate edilir). Bu, şimdi tahmin edilen renkle tam bir
LAB
görüntüsünü yeniden birleştirir. - Görüntülenebilir Formata Geri Dönüşüm: Sonuçtaki
LAB
görüntüsü, çoğu görüntü görüntüleme fonksiyonu (örneğincv2.imshow
) tarafından beklenen standart format olduğu içincv2.cvtColor
kullanılarakBGR
renk uzayına geri dönüştürülür. - Kırpma ve Ölçekleme:
BGR
görüntüsündeki piksel değerleri, şu anda normalleştirilmiş aralıkta (muhtemelen 0.0 ila 1.0), bu geçerli aralıkta kalmalarını sağlamak için kırpılır (değerler bazen tahmin süreci nedeniyle sınırları biraz aşabilir). Ardından, standart bir görüntü dosyası olarak görüntülemek veya kaydetmek için gereken standart 0-255 tamsayı aralığına geri ölçeklenirler.
8. Görselleştirme:
Son olarak, cv2.imshow
gibi fonksiyonlar, orijinal gri tonlamalı görüntüyü yeni renklendirilmiş karşılığıyla yan yana görüntülemek için kullanılabilir, bu da anında görsel karşılaştırmaya olanak tanır.
Süreci Yürütme:
Tipik olarak, bu adımları uygulayan bir betik komut satırından çalıştırılır. argparse
kurulumunu kullanarak, kullanıcı girdi gri tonlamalı görüntünün yolunu bir argüman olarak sağlar (örneğin, python colorize_image.py --image my_photo.jpg
). Betik daha sonra yükleme, ön işleme, çıkarım ve yeniden yapılandırma adımlarını yürütür ve sonuçta renklendirilmiş sonucu görüntüler veya kaydeder.
Önceden eğitilmiş modellerden ve güçlü kütüphanelerden yararlanan bu iş akışı, derin öğrenme renklendirmesinin karmaşık teorisini, monokrom görüntülere canlı, makul renkler ekleyebilen pratik bir araca dönüştürür ve geçmiş ile günümüz arasındaki boşluğu etkili bir şekilde kapatır.