Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Kuvien jakaminen clustereihin k means algoritmilla

Sivun loppuun

E1ss [11.02.2018 12:03:25]

#

Olen tekemässä ohjelmaa joka jakaa noin 45,000 valokuvaa niiden siällön perusteella. Kuvissa on taloja ja halauaisin että ohjelmalle syötetään saman talon kuva ja se tulostaa kaikki tietokannasta löytyvät samat talot. Ajattelin että käytän clusteria ja jaan kaikki kuvat x määrään sarjoja. Tällä hetkellä ongelma on se että kuvien pixelimääräät ovat noin 1000-2000 x 1000-2000 mutta muutan ne 1000x1000 kokoisiksi ja sitten muutan ne myös greyscale muotoon. Tallennan jokaisen kuvan pixelit matriisiin joka on 45,000 (kuvien määrä) x 1,000,000 (pixelien määrä). Tietokoneellani menee tähän noin 1-2h tehdä tämä matriisi ja sen jälkeen se suorittaa k means algoritmin. En ole viellä kokeillut kauanko k means algoritmin suoritus kestää, mutta jo kuvien läpikäyminen on todella pitkä aika. Siis ei viellä mutta olen ajatellut että jos kasvatan tietokantani kokoa siten että kuvia olisi miljoona kestäisi niiden läpikäyminen noin 2 viikkoa. En ole muuten viellä edes kokeillut toimiiko koodini mutta halusin kertoa tästä sen takia että voisiko joku antaa vähän palautetta. Onko ongelmanratkaisuni oikea vai kannattaisiko käyttää jotain muita algoritmeja? Monestihan kuvia käsitellessä käytetään neural networkeja mutta en itse ainakaan tiedä voiko sitä lisätä tähän unsuperviced ongelmaan ja miten lisäys tapahtuisi. Laitan varmaan koodin tänne jossain vaiheessa ja kerron myös miten se suoriutui kun ohjelma on laskenut kaiken.

Grez [11.02.2018 12:35:04]

#

Mä väittäisin että pelkkien kuvien perusteella lähes mahdoton tehtävä. Jos ajatellaan että sulla on talosta kaksi kuvaa, toinen pohjoisen suunnasta ja toinen etelän suunnasta, niin mistä ohjelma voi tietää että se on sama talo eikä toinen samanlainen?

Jaska [11.02.2018 13:10:43]

#

Grez kirjoitti:

Mä väittäisin että pelkkien kuvien perusteella lähes mahdoton tehtävä.

Teoreettisesti on kyllä mahdotonta, mutta käytännössä voi tehdä oppivan verkon, joka tunnistaa kuvista yhteisiä piirteitä.

Kuulin, että tuollaiset tehtävät tehdään siten, että käsipelin jaetaan jotkut kuvat oikein, sitten tekoälyllä ja neuroverkoilla etsitään pikseleistä sopiva kriteeri, testataan miten luokittelija luokittelee kuvat, korjataan taas väärät kuvat manuaalisesti ja taas ajetaan tunnistusalgoritmi. Tähän tarvitaan todennäköisesti tilastotieteen osaamista ja pattern recognitionia.

E1ss [11.02.2018 13:19:00]

#

Voisin kokeilla koodiani mutta se pysähtyi noin 400 kuvan kohdalla jolloin matriisin koko oli 400x1,000,000 joten ajattelin että pitäisi tehdä PCA. Osaako joku neuvoa miten teen pythonilla. Vaikka ihan laittamalla esimerkki koodin. Voin kyllä lukea documentationit jos ei kellään ole tietoa.

Jaska [11.02.2018 13:25:35]

#

En ole koskaan tehnyt, mutta varmasti sopivalla paketilla löytyy ainakin jotain käyttökelpoista. Toimisikohan scikit-learn? Netistä löytyi ohjeita: https://towardsdatascience.com/pca-using-python-scikit-learn-e653f8989e60

E1ss [11.02.2018 13:30:29]

#

Kiitos selvittelen noita ja kerron sitten miten toimi

E1ss [11.02.2018 17:33:52]

#

Tuli mieleeni että voiko PCA:ta edes lisätä kesken kaiken. Eli siis eikö kaikki kuvat pitäisi olla yhdessä matriisissa joka olisi niinsanotusti training matriisi. En kuitenkaan saa edes tätä koottua. Voiko siis PCA:ta käyttää siten että jokaiselle kuvalle suoritan ja niistä tulee saman kokoisia ettei toisista lähde enemmän ominaisuuksia kuin toisista ja että tekeekö edes samaan suhteeseen?

Lisäys: En ole varma teinkö PCA:n oikein mutta nyt koodi ainakin sanoo tehneensä kaikista 1,000,000 eri featuresta vain yhden 99% tarkkuudella. Minusta vähän tuntuu että tämä ei toimi siten että keskenkaiken rupeaa muuttelemaan.

Lisäys:

Nyt tuli mieleen että skaalaan kuvat 1000x1000 kokoisiksi mikä on aika iso. Periaattessa voisin tehdä niistä 100x100 mutta kannattaako tehdä vain puhtaasti tällä komennolla

img = misc.imresize(img, size = [1000,1000])

Eli mitä tämä tekee. Mitä skaalauksessa pixeleille tapahtuu. Voiko lopputuloksesta viellä selvittää alkuperäisen kuvan?

The Alchemist [12.02.2018 15:20:44]

#

Ainahan sinä voit mäpätä thumbnailin isompaan kuvaan ja hakea vastaavan alkuperäisen sillä tavoin. Muista nyt kuitenkin, että pikselit ovat juuri se data, mistä algoritmi tunnistaa kuvassa esiintyvät objektit. Jos pienennät kuvaa liikaa, niin tietokoneen on aivan yhtä vaikeaa ymmärtää kuvan sisältö kuin sinunkin sitä pientä tuhrua katsomalla.

E1ss [12.02.2018 18:30:55]

#

Mutta siis miten saisin kun olen samaa mieltä siitä että pixeleitä ei kannata hirveästi poistaa. Koneeni eikä varmaan mikään kone pysty kuitenkaan käsittelemeään 1,000,000 x 1,000,000 matriisia. Eli voisiko joku selittää että pystyykö PCA:ta käyttämään niinkuin esimerkkien pienentämiseen ennen kuin ne on koottu yhteen matriisiin? Jos saisin esim pienennettyä 1,000,000 muuttujan esimerkin 1,000 muuttujaan kone varmasti pystyisi käsittelemään ohjelmani.

Jackpontikka [27.02.2018 11:16:47]

#

Tehtäväsi on ehkä hieman hankalampi kuin osaat kuvitella. Tämän kaltaiset tuotteet ovat vielä kehitysvaiheessa suurillakin yrityksillä kuten Googlella. Aiheena tietysti mielenkiintoinen, ja uskoisin että kuluttamalla aiheeseen hieman aikaa ja ajatusta saanet jonkinlaisia tuloksia.

Pelkkä k-means clustering edes PCAlla höystettynä ei tuone haluamaasi tulosta. PCA on lineaarinen operaattori ja jos ajat klusterit ennen ja jälkeen PCAn saat käytännössä saman tuloksen (ainoana hyötynä tietysti muuttujien määrän väheneminen). K-meansin käytössä on haluamasi tarkoituksen kannalta muutama oleellinen ongelma. Kun muuttujien dimensionaalisuus on suuri (esim. 1000*1000) perinteiset etäisyys funktiot eivät sovellu tilanteeseen kovin hyvin. Toiseksi, klustereiden muodostaminen haluamallasi tavalla perustuu ainoastaan yksittäisten pikseliarvojen vertailuun. Menetlemä ei käytä pikseliarvojen spatiaalista jakaumaa mitenkään hyväkseen. Toisin sanoen kaksi kuvaa, jotka ovat identtisiä ihmissilmälle mutta jossa toisessa pikseleitä on siirretty yhdellä vasemmalle, eivät välttämättä kuulu samaan klusteriin, koska niiden pikseleiden välinen etäisyys on mahdollisesti kovinkin suuri.

Uskoisin, että ainoa keino haluamaasi tulokseen on tekoäly/koneoppiminen ja neuroverkot (artificial neural networks). Esimerkiksi konvolutionaalisien neuroverkkojen (CNN = convolutional neural networks) käyttö tarjoaa mahdollisuuden tarkastella kuvan ominaisuuksia jotka ovat riippumattomia skaalauksesta, rotaatiosta ja muista vääristymistä. Lisäksi mainitut menetelmä voivat oppia erittäinkin monimutkaisia riippuvuuksia eri kuvien ja niissä esiintyvien ominaisuuksie välillä.

Itse yrittäisin muodostoaa seuraavanlaisen neuroverkon: INPUT taso (syötetiedo: mustavalkokuva(t), skaalattu noin 200 * 200 kokoiseksi, tai jopa pienemmäksi) N määrä konvoluutio tasoja (convolutional layers) (esim. 4-6 jossa kuva skaalautuu kokoajan pienemmäksi mutta informaatio tiheys kasvaa), M määrä perinteisiä neuroverkkoja (fully connected layers, esim. 4 joissa muuttujien määrä pienenee kokoajan) ja OUTPUT taso, jolla neuroverkko tulostaa haluamasi tuloksen.

Mallinnus haaste on pohtia kuinka haluat klusteroinnnin tapahtuvan. Yksi esimerkki olisi antaa neuroverkolle syötteenä kaksi kuvaa ja tulos on yksi arvo väliltä 0-1 kuvaten todennäköisyyttä, että annetut kaksi kuvaa ovat samasta talosta. Edellä kuvaamani neuroverkko toiminee, jos kaikki kuvat ovat talon ulkopuolelta. Tällöin verkko voi oppia tunnistamaan talon ulkoisen verhoilumateriaalin/värin, ja esimerkiksi ikkunoiden tyylin/muodon ja katon ominaisuudet. Jos tarkoituksena on liittää ulko- ja sisäkuvia yhteen, verkon tulee olla huomattavasti suurempi ja tulosten perusteella voit myös julkaista useampiakin artikkeleita aiheesta.

The Alchemist [27.02.2018 14:38:31]

#

Kuvia pitäisi luultavasti tarkastella ns. litteiden kuvien sijaan kokoelmana objekteja. Eli algoritmin pitäisi ensin pilkkoa kuvasta objektit erilleen ja sen jälkeen yrittää tunnistaa, mitä nämä löydetyt objektit kuvastavat.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta