zaterdag 27 januari 2018

data-science-bowl-2018 - Herkennen van de bronnen

Bij een Kaggle competitie wordt gelukkig al verrassend snel voorbeeld code gedeeld van mede competitie teams / spelers. Dat maakt dat je niet alles zelf vanaf de bodem hoeft uit te programmeren. Ik 'leen' vooral veel code van dit 'Notebook': Keras U-Net starter - LB 0.277.
Met name omdat ik ook met de Keras deeplearning library wil gaan werken en het beschreven U-net al eerder in een dergelijke competitie ben tegengekomen.

Het zelfstandig ontdekken van groeperingen kan met behulp van het 'un-superviced learning algoritme',  K-means.  De Scikit - learn bibliotheek heeft daar heel goed bruikbare oplossing voor.

 In basic terms, the algorithm has three steps. The first step chooses the initial centroids, with the most basic method being to choose  samples from the dataset . After initialization, K-means consists of looping between the two other steps. The first step assigns each sample to its nearest centroid. The second step creates new centroids by taking the mean value of all of the samples assigned to each previous centroid. The difference between the old and the new centroids are computed and the algorithm repeats these last two steps until this value is less than a threshold. In other words, it repeats until the centroids do not move significantly. 

Je moet dus wel zelf het aantal gewenste clusters opgeven maar dan classificeert Kmeans de data naar grootste afwijkingen. Lijkt precies wat ik nodig heb om de verschillende microscoop-bronnen te kunnen onderscheiden.

Mijn intuïtie is dat de verschillende afbeeldingen een verschillende kleuropbouw zullen hebben. Ik maak daarom een frequentie verdeling van de kleurwaarden van de afbeelding. Omdat een afbeelding uit 3 lagen (channels) bestaat doe ik dat per laag. Ik kies uiteindelijk voor 20 bins (20 aparte vakjes per laag) .  Ik koppel ze aan elkaar zodat ik per afdeling 60 'features' krijg waar Kmeans zijn kunsten op kan botvieren. Omdat het unsuperviced is kan ik ook de test afbeeldingen meenemen in de classificatie. Het lijkt heel aardig te werken. Ik experimenteer wat met verschillende aantallen clusters maar er zit toch af en toe een vreemde 'eend in de bijt'. Omdat de bron ook voor een deel het formaat van de afbeelding lijkt te bepalen voeg ik die waarden ook toe aan de features. (Dat doe ik - iets overbodig - per laag zodat het aantal features uiteindelijk 66 wordt.
Het levert dus een klassenummer per afbeelding op. Deze ga ik wellicht later gebruiken als extra informatie bij het DL dat de maskers moet gaan samenstellen.

Voorbeelden van histogrammen:

Channel 0 (R)
Mogelijk dat de hoge waarden in het 'nul' domein iets teveel invloed hebben t.o.v. de rest van de verdeling voor een goede 'fingerprint'. Kijk ik later nog eens na.
Channel 1 (G)
Channel 2 (B)




Geen opmerkingen:

Een reactie posten