Objektdetektion med YOLO: implementeringer og hvordan man bruger dem

Dette er en engelsk oversættelse af historien skrevet på spansk, som jeg udgav for et par måneder siden: https://medium.com/@monocasero/detecci%C3%B3n-de-objetos-con-yolo-implementaciones-y-como- usarlas-c73ca2489246
EDIT: Jeg er færdig med det første trin for trin-tutorial om træning af YOLO med Darkflow: https://medium.com/@monocasero/detecting-custom-objects-in-images-video-using-yolo-with-darkflow-1ff119fa002f

De fleste af Machine Learning-projekterne, som vi overvejer i det firma, jeg for nylig tiltrådte, involverer på en eller anden måde en slags objektdetektion. Objektdetektion i billeder betyder ikke kun at identificere, hvilken type objekt der er inkluderet, men også lokalisere det inde i billedet (få koordinaterne for den "afgrænsningsboks", der indeholder objektet). Med andre ord detektion = klassificering + lokalisering.

Eksempel på resultatet af objektdetektion

Heldigvis havde jeg tid nok til at tilbringe de første uger af mit nye job med at undersøge den nyeste teknik i systemer og algoritmer til objektdetektion. Som stort set enhver form for problem for nylig tog alle veje mig til Deep Learning. Efter at have sammenlignet adskillige alternativer, besluttede jeg mig for at uddybe YOLO som min første mulighed, hovedsageligt fordi det er grundigt forklaret i kurset om Convolutional Neural Networks (CNN), som jeg har studeret de sidste par måneder i Coursera (https: // www. deeplearning.ai/), og selvfølgelig også på grund af navnet;).

Se http://cv-tricks.com/object-detection/faster-r-cnn-yolo-ssd/ for en god sammenligning af de forskellige algoritmer.

YOLO: Du ser kun én gang

Uden at komme meget ind i detaljer (jeg vil gerne skabe en anden historie om detaljerne om, hvordan det fungerer), vil jeg fokusere på de forskellige implementeringer og hvordan man bruger dem. YOLO (Du ser kun én gang) bruger dyb læring og indviklede neurale netværk (CNN) til objektdetektion, det skiller sig ud fra sine “konkurrenter”, fordi navnet, som navnet antyder, kun skal “se” hvert billede én gang. Dette tillader YOLO at være en af ​​de hurtigste detektionsalgoritmer (naturligt ofre en vis nøjagtighed). Takket være denne hurtighed kan YOLO registrere objekter i realtid (op til 30 FPS).

For at udføre detekteringen er billedet opdelt i et gitter med SxS (venstre billede). Hver af cellerne vil forudsige N mulige "afgrænsningsbokse" og niveauet for sikkerhed (eller sandsynlighed) for hver enkelt af dem (billede i midten), det betyder, at SxSxN-bokse beregnes. Langt de fleste af disse bokse har en meget lav sandsynlighed, det er grunden til, at algoritmen fortsætter med at slette de bokse, der er under en bestemt tærskel for minimumssandsynlighed. De resterende felter føres gennem en "ikke-maksimal undertrykkelse", der vil fjerne mulige duplikatobjekter og således kun efterlade det mest nøjagtige af dem (billede til højre).

På det tidspunkt, hvor dette skrives, har YOLO gennemgået tre iterationer, hver af dem er en gradvis forbedring i forhold til den foregående. Du kan kontrollere hver enkelt af artiklerne:

  • Den oprindelige. Du ser kun én gang: Unified, Real-Time Object Detection https://arxiv.org/pdf/1506.02640.pdf
  • Den anden version. YOLO9000: Bedre, hurtigere, stærkere https://arxiv.org/pdf/1612.08242.pdf (Ja, navnet er inspireret af Daft Punk-sangen!)
  • Den tredje version. YOLOv3: En gradvis forbedring https://pjreddie.com/media/files/papers/YOLOv3.pdf

implementeringer

I øjeblikket er der 3 hovedimplementeringer af YOLO, hver af dem med fordele og ulemper

  1. Darknet (https://pjreddie.com/darknet/). Dette er den "officielle" implementering, oprettet af de samme mennesker bag algoritmen. Det er skrevet i C med CUDA, derfor understøtter det GPU-beregning. Det er faktisk en komplet neurale netværksramme, så den kan virkelig bruges til andre mål udover YOLO-detektion. Ulempen er, da det er skrevet fra grunden (ikke baseret på en etableret neurale netværksramme), kan det være vanskeligere at finde svar på fejl, du måtte støde på (skete for mig mere end én gang).
  2. AlexeyAB / darknet (https://github.com/AlexeyAB/darknet). Her snyder jeg faktisk lidt, fordi det faktisk er en gaffel af Darknet, der understøtter Windows og Linux. Jeg har faktisk ikke brugt denne, men jeg har kontrolleret README mange gange, det er en fremragende kilde til at finde tip og anbefalinger om YOLO generelt, hvordan man forbereder dit træningssæt, hvordan man træner netværket, hvordan man forbedrer objektet afsløring osv.
  3. Darkflow (https://github.com/thtrieu/darkflow/). Dette er porten til Darknet til at arbejde over TensorFlow. Dette er det system, jeg har brugt mest, hovedsageligt fordi jeg startede dette projekt uden at have en GPU til at træne netværket og tilsyneladende at bruge CPU-kun Darkflow er flere gange hurtigere end det originale Darkent. AFAIK den største ulempe er, at den ikke er blevet opdateret til YOLOv3.

Alle disse implementeringer kommer “klar til brug”, hvilket betyder, at du kun behøver at downloade og installere dem for at begynde at registrere billeder eller videoer med det samme ved hjælp af allerede trænede vægte, der kan downloades. Naturligvis vil denne detektion være begrænset til klasser indeholdt i datasættene, der bruges til at opnå denne vægt.

Som du kunne forvente, er den sande magt ved alle disse implementeringer, at du kan træne dem til at opdage nye klasser. Som de fleste af maskinlæringsproblemer er en af ​​de første problemer enten at skaffe eller oprette vores eget datasæt.

Oprettelse af datasættet til at træne nye klasser

Et træningssæt til YOLO består af en serie billeder, hver skal have en tekstfil, der angiver koordinaterne og klassen for hvert af de objekter, der findes i billedet (jeg kan tilføje, det er muligt og endda tilrådeligt at tilføje nogle billeder med ingen objekter overhovedet).

Desværre ser det ud til, at der lige nu ikke er nogen standard for, hvordan man repræsenterer disse oplysninger. Med andre ord forventer hvert system et andet format til at repræsentere afgrænsningsboksen og klassen for hvert objekt:

  • Darknet bruger en meget enkel tekstfil med følgende format:
[kategorienummer] [objektcenter i X] [objektcenter i Y] [objektbredde i X] [objektbredde i Y]
  • Darkflow forventer annoteringer i det samme format af PASCAL VOC-datasættet, det er det, der bruges af ImageNet. Er en xml-fil som følgende eksempel:

 map_text / billeder 
 _ATRP_0001_003_001.JPEG 

 608 
 608 
 3 

 0 

 map_text 
 center 
 1 
 0 

 6 
 318 
 97 
 409 



Værktøjer til at oprette træningssættet

Der er flere værktøjer, der kan bruges til at oprette kommentarer til hvert af de billeder, der vil være en del af træningssættet. Dette betyder at manuelt indikere “afgrænsningsfeltet”, der indeholder hver enkelt af objekterne i billedet og angive, til hvilken klasse objektet hører til.

  • Yolo Mark (https://github.com/AlexeyAB/Yolo_mark). Oprettet af de samme mennesker bag Windows-gaffelen. Gemmer annotationerne i det format, der forventes af Darknet.
  • LabelImg (https://github.com/tzutalin/labelImg). Gemmer annotationerne i PASCAL VOC-formatet, det, der bruges naturligt af Darkflow.
  • BBox-Label-Tool (https://github.com/puzzledqs/BBox-Label-Tool). Gemmer annotationerne i et format, der så vidt jeg ved, ikke er naturligt brugt af nogen af ​​YOLO-implementeringerne. Desuden tillader mastergrenen ikke flere klasser pr. Billede.

Desværre, efter en tutorial (som ellers er fantastisk), startede jeg (og næsten færdig) oprettelsen af ​​mit træningssæt ved hjælp af BBox-Label-Tool, så jeg måtte også skrive python-scripts for at konvertere til de formater, der bruges af Darknet eller Darkflow (Jeg tjekker med mit firma, om vi kan åbne kildekoden til disse scripts og lægge dem i github eller noget lignende).

EKSTRA

  • Enriqueav / BBox-Label-Tool (https://github.com/enriqueav/BBox-Label-Tool). Jeg har oprettet en gaffel af BBox-Label-værktøj, der gemmer annotationerne i PASCAL VOC-formatet (til Darkflow). Desværre baserede jeg min gaffel på mastergrenen i stedet for multiklassegren, så den kun kan arbejde for en enkelt klasse pr. Billede.

Jeg planlægger en mere detaljeret tutorial, trin for trin, hvordan man bruger Darkflow, fra oprettelsen af ​​træningssættet, træning, validering, almindelige fejl osv.

Mere information, referencer:

Coursera specialisering i Deep Learning:

  • https://www.coursera.org/specializations/deep-learning

Om indviklede neurale netværk:

  • http://cs231n.github.io/convolutional-networks/

Tutorials om træning af darknet:

  • https://timebutt.github.io/static/how-to-train-yolov2-to-detect-custom-objects/
  • http://guanghan.info/blog/en/my-works/train-yolo/