Haluaisin saada yksinkertaisen hahmontunnistussysteemin toimimaan, joka tunnistaisi tunnettuja esineita toisistaan, esim. maitopurkin voipaketista. Luultavasti tuotteen varitys veisi jo pitkalle, yksinkertainen muotoanalyysi voisi selvittaa loput. Ja vastaukseksi riittaisi vaikkapa pari parasta arvausta (esim jugurtti- tai viilipurkki), kayttaja voisi sitten valita naista kahdesta.
Ymparisto olisi Linux, kamerana webcam ja toiveena saada pieni ajaettava ohjelma aikaiseksi melko vahalla perehtymisella kun tama tulisi vain omaksi iloksi... Eli varmaankin pitaisi loytaa joku suppeahko kirjasto jossa olisi perusfunktioita valmiiksi, mutta tarjontaa tuntuu olevan todella paljon. Osaisiko joku suositella jotain kirjastoa tai antaa muita vinkkeja eteenpain? Millahan forumilla tallaisista asioista keskusteltaisiin?
Ymparisto olisi Linux, kamerana webcam ja toiveena saada pieni ajaettava ohjelma aikaiseksi melko vahalla perehtymisella kun tama tulisi vain omaksi iloksi... Eli varmaankin pitaisi loytaa joku suppeahko kirjasto jossa olisi perusfunktioita valmiiksi, mutta tarjontaa tuntuu olevan todella paljon. Osaisiko joku suositella jotain kirjastoa tai antaa muita vinkkeja eteenpain? Millahan forumilla tallaisista asioista keskusteltaisiin?
Vastaukset 15
Vanhimmat
http://www.google.fi/search?hl=fi&q=hahmontunnistus&btnG=Google-haku&meta=
Olen kylla surffannut netissa ihan paljon, ja aiheesta loytyy mm. hakusanoilla machine vision, appearance based object recognition ja tiedan etta ei-parametriset klusterointimenetelmat sopisivat varmaan parhaiten.. Mutta edelleenkin kirjastoja yms loytyy ihan valtavasti, ja haluaisinkin kuulla onko kenellakaan kokemuksia jostain vastaavasta. Aihepiiri on hyvin laaja mutta en haluaisi mitaan tieteellista tutkimusta tehda vaan saada homman toimimaan.. Tunnistus tai paremminkin tuotteiden identifiointi olisi vain osa isompaa kokonaisuutta.
Sehän ei olekaan sitten enää vaikeata. Kaksi erillistä ja ERILAISTA kuvaa SAMASTA objektista - vaikkapa tikkuaskista - tiedostona ja sitten identifioimaan OHJELMALLISESTI ovatko kuvat samasta esineestä?
Olen itse aikoinaan tehnyt paljon yksinkertaisemman hahmontunnistusjärjestelmän ja tiedän miten vaikea se on. Lisäksi laskentakuorma on valtava. Kirjastot ovat varmasti kehittyneet valtaavasti, en ole seurannut kehitystä.
Itse soittaisin VTT:lle (matematikan laitos) tai Tekniseen korkeakouluun koneosastolle. Molemmat ovat puuhanneet noilla asioilla ja voivat varmasti suositella kirjastoohjelmaa, kirjallisuutta sekä antaa käytännön vinkkejä. Kokemuksieni perusteella ne vastaavat mielellään asiallisiin kysymyksiin.
Yksi asia jäi epäselväksi: Aiotko tehdä 2D- tai 3D-hahmontunnistusta. Eli voivatko esineet olla mielivaltaisessa asennossa tai ovatko ne aina samassa asennossa (esim suoraan sivusta kuvattuna)?
Erikoisjärjestelyin kuvatut esineet on mahdollista tunnistaa "simppelisti".
Jos tiedät jo etukäteen, että tausta on aina sininen, kamera on aina samassa asennossa ja valaistus pysyy samana ja esineet ovat aina pystyssä, homman voi saada toimimaan sopivilla asetuksilla melko helposti.
Jos esine on kiertynyt akselinsa ympäri, eli viilipurkki onkin esim kyljellään, ongelma tulee vaikeammaksi. Toki voidaan tehdä hahmontunnistus eri kulmilla, mutta se taas tuo esille muita ongelmia. Onko kyljellään oleva viilipurkki sittenkin hieman kallistunut kermapurkki tms?
Kirjastoja on olemassa. Toimivan toteutuksen saavuttaminen on vaikeaa, joten kirjastojen hinnat ovat suhteessa sen suorituskykyyn ja ominaisuuksiin...
1. Aloita asentamalla JMF ja ota sillä yhteys web-kameraasi.
2. Tee ohjelma joka esittää web-kameran kuvaa livenä ruudulla.
3. Tee hahmontunnistus jokaiselle esitettävälle kuvalle (varaudu nopeuteen 3-10 kuvaa sekunnissa, jos kuvan koko on luokkaa 320x240, suuremmalla esim 640x480, 1 - 5 kuvaa sekunnissa).
Jos et ole saanut käsiisi kirjastoja, toteuta hahmontunnistuskirjaston metodit itse. Käytä BufferedImagea ja kuvan pikselidataa taulukoissa. Manipuloi pikseleiden r,g ja b-arvoja erikseen.
Tutustu myös reunanhavaitsijoihin (edge detectors), viivantunnistukseen (line detectors) ja segmentointiin (image segmentation).
Jotain taman suuntaista ajattelinkin!
Vierastan vahan (en tieda onko syyta) Javaa, mutta paasen kuvaan kasiksi Linuxin Streamerilla. Motion kai osaisi tunnistaa liikkeen, mika voisi nopeuttaa kuvakirjaston luomista. Eli purkki kameran eteen/alle, kuva, ja seuraava.. Ei haittaa, vaikka kuvakirjaston luominen hetken :-) kestaisikin, mutta varsinainen tunnistus saisi sujua melko vilkkaan.
Ajattelin etta jos ottaisi kuvan aina ylhaalta pain ja asettaisi purkin poydalle kameran alle, niin ei tulisi kallistuksia. Valo tulisi suurelta osin ylhaalta pain lampusta. Tosin ylhaalta pain otettuna jaa tieto esim. korkeudesta saamatta.
Niin ja uskoisin, etta varit veisivat melko pitkalle tunnistamisessa. Mutta miten loydetaan esim. 4 paavaria kuvasta? Varihistogrammin 4 huippua (jos on)? Ja tama joka kanavalle, vai kuinka?
Kannattaisiko laittaa joku eksoottinen vari taustaksi, jotta se olisi helppo "suodattaa" pois? Vai onko valkoinen paras? Kuvioita?
Mika olisi kaytannonlaheinen kirja metodeille, vai onko paras googlata? C-kieli voisi onnistua, C ehka.. Tallaisen kirjaston loysin: DIPlib eli Matlabin funktioita C:lla. http://www.ph.tn.tudelft.nl/DIPlib/diplib_2.html
Mutta taitaa puuttua esim. histogrammit, jotka ovat Matlabin peruskamaa.
Mutta kyllahan tahan aikaa saa kulumaan, vaikka logiikan keksisikin. Luulisi, etta alkaisi jo loytya jotain valmiita paketteja kaipaamaani tarpeeseen, itse pitaisi vain luoda esimerkkikuvat ja ehka valita featuret joita tunnistamiseen kaytetaan.. Ja kun tama pitaisi viela olla open source niin unta taidan nahda. :-)
"julkisivu" (jogurttipurkin kansi, maitotölkin etusivu jne) niin ongelma ei ole kovin vaikea.
Aseta taustaksi musta. Kuva yksi esine kerralla. Poista kaikki bitit jotka ovat mustia tai lähes mustia (eli aseta ne mustiksi tai älä välitä niistä laskennassa. Vaikka tuote sisältää mustaa se ei vaikuta analyysiin (miesten hautaussolmio jää kyllä tunnistamatta!)
Sen jälkeen teet tunnistettavalle tuoteelle värispektrin pikseli kerrallaan. Älä käytä enemmän kuin 256 väriä, 16 väriä on ehkä paras vaihtoehto. Tallenna eri tuotteiden värispektrit (yhden tuotteen spektrin koko on esim 256 x 1 byte, eli suhteellisesti miten tietty väriarvo esiintyy bittikartassa)
Sen jälkeen kuvaat tunnistettavan tuotteen ja teet siitä vastaavan värispektrin. Lopuksi teet ristikorrelaation (10-20 riviä koodia) näiden kahden spektrin välillä. Jos korrelaatio ei ole riittävän suuri, haet seuraavan mallispektrin ja teet uudestaan ristikorrelaation jne kunnes oikea on löytynyt.
Jos on monta tunnistettavaa tuotetta, tällainen järjestelmä menee hitaaksi (jokaista tunnistuskuvaa on mentävää läpi pikseli pikseliltä mutta vain kerran. Tämä toimii.) Mutta jos sinulla on 10 000 tunnistettavaa tuotetta, joudut suorittamaan yhtä monta ristikorrelaatiolaskentaa. Tämä ontuu.
Järjestelmää voi selkeästi parantaa laskemalla yksinkertaisia tunnuslukuja spektrille (vaikka ainoastaan RGB-painopiste) ja tallentaa tämä tieto tunnistustietokantaan. Kun verrataan tunnistettavaa kohdetta (kuvattu) tietokantaan aloitetaan niistä kohteista joiden RGB-poikkeavuudet (neliösumma) ovat pienimmät. Tällöin ei mene aikaa etsiä vihreää DelMonte ananaspurkkia kun tuote oli punainen Pirkan papuja tomaattisoseessa.
Testausjärjestys ja mallispektrien tallentaminen oikealla tavalla ovat erittäin tärkeää järjestelmän toimivuuden kannalta.
Esineen muodolla ja koolla ei luultavasti ole kovin paljon merkitystä, eli kurkku, maissi ja penis erottuvat kaikesta huolimatta helposti toisistaan. Rukolasalaatti ja kurkku voivat olla vaikeampi juttu. Mansikka ja tomaatti samoin.
Kirjoita ja kerro miten meni, pidetään peukkoja!
Motion on vähän amatöörimäinen tekele. Teet itse varmasti paremman.
Värit eivät kyllä riitä hahmontunnistukseen. Kamera reagoi eri tavalla erilaiseen valaistukseen. Päivänvalossa web-kameran kaappaamat värit ovat täysin erit kuin loisteputken valossa.
Värien kanssa pelatessa pitäisi löytää aina jokin referenssi, johon värejä verrataan. Esim jokaisen tunnistussession yhteydessä kameralle näytetään väripaletti, josta ohjelma osaa poimia värit. Myöhemmin väreihin viitataan vain indekseillä tai viittauksilla. Tunnistuksessa käytettävät värit eivät siis ole kiinnitettyjä värejä, vaan vaihtelevat tilanteen mukaan.
Taustalle ei tarvitse asettaa mitään tiettyä väriä. Riittää että tiedetään koska kuvassa ei ole mitään. Silloin kuvassa näkyvät pikselit ovat taustaa. Kaikki muuttuvat pikselit ovat liikettä, eli esinettä. Kun et salli 1 pikselin tai 2x2 tai 4x4 jne pikselin kokoisia taustoja, saat satunnaiset taustan kanssa saman väriset esineen pikselit mukaan esineeseen.
Huomaa kuvia käsitellessä myös se, että kameran ottama täysin musta kuva ei ole täysin musta. Tekniikka aiheuttaa kuvaan kohinaa ja jopa "täysin musta" voi olla itse asiassa "harmaa".
Muutenkin kannattaa ajatella sitä, että ohjelma toimisi olosuhteiden muuttuessakin (esim eri kameralla, eri resoluutiolla, eri valaistuksella, eri paikassa jne). Tunnistuksen varmistamiseksi featureita kannattaisi etsiä useilla eri tavoilla. Värit voisivat olla yksi tarkastelun aihe.
Tunnistuksessa voi käyttää tietyissä tilanteissa asteittain tarkentuvaa tunnistusta. Tunnistettavaa kuvaa käsitellään ensin skaalattuna esim 8x8 kokoon. Jos hahmoa ei tunnisteta yksikäsitteisesti, lisätään tarkkuutta esim kokoon 16 x 16. Näin saadaan haku nopeutumaan ja kohdistumaan oikeaan suuntaan jo tunnistuksen alussa. Pitkulainen esine voidaan luokitella pitkulaiseksi jo pienestä kuvasta, joten kaikki pyöreät esineet voidaan poistaa ehdokkaiden joukosta jne.
Käytännönläheistä kirjaa tuskin löytyy. Hahmontunnistuksen kirjallisuudessa siirrytään usein aika nopeasti neuroverkkoihin ja sitä rataa...
Muut esitti hyvältä kuulostavia ideoita (omia tai ei) ja niihin olisi vähän täydentämistä. Ristikorrelaatio-tarkistuksen tms. pitää loppua kesken jos jo laskennan alkuvaiheessa ero osoittautuu liian suureksi. Sitten siirrytään seuraavaan.
Useimmin esiintyvät tuotteet tarkistusten jonon alkupäähän. Harvemmin ilmenevät tuotteet harkitaan viimeisenä. Näin kannattaa tehdä jos ei tarvitse valita parhaiten sopivaa, vaan tietyissä rajoissa sopiva. Eli tuote näyttää tietyltä joko tosi hyvin tai tosi huonosti, eikä välimuotoja ole.
---------
Yksi mahdollinen keino on laittaa softa kuvittelemaan viiva tuotteen tietyn(*) kohdan läpi, jotta sitten voi tutkia kirkkauskäyrää tai kolmea eri värin kirkkauskäyrää viivan kohdalla. Tämä sopii erityisesti kasvien ja kivien tekstuurin tunnistamiseen. En tiedä onko mitään tällaista käytetty, mutta voisi käyttää.
Sitä käyrää voi tutkia esim. huippuvälien mitan, lokaalien minimien lukumäärän, kirkkausjakauman tai huippujen etäisyyksien hajonnan perusteella.
*esim. levein kohta tai leveistä kohdista keskimmäinen. Kivelle sillä ei ole niin väliä. Tai poikkileikkaus. Miten avomaan kurkusta määrittelee poikkileikkauksen? Voi myös ottaa viivat 10-20 asteen välein pisimmästä reunasta reunaan kohdasta. Joku niistä on poikkileikkaus. Pyöreän kappaleen pyöreys näkyy sellaisessa viivan kirkkauskäyrässä. Ja kysytään: missä kulmassa on kapein leveä kohta?
Jos on pyöreä purkki vaakatasossa sivulta kuvattuna, niin tietokantaan 3-6 viivaa tasakulmin ja sitten skannataan (softa-kuvitteellisesti) kylkeä kunnes tulee 1-1 vastaava kirkkauskäyrä (tai tarpeeksi monta pistettä kirkkauskäyrästä)
Kiitos, paljon on tullut ideoita ja pohtimisen aihetta. Jotenkin ajattelisin, etta kullekin kuvalle taytyisi laskea piirteet eli tunnusluvut valmiiksi, jotta niita olisi sitten melko nopea vain verrata uuteen kuvaan. Eiko ristikorrelaatioiden laskemisessa helposti menisi pitkahko aika, kun eipa kayttaja taitaisi jaksaa kovin montaa sekuntia tulosta odotella?
Luin artikkelin, jossa oli tunnistettu lego-palikoita. :-) Kuvista oli valmiiksi laskettu vareja kuvaavia piirteita (helpompaa yksivarisille) kuten myos pyoreytta jne. Varsinaiseen luokitteluun kaytettiin paatospuuta eli "kysymyksilla" jaettiin vastausjoukko pienempiin ja pienempiin osiin. Tunnistus tapahtui reaaliajassa ja tuloksissa paastiin yli 80% onnistumisiin, mika riittaisi mainiosti.
Mutta mutta, kaytannon toteuttaminen mille idealle tahansa ei taida tapahtua noin vain. Joten taidan vetaytya pohdiskelemaan ja koodailemaan, mutta hiukan pelottavan isolta projekti vaikuttaa. Loytyisikohan muita innokkaita tekijoita? Luulisi, etta jos tunnistamisesta tekisi riittavan yleisluontoisen, olisi tekeleelle monia kayttotarkoituksia. Seurailen tata palstaa, jos vaikka jollakulla olisi ideoita ja/tai intoa!
Itseäni kiinnostaa toteutuksen kaupallinen hyödyntäminen. Eli mokkula ei saa sisältää GPL-koodia tai muuta koodin avaavia tai kaupallisen käytön estäviä lisenssejä.
Open source on kiva juttu, mutta sillä ei makseta lainoja eikä osteta ruokaa nälkäisille lapsille.
Voisin kuvitella osallistuvani hyvin projektoituun kehitystyöhön työpanoksella.
Tottakai kaikki on parasta lisensoida GPL:n alle! Eihän siinä rahallista hyötymistä missään kielletä. Menestyäkseen täytyy vain tehdä jotain oikeasti hyödyllistä eikä vain omahyväisesti vetää välistä pseudo-keksinnöillä.
Jos todella kiinnostaa niin kannattaa pyrkiä alaa tutkiviin ryhmiin, yliopistoihin jne. Alaa tutkitaan vaikka kuinka paljon. Täysin yksinään pähkäily on helposti turhaa työtä ja pyörän uudelleen keksimistä.
Ei kielletä, mutta kuinka moni innostuu projektista jota ei sitten kuitenkaan voisi käyttää hyväksi varsinaisessa "työssään". Kaikki ei koodaa menestyksen takia, vaan ihan vain työkseen, pysyäkseen leivässä kiinni. LGPL, Apache tai BSD tyyppinen lisenssi olisi parempi.
"Jos todella kiinnostaa niin kannattaa pyrkiä alaa tutkiviin ryhmiin, yliopistoihin jne"
Haloo, tuo on mahdotonta useimmille ihmisille vaikka olisi miten hyviä ideoita.
"Täysin yksinään pähkäily on helposti turhaa työtä ja pyörän uudelleen keksimistä."
Entä yksinään kirjojen ja netin lukeminen.
Lisäksi sitä voi ehkä perustaa harrastuspiirin. Tosin niitä voi maailmalla jo olla, netin kautta ainakin.