Techniek gebruikt machine learning om zwart-witvideo in te kleuren

Een Reddit-gebruiker wist met louter kunstmatige intelligentie een zwart-witvideo van kleur te voorzien. De methode die hij gebruikte is eigenlijk bedoeld om zwart-witfoto's in te kleuren en werd eerder deze week gepresenteerd door een Japans onderzoeksteam.

De redditor, mar_cnu, liet de techniek los op een trailer van een Franse film uit 1964 getiteld La 317ème Section of 'De 317de Divisie', een film over een Franse militaire divisie die vast komt te zitten in vijandig gebied aan het eind van de Eerste Indochinese Oorlog.

De toegepaste techniek, die onderzoekers van de Waseda University uit Tokio ontwikkelden, kan zwart-witfoto's op realistische manier inkleuren zonder tussenkomst van mensen. Het team maakt daarvoor gebruik van zogenaamde convolutional neural networks, een machinelearningtechniek die is geïnspireerd op de visuele cortex van dieren.

Hoewel de techniek bij foto's uitstekend presteert, laat zij in het filmpje nog te wensen over. Vooral het invullen van kleuren bij close-ups zorgt voor problemen waarbij beelden eerder een specifieke kleur krijgen dan dat er nog sprake is van kleurverschillen. Bij overzichtsshots van de jungle werkt het beter.

Bij de foto's was het gebruik van kunstmatige intelligentie voor het inkleuren niet geheel nieuw, maar eerst was er vaak nog wel een referentiefoto nodig om tot het juiste kleurgebruik te komen of konden alleen bepaalde categorieën foto's goed ingekleurd worden.

De code voor het inkleuren van zwart-witfoto's is te vinden op GitHub, zo kan iedereen zijn oude familiefoto's van een kleurtje voorzien.

Bron: Waseda University

Door Krijn Soeteman

Freelanceredacteur

29-04-2016 • 10:42

55 Linkedin

Reacties (55)

55
55
35
7
0
11
Wijzig sortering
Ze gebruiken nu foto's waarbij je nooit kunt controleren hoe dicht ze bij de echte kleur in de buurt komen. Ik zou wel eens willen zien wat ze ervan maken als je een kleurenfoto naar grijswaarden photoshopt weer door dit proces heen haalt.
De code voor het inkleuren van zwart-witfoto's is te vinden op GitHub, zo kan iedereen zijn oude familiefoto's van een kleurtje voorzien.
Dat vindt ik nog wel meevallen hoor, daar kom ik zo 1,2,3 niet uit :X
Ze gebruiken nu foto's waarbij je nooit kunt controleren hoe dicht ze bij de echte kleur in de buurt komen. Ik zou wel eens willen zien wat ze ervan maken als je een kleurenfoto naar grijswaarden photoshopt weer door dit proces heen haalt.
Dat is precies hoe een neuraal netwerk getraind wordt. Het netwerk laat je 'oefenen' met materiaal waarvan bekend is wat de uitkomst moet zijn: je pakt een set kleurenfoto's die je degradeerd naar zwartwit/grijswaarden. Vervolgens laat je het netwerk trainen om zo goed mogelijk de originelen te benaderen. Het moeilijke zit hem in het vinden van een goede representatieve trainingsset en een goed optimalisatiealgoritme. De rest is een kwestie van number crunching.
Hoewel je uitleg over de werking inderdaad klopt, vrees ik dat dit in de praktijk niet gaat werken voor dit voorbeeld.
Als je verschillende foto's gaat omzetten naar grijswaarden op dezelfde manier, dan kan het zijn dat hij zichzelf gaat aanleren om bepaalde herkenningspunten op te zoeken in de grijswaarden (bvb. bepaalde grijswaarden combinaties die overeenkomen met een bepaalde kleur)

Bij foto's is dit natuurlijk niet het geval. De grijswaarden daar hangen af van hoeveel licht er op het diafragma terecht kwam tijdens het nemen van de foto. De afzonderlijke pixels (na het inscannen van de foto) zijn dus veel willekeuriger dan een kleurenfoto die is omgezet met photoshop.

Om het programma te laten werken moeten ze het dus aanleren om vormen en objecten te leren herkennen. (bijvoorbeeld grassprietjes groen, en gezichten roze)
Het is inderdaad een wat versimpelde uitleg, vandaar ook mijn opmerking:
Het moeilijke zit hem in het vinden van een goede representatieve trainingsset en een goed optimalisatiealgoritme.
Juist de trainingsset en optimalisatie bepalen de uiteindelijke vorm van het neurale netwerk. Zonder referentie kan je het netwerk niet trainen, dus dat zal je zelf moeten verzorgen.
Waar het netwerk precies naar gaat kijken hangt enorm af van de optimalisatie (wat is een goede overeenkomst en hoe 'beloon' je het netwerk hiervoor?). Dat is niet perse alleen kijken naar kleur, maar ook naar intensiteit, overgangen, randen enz. Het idee van een neuraal netwerk is juist dat het zelf deze verbanden dient te leren; wij kunnen dingen voorkauwen maar dat is vrijwel nooit compleet. Vandaar dat het eindresultaat ook valt of staat met je trainingsset. Het verkrijgen/bedenken van een goede trainingsset is overigens vaak ook de grootste horde om dit soort dingen in de praktijk (buiten dit soort proof-of-concept onderzoeken) toe te gaan passen.
Je kan misschienhet netwerk ook trainen door deze te vertellen van goed/fout is (begint met paarse gezighten, leert dat het een andere tint dient te zijn, gras was blauw etc etc?)
Het draait bij neurale netwerken allemaal om het versterken/groeien van verbindingen tussen de nodes (neuronen). Dat werkt meestal niet op basis van goed/fout maar meer statistisch gebaseerd. Doorgaans werk je ook niet met één meting voor de fout maar met meerdere variabelen. In dit geval moeten bijvoorbeeld zowel kleurtint, verzadiging en helderheid zo goed mogelijk overeen komen met het origineel. Je geeft dan bijvoorbeeld gewichten mee aan de fouten: in dit geval zou ik me voor kunnen stellen dat kleurtint belangrijker is dan de helderheid en verzadiging (een paars gezicht met goede helderheid en verzadiging is een slechtere uitkomst dan een gezicht met de goede kleurtint maar net iets te licht of te donker).

Hier staan nog wel wat interessante voorbeelden met korte animaties over neurale netwerken: http://natureofcode.com/book/chapter-10-neural-networks/
Een goed getraind neuraal netwerk vereist kennis bij de onderzoekers. Wat jij beschrijft kan inderdaad gebeuren als je de zwart-wit conversie te simpel doet. Maar voeg er wat dithering aan toe, wat ruis, en het resultaat verbetert spectaculair.
Ik ben daar ook wel benieuwd naar wat het resultaat nou echt is. Zeker omdat het lua script amper 50 regels lang is.
zit om ook niet in die 50 regeltjes, maar in de 600mb additionele download; http://hi.cs.waseda.ac.jp/~iizuka/data/colornet.t7
die je via sh download_model.sh met wget binnen haalt
op hun website staat een afbeelding die wat meer duidelijkheid geeft

[Reactie gewijzigd door himlims_ op 29 april 2016 11:57]

Je hebt helemaal gelijk.
Ik heb het script inmiddels draaiende onder Ubuntu maar kan nog niet zeggen dat ik dezelfde geweldige resultaten terug krijg zoals in de voorbeelden hierboven. Foto's worden geel.
Het is een neuraal netwerk, en blijkbaar bestaat er voor lua een module om neurale netwerken te simuleren.
Het neurale netwerk zelf moet vooraf gedownload worden, en dat is 600MB groot.

Het werk van het trainen van het netwerk is dan blijkbaar al gedaan door de japanse onderzoekers.
Overigens is dat een perfecte manier om een grote trainingsset te genereren: kleurenfoto's naar grijswaarden omzetten. Natuurlijk maken oude camera's geen perfecte grijze foto's, maar je zou van één kleurenfoto meerdere conversies (zwart-wit, beetje gelig etc. )kunnen genereren en die allemaal aan de trainingsset toevoegen.
Ik zou wel eens willen zien wat ze ervan maken als je een kleurenfoto naar grijswaarden photoshopt weer door dit proces heen haalt.
Dat lijkt me een interessante manier voor de AI om te leren: Het hele internet downloaden (google images oid bedoel ik dan), converteren naar zwartwit, en de kleurenfoto gebruiken ter referentie om van te leren.

En dan nog eens die trailer inkleuren. :)
Klinkt goed, maar wel eerst alle 'rare' bewerkte foto's uitfilteren voor zover dat mogelijk is...
Ik heb het net even uitgetest (toegegeven: het installeren was niet bepaald appeltje eitje. Het script zelf niet persé, maar binnen de dependencies liep er wel een en ander mis, waardoor ik veel manueel heb moeten uitzoeken).
Had hier nog een hele hoop oude foto's liggen, en heb het programma er op los gelaten. Op de meeste is het resultaat matig tot slecht (meestal omdat de foto wazig is, maar soms ook om een reden die ik niet meteen kan verklaren). Maar soms lukt het eigenlijk wel vrij goed. Heb enkele foto's die heel mooi zijn ingekleurd, en waar hij echt perfect de kleuren kan onderscheiden. (Bijvoorbeeld groene blaadjes onderscheiden van een blauwe lucht).
Wat hij soms wel doet is kleuren overnemen van een naburige kleur als hij niet weet welke kleur hij aan iets moet geven. Personen die in het gras zitten bijvoorbeeld hebben soms een groen gezicht of groen haar. Ook de kleur van kledij neemt hij soms gewoon over van wat er in de buurt te vinden is.

Sommige foto's (vooral binnenshuis foto's heb ik de indruk) kleurt hij niet, maar maakt hij gewoon een sepia foto van. Geen idee hoe dat komt.

[Reactie gewijzigd door Opifex op 29 april 2016 14:43]

Kan dat niet veel makkelijker? Een kleurenfoto kun je eenvoudig omzetten naar zwart-wit dus het lijkt me dat elke kleur correspondeert met een bepaalde grijswaarde. Is dat proces niet op de een of andere manier om te keren?
Bij het omzetten van kleur naar grijs verlies je informatie. Je behoud namelijk wel de helderheidsinformatie, maar verliest de tint en kleurtemperatuur. Daarom kan je het niet zomaar terugzetten.
Nee, omdat de grijs-waarden (256 ervan) op verschillende manieren samengesteld kunnen worden.

De veelgebruikte formule voor Luminosity (lichtwaarde) is: L = 0.21 R + 0.72 G + 0.07 B. (zie hier: http://www.johndcook.com/...-convert-color-grayscale/ )

Dus het terugrekenen is niet zo eenvoudig. B.v. L = 0.5 kan komen door 1R, 0.06G en 1B of door 0R, 0.66G 0B.
Daarmee kom je wel een heel eind maar het feit dat er meer kleurtinten dan grijstinten zijn geeft al aan dat er informatie mist en dat er een bepaalde mate van gokken in het inkleuren zit.
Het klopt dat er informatie mist. Je zou je gras blauw kunnen verven, een zwart-wit foto nemen, en dit algoritme zou je blauwe gras weer groen inkleuren. De missende informatie is dat jij je gras blauw hebt geverfd.

Alleen, hoe vaak gebeurt dat nou? Zoveel paarse coca-cola blikjes zijn er niet, zoveel groene bakstenen ook niet.
maar de kleur die het moet zijn is ook niet duidelijk. Jij ziet het gras in die foto die op een bijzonder zonnige dag genomen is, als groen. Maar misschien was het die dag helemaal niet zo zonnig, eerder zwaar bewolkt, en zag het gras er qua kleur eerder gelig uit ;)

Kleur is een naar iets eigenlijk wat van een hele berg factoren afhankelijk is.

http://www.ted.com/talks/...illusions_show_how_we_see laat met wat simpele dingen zien dat het gras niet perse groen moet zijn om jouw brein (of het mijne zo je wil) te laten geloven dat het harstikke groen is :)
Nee, want het is niet één op één. Meerdere verschillende kleuren leveren dezelfde grijswaarden op. Uit die ene grijswaarden kun je dus nooit achterhalen welke kleur het echt was. Echter, je kunt wel een gebiedje in de RGB kleurenruimte aangeven van kleuren die het mogelijk geweest kunnen zijn - en dan op basis van vergelijkbare kleurenfoto's bepalen wat de meest waarschijnlijk kleur (binnen dat gebiedje) is geweest. Heb het onderzoek niet gelezen, maar vermoed dat ze wel zo iets toepassen (impliciet of expliciet).

[Reactie gewijzigd door casparvl op 29 april 2016 10:49]

Anoniem: 463321
@casparvl29 april 2016 10:59
Hooguit per foto. Hetzelfde grijs kan op de ene foto groen gras zijn en op een andere foto de blauwe lucht en op weer een andere de huidskleur.
Pak maar eens een zwart-wit foto en maak deze donkerder of juist lichter en je ziet meteen het effect van veranderende grijswaarden.
Het is een convolutioneel netwerk, dus je hebt dan een redelijk idee. Dit soort netwerken is bijvoorbeeld behoorlijk goed in het herkennen van textures. Bijvoorbeeld het patroon van gras of wolken in de lucht. In dat geval kan het netwerk dus gokken dat het gras groen ingekleurd moet worden, en de grijswaarde bepaalt dan of het donker- danwel lichtgroen wordt. En in de lucht gebruik je blauw voor de lucht zelf, terwijl de wolken van gewoon grijs blijven.
Een duif is een vogel, maar niet alle vogels zijn duiven. Dat geld, voor zover ik weet, ook met kleuren tov grijswaardes. Daarom is er wel degelijk intelligentie en slimme inschattingen nodig om dergelijke zwart-wit foto's/video's in te kleuren.
Verschillende kleuren met een gelijke helderheid krijgen dezelfde grijswaarde.
Anoniem: 463321
@SomerenV29 april 2016 10:48
Nee, niet elke grijswaarde betekent ook altijd dezelfde kleur. Er komt wel meer bij kijken dan kleur alleen, namelijk ook de belichting.
Nee, dat is niet zo. Kleur bestaat digitaal uit RGB waardes en die informatie is echt kwijt op het moment dat je de foto omzet naar zwart-wit. Volgens mij is het zelfs dat een RGB waarde van 256,0,0 dezelfde intensiteit oplevert in zwart-wit dan 0,256,0.

In photoshop kun je de RGB informatie nog wel gebruiken om een zwart-wit foto te pimpen, maar dat is alleen maar omdat je dus de kleurenfoto tot je beschikking hebt.
Best indrukwekkend ondanks dat het nog niet perfect is.

Ik denk dat van kleur naar zwart/wit aanzienklijk makkelijker is dan andersom. Hoe moet zo'n AI nou weten welke kleur iets heeft? Denk aan kleren, van kleur naar Z/W worden deze bijvoorbeeld grijs maar hoe moet zo'n systeem dan bepalen of het bijvoorbeeld blauw of groen hoort te zijn? (de cammouflage kleur groen op de kleding van die gasten in het filmpje, had even goed donkerblauw kunnen zijn als de overal van een automonteur)
Dat zou je denken, maar dat zou ook betekenen dat er net zoveel zwart- / wit- / grijstinten bestaan als alle andere kleuren bij elkaar en dat lijkt me onmogelijk / paradoxaal. Hoe doe je dat dan bij Sepiafoto's, enz?... Nu wordt er wellicht bij moderne foto's die vanuit kleur zijn omgezet naar zwart-wit opgeslagen wat er met de kleur gebeurd is; of dat ook met direct in zwart-wi gemaakte foto's hetzelfde geval is; geen idee. Je denkt dat het wel moet kunnen, maar ik vermoed dat er aan jouw theorie nog wel wat haken en ogen zitten. Waarschijnlijk geven veel meer kleuren één-en-dezelfde grijstint, maar dat is ook een aanname van mij kant.
Een hash kun je ook makkelijk genereren, maar andersom is niet mogelijk ;)
Veel kleuren hebben jammer genoeg dezelfde grijswaarde als je het omzet naar zwart-wit. En dan is het nog maar de vraag of het bijvoorbeeld lichtblauw of donder rood is, ze hebben beide dezelfde grijswaarde.
Hoewel de techniek bij foto's uitstekend presteert, laat het in het filmpje nog te wensen over. Vooral het invullen van kleuren bij close-ups zorgt voor problemen waarbij beelden eerder een specifieke kleur krijgen dan dat er nog sprake is van kleurverschillen. Bij overzichtsshots van de jungle werkt het beter.
Dit begrijp ik niet, als je bij een video frame voor frame die filter er overheen draait, doe je het in feite allemaal op "een foto", namelijk het betreffende frame in de video. Als dat dan niet met elkaar klopt zodra ze achter elkaar geplakt worden, is het niet de video die de kleurverschillen maakt, maar het algoritme van de filler.
Waarschijnlijk is er in de close up te weinig informatie (bijvoorbeeld randen) om goed te kunnen herkennen wat zich in de foto bevindt.

Het kan ook zijn dat het algoritme met relatief veel overzichts scènes is getraind in verhouding met het aantal close up scènes.
Het effect wat je ziet in de video is een gevolg van de menselijke visuele waarneming.

Mensen kunnen een heleboel tinten groen onderscheiden. Maar in tegenstelling tot een absoluut gehoor heeft niemand een absoluut zicht. Genoeg mensen kunnen een toon herkennen als 440 Hz, maar niemand herkent kleur #22F036. Het gevolg is dus dat als je groen ingekleurd gras ziet, dat het al snel geloofwaardig lijkt. Gras varieert in het echt ook van kleur, geel als het uitdroogt, wat roder bij de ondergaande zon, maar we blijven het herkennen als groen.

Wat ons well opvalt is als gras opeens van kleur verschiet. Film is een nieuw frame elke 40 ms Als je elke 40 ms een andere tint groen ziet (omdat je nu eenmaal miljoenen verschillende kleuren kunt zien), dan valt dat erg op. Echt gras doet dat niet.
Indrukwekkend, vooral bij de foto's - check de waseda paper maar eens! Vwb de video, nu zijn ze als individuele frames ingekleurd, als het algoritme ook de temporale informatie (kortgezegd de volgorde vd frames en dus de onderlinge relaties) zou meenemen dan wordt het geheid al een stuk beter. En het zou ook gelijk een stuk sneller moeten gaan.
Inderdaad. Bij videocompressie wordt daar ook gebruik van gemaakt; ik denk dat dat hier ook een groot verschil kan maken. Het is vooral een kwestie van kleur koppelen aan positie, patroon, omliggende patronen, contrasten en helderheid. Door genoeg voorbeelddata aan te leveren wordt de herkenning vanzelf beter en door meerdere opvolgende frames te analyseren kun je eigenschappen van gebieden beter herkennen. Het verhoogt je resolutie eigenlijk. Er bestaan ook technieken om een scherpere foto van meerdere videoframes te maken.
Hoe interessant! Een geweldige techniek als je het mij vraagt.
Wellicht eens proberen op een Z/W HD film. De resultaten van de trailer komen niet in de buurt bij die van de foto's.
Heel tof. Jammer voor de mensen die de docu over WW2 handmatig hebben ingekleurd haha.
Het blijft er nep uit zien, veel wo2 materiaal is ingekleurd en je ziet meteen het verschil tussen echt kleur filmmateriaal uit de jaren 40 en zwart/wit materiaal wat ingekleurd is.

[Reactie gewijzigd door danielik op 29 april 2016 10:50]

Anoniem: 463321
@danielik29 april 2016 11:02
Net zoals alles in huidige bioscoopfilms er nep uit ziet, slechte CGI enzo. Na 100 jaar nog geen zak opgeschoten.
Er is niks mis het het huidige CGI, het wordt alleen verkeerd gebruikt. https://www.youtube.com/watch?v=bL6hp8BKB24
jawel tijdperk 1953-1998 is prima te doen. Niet teveel cgi en widescreen en kleur. Daarna is het rap bergafwaarts gegaan met wat ze films durven te noemen. Zeker toen ze in 2002 ook nog eens besloten om alles digitaal te gaan doen.
Jammer dat het linux only is, ik had het wel eens willen loslaten op mijn oude foto's.
Precies, is er een Windows alternatief?
ik ben zelf geen linux expert, maar misschien dat het wel werkend te krijgen is via bash voor windows 10(beschikbaar in de recente windows 10 previews)
Het is blijkbaar 50 regels Lua code om een 600 MB neuraal netwerk te laden. Die 600 MB is niet Linux-specifiek, en op zich draait Lua ook onder Windows. Dus dat klinkt niet als een onoverkomelijk probleem. Misschien wat filepaden fixen, wget voor Windows downloaden, etc.
Lijkt me dat het nooit helemaal natuurgetrouw wordt. Ik zou me zo voorstellen dat je voor elke scene een soort van ijkpunt moet hebben waaraan je de rest van de kleuren refereeert om zo dicht mogelijk bij de realiteit te komen. Ik denk dan aan bijvoorbeeld de kleur van lucht of van de militaire uniformen waarover je met enige zekerheid iets kan stellen.
Bijkomend probleem met oude film is dat waarschijnlijk ook de helderheid niet altijd even goed/stabiel is.

Goed, ik ben geen expert maar ik vind het wel een interessant verhaal.
Het is in elk geval veelbelovende techniek die vast bijdraagt op andere gebieden dan alleen dit specifiek voorbeeld.

Op dit item kan niet meer gereageerd worden.

Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee