Preskoči na vsebino

Poglabljanje v delovanje vstavka za hitro čiščenje skic v Kriti

Prejšnja objava | Petek, 20. december 2024 | Čas branja: 11 minut |

Vtičnik za hitro čiščenje skice

Uvod

Ta projekt smo začeli z namenom, da uporabnikom zagotovimo orodje, ki pomaga pri skiciranju s črnilom. Temelji na raziskovalnem članku avtorjev Simo & Sierra, objavljenem leta 2016, za delo pa uporablja nevronske mreže (zdaj običajno imenovane preprosto AI oz. UI). Orodje je bilo razvito v sodelovanju z Intelom in še vedno velja za eksperimentalno, vendar ga lahko že uporabljate in si ogledate rezultate.

V spodnjem razdelku je nekaj primerov uporabe iz resničnega življenja in rezultatov vstavka. Rezultati se razlikujejo, vendar ga lahko uporabite za izluščenje nežnih skic s svinčnikom iz fotografij, čiščenje črt in risanje stripov.

Kar zadeva model, uporabljen v orodju, smo ga usposobili sami. Vsi podatki v naboru podatkov so podarili ljudje, ki so nam sami poslali svoje slike in se dogovorili za ta poseben primer uporabe. Drugih podatkov nismo uporabili. Poleg tega, ko uporabljate vstavek, ta obdeluje podatke krajevno na vašem računalniku, ne zahteva nobene internetne povezave, se ne poveže z nobenim strežnikom in tudi račun ni potreben. Trenutno deluje samo v operacijskih sistemih Windows in Linux, vendar bomo delali na tem, da bo na voljo tudi na macOS-u.

Primeri uporabe

Povpreči črte v eno črto in ustvari močne črne črte, končni rezultat pa je lahko zabrisan ali neenakomeren. V mnogih primerih pa še vedno deluje bolje kot le uporaba filtra Ravni (npr. pri pridobivanju skice svinčnika). Morda bi bilo dobro uporabiti filter Ravni po uporabi vtičnika, da zmanjšate zabrisanost. Ker vstavek najbolje deluje z belim platnom in črno-sivimi črtami, je v primeru fotografiranih skic s svinčnikom ali zelo tankih črt skice morda dobra ideja, da uporabite Ravnin tudi pred uporabo vstavka.

Izvleček fotografirane skice s svinčnikom

To je rezultat standardnega postopka uporabe filtra Ravni na skici za izvleček črt (kar povzroči, da del slike dobi senco):

sketch_girl_original_procedure_comparison_small

sketch_girl_original_procedure_comparison_small1843×1209 165 KB

Skico je narisal Tiar (povezava na profil KA)

To je postopek z uporabo vtičnika s SketchyModel (Ravni → vstavek → Ravni):

sketch_girl_new_procedure_comparison_small

sketch_girl_new_procedure_comparison_small1843×2419 267 KB

Primerjava (za črne črte):

sketch_girl_procedures_comparison_small

sketch_girl_procedures_comparison_small1920×1260 215 KB

Drug možen rezultat je, da se preprosto ustavite pri vstavku, ne da bi vsilili črne črte z uporabo ravni, kar ima za posledico lepši videz svinčnika, medtem ko spodnji del strani ostane prazen:

sketch_girl_after_plugin_small

sketch_girl_after_plugin_small1536×2016 161 KB

Striparskemu podobno risanje s črnilom


Slika moškega, ki jo je ustvaril BeARToys

Tukaj na zgornjih slikah si lahko ogledate risanje s črnilom v stripovskem slogu. Rezultat, ki je v primerjavi z izvirnikom nekoliko zabrisan, je mogoče dodatno izboljšati z uporabo filtra Izostri. Zmaja je skiciral David Revoy (CC-BY 4.0).

Čiščenje črt

Primeri skic, ki sem jih naredil, in rezultat vstavka, ki prikazuje močne in šibke plati vstavka. Vse spodnje slike so bile narejene z uporabo SketchyModel.

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

Vse zgornje slike je naslikal Tiar (povezava do profila KA)

Na spodnjih slikah lahko na luskah rib vidite, kako model razlikuje svetlejše črte in krepi močnejše črte, zaradi česar so luske bolj izrazite. Teoretično bi to lahko storili s filtrom Ravnni, vendar bi bili v praksi rezultati slabši, ker model upošteva lokalno moč črte.


fish_square_sketchy_comparison_small1920×968 156 KB

Slika ribe, ki jo je izdelala Christine Garner (povezava do portfelja)

Kako ga uporabljati v Kriti

Če želite uporabiti vtičnik Fast Sketch Cleanup v Kriti, naredite naslednje:

  1. Pripravite Krito:
    1. V sistemu Windows:
      1. LAhko v enem paketu: prenesite Krita 5.3.0-prealpha z že vključenim vstavkom Fast Sketch Cleanup: https://download.kde.org/unstable/krita/5.3.0-prealpha-fast-sketch/krita-x64-5.3.0-prealpha-cdac9c31.zip
      2. Ali ločeno:
        1. Prenesite prenosno različico Krite 5.2.6 (ali podobno različico - bi morala še vedno delovati)
        2. Tukaj ločeno prenesite vstavek Fast Sketch Cleanup: https://download.kde.org/stable/krita/FastSketchPlugin-1.0.2/FastSketchPlugin1.0.2.zip
        3. Razpakirajte datoteko v mapo krita-5.2.6/ (ohranite strukturo map).
        4. Nato pojdite na Nastavitve → Prilagodi Krito → Upravitelj vstavkov Python, omogočite vtičnik Fast Sketch Cleanup in znova zaženite Krito.
    2. V Linuxu:
      1. Prenesite appimage: https://download.kde.org/unstable/krita/5.3.0-prealpha-fast-sketch/krita-5.3.0-prealpha-cdac9c31c9-x86_64.AppImage
  2. (Neobvezno) Namestite gonilnike NPU, če imate v napravi NPE (praktično potrebno samo v Linuxu, če imate zelo novo Intelovo CPE): prilagoditve za Intel® NPE z OpenVINO - dokumentacija OpenVINO™™ (opomba: še vedno lahko izvajate vstavek na CPE ali GPE, ne zahteva NPE)
  3. Zaženite vstavek:
    1. Odprite ali ustvarite belo platno s sivo-belimi potezami (upoštevajte, da bo vstavek prevzel trenutno projekcijo platna, ne trenutne plasti).
    2. Izberite Orodja → Hitro čiščenje skice / Fast Sketch Cleanup
    3. Izberite model. Napredne možnosti bodo samodejno izbrane za vas.
    4. Počakajte, da se obdelava konča (pogovorno okno se bo nato samodejno zaprlo).
    5. Poglejte, ali je z rezultatom ustvaril novo plast.

Nasveti za obdelavo

Trenutno je bolje uporabiti samo SketchyModel.xml, v večini primerov deluje bistveno bolje kot SmoothModel.xml.

Prepričati se morate, da je ozadje precej svetlo in da so črte, ki jih želite obdržati v rezultatu, razmeroma temne (bodisi nekoliko temno sive ali črne; svetlo siva lahko povzroči veliko spregledanih črt). Morda bi bilo dobro, da vnaprej uporabite filter, kot je Ravni.

Po obdelavi boste morda želeli izboljšati rezultate s filtrom »Ravni« ali »Izostri«, odvisno od rezultatov.

Tehnologija in znanost za tem

Edinstvene zahteve

Prva edinstvena zahteva je bila, da mora delovati na platnih vseh velikosti. To je pomenilo, da omrežje ne more imeti gosto / popolnoma ali gosto povezanih linearnih plasti, ki so zelo pogoste v večini nevronskih mrež za obdelavo slik (ki zahtevajo vnos določene velikosti in bodo proizvedle različne rezultate za isto slikovno točko, odvisno od lokacije), samo zvijanje ali združevanje ali podobne plasti, ki so proizvedle enake rezultate za vsako slikovno točko platna, ne glede na lokacijo. Na srečo je članek Simo & Sierra, objavljen leta 2016, opisal omrežje na ravno takšen način.

Še en izziv je bil, da nismo mogli zares uporabiti modela, ki so ga ustvarili, ker ni bil združljiv z dovoljenjem Krite, in nismo mogli niti uporabiti natančnega tipa modela, ki so ga opisali, ker bi bila ena od teh datotek modela skoraj tako velika kot Krita, usposabljanje pa bi trajalo zelo dolgo. Potrebovali smo nekaj, kar bi delovalo enako dobro, če ne celo bolje, vendar dovolj majhno, da bi lahko dodali v Krito, ne da bi bilo dvakrat večje (teoretično bi lahko naredili kot nekatera druga podjetja in obdelavo naredili na nekakšnem strežniku, vendar to ni bilo tisto, kar smo želeli. In tudi če bi rešil nekatera naša vprašanja, bi prineslo veliko svojih velikih izzivov; prav tako smo želeli, da bi funkcionalnost naši uporabniki lahko uporabljali krajevno, ne da bi se zanašali na naše strežnike in internet). Poleg tega je moral biti model razmeroma hiter in tudi skromen glede porabe RAM-a / VRAM-a.

Poleg tega nismo imeli nobenega nabora podatkov, ki bi ga lahko uporabili. Simo & Sierra sta uporabila nabor podatkov, kjer so bile pričakovane slike narisane s konstantno širino črte in prosojnostjo, kar je pomenilo, da so imeli tudi rezultati usposabljanja te lastnosti. Želeli smo nekaj, kar je videti nekoliko bolj ročno narisano, z različnimi širinami črte ali polprosojnimi konci črt, zato je moral naš nabor podatkov vsebovati tovrstne slike. Ker nismo vedeli za noben nabor podatkov, ki bi ustrezal našim zahtevam glede licence in postopka zbiranja podatkov, smo za pomoč prosili našo skupnost, tukaj si lahko preberete nit Krita Artists o tem: https://krita-artists.org/t/call-for-donation-of-artworks-for-the-fast-line-art-project/96401.

Povezavo do našega celotnega nabora podatkov najdete spodaj v razdelku Nabor podatkov.

Arhitektura modela

Vse glavne plasti so konvolucijske, ali dekonvolucijske (na koncu modela). Po vsaki (de)konvolucijski plasti, razen zadnje, je aktivacijska plast ReLu, po zadnji konvoluciji pa sigmoidna aktivacijska plast.

Uporabljeni paketi Python: Pillow, Numpy, PyTorch in Openvino

Numpy je standardna knjižnica za vse vrste polj in naprednih operacij matrik, Pillow pa smo uporabili za branje slik in njihovo pretvorbo v matrike numpy in nazaj. Za usposabljanje smo uporabili PyTorch, medtem ko smo v vstavku za Krito uporabili Openvino za sklepanje (obdelavo prek omrežja).

Uporaba NPE za sklepanje


V tej tabeli je prikazan rezultat benchmark_app, ki je orodje, ki je na voljo z Intelovim paketom python openvino. Model preizkuša ločeno na naključnih podatkih. Kot lahko vidite, je bil NPE večkrat hitrejši od CPE na istem računalniku.

Po drugi strani pa je uvedba NPE dodala izziv: edini modeli, ki lahko delujejo na NPE, so statični modeli, kar pomeni, da je vhodna velikost znana v času shranjevanja modela v datoteko. Da bi to rešili, vstavek najprej razreže platno na manjše dele določene velikosti (kar je odvisno od datoteke modela), nato pa nadaljuje z obdelavo vseh in končno združi rezultate. Da bi se izognili artefaktom na območjih poleg šiva, se vsi deli razrežejo z malo roba, rob pa se kasneje odreže.

Kako trenirati svoj model

Če želite uriti svoj model, boste potrebovali nekaj tehničnih veščin, pare slik (vhod in pričakovani izhod) in zmogljiv računalnik. Morda boste potrebovali tudi precej prostora na trdem disku, čeprav lahko preprosto odstranite nepotrebne starejše modele, če boste imeli težave s pomanjkanjem prostora.

Gonilniki in priprava

Namestiti boste morali Python3 in naslednje pakete: Pillow, openvino, numpy, torch. Za kvantizacijo modela boste potrebovali tudi nncf in sklearn. Če sem kaj pozabil, se bo pritožil, zato namestite tudi tiste pakete, ki jih omenja.

Če uporabljate Windows, imate verjetno gonilnike za NPE in namensko GPE. V Linuxu boste morda morali namestiti gonilnike NPE, preden jo boste lahko uporabljali: https://docs.openvino.ai/2024/get-started/configurations/configurations-intel-npu.html .

Poleg tega, če želite uporabiti iGPE za usposabljanje (ki je lahko še vedno bistveno hitrejši kot na CPE), boste verjetno morali uporabiti nekaj podobnega IPEX, ki omogoča PyTorchu uporabo naprave "XPU", ki je samo vaša iGPE. Ni preizkušen ali priporočen, ker ga osebno nisem mogel uporabiti, ker je bila moja različica Pythona višja, kot pričakuje navodilo, vendar je navodilo tukaj: https://pytorch-extension.intel.com/installation?platform=gpu&version=v2.5.10%2Bxpu .
Preverjanje ustreznosti namestitve je naslednje:
python3 -c »import torch; import intel_extension_for_pytorch as ipex; print(f'Različice paketov:'); print(f'Različica Torch: {torch.__version__}'); print(f’Različica IPEX: {ipex.__version__}'); print(f'Naprave:'); print(f'Število naprav Torch XPE: {torch.xpu.device_count()}'); [print(f'[Naprava {i}]: {torch.xpu.get_device_properties(i)}') for i in range(torch.xpu.device_count())];"
Prikazati mora več kot 0 naprav z nekaterimi osnovnimi lastnostmi.

Če vam uspe vzpostaviti delovanje naprave XPE na vašem računalniku, boste morali še vedno urediti skripte za usposabljanje, da jo bodo lahko uporabljali: https://intel.github.io/intel-extension-for-pytorch/xpu/latest/tutorials/getting_started.html (najverjetneje boste morali dodati samo to vrstico:
import Intel_extension_for_pytorch as IPEX
do skripta na samem vrhu, tik pod »import tor«ch, in uporabite "xpu" kot ime naprave, ko prikličete skript, in moralo bi delovati. Ampak, kot sem zapisal, scenariji za to niso bili preizkušeni.

Nabor podatkov

Potrebovali boste nekaj slik, da boste lahko urili svoj model. Slike morajo biti v parih, vsak par mora vsebovati skico (vhod) in črtno sliko (pričakovani izhod). Boljša kot je kakovost nabora podatkov, boljši so rezultati.

Pred vadbo je najbolje, da podatke povečate: to pomeni, da se slike zasukajo, povečajo ali zmanjšajo in zrcalijo. Trenutno skript za povečanje podatkov izvaja tudi inverzijo s predpostavko, da bi urjenje na barvno preobrnjenih slikah hitreje prineslo rezultate (glede na to, da črna pomeni nič, t.j. brez signala, in želimo si, da je to ozadje, tako da se modeli učijo črt, ne ozadja okoli črt).

Kako uporabljati skript za povečanje podatkov, je razloženo spodaj v podrobnih navodilih v delu usposabljanja.

Tukaj je nabor podatkov, ki smo ga uporabili (prosimo, pozorno preberite licenco, če jih želite uporabiti): https://files.kde.org/krita/extras/FastSketchCleanupPluginKritaDataset.zip

Izbor modela in drugih parametrov

Za hitre rezultate uporabite tudiSmallConv; če imate več časa in sredstev, je typicalDeep morda boljša ideja. Če imate dostop do računalnika z zmogljivejšo GPE, lahko poskusite original ali originalSmaller, ki predstavljajo izvirni opis modela iz članka SIGGRAPH Simo-Sierra 2016 in njegovo manjšo različico.

Uporabite adadelta kot optimizator.

Kot funkcijo izgube lahko uporabite blackWhite ali mse; mse je klasičen, vendar lahko blackWhite privede do hitrejših rezultatov, saj zmanjša relativno napako na popolnoma belih ali popolnoma črnih območjih (na podlagi pričakovane izhodne slike).

Usposabljanje

  1. Klonirajte skladišče na https://invent.kde.org/tymond/fast-line-art (na 33869b6)
    git clone https://invent.kde.org/tymond/fast-line-art.git

  2. Nato pripravite mapo:

    • Ustvarite novo mapo za usposabljanje.
    • V mapi zaženite:
      python3 [mapa skladišča]/spawnExperiment.py --pot [pot do nove mape, relativne ali absolutne] --note "[vaša osebna opomba o poskusu]"
  3. Pripravite podatke:

    • Če imate obstoječi razširjeni nabor podatkov, ga vstavite v data/training/ in data/verify/, pri čemer upoštevajte, da morajo imeti pari slik v podmapah ink/ in sketch/ popolnoma enaka imena (primer: če imate sketch.png in ink.png kot podatke, morate eno vnesti v sketch/ kot slika.png in drugo v ink/ kot slika.png, da jih upošteva kot par).
    • Če nimate obstoječega razširjenega nabora podatkov:
      1. Postavite vse neobdelane podatke v data/raw/, pri čemer ne pozabite, da morajo imeti slike v parih popolnoma enaka imena z dodano predpono ink_ ali sketch_ (primer: če je slika _1.png slika skice in slika _2.png slika s črnilom, ju morate poimenovati sketch_slika.png in ink_slika.png).
      2. Zaženite skript za pripravo podatkov:
        python3 [mapa skladišča]/dataPreparer.py -t taskfile.yml
        To bo povečalo podatke v neobdelani mapi, da bo usposabljanje uspešnejše.
  4. Uredite datoteko taskfile.yml po svoji meri. Najpomembnejši deli, ki jih morda želite spremeniti, so:

    • model type - kodno ime za vrsto modela, uporabite tinyTinier, tooSmallConv, typicalDeep ali tinyNarrowerShallow
    • optimizer - vrsta optimizatorja, uporabite adadelta ali sgd
    • learning rate - hitrost učenja za sgd, če ga uporabljate
    • loss function - kodno ime za funkcijo loss, uporabite mse za napako kvadratne srednje vrednosti ali blackWhite za funkcijo izgub po meri, ki temelji na mse, vendar je manjša za slikovne točke, kjer je ciljna vrednost slikovne točke slike blizu 0,5
  5. Zaženite kodo za usposabljanje:
    python3 [mapa skladišča]/train.py -t taskfile.yml -d "cpu"

    Če želite, da na Linuxu deluje v ozadju, dodajte na koncu »&«. Če se izvaja v ospredju, lahko usposabljanje zaustavite tako, da pritisnete krmilka+C, in če se izvaja v ozadju, poiščite id procesa (z ukazom »jobs -l« ali »ps aux | grep train.py«, bi bila prva izpisana številka id procesa) in ga ubijte z ukazom »kill [id procesa]«. Rezultati bodo še vedno v mapi in z istim ukazom boste lahko nadaljevali usposabljanje.

  6. Pretvorite model v model openvino:
    python3 [mapa skladišča]/modelConverter.py -s [velikost vhoda, priporočeno 256] -t [ime vhodnega modela, iz pytorch] -o [ime modela openvino, mora se končati z .xml]

  7. Postavite datoteke .xml in .bin modela v mapo z viri Krite (v podmapo pykrita/fast_sketch_cleanup) skupaj z drugimi modeli, da jih uporabite v vstavku.