Sådan trænes YOLOv2 til at registrere tilpassede objekter

yolo-tog med brugerdefineret objekt (ubuntu 16.04)

Mine krav:

OS: Ubuntu 16.04
Python version: 2.7
GPU: 1 gb

Det brugerdefinerede objekt, som vi vil registrere i denne artikel, er NFPA 704 'branddiamant'.

Datasættet, jeg sammensatte til denne artikel, kan findes her (19.4Mb).

Installation af Darknet

ubuntu: ~ $ git-klon https://github.com/AlexeyAB/darknet.git
ubuntu: ~ $ cd darknet

(Bemærk, at du vil have GPU, skal du følge trinnene. Vigtig GPU er nødvendig for at træne ellers ikke har brug for)

ubuntu: ~ $ vi Makefile

(Skift GPU 0 til 1 og gem det. Hvis du installerede openCV, skal du indstille OPENCV 0 til 1 ellers ikke)

ubuntu: ~ $ make

Hvis du har nogen fejl, kan du prøve at rette dem? Hvis alt ser ud til at være samlet korrekt, kan du prøve at køre det!

./darknet

Du skal få output:

brug: ./darknet 

Yolo Testing

Du har allerede konfigurationsfilen til YOLO i cfg / undermappen. Du skal downloade den foruddannede vægtfil her (258 MB). Eller bare køre dette:

wget https://pjreddie.com/media/files/yolo.weights

Kør derefter detektoren!

./darknet detekterer cfg / yolo.cfg yolo.weights data / dog.jpg

Du vil se nogle output som denne:

lag filtre input output output
    0 konv. 32 3 x 3/1 416 x 416 x 3 -> 416 x 416 x 32
    1 maks. 2 x 2/2 416 x 416 x 32 -> 208 x 208 x 32
    .......
   29 konv. 425 1 x 1/1 13 x 13 x1024 -> 13 x 13 x 425
   30 detektion
Indlæser vægte fra yolo.weights ... Udført!
data / dog.jpg: Forudsagt i 0.016287 sekunder.
bil: 54%
cykel: 51%
hund: 56%

Hvis du ønsker mere information om darknet, se venligst link

Datamarkering

Vigtigste ting for oprettelse af tekstfil med billeder (bare forstå følgende 2 trin)

  1. Opret .txt-fil for hver .jpg-image-fil - i det samme bibliotek og med samme navn, men med .txt-udvidelse, og sæt til fil: objektnummer og objektkoordinater på dette billede for hvert objekt i nyt linje:

Hvor:

  • - heltal af objekt fra 0 til (klasser-1)
  • - flydende værdier i forhold til billedets bredde og højde, det kan være lig fra 0,0 til 1,0
  • for eksempel: = / eller = /
  • opmærksomhed: - er midten af ​​rektanglet (er ikke øverste venstre hjørne)

For eksempel til img1.jpg skal du oprette img1.txt indeholdende:

1 0,716797 0,395833 0,216406 0,147222
0 0.687109 0.379167 0.255469 0.158333
1 0,420312 0,395833 0,140625 0,166667

Eksempel

Min billedstørrelse: 360 * 480 den har et objekt dvs. hund
image_width = 360
image_height = 480
absolut_x = 30 (hund x position fra billede)
absolut_y = 40 (hund y position fra billede)
absolut_højde = 200 (originalhøjde på hund fra billede)
absolut_bredde = 200 (original bredde på hund fra billede)

Den endelige tekstfil har. Det har fem args og alle fem args mellem 0 til 1

 ( / ) ( / ) ( / ) ( / )
dvs:
0 (30/360) (40/480) (200/360) (200/480)
0 0,0833 0,0833 0,556 0,417

YOLO-træning startede

Bemærk: Træne disse data med et objekt efter succes, start derefter dine egne eller tilpassede data (med flere objekter).
Jeg har annonceret nyt annotationsværktøj til dataanotation. Find det nye værktøjslink til dataforberedelse. Hvis dit brugte nye værktøj, skal du ikke køre main.py og convert.py i denne blog og flytte direkte til at køre process.py. Fordi de to python-filprocesser tager enkelt python-script. Læs den fulde beskrivelse video på en ny værktøj blog for hvordan du kører filen.

Download datasættet (med tekstfil) herfra.
Download datasættet (ingen tekstfil) herfra. Hvis du ikke downloader nogen tekstfil, kan du oprette tekstfilen ved hjælp af kommandoer nedenfor.
Download CODE fra github og link her
Se alle billeder fra Billeder / 001 (eksempler på billeder).

Sæt dine datasætbilleder til Billeder / 001 og kør under kommandoen
Kør main.py (se nedenstående video for, hvordan du kører main.py)

Opret den endelige txt-fil til YOLO ved hjælp af convert.py
python convert.py

BBox etiketværktøj:

[kategorienummer]
[afgrænsningsboks til venstre X] [afgrænsningsboks øverst Y] [afgrænsningsboks højre X] [afgrænsningsboks nederst Y]

YOLOv2-format:

[kategorienummer] [objektcenter i X] [objektcenter i Y] [objektbredde i X] [objektbredde i Y]

Konverteringen mellem disse to formater kan håndteres med dette Python-script (convert.py). Bare rediger linje 31 og linje 32 for at konfigurere både ind- og outputsti, og vi er gode til at gå.

Efter at have kørt convert.py

Store! Vi har nu en .txt-fil pr. Billede i træningssættet, der fortæller YOLOv2, hvor det objekt, vi vil registrere, er på: vores datasæt er fuldstændigt annoteret. Sørg for, at begge filtyper er i den samme mappe. Nedenstående billede illustrerer, hvordan mappen skal se ud nu:

Ok, vi kommer tæt på det punkt, hvor vores powerhouse GPU kan begynde at gøre noget alvorligt taleknusning. Dernæst skal vi fortælle YOLOv2, hvilke billeder der udgør vores faktiske træningssæt, og hvad der vil fungere som test sæt: test.txt og train.txt filerne. Jeg skrev et lille process.py Python-script, der vil oprette disse filer fra de billeder, der findes i det bibliotek, hvor det køres. Procentdelen af ​​billeder, der skal bruges til test, kan defineres ved at ændre variablen percentage_test. Jeg har ikke et GitHub-arkiv til mine YOLOv2-eksperimenter endnu, så jeg vil bare skrive scriptet her for nu. Path_data-variablen angiver, hvor billederne er placeret i forhold til den udførbare darknet.exe, rediger dette efter behov.

Forbered train.txt og test.txt ved hjælp af nedenstående python-fil (process.py), og sæt dit datasæt sti i linje 5

import glob, os
# Aktuelt bibliotek
aktuelle_dir = os.path.dirname (os.path.abspath (__ fil__))
print (current_dir)
current_dir = ''
# Procentdel af billeder, der skal bruges til testsættet
procentsats = 10;
# Opret og / eller trunker train.txt og test.txt
file_train = åben ('train.txt', 'w')
file_test = åben ('test.txt', 'w')
# Befolkning af train.txt og test.txt
tæller = 1
index_test = runde (100 / procent_test)
for pathAndFilename i glob.iglob (os.path.join (aktuelle_dir, "* .jpg")):
    title, ext = os.path.splitext (os.path.basename (pathAndFilename))
hvis tæller == indeks_test:
        tæller = 1
        file_test.write (current_dir + "/" + title + '.jpg' + "\ n")
    andet:
        file_train.write (current_dir + "/" + title + '.jpg' + "\ n")
        tæller = tæller + 1

Et lille uddrag fra filerne train.txt (venstre) og test.txt (højre):

Forberedelse af YOLOv2-konfigurationsfiler

YOLOv2 har brug for visse specifikke filer for at vide, hvordan og hvad de skal træne. Vi opretter disse tre filer. Jeg bruger 1 GB GPU. Så jeg bliver brugt small-yolo.cfg:

  • cfg / obj.data
  • cfg / obj.names
  • cfg / lille-yolo.cfg

Lad os først forberede filen YOLOv2 .data og .names. Lad os starte med at oprette obj.data og udfylde det med dette indhold. Dette siger dybest set, at vi træner en klasse, hvad tog- og valideringssætfilerne er, og hvilken fil indeholder navnene på de kategorier, vi vil registrere.

klasser = 1
tog = tog.txt
valid = test.txt
names = obj.names
backup = backup /

Obj.names ser sådan ud, almindelig og enkel. Hver ny kategori skal være på en ny linje, dens linjenummer skal matche kategorienummeret i .txt-etiketfilerne, vi oprettede tidligere.

NFPA

En sidste fil, vi er nødt til at forberede (jeg ved, magtfuld GPU, der ivrigt venter på at begynde at knuse!), Er .cfg-filen. Jeg duplikerede lige fileniny-yolo.cfg og lavede følgende redigeringer:

  • Linie 2: indstil batch = 24, det betyder, at vi bruger 64 billeder til hvert træningstrin
  • Linie 3: indstil underafsnit = 8, batchet vil blive divideret med 8 for at reducere GPU VRAM-krav. Hvis du har en kraftig GPU med belastninger af VRAM, kan dette antal reduceres, eller batch kan øges. Træningstrinnet smider en CUDA ud af hukommelsesfejl, så du kan justere i overensstemmelse hermed.
  • Linie 120: indstil klasser = 1, antallet af kategorier, vi vil registrere
  • Linie 114: indstil filtre = (klasser + 5) * 5 i vores tilfælde filtre = 30

For at starte træning kræver YOLOv2 et sæt indviklede vægte. For at gøre tingene lidt lettere tilbyder Joseph et sæt, der var foruddannet på Imaget. Denne konv.23-fil kan downloades (76Mb) fra det officielle YOLOv2-websted og giver et fremragende udgangspunkt. Vi har brug for denne fil til det næste trin.

Uddannelse

Tid til den sjove del! Indtast følgende kommando i din terminal og se din GPU gøre, hvad den gør bedst (kopier din train.txt og test.txt til mappen yolo_darknet):

manivannan @ manivannan-whirldatascience: ~ / YoloExample / darknet $ ./darknet detektor tog cfg / obj.data cfg / yolo-obj.cfg darknet19_448.conv.23

Bemærk: Når 100 iteration er afsluttet, vil den automatisk gemme vægtfilen og dræbe processen, når det gennemsnitlige tab er mindre end 0,06 for at få en nøjagtighed.

Resultater

Vi skal nu have en .vægt-fil, der repræsenterer vores uddannede model. Lad os bruge dette på nogle billeder for at se, hvor godt det kan registrere NFPA 704 'fire diamant'-piktogram. Denne kommando løsner YOLOv2 på et billede, vi vælger. Hvis du vil have min træne vægtfil, prøv at downloade her.

manivannan @ manivannan-whirldatascience: ~ / YoloExample / darknet $ ./darknet detektor test cfg / obj.data cfg / yolo-obj.cfg yolo-obj1000.vægtdata / manivannan.jpg

Jeg valgte nogle interessante billeder for at vise effektiviteten af ​​vores detekteringsopsætning. Billeder, der ikke er blevet brugt i træning, snyder vi ikke her. Som du kan se, er resultaterne meget acceptable, da alle forekomster af NFPA 'branddiamant' på de følgende billeder er korrekt detekteret. Stor succes!

Bemærk: Dette er til detektion af enkeltobjekter. Brug dette link til tog med multiobjekt. Tak