Genkendelse af vartegn – udvikling og oplevelser – novatec blog

Landmark Recognition Challenge – Udvikling og oplevelser

I dette indlæg vil jeg dele mine oplevelser inden for Landmark Recognition Challenge of Kaggle. I denne artikel lærer du, hvordan du udvikler en maskinlæringsmodel til at genkende vartegn i billeder ud af 15k klasser. Kaggle-konkurrencer som landmærkegenkendelse i fremtiden. Jeg vil opsummere mine erfaringer i slutningen af ​​denne artikel. Du kan finde koden i dette arkiv.

Landmark Recognition Challenge

Indtil videre blev billedklassificeringsudfordringer (for eksempel ImageNet Large Scale Visual Recognition Challenge) holdt enkle med et lille antal klasser og en masse træningseksempler pr. Klasse. Landmark Recognition sætter nye standarder i billedklassificering med det største verdensomspændende datasæt til dato. Derudover et eller endda et par træningsbilleder. Til at begynde med er disse lyde vanskeligere end ældre udfordringer. Men der er to yderligere snags, der bringer Landmark Recognition Challenge til næste niveau:

  • Der er testbilleder med intet vartegn.
  • Der er testbilleder med mere end et vartegn.

Desuden ville det være bedre at forudsige et vartegnbillede, hvis forudsigelsesresultatet er for lavt. Jeg skrev min klassificering i en csv-fil til indsendelse. Denne fil skal indeholde en overskrift og have følgende format:

Baseret på den globale gennemsnitlige præcision (GAP), kaldet mikro gennemsnitlig præcision (microAP). Den endelige placering (på Kagglers sprog: "Leaderboard") oprettes på grundlag af GAP-værdien. Hvis du vil vide mere om GAP-metrikken, skal du klikke her.

Forarbejdning af data

Til denne konkurrence downloadede jeg følgende to datasæt:

  • train.csv: 1.225.029 csv-rækker med URL’er til at træne billeder mærket med deres tilhørende vartegn
  • test.csv: indeholder indeholder 117.703 csv-rækker med URL’er til test af billeder

Som tidligere sagt kan testbillederne muligvis ikke have et vartegn, et vartegn eller mere end et vartegn. Træningsbillederne viser hver et vartegn. Hvert billede indeholder en unik id, URL’en og det mærkede landemærke-id.

Træne datasæt med id, URL og landmark_id

I testdatasættet indeholder hvert billede en unik id og billedets URL.

Test datasæt med id og URL

Som du kan se, er jeg nødt til at downloade billederne først, før jeg kan bruge dem. I den første prøveversion downloadede jeg billederne i fuld opløsning (over 350 GB data). Så jeg besluttede at ændre størrelsen på dem. Derefter lagrede jeg dem i en opløsning på 128 x 128 pixels, hvilket reducerede størrelsen til 15 GB.

Tog- og testbillederne fås i samme størrelse nu. Vi har nu vores forarbejdningstrin til testdataene. Men vi kender ikke etiketten for hvert billede i togdataene. Derfor oprettede jeg et script, der forbereder til hver vartegn klasse og tildeler de relaterede billeder til disse mapper. Nu har vi 15.000 mapper, en til hver etiket.

Modellering med Keras og Transfer Learning

Til min landemærkegenkendelsesmodel besluttede jeg at klassificere billederne ved hjælp af et indbygget neuralt netværk (i dette tilfælde: VGG16), der er foruddannet på Google ImageNet-datasættet. Keras-biblioteket indeholder forskellige typer CNN-arkitekturer som den anvendte VGG16. To andre typer ville være for eksempel ResNet eller Inception. 1.000 forskellige kategorier af dagligdags ting, såsom arter af hunde, katte, forskellige typer husholdningsgenstande, køretøjstyper og så videre. ImageNet-datasættet inkluderer alle disse daglige objekter. For at klassificere landemærket anvender vi ‘transfer learning’ strategi, såsom ekstraktion og finjustering, og bruger den til foruddannet på ImageNet datasæt. Under træningen frøs vi de første 15 lag af CNN’erne, så netværket kan lære om billederne uden for ImageNet datasætets billeder.

VGG16-arkitektur (Kilde: toronto.edu)

Netværksarkitekturen af ​​VGG16 er i papiret fra Simonyan og Zisserman i 2014 (papir).

’16’ betyder, at der er 16 lag forbundet i denne CNN. Der er forresten en VGG med 19 lag. Dets navn er selvfølgelig VGG19. Standardindgangsstørrelsen for denne model er 224 x 224. Jeg har dog ændret opløsningen til 128 x 128 pixels for bedre ydelse.

Flaskehalsfunktioner

Lad os nu springe ind i kode, og lad os se, hvilke trin. Flaskehalsfunktioner (dvs. de sidste aktiveringskort før de fuldt forbundne lag i den originale model). Derefter træner jeg et lille fuldt tilsluttet netværk på flaskehalsfunktionerne, så vi får klasserne som output til vores problem. Følgende flaskehalsfunktioner i VGG16. Desuden bruger jeg en ImageDataGenerator til at omskalere billederne (fuld kode: her)

Træna topmodellen

Når flaskehalsfunktionerne er gemt, er jeg nu klar til at træne vores topmodel. Jeg definerer en funktion til det, kaldet ‘train_top_model ()’. Jeg opretter et lille fuldt tilsluttet netværk ved hjælp af flaskehalsfunktioner som input. CNN, fordi det ville ødelægge de lærte vægte i den indviklede base. Som en konsekvens af dette vil vi bare være i stand til at begynde at finjustere en trænet topniveauklassifikator.

Finjustering

Denne model fungerer endnu ikke, fordi vægterne stadig er vægterne af ImageNet – som konklusion skal vi finjustere den. Ved siden af ​​klassifikatoren på øverste niveau finjusterer vi de to sidste indviklede dele og fryser de første 15 lag. Først skal vi lægge den gamle vægt og opbygge den indviklede base af VGG16. 15. Vi bruger også augmentation til træningsbillederne (detaljeret information i Haukes blogindlæg: her). En ‘fit_generator’ hjælper med at tilføje dataene til vores RAM i batches. Uden det ønsker du at få ‘out-of-memory-error’.

uddannelse

Denne del om brugen af ​​en GPU i denne sammenhæng. Træning af en CNN får en big time boost med en GPU eller endda flere GPU’er. Så for denne Landmark Recognition Challenge besluttede jeg at gå til EC2 Instance of AWS, som allerede har en Tesla K80 GPU integreret. I slutningen fik jeg en valideringsnøjagtighed på næsten 80 procent og et tab på ca. 0,9, hvilket er en stor succes. Selv hvis du bruger en GPU, tager træningen flere dage. Det er ikke noget nyt, at VGG16 er meget udfordrende på grund af dens dybde. Når du kombinerer dette med en masse data workout varighed Øger umådeligt. CPU ville være et kedeligt job &# 128.512;

Træning af CNN – terminalvisning

Forudsigelse

Nu er vi klar til at videregive vores testbilleder gennem netværket. Jeg har en vartegneklasse fra 1 til 15.000 og den relaterede forudsigelsesscore for denne klassificering. Jeg har allerede sammensat en indsendelsesfil, da jeg allerede har nævnt overskriften ‘The Landmark Recognition Challenge’.

Hvilket vartegn?

Det er vigtigt at bemærke, at dette trin ignoreres. Først og fremmest forudsiger jeg klassemærket, som ville være den rigtige løsning. Differentieringen, hvis der endda er et vartegn eller ej, vil jeg se i det næste forudsigelsestrin. Imidlertid viser jeg i det følgende koden til forudsigelse af etiketten:

For at forudsige vartegn er vi nødt til at køre gennem den samme rørledning som før. Jeg forudsiger forudsigelser fra det indviklede neurale netværk. Derefter afkoder jeg forudsigelser og kort. Og husk at rydde Keras-sessionen efter hver løb!

Er forudsigelsen korrekt?

Hvordan bestemmer du for eller imod det forudsagte vartegn? Svaret kaldes DELF (DEP Local Features). Som navnet antyder, er det en metode til at udtrække lokale funktioner fra billeder og sammenligne dem. I vores tilfælde hjælper DELF med at matche to billeder, der indeholder det samme vartegn og til at opnå lokal billedkorrespondance. Så det passer perfekt til milepælgenkendelse. DELF blev nyligt udviklet og introduceret i denne artikel.

DELF-arkitektur (kilde: DELF-papir)

Arkitekturen indeholder en mekanisme, der er trænet til at vælge funktioner med den højeste score (gul). På højre side af DELF-rørledningen bruges til at finde nogle matcher mellem et forespørgselsbillede og nogle databasebilleder. Indekset understøtter forespørgsler ved at hente nærmeste nabo (NN) -funktioner. Derudover er billedets korrespondencer baseret på geometrisk verificerede matchninger.

For eksempel illustrerer billedet herunder de visualiserede funktionskorrespondenser mellem to billeder. Det specifikke ‘vartegn’ skal være vores NovaTec hovedkontor i Leinfelden-Echterdingen.

DELF-kampe – hovedkontor NocaTec

Implementering af DELF

Det tager tre trin for at identificere et forudsagt vartegn i et testbillede. Du kan finde dem i mit lager.

  1. Uddragsfunktioner: DELF-ekstraktion danner en billedliste
  2. Find kampe: Sammenligning af funktioner for at få kampene
  3. Bestem resultatet: Beslutning, eftersom det fra mange korrespondenter (inliers) vartegn er sandt

Når vi har oprettet DELF-funktionerne, er det eneste, vi skal gøre, at finde matcherne mellem disse funktioner. Som nævnt gør vi dette med geometrisk verifikation i Ransac. Gennem de returnerede ‘inliers’ kan jeg måle DELF-korrespondancerne. Det betyder, at der er en værdi, der er højere end 35 indeholder det forudsagte vartegn.

Når vi sætter alt sammen får vi en rørledning som vist nedenfor.

Fuld rute for anerkendelse af vartegn

Vi starter med at klassificere testbilledet i en vartegn klasse. Vi tjekker den givne klasse med DELF-funktionerne ved at udtrække billederne fra den klassificerede vartegnmappe. Hvis 20 sammenligninger løb igennem, eller tærskelværdien af ​​inlier (35) blev overskredet, returneres et resultat. Resultatet kan være klassificeret som et vartegn eller intet vartegn.

Lærede lektioner

Under udviklingen af ​​min landemærke-pipeline og min deltagelse i Kaggle Landmark Recognition Challenge lærte jeg et par ting.

Det første punkt vedrører tilgængeligheden af ​​min hardwarearkitektur. Det er vigtigt at have nok hukommelse til rådighed og en stærk processor. Du beskæftiger dig med en masse data. I mit tilfælde havde jeg kun en hukommelse på 50 GB på min virtuelle maskine, så jeg besluttede at minimere opløsningen af ​​mine billeder. Men med højere opløsning kunne landmærkegenkenderen fungere bedre. Et træningstrin tager cirka tre dage på en GPU. Hvis du har flere GPU’er til rådighed, kan du multiprocessere din ansøgning på disse GPU’er. Din træningsproces ønsker at være hurtigere, og du kan gentage oftere for at optimere din ansøgning.

En Kaggle Challenge tager cirka tre måneder. I de fulde tre måneder skal du koncentrere dig om at optimere dit maskinlæringsresultat. Du vil have en stor ulempe, hvis du beslutter at deltage i en udfordring midt i varigheden. De andre deltagere vil altid være et skridt foran.

Fokuser ikke for meget på én modelløsning. Hvis du prøver mere end en løsning, kan du beslutte den bedste eller sammensætte flere teknikker. Under min deltagelse fokuserede jeg på kun en løsning og prøvede at optimere den. Bagefter tror jeg, det ville være bedre at prøve andre strategier og teknikker.

Kommuniker med andre Kaggle-deltagere, eller deltag i et team for at dele ideerne. Udover nye ideer ville en anden fordel være tilgængeligheden af ​​mere computerkapacitet. Du kan opdele testdatasættet og levere resultaterne hurtigere.

Konklusion

Som du kan se, i min første Kaggle Challenge regnede jeg ud med en masse nye ting. Jeg håber, at du også accepterer disse forslag i din udfordring. Kaggle Challenges har den betydelige fordel at komme ind i emnet maskinlæring og få lidt økonomisk støtte, hvis du gør det godt.

En oversigt over min kode er her. Hvis der er spørgsmål, vil jeg gerne høre fra dig. Ellers kan jeg kun ønske dig meget sjov i din næste Kaggle Challenge!

Referencer

"Billedhentning i stor målestok med opmærksomme dybe lokale funktioner", Hyeonwoo Noh, Andre Araujo, Jack Sim, Tobias Weyand, Bohyung Han, Proc. ICCV’17

Related Posts

Like this post? Please share to your friends:
Christina Cherry
Leave a Reply

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: