OSCAR Navigation collision avoidance -systeemin inspiroimana halusin testata kuinka hyvin valmis tekoaly (AI), erityisesti syviin neuroverkkoihin perustuva asioden tunnistus, toimisi törmäyksenesto-sovelluksessa merenkulussa. AI olisi vastuussa asioiden tunnistuksesta ja niiden paikantamisesta kuvassa. Jos tämä voidaan tehdä johdonmukaisesti ja suhteellisen usein, ja jos kamera on asennettu gimbaliin tai siinä on elektroninen kuvanvakain, pitäisi olla mahdollista arvioida kuvassa näkyvän liikkuvan kohteen nopeus ja suunta (käyttäen hyväksi tietoa omasta nopeudesta ja suunnasta). Samaan tapaan pitäisi myös olla mahdollista arvioida kohteen etäisyys omasta aluksesta.
Päätin käyttää testeissä Amazon Rekognition -palvelua, jolla voi labeloida ja paikantaa asioita kuvista. Amazon tarjoaa myös mahdollisuuden kustomoiduille labeleille, joiden opettaminen vaatii vain suhteellisen vähän opetusdataa, mutta halusin kokeilla miten tuote toimii ilman yhtään lisäopetusta.
Käytin testeissä kuvia, joissa näkyy kaukana oleva vene. Koska nyt on talvi, en pystynyt ottamaan kuvia itse vaan käytin Internetistä löytyviä kuvia. Yritän toistaa testin ensi kesänä hieman systemaattisemmin otetuilla kuvilla.
Syvät neuroverkot (Artificial Neural Networks – ANNs) eivät koskaan kerro suoraan mitä kuvassa on vaan antavat vain prosentin, millä todennäköisyydellä kuvassa näkyy jokin tietty asia. Kuvien alle olen kopioinut todennäköisyysjärjestyksessä olevan listan asioista, jotka Amazonin mukaan kuvasta löytyy.
Todennäköisyyksien lisäksi Amazon Rekognition palauttaa myös asian sijainnin (bounding box) kuvassa, jos se pystytään todentamaan riittävällä todennäköisyydellä.
Niille, joita kiinnostaa, olen kopioinut tämän postin loppuun Amazon Rekognitionin palauttaman response JSONin yllä olevalle kuvalle.
Tässä toinen kuva purjeveneestä.
Purjevene on selkeästi helppo löytyy, mutta miten löytyvät muut venetyypit?
Alla vene havaittu 96% todennäköisyydellä ja myös paikannettu.
Joutsenet ja vene sekä tunnistettu että paikannettu alla olevassa kuvassa.
Alus havaittu 97% todennäköisyydellä alla, mutta paikkaa ei ole pystytty määrittämään.
Kun yllä olevaa kuvaan leikkaa vain hieman niin aluksen paikka pystytään myös määrittämään.
Alla olevassa kuvassa on myös yksi väärä positiivinen (false positive): keskellä oleva asia ei ole vene. Lisäksi oikealla oleva asia on laiva eikä vene niinkuin Amazon luulee. On kuitenkin erinomainen tulos, että alus tunnistetaan tästä kuvasta.
Venettä ei pystytty paikantamaan alla olevasta kuvasta, mutta neuroverkkojen mukaan kuvassa on 70% todennäköisyydellä kulkuneuvo ja 65% todennäköisyydellä laiva. Kuvan vene on vain 11×7 pikselin kokoinen.
Pienentämällä testikuvan resoluutiota pienin askelin, pystytään määrittämään, että jos kuvassa näkyy vene ja se on vähintään 35 pikseliä yhteen suuntaan (esim. 35 x 20 pikseliä), Amazonin neuroverkot löytävät sen ja pystyvät usein myös paikantamaan sen. Kuvan leikkaaminen tai pilkkominen parantaa ainakin asioiden paikantamista. Asioiden tunnistaminen toimii uskomattoman hyvin vaikka käytössä on geneerinen neuroverkko. Olisi kiinnostavaa nähdä kuinka paljon tulokset paranisivat käyttäen custom labelointia, jossa neuroverkko opetettaisiin käyttäen kuvia samasta kamerasta kuin mikä ottaa analysoitavat kuvat.
Amazon Rekognitionin response JSON postin ensimmäiselle kuvalle:
{
"Labels": [
{
"Name": "Vessel",
"Confidence": 99.7686538696289,
"Instances": [],
"Parents": [
{
"Name": "Vehicle"
},
{
"Name": "Transportation"
}
]
},
{
"Name": "Transportation",
"Confidence": 99.7686538696289,
"Instances": [],
"Parents": []
},
{
"Name": "Watercraft",
"Confidence": 99.7686538696289,
"Instances": [],
"Parents": [
{
"Name": "Vehicle"
},
{
"Name": "Transportation"
}
]
},
{
"Name": "Vehicle",
"Confidence": 99.7686538696289,
"Instances": [],
"Parents": [
{
"Name": "Transportation"
}
]
},
{
"Name": "Boat",
"Confidence": 98.71965789794922,
"Instances": [
{
"BoundingBox": {
"Width": 0.05666980892419815,
"Height": 0.11389521509408951,
"Left": 0.10582049936056137,
"Top": 0.6451812386512756
},
"Confidence": 98.71965789794922
}
],
"Parents": [
{
"Name": "Vehicle"
},
{
"Name": "Transportation"
}
]
},
{
"Name": "Sailboat",
"Confidence": 96.3071517944336,
"Instances": [],
"Parents": [
{
"Name": "Boat"
},
{
"Name": "Vehicle"
},
{
"Name": "Transportation"
}
]
}
],
"LabelModelVersion": "2.0"
}