Kuidas süvaõppe abil jälgimist hõlpsalt automatiseerida

See artikkel on kiire õpetus jälgimissüsteemi rakendamiseks, kasutades süvaõppel põhinevat objektide tuvastamist. Samuti võrreldakse erinevate objekti tuvastamise mudelite jõudlust, kasutades järeldusena GPU multiprocessingut, jalakäijate tuvastamisel.

Valve on turvalisuse ja patrulli lahutamatu osa. Enamasti tähendab see töö pikema perioodi vältel otsimist, et midagi soovimatut juhtuks. On ülioluline, et me seda teeme, kuid ka see on väga igapäevane ülesanne.

Kas poleks elu palju lihtsam, kui leiduks midagi, mis võiks meid “vaadata ja oodata”? Noh, teil on õnne. Tänu viimaste aastate tehnoloogia arengule võiksime ülaltoodud ülesannete automatiseerimiseks kirjutada mõned skriptid - ja seda ka üsna hõlpsalt. Kuid enne kui sügavamale sukelduda, küsigem endalt:

Kas masinad on inimesena head?

Kõik, kes on sügava õppimisega tuttavad, teaksid, et pildiklassifikaatorid on ületanud inimliku täpsuse.

ImageNeti andmestiku veamäär aja jooksul inimestele, traditsioonilisele arvutinägemusele (CV) ja sügavale õppele. (Pildi allikas: Link)

Niisiis, jah, masin suudab inimestega võrreldes hoida sama standardi (või parema) objekte. Sellegipoolest on tehnoloogia kasutamine jälitustegevuse teostamiseks palju tõhusam.

  • Järelevalve on korduv ja igapäevane ülesanne. See võib põhjustada inimeste jõudluse langust. Lastes tehnoloogial järelevalvet teostada, võiksime keskenduda meetmete võtmisele, kui midagi läheb valesti.
  • Suure maariba ülevaatamiseks on vaja palju personali. Ka statsionaarsetel kaameratel on piiratud vaateväli. Mobiilseire robotite (näiteks mikro droonide) abil saab neid probleeme leevendada.

Lisaks saab sama tehnoloogiat kasutada paljudes rakendustes, mis pole piiratud turvalisusega, näiteks beebimonitorid või automatiseeritud toodete kohaletoimetamine.

Piisavalt õiglane. Aga kuidas seda automatiseerida?

Enne keeruliste teooriate vabandust mõelgem, kuidas jälgimine normaalselt töötab. Vaatame videovoogu ja kui märkame midagi ebaharilikku, siis tegutseme. Nii et sisuliselt peaks meie tehnoloogia tutvuma video iga kaadriga, lootes märgata midagi ebaharilikku. Kas see protsess heliseb?

Nagu arvata võis, on see lokaliseerimisega objektide tuvastamise olemus. Klassifikatsioonist erineb see pisut sellega, et peame teadma objekti täpset asukohta. Pealegi võib meil ühes pildis olla mitu objekti.

Täpse asukoha leidmiseks peaks meie algoritm kontrollima iga pildi osa, et leida klassi olemasolu. See on raskem, kui kõlab. Kuid alates 2014. aastast on Deep Learning pidevad iteratiivsed uuringud juurutanud tugevalt konstrueeritud närvivõrke, mis suudavad objekte reaalajas tuvastada.

Vaadake, kuidas jõudlus kasvas vaid kahe aasta jooksul!

On mitu süvaõppe arhitektuuri, mis kasutavad sama ülesande täitmiseks sisemiselt erinevaid meetodeid. Kõige populaarsemad variandid on kiirem RCNN, YOLO ja SSD-võrgud.

Kiirus vs täpsus kompromiss. Kõrgem mAP ja madalam GPU aeg on optimaalne.

Iga mudel sõltub baasklassifikaatorist, mis mõjutab suuresti lõplikku täpsust ja mudeli suurust. Lisaks võib objektidetektori valik tugevasti mõjutada arvutuslikku keerukust ja lõplikku täpsust.

Objektituvastuse algoritmi valimisel on kompromiss alati Kiirus vs Täpsus vs Suurus.

Selles ajaveebipostituses saame teada, kuidas luua objektide tuvastamise abil lihtne, kuid tõhus jälgimissüsteem. Arutame kõigepealt piiranguid, millega oleme seotud järelevalveülesande olemuse tõttu.

Järelevalve sügava õppimise piirangud

Sageli tahaksime vaadata pilku laiale maa-alale. See toob välja paar tegurit, mida peame enne valve automatiseerimist arvestama.

1. Video voog

Loomulikult vajame suure ala väljavaate säilitamiseks mitut kaamerat. Pealegi peavad need kaamerad neid andmeid kuskile salvestama; kas kohapeal või kaugemasse kohta.

Tüüpilised valvekaamerad. (Foto autor Scott Webb saidil Unsplash)

Kvaliteetsem video võtab palju rohkem mälu kui madalama kvaliteediga video. Lisaks on RGB sisendvoog 3x suurem kui BW sisendvoog. Kuna me saame salvestada ainult piiratud koguses sisendvoogu, siis langetatakse selle kvaliteeti talvituse maksimeerimiseks sageli.

Seetõttu peaks skaleeritav valvesüsteem suutma tõlgendada madala kvaliteediga pilte. Seega tuleb meie süvaõppe algoritmi koolitada ka selliste madala kvaliteediga piltide jaoks.

2. Töötlemisvõimsus

Nüüd, kui sisendipiirang on lahendatud, saame vastata suuremale küsimusele. Kus töötleme kaameraallikatest saadud andmeid? Selle tegemiseks on kaks meetodit.

  • Töötlemine tsentraliseeritud serveris:

Kaamerate videovooge töödeldakse kaugserveris kaugserveris või klastris. See meetod on vastupidav ja võimaldab meil kasutada suure täpsusega keerukate mudelite eeliseid. Ilmne probleem on latentsus; vajate piiratud viivituse korral kiiret Interneti-ühendust. Veelgi enam, kui te ei kasuta kaubanduslikku API-d, võivad serveri seadistamis- ja hoolduskulud olla suured.

Mälukasutus vs GPU järeldamisaeg (millisekundites). Enamik kõrgjõudlusega mudeleid kulutab palju mälu. (Allikas)
  • Töötlemine serval:

Kinnitades väikese mikrokontrolleri, saame teha reaalajas järeldusi kaamera enda kohta. Edastamise viivitust pole ja kõrvalekaldeid saab teatada kiiremini kui eelmist meetodit. Lisaks on see suurepärane lisa mobiiltelefonidele, nii et saadavaloleva WiFi / Bluetoothi ​​valik ei pea neid piirama. (näiteks mikrodronid).

Erinevate objektidetektorite FPS-i võime. (Allikas)

Puuduseks on see, et mikrokontrollerid pole nii võimsad kui GPU-d ja seetõttu võite olla sunnitud kasutama madalama täpsusega mudeleid. Sellest probleemist saab pardal olevate GPU-de abil mööda hiilida, kuid see on kallis lahendus. Huvitav lahendus oleks kasutada tarkvara nagu TensorRT, mis võimaldab teie programmi järelduste jaoks optimeerida.

Valvesüsteemi koolitamine

Selles jaotises kontrollime, kuidas jalakäijaid objekti tuvastamise abil tuvastada. Objektide tuvastamise mooduli loomiseks kasutame objekti TensorFlow Object Detection API. Uurime lühidalt, kuidas API üles seada ja koolitada seda oma valveülesande täitmiseks. Üksikasjalikuma selgituse saamiseks saate vaadata seda ajaveebi postitust.

Kogu protsessi võib kokku võtta kolme etappi:

  1. Andmete ettevalmistamine
  2. Treeni mudelit
  3. Järeldused
Objektituvastuse mudeli väljaõppega seotud töövoog.

Kui tunnete, et tulemuste nägemine motiveeriks teid rohkem seda proovima, liikuge julgelt alla 3. faasi!

1. etapp: andmete ettevalmistamine

1. samm: hankige andmekogum

Varem tehtud jäljend on tõenäoliselt kõige täpsem andmekogum, mida saate saada. Kuid enamasti on sellist jäljendit raske hankida. Sel juhul saame oma objektidetektorit koolitada, et ta saaks tavalistest piltidest üldiselt meie sihtmärgid ära tunda.

Näide annoteeritud pildist meie andmestikust.

Nagu eelnevalt arutatud, söödavad teie kaamera pildid võib-olla madalama kvaliteediga. Seega peate oma mudeli koolitama sellistes tingimustes töötamiseks. Väga elegantne viis selleks on andmete suurendamine, mida siin üksikasjalikult selgitatakse. Põhimõtteliselt peame andmekogumi pildikvaliteedi halvendamiseks lisama mingit müra. Samuti võiksime katsetada hägustumise ja erosiooni mõjudega.

Objektide tuvastamise ülesandeks kasutame TownCentre'i andmestikku. Video esimesi 3600 kaadrit kasutame koolitamiseks ja valideerimiseks ning ülejäänud 900 testimiseks. Andmekogumi ekstraheerimiseks võite kasutada minu GitHubi repo skripte.

2. samm: tehke andmekogu kommentaarid

Märkuste tegemiseks võiksite kasutada sellist tööriista nagu LabelImg. See on tüütu ülesanne, kuid samas oluline. Märkused salvestatakse XML-failidena.

Õnneks on TownCentre andmekogu omanikud esitanud csv-vormingus märkused. Kirjutasin kiire skripti märkuste teisendamiseks vajalikuks XML-vorminguks, mille leiate minu GitHubi repost.

3. samm: kloonige hoidla

Klooni hoidla. Nõuete installimiseks käivitage järgmised käsud, koostage mõned Protobufi teegid ja määrake tee muutujad

pip install -r nõuetele.txt
sudo apt-get install protobuf-kompilaator
protoc object_detection / protos / * .proto --python_out =.
eksport PYTHONPATH = $ PYTHONPATH: `pwd`:` pwd` / õhuke

4. samm: valmistage ette toetavad sisendid

Peame oma sihtmärgi määrama ID-ga. Me määratleme ID-faili nimega label_map.pbtxt järgmiselt

üksus {
 id: 1
 nimi: 'sihtmärk'
}

Järgmisena peate looma tekstifaili XML-i ja pildifailide nimedega. Näiteks kui teie andmestikus on img1.jpg, img2.jpg ja img1.xml, img2.xml, siis peaksite failvalval.txt välja nägema järgmine:

img1
img2

Jagage oma andmekogum kaheks kaustaks, nimelt piltideks ja märkusteks. Paigutage sildid_map.pbtxt ja koolituse.txt oma märkuste kausta. Looge märkuste kausta sees kaust nimega xmls ja pange kõik oma XML-id sinna sisse. Teie kataloogihierarhia peaks välja nägema umbes selline:

-baasi_kataloog
| -kujutised
| -märkused
|| -xmls
|| -silt_map.pbtxt
|| -trainval.txt

5. samm: looge TF-kirjed

API aktsepteerib sisendeid TFRecords failivormingus. Kasutage minu repos pakutavat faili create_tf_record.py, et teisendada oma andmestik TFRecordsiks. Peaksite oma baaskataloogis täitma järgmise käsu:

python luua_tf_record.py \
    --data_dir = `pwd` \
    - output_dir = `pwd`

Pärast programmi täitmise lõppu leiate kaks faili, train.record ja val.record.

2. etapp: mudeli treenimine

1. samm: mudeli valimine

Nagu varem mainitud, on kiiruse ja täpsuse vahel kompromiss. Samuti oleks objektidetektori ehitamine ja nullist väljaõpetamine äärmiselt aeganõudev. TensorFlow objektide tuvastamise API pakub hunniku eelkoolitatud mudeleid, mida saate oma kasutusjuhtudega kohandada. Seda protsessi tuntakse siirdeõppena ja see kiirendab teie koolitusprotsessi tohutult.

Hulk mudeleid on eelnevalt koolitatud MS COCO andmestikus

Laadige üks neist mudelitest alla ja ekstraheerige sisu oma baaskataloogi. Teile saadetakse mudeli kontrollpunktid, külmutatud järelduste graafik ja fail pipeline.config.

2. samm: koolitustöö määratlemine

Peate failis pipeline.config määratlema “väljaõppe töö”. Paigutage fail aluskataloogi. Oluline on vaid faili viimased read - peate esiletõstetud väärtused määrama ainult vastavatele faili asukohtadele.

gradient_clipping_by_norm: 10,0
  fine_tune_checkpoint: "model.ckpt"
  from_detection_checkpoint: tõene
  num_sammud: 200000
}
rongide sisendlugeja {
  label_map_path: "annotations / label_map.pbtxt"
  tf_record_input_reader {
    input_path: "train.record"
  }
}
eval_config {
  arvnäiteid: 8000
  maksimaalsed aastad: 10
  kasutamine_moving_keskmised: vale
}
eval_input_reader {
  label_map_path: "annotations / label_map.pbtxt"
  segadus: vale
  num_epochs: 1
  lugejate arv: 1
  tf_record_input_reader {
    input_path: "val.record"
  }
}

3. samm: alustage koolitust

Treeningtöö alustamiseks täitke allolev käsk. Treeningprotsessi kiirendamiseks on soovitatav kasutada piisavalt suure GPU-ga masinat (eeldusel, et olete installinud tensorflow gpu-versiooni).

python object_detection / train.py \
--logtostderr \
--pipeline_config_path = pipeline.config \
--rong_dir = rong

3. etapp: järeldused

1. samm: eksportige koolitatud mudel

Enne mudeli kasutamist peate eksportima koolitatud kontrollpunkti failid külmutatud järelduste graafikusse. See on tegelikult lihtsam kui öeldud - täitke lihtsalt allpool olev kood (asendage „xxxxx” kontrollpunkti numbriga):

python object_detection / export_inference_graph.py \
--input_type = image_tensor \
--pipeline_config_path = pipeline.config \
--trained_checkpoint_prefix = rong / mudel.ckpt-xxxxx \
- väljundi_kataloog = väljund

Saate faili külmutatud_inference_graph.pb koos hunniku kontrollpunkti failidega.

2. samm: kasutage seda videovooges

Peame videoallikast eraldama üksikud kaadrid. Seda saab teha OpenCV VideoCapture'i meetodi abil järgmiselt:

kork = cv2.VideoCapture ()
lipp = tõsi
kuigi (lipp):
    lipp, raam = cap.read ()
    ## - objekti tuvastuskood -

1. faasis kasutatud andmete ekstraheerimise kood loob meie testkomplekti piltidega automaatselt kausta „test_images”. Saame oma mudeli testkomplekti käivitada, täites järgmist:

python object_detection / inference.py \
--input_dir = {PATH} \
- output_dir = {PATH} \
--label_map = {PATH} \
--frozen_graph = {PATH} \
--num_output_classes = 1 \
--n_jobs = 1 \
- viivitus = 0

Katsed

Nagu varem mainitud, on objekti tuvastusmudeli valimisel kiiruse ja täpsuse vahel kompromiss. Tegin mõned katsed, mis mõõtsid kolme erineva mudeli abil tuvastatud inimeste FPS-i ja loendasid nende täpsust. Lisaks sellele viidi katsed läbi erinevate ressursipiirangutega (GPU parallelismi piirangud). Nende katsete tulemused annavad teile objektide tuvastamise mudeli valimisel väärtuslikku teavet.

Seadistamine

Meie eksperimendiks valiti järgmised mudelid. Need on saadaval TensorFlow objektide tuvastamise API mudeli loomaaias.

  • Kiirem RCNN koos ResNet 50-ga
  • SSD koos MobileNet v1-ga
  • SSD koos InceptionNet v2-ga

Kõiki mudeleid koolitati Google Colabis 10 000 sammuga (või kuni nende kaotus oli küllastunud). Järeldusena kasutati AWS p2.8xlarge eksemplari. Loendamise täpsust mõõdeti, võrreldes mudeli abil tuvastatud inimeste arvu ja maapealset tõde. Järelduskiirust kaadrites sekundis (FPS) testiti järgmiste piirangutega:

  • Üks GPU
  • Kaks GPU-d paralleelselt
  • Neli GPU-d paralleelselt
  • Kaheksa GPU-d paralleelselt

Tulemused

Siin on väljavõte väljundist, mis on toodetud meie testikomplekti FasterRCNN abil. Lisasin selle blogi lõpus video, milles võrreldakse iga mudeli toodetud väljundit. Kerige julgelt alla ja kontrollige!

Treeningu aeg

Alloleval joonisel on näidatud aeg, mis kulub iga mudeli 10k sammu treenimiseks (tundides). See välistab hüperparameetri otsimiseks vajaliku aja.

Kui teie rakendus erineb oluliselt eelõpetatud mudelist, mida kasutate ümberõppeks, peate võib-olla hüperparameetreid tugevalt kohandama. Kui teie rakendus on sarnane, ei pea te siiski põhjalikku otsingut tegema. Sellegipoolest peate võib-olla proovima treenida selliste treenimisparameetritega nagu õppimiskiirus ja optimeerija valik.

Kiirus (kaadreid sekundis)

See oli meie eksperimendi kõige huvitavam osa. Nagu varem öeldud, mõõtsime oma kolme mudeli FPS jõudlust viie erineva ressursipiirangu korral. Tulemused on toodud allpool:

SSD-d on ülimalt kiired ja võidavad kiiremini RCNN-i kiiruse, kui kasutame ühte GPU-d. Kiirem RCNN jõuab kiiresti SSD-ga järele, kui suurendame GPU-de arvu (töötame paralleelselt). Ütlematagi selge, et SSD koos MobileNetiga on madala GPU keskkonnas palju kiirem kui InceptionNetiga SSD.

Ülaltoodud graafiku üks tähelepanuväärne omadus on see, et FPS väheneb veidi, kui suurendame MobileNetiga SSD-de GPU-de arvu. Sellele näilisele paradoksile on tegelikult lihtne vastus. Selgub, et meie seadistus töötles pilte kiiremini kui piltide lugemise funktsioon neile pakkus!

Videotöötlussüsteemi kiirus ei tohi olla suurem kui piltide süsteemi toomise kiirus.

Oma hüpoteesi tõestamiseks andsin pildi lugemise funktsioonile edumaa. Alloleval joonisel on näidatud SSD-de FPS-i paranemine MobileNetiga viivituse lisamisel. FPS-i väike vähenemine varasemas graafikus on tingitud kaasnevast üldkulust, kuna mitu GPU-d küsivad sisendit.

Pole vaja öelda, et viivituste kehtestamisel täheldatakse FPS-i järsku tõusu. Lõpptulemus on see, et meil peab olema optimeeritud piltide edastamise torustik, et vältida kiiruse kitsaskohta. Kuid kuna meie kavandatud kasutusjuhtum on jälgimine, on meil veel üks kitsaskoht. Valvekaamera FPS seab meie süsteemi FPS ülemise piiri.

Loenduse täpsus

Loendustäpsuse määratleme inimeste protsendina, mille meie objekti tuvastussüsteem õigesti tuvastab. Tundsin, et see on jälitustegevuse osas kohasem. Iga meie mudeli toimimine on järgmine:

Ütlematagi selge, et kiireim RCNN on kõige täpsem mudel. Üllatavalt hästi töötab ka MobileNet paremini kui InceptionNet.

Katsete põhjal on ilmne, et kiiruse ja täpsuse vahetamine on tõepoolest olemas. Kui meil on piisavalt ressursse, võime siiski kasutada suure täpsusega mudelit hea FPS-i kiirusega. Jälgime, et kiirem RCNN koos ResNet-50-ga pakub parimat täpsust ja väga head FPS-i reitingut, kui seda kasutatakse paralleelselt 4+ GPU-l.

See oli palju samme!

Noh .. ma ei vaidleks vastu. See on tõesti palju samme. Lisaks oleks selle mudeli jaoks reaalajas töötamiseks pilve eksemplari seadistamine koormav ja kulukas.

Parem lahendus oleks kasutada juba serverites juurutatud API-teenust, et saaksite oma toote arendamise pärast lihtsalt muretseda. Nanonets saab selle alguse. Nende API on GPU-dega kvaliteetsele riistvarale paigaldatud nii, et saate meeletut jõudlust ilma probleemideta!

Teisendasin oma olemasolevad XML-märkused JSON-vormingusse ja söötsin selle Nanonetsi API-le. Tegelikult, kui te ei soovi oma andmestikku käsitsi annoteerida, võite paluda neil see teie jaoks annoteerida. Siin on vähendatud töövoog, kui Nanonets hoolitseb raskete raskuste eest.

Vähendatud töövoog nanonetsidega

Varem mainisin, kuidas mobiilsed seireüksused, näiteks mikro droonid, võivad tõhusust märkimisväärselt suurendada. Selliseid droone saame mikrokontrollerite, näiteks Raspberry Pi abil üsna hõlpsalt luua, ja järelduste tegemiseks võime kasutada API-kõnesid.

Objektide tuvastamiseks on Nanonetsi API-ga alustamine üsna lihtne, kuid hästi selgitatud juhendi jaoks saate vaadata seda ajaveebi postitust.

Tulemused Nanonetsiga

Treeningprotsessi lõpuleviimiseks kulus Nanonetsil umbes 2 tundi. See hõlmab hüperparameetri otsimiseks kuluvat aega. Treenimiseks kulunud aja osas on Nanonets kindel võitja. Nanonets alistas FasterRCNNi ka loendamise täpsuse osas.

KiiremRCNN-i täpsus = 88,77%
Nanonetsi loenduse täpsus = 89,66%

Siin on kõigi meie katseandmete nelja mudeli jõudlus. On ilmne, et mõlemad SSD mudelid on pisut ebastabiilsed ja väiksema täpsusega. Veelgi enam, kuigi FasterRCNN ja Nanonets on võrreldava täpsusega, on viimasel stabiilsemad piirdekarbid.

Kas automatiseeritud valve on vastutav?

Sügav õppimine on hämmastav tööriist, mis pakub hõlpsalt eeskujulikke tulemusi. Kuid mil määral võime usaldada, et meie valvesüsteem tegutseb iseseisvalt? Mõnel juhul on automatiseerimine küsitav.

Värskendus: GDPR-i ja allpool toodud põhjusi silmas pidades on hädavajalik mõelda järelevalvesüsteemi automatiseerimisega seotud seaduslikkuse ja eetiliste küsimuste üle. See ajaveeb on mõeldud ainult hariduslikel eesmärkidel ja selles kasutati avalikult kättesaadavat andmekogumit. Teie kohustus on veenduda, et teie automatiseeritud süsteem vastab teie piirkonna seadustele.

1. Kahtlased järeldused

Me ei tea, kuidas sügava õppe algoritm järeldusele jõuab. Isegi kui andmete sisestamise protsess on laitmatu, võib eksitavaid tabamusi olla palju. Näiteks eemaldas see Briti võmmide kasutatud AI rüvetamisfilter liivaluidetelt pilte, arvates, et need on ropud pildid. Sellised tehnikad nagu juhendatud tagasi paljundamine võivad otsuseid mingil määral selgitada, kuid meil on veel pikk tee minna.

2. Võistlevad rünnakud

Süvaõppe süsteemid on habras. Vastupidised rünnakud sarnanevad pildiklassifikaatorite optiliste illusioonidega. Kuid hirmutav osa on see, et arvutatud märkamatu segadus võib sundida sügava õppe mudelit valesti klassifitseerima. Sama põhimõtet kasutades on teadlastel õnnestunud mööda minna süvaõppel põhinevatest järelevalvesüsteemidest, kasutades „võistlevaid prille”.

3. Valed positiivsed

Teine probleem on see, mida me valepositiivsete juhtumite korral teeme. Probleemi raskusaste sõltub rakendusest endast. Näiteks võib valepakkumine piiripatrullide süsteemis olla olulisem kui aedade järelevalvesüsteem. Äparduste vältimiseks peaks inimtegevus olema mingil määral vajalik.

4. Sarnased näod

Kahjuks pole teie välimus nii ainulaadne kui sõrmejälg. Kahel (või enam) inimesel on võimalik välja näha väga sarnane. Identsed kaksikud on üks peamisi näiteid. Teatati, et Apple Face ID ei suutnud eristada kaht sõltumatut Hiina töökaaslast. See võib muuta jälgimise ja inimeste tuvastamise raskemaks.

5. Andmekogumite mitmekesisuse puudumine

Süvaõppe algoritmid on ainult nii head kui teie pakutavad andmed. Inimeste nägude kõige populaarsemad andmekogumid, ainult valgete inimeste näidised. Kuigi lapsele võib tunduda ilmne, et inimesed võivad eksisteerida erinevates värvides, on süvaõppe algoritmid omamoodi nukrad. Tegelikult sattus Google hätta, kuna liigitas musta inimese valesti gorillaks.

Nanonetsi kohta: Nanonets loob API-sid arendajate süvaõppe lihtsustamiseks. Külastage meid aadressil https://www.nanonets.com rohkem)