İçeriğe atla

Krita için Hızlı Eskiz Eklentisine Yakından Bakış

Önceki Gönderi | 20 Aralık 2024 Cuma | Okuma süresi: 9 dakika |

Hızlı Eskiz Temizleme Eklentisi

Giriş

Bu projeye, kullanıcıların eskizleri mürekkeplemede yardımcı olacak bir araç sağlamayı amaçlayarak başladık. Araç, Simo’nun ve Sierra’nın 2016 yılında yayınladığı bir araştırma makalesine dayanıyor ve sinir ağlarını (günümüzde genellikle yapay zeka olarak anılıyor) kullanıyor. Intel ile ortaklaşa geliştirilen bu araç hâlâ deneysel olarak kabul edilse de şimdiden kullanabilir ve sonuçlarını görebilirsiniz.

Aşağıdaki bölümde, gerçek kullanım örnekleri ve eklentiden elde edilen sonuçlar yer almaktadır. Sonuçlar çeşitlilik göstermekle birlikte, soluk kalem eskizlerini fotoğraflardan çıkarmak, çizgileri temizlemek ve çizgi roman mürekkeplemesi gibi işlemler için kullanılabilir.

Araçta kullanılan modeli kendimiz eğittik. Veri kümesindeki tüm veriler, kullanıcıların bize kendi fotoğraflarını göndererek bu kullanım durumu için onay verdikleri bağışlardan oluşuyor. Başka bir veri kullanılmadı. Ayrıca, eklentiyi kullandığınızda işleme yerel olarak bilgisayarınızda gerçekleştirilir; internet bağlantısı gerekmez, herhangi bir sunucuya bağlanmaz ve bir hesap gerektirmez. Şu anda yalnızca Windows’ta ve Linux’ta çalışıyor; ancak macOS için de uyumlu hale getirmek üzere çalışıyoruz.

Kullanım Alanları

Eklenti, çizgileri birleştirerek güçlü siyah çizgiler oluşturur; ancak sonuçlar bulanık veya düzensiz olabilir. Bununla birlikte, birçok durumda, kalem eskizlerini çıkarmak için yalnızca “Düzeyler” süzgecini kullanmaktan daha iyi çalışır. Bulanıklığı azaltmak için eklentiyi kullandıktan sonra “Düzeyler” süzgecini kullanmanız faydalı olabilir. Eklenti, beyaz tuval ve gri–siyah çizgilerle en iyi şekilde çalışır. Fotoğraflanmış kalem eskizleri veya çok açık çizim çizgileri durumunda, eklentiyi kullanmadan önce de “Düzeyler” süzgecini kullanmak iyi bir fikir olabilir.

Fotoğraflanmış kalem eskizini çıkarmak

Bu, çizgileri çıkarmak için bir eskiz üzerinde Düzeyler süzgecinin kullanılmasının standart prosedürünün sonucudur (görselin gölgeyi almasıyla sonuçlanır):

sketch_girl_original_procedure_comparison_small

sketch_girl_original_procedure_comparison_small1843×1209 165 KB

Eskiz Tiar (KA profili) tarafından yapıldı.

Bu, SketchyModel (Düzeyler → eklenti → Düzeyler) ile eklentiyi kullanan prosedürdür:

sketch_girl_new_procedure_comparison_small

sketch_girl_new_procedure_comparison_small1843×2419 267 KB

Karşılaştırma (siyah çizgiler için):

sketch_girl_procedures_comparison_small

sketch_girl_procedures_comparison_small1920×1260 215 KB

Bir başka olası sonuç, daha güzel bir sonuçla sonuçlanan düzeyleri kullanarak siyah çizgileri zorlamadan eklentiyi durdurmaktır, sayfanın alt kısmını hala boş tutarken daha fazla kalem görünümü:

sketch_girl_after_plugin_small

sketch_girl_after_plugin_small1536×2016 161 KB

Çizgi Roman Gibi Mürekkeplemek


Bir adamın resmi, BeARToys tarafından yapıldı.

Burada yukarıdaki resimlerde çizgi roman tarzı mürekkeplemeyi görebilirsiniz. Özgüne kıyasla biraz bulanık olan sonuç, bir Keskinleştir süzgeci kullanılarak daha da geliştirilebilir. Ejderha David Revoy (CC-BY 4.0) tarafından çizildi.

Çizgileri Temizlemek

Yaptığım eskiz örnekleri ve eklentinin sonucu, eklentinin güçlü ve zayıf noktalarını gösteriyor. Aşağıdaki resimlerin tümü SketchyModel kullanılarak yapılmıştır.

flower_001

flower_0011209×739 46.5 KB

flower_001_detail

flower_001_detail681×456 22.1 KB

portrait_man_portrait_2_comparison_2_small

portrait_man_portrait_2_comparison_2_small1305×505 139 KB

portrait_man_portrait_2_detail

portrait_man_portrait_2_detail646×1023 26.6 KB

Yukarıdaki resimlerin tümü Tiar (KA profili) tarafından yapıldı.

Aşağıdaki resimlerde, balıkların ölçeklerinde, modelin daha hafif çizgileri nasıl ayırt ettiğini ve daha güçlü çizgileri nasıl geliştirdiğini ve ölçekleri daha belirgin hale getirdiğini görebilirsiniz. Teoride bunu Düzeyler süzgecini kullanarak yapabilirsiniz; ancak pratikte sonuçlar daha kötü olacaktır; çünkü model çizginin yerel gücünü dikkate alır.


fish_square_sketchy_comparison_small1920×968 156 KB

Balık resmi Christine Garner (portföy) tarafından yapıldı.

Krita’da Nasıl Kullanılır

Krita’da Hızlı Eskiz Temizleme eklentisini kullanmak için şu adımları izleyin:

  1. Krita’yı Hazırlayın:
    1. Windows üzerinde:
      1. Ya tek bir pakette: Hızlı Eskiz Temizleme eklentisini içeren Krita 5.3.0-prealpha sürümünü indirin: https://download.kde.org/unstable/krita/5.3.0-prealpha-fast-sketch/krita-x64-5.3.0-prealpha-cdac9c31.zip
      2. Ya da ayrı olarak:
        1. Krita 5.2.6 (veya benzer bir sürümü; yine de çalışır) sürümünün taşınabilir olanını indirin.
        2. Hızlı Eskiz Temizleme eklentisini ayrı olarak buradan indirin: https://download.kde.org/stable/krita/FastSketchPlugin-1.0.2/FastSketchPlugin1.0.2.zip
        3. Dosyanın paketini krita-5.2.6/ klasörüne açın (klasör yapısını bozmayın).
        4. Sonra “Ayarlar → Krita’yı Yapılandır → Python Eklentisi Yöneticisi” sayfasına gidip Hızlı Eskiz Temizleme eklentisini etkinleştirip Krita’yı yeniden başlatın.
    2. Linux üzerinde:
      1. AppImage’i indirin: https://download.kde.org/unstable/krita/5.3.0-prealpha-fast-sketch/krita-5.3.0-prealpha-cdac9c31c9-x86_64.AppImage
  2. (İsteğe Bağlı) Aygıtınızda NPU varsa NPU sürücülerini kurun (çok yeni bir Intel CPU’nuz varsa yalnızca Linux üzerinde gereklidir): Intel® NPU with OpenVINO™ — OpenVINO™ belgelendirmesi (Not: Eklentiyi CPU veya GPU üzerinde çalıştırabilirsiniz, NPU elzem değildir).
  3. Eklentiyi çalıştırın:
    1. Gri–beyaz vuruşlarla beyaz bir tuval açın veya oluşturun (eklentinin geçerli katmanın değil tuvalin geçerli projeksiyonunu alacağını unutmayın).
    2. “Araçlar → Hızlı Eskiz Temizleme” yolunu izleyin.
    3. Modeli seçin. Gelişmiş seçenekler sizin için kendiliğinden seçilir.
    4. İşlemeyi bitirene değin bekleyin (iletişim kutusu kendiliğinden kapanır).
    5. Sonucu içeren yeni bir katman oluşturduğunu görün.

İşlem Önerileri

Çoğu durumda SketchyModel.xml kullanılması daha iyi sonuç verir. Bu model genellikle SmoothModel.xml’den daha etkili çalışır.

Arka planın oldukça parlak olduğundan ve sonuçta korunmasını istediğiniz çizgilerin nispeten koyu olduğundan emin olun (örneğin, biraz koyu gri veya siyah; açık gri çizgiler birçok eksik çizgiyle sonuçlanabilir). İşlem öncesinde Düzeyler (Levels) gibi bir süzgeç kullanmak iyi bir fikir olabilir.

İşlemden sonra, sonuçları iyileştirmek için Düzeyler veya Keskinleştir (Sharpen) süzgeçlerini kullanmayı düşünebilirsiniz.

Teknoloji ve Bilimsel Arka Planı

Özgün Gereksinimler

İlk özgün gereksinim, her boyuttaki tuvalde çalışması gerektiğiydi. Bu, ağın, birçok görüntü işleme sinir ağında yaygın olan (belirli bir giriş boyutu gerektiren ve pikselin konumuna bağlı olarak farklı sonuçlar üreten) yoğun/tam bağlantılı doğrusal katmanlara sahip olmaması gerektiği anlamına geliyordu. Bunun yerine, yalnızca her piksel için aynı sonucu üreten konvolüsyonlar, havuzlama ya da benzeri katmanlar kullanıldı. Neyse ki, 2016 yılında yayımlanan Simo ve Sierra makalesi tam olarak böyle bir ağı tarif ediyordu.

Bir diğer zorluk, onların oluşturduğu modeli kullanamamamızdı; çünkü bu, Krita’nın lisansıyla uyumlu değildi. Hatta onların tarif ettiği tam model türünü bile kullanamadık; çünkü bu model dosyalarından biri Krita kadar büyük olabilirdi ve eğitimi çok uzun sürebilirdi. Biz, en az aynı derecede iyi çalışacak, ancak Krita’yı iki kat büyütmeden eklenebilecek kadar küçük bir şey istiyorduk. (Teorik olarak, diğer bazı şirketler gibi işleme işlemini bir tür sunucuda gerçekleştirebilirdik; ancak bu, istediğimiz bir şey değildi. Bu, bazı sorunlarımızı çözse bile kendi büyük zorluklarını da beraberinde getirecekti. Ayrıca, kullanıcılarımızın internet veya sunucularımıza bağımlı olmadan yerel olarak kullanabilmesini istiyorduk.) Dahası, modelin makul derecede hızlı ve RAM/VRAM tüketimi açısından da mütevazı olması gerekiyordu.

Bunun yanı sıra, kullanabileceğimiz bir veri setimiz yoktu. Simo & Sierra, beklenen görüntülerin tamamının sabit bir çizgi genişliği ve saydamlıkla çizildiği bir veri seti kullanmıştı; bu da eğitimin sonuçlarının bu özelliklere sahip olduğu anlamına geliyordu. Biz, çizgi genişlikleri değişen veya çizgilerin uçlarında yarı saydamlık bulunan, elle çizilmiş gibi görünen bir şey istiyorduk; bu nedenle, veri setimizin bu tür görüntüleri içermesi gerekiyordu. Lisans ve veri toplama süreciyle ilgili gereksinimlerimizi karşılayan herhangi bir veri seti bilmediğimiz için kendi topluluğumuzdan yardım istedik. Bu konuda Krita Artists’te açılan tartışma başlığını buradan okuyabilirsiniz: https://krita-artists.org/t/call-for-donation-of-artworks-for-the-fast-line-art-project/96401.

Tam veri kümemize ait bağlantıyı aşağıdaki Veri Kümesi bölümünde bulabilirsiniz.

Model Mimarisi

Tüm ana katmanlar ya konvolüsyonel ya da (modelin sonunda) dekonvolüsyoneldir. Son katman hariç her (de)konvolüsyonel katmandan sonra bir ReLu aktivasyon katmanı bulunmaktadır; son konvolüsyon katmanından sonra ise bir sigmoid aktivasyon katmanı yer alır.

Kullanılan Python Paketleri: Pillow, Numpy, PyTorch ve Openvino

Numpy, her türlü dizi ve ileri düzey dizi işlemleri için standart bir kitaplıktır. Görselleri okumak, bunları numpy dizilişlerine dönüştürmek ve yeniden geri dönüştürmek için Pillow kullandık. Eğitim sürecinde PyTorch kullanılırken, Krita eklentisinde ağdan geçiş işlemleri (inference) için Openvino kullanılmıştır.

Çıkarım İçin NPU Kullanımı


Aşağıdaki tablo, Intel’in Python paketi Openvino ile birlikte sunulan bir araç olan benchmark_app’in sonuçlarını göstermektedir. Bu araç, modeli rastgele veriler üzerinde izole bir şekilde sınar. Gördüğünüz gibi, NPU, aynı makinedeki CPU’dan birkaç kat daha hızlıydı.

Öte yandan, NPU’nun kullanılması bir zorluk getirdi: NPU üzerinde çalışabilen modeller yalnızca statik modellerdir, yani model dosyasına kaydedilirken giriş boyutu bilinmelidir. Bu sorunu çözmek için eklenti önce tuvali model dosyasına bağlı olarak belirli bir boyuttaki daha küçük parçalara böler, ardından tüm parçaları işler ve sonunda sonuçları birleştirir. Birleştirme alanlarının yakınında eserlerin (artifacts) oluşmasını önlemek için tüm parçalar biraz kenar boşluğu ile kesilir ve bu kenarlar daha sonra kesilerek çıkarılır.

Kendi Modelinizi Eğitmek

Kendi modelinizi eğitmek için bazı teknik becerilere, resim çiftlerine (girdi ve beklenen çıktı) ve güçlü bir bilgisayara ihtiyacınız olacak. Ayrıca sabit diskinizde oldukça fazla alan gerekebilir; ancak alan sıkıntısı yaşamaya başladığınızda eski ve gereksiz modelleri silebilirsiniz.

Sürücüler ve Hazırlık

Python3 ve şu paketleri kurmanız gerekecek: Pillow, Openvino, Numpy, Torch. Modelin kuantizasyonu için ayrıca nncf ve sklearn paketlerine gereksinim duyabilirsiniz. Eğer başka bir şey eksik olursa hata alırsınız; bu durumda eksik paketleri kurun.

Eğer Windows kullanıyorsanız büyük olasılıkla NPU ve ayrık GPU için sürücüler zaten kuruludur. Linux kullanıyorsanız NPU’yu kullanabilmek için sürücüleri kurmanız gerekebilir: https://docs.openvino.ai/2024/get-started/configurations/configurations-intel-npu.html.

Ayrıca, eğitimi CPU yerine iGPU üzerinde yapmak isterseniz (bu işlem CPU’dan hâlâ önemli ölçüde hızlı olabilir), PyTorch’un bir "XPU" cihazını (iGPU) kullanmasını sağlayan IPEX gibi bir araç kullanmanız gerekebilir. Ancak bu yöntem sınanmamıştır ve önerilmez; çünkü kişisel olarak Python sürümüm talep edilen sürümden daha yüksek olduğu için bunu kullanamadım. Yönergeler burada: https://pytorch-extension.intel.com/installation?platform=gpu&version=v2.5.10%2Bxpu.
Kurulumun sağlıklı olup olmadığını denetlemek için şu komutu çalıştırabilirsiniz:
python3 -c "import torch; import intel_extension_for_pytorch as ipex; print(f'Packages versions:'); print(f'Torch version: {torch.__version__}'); print(f'IPEX version: {ipex.__version__}'); print(f'Devices:'); print(f'Torch XPU device count: {torch.xpu.device_count()}'); [print(f'[Device {i}]: {torch.xpu.get_device_properties(i)}') for i in range(torch.xpu.device_count())];"
Bu komut, 0’dan fazla aygıtı temel özellikleriyle göstermelidir.

Eğer XPU aygıtını çalıştırmayı başarırsanız eğitim betiklerini düzenlemeniz gerekebilir: https://intel.github.io/intel-extension-for-pytorch/xpu/latest/tutorials/getting_started.html (betiklerin en üstüne şu satırı eklemeniz yeterli olabilir:
import intel_extension_for_pytorch as ipex
çalıştırırken aygıt adı olarak “xpu” kullanmanız gerekir. Ancak daha önce de belirtildiği gibi, bu betikler XPU üzerinde sınanmamıştır. Ayrıntılar için şu kılavuza göz atabilirsiniz: Intel Extension for PyTorch — Başlangıç Kılavuzu.

Veri Kümesi

Modelinizi eğitebilmek için bazı resimlere ihtiyacınız olacak. Bu resimler çiftler halinde olmalı ve her çift bir eskiz (girdi) ve bir çizim (beklenen çıktı) içermelidir. Veri kümesinin kalitesi ne kadar yüksekse sonuçlar da o kadar iyi olur.

Eğitimden önce veriyi artırmanız en iyisidir: Bu, resimlerin döndürülmesi, büyütülmesi veya küçültülmesi ve yansıtılması anlamına gelir. Şu anda veri artırma betiği, resimleri tersine çevirme işlemini de gerçekleştirir. Bunun nedeni, tersine çevrilmiş resimlerle yapılan eğitimin sonuçları daha hızlı getirebileceği varsayımıdır (siyahın sıfır, yani sinyal yok anlamına gelmesi ve bunun arka plan olarak kullanılmasını istediğimiz için; böylece modeller çizgileri öğrenir, çizgilerin çevresindeki arka planı değil).

Veri artırma betiğinin nasıl kullanılacağı, eğitimle ilgili ayrıntılı yönergelerde açıklanmıştır.

İşte kullandığımız veri kümesi (kullanmak isterseniz lisansı dikkatlice okuyun): https://files.kde.org/krita/extras/FastSketchCleanupPluginKritaDataset.zip

Model ve Diğer Parametrelerin Seçimi

Tez sonuçlar için tooSmallConv modelini kullanabilirsiniz; daha fazla zaman ve özkaynak ayırabiliyorsanız typicalDeep daha iyi bir seçenek olabilir. Güçlü bir GPU makinesine erişiminiz varsa,original veya originalSmaller modellerini deneyebilirsiniz. Bu modeller, 2016 yılında Simo ve Sierra tarafından SIGGRAPH makalesinde tanımlanan modelin özgününü ve daha küçük bir sürümünü temsil eder.

Eniyileyici olarak adadelta kullanın.

Kayıp işlevi olarak blackWhite veya mse kullanılabilir. mse klasik bir seçenektir, ancak blackWhite daha hızlı sonuçlar elde edilmesine yardımcı olabilir. Bunun nedeni, tam beyaz veya tam siyah alanlardaki göreceli hatayı azaltmasıdır (beklenen çıktı resmine dayanarak).

Eğitim

  1. https://invent.kde.org/tymond/fast-line-art (33869b6 işlemesi) konumundaki depoyu klonlayın.
    git clone https://invent.kde.org/tymond/fast-line-art.git

  2. Sonrasında klasörü hazırlayın:

    • Eğitim için yeni bir klasör oluşturun.
    • Klasörde şu komutu çalıştırın:
      python3 [depo klasörü]/spawnExperiment.py --path [yeni klasöre olan yol, mutlak veya göreceli] --note "[deney üzerine olan notunuz]"
  3. Veriyi hazırlayın:

    • Var olan bir artırılmış veri kümeniz varsa tüm verilerinizi data/training/ ve data/verify/ klasörlerine yerleştirin. Eşli resimler, ink/ ve sketch/ alt klasörlerinde tam olarak aynı adlada sahip olmalıdır. Örneğin: sketch.png → sketch/ alt klasörüne ve ink.png → ink/ alt klasörüne.
    • Artırılmış veri kümeniz yoksa:
      1. Ham verinizi data/raw/ klasörüne yerleştirin. Eşli resimlerin adları ink_ veya sketch_ öneki ile aynı olmalıdır. Örneğin: picture_1.png → sketch_picture.png ve picture_2.png → ink_picture.png
      2. Veri hazırlama betiğini çalıştırın:
        python3 [depo klasörü]/dataPreparer.py -t taskfile.yml
        Bu işlem, ham veriyi artırılmış bir şekilde hazırlayarak eğitimin daha başarılı olmasını sağlar.
  4. taskfile.yml dosyasını düzenleyin. Değiştirilebilecek en önemli alanlar:

    • Model türü: tinyTinier, tooSmallConv, typicalDeep veya tinyNarrowerShallow seçilebilir.
    • Eniyileyici: adadelta veya sgd kullanın.
    • Öğrenme hızı: Kullanılıyorsa sgd için öğrenme hızı.
    • Kayıp işlevi: mse ortalama kare hatasını; blackWhite ise mse tabanlı ancak piksel değerleri 0,5’e yakın olanlarda daha küçük bir kayıp verir.
  5. Eğitim kodunu çalıştırın:
    python3 [depo klasörü]/train.py -t taskfile.yml -d "cpu"

    Linux üzerinde arka planda çalıştırmak için sonuna “&” ekleyin. Ön planda çalışıyorsa Kontrol+C yaparak veya arka planda ise süreç kimliğini bulup (“jobs -l” komutuyla veya “ps aux | grep train.py” ile çıkan ilk sayı süreç kimliğidir) onu “kill [süreç kimliği]” komutuyla eğitimi duraklatabilirsiniz. Sonuçlarınız yine klasörde olacaktır ve aynı komutla eğitimi sürdürebileceksiniz.

  6. Modeli bir openvino modeline dönüştürün:
    python3 [depo klasörü]/modelConverter.py -s [girdinin boyutu, 256 önerilir] -t [girdi modeli adı, pytorch üzerinden] -o [openvino modeli adı, .xml ile bitmelidir]

  7. Hem .xml hem .bin model dosyalarını Krita özkaynakları klasörüne diğer modellerin yanına koyun (pykrita/fast_sketch_cleanup alt klasörü) ve eklentide kullanın.