Skip navigation

Gombaspórák felismerése mesterséges intelligenciával

Az algoritmus bemutatása

Az eljárás a Mask R-CNN nevű mély neuron hálós modell használatán alapul, amely képes egy felvételen szereplő több objektumot külön-külön szegmentálni és osztályozni is. A megoldásul szolgáló szkript a Mask R-CNN-nek a https://github.com/matterport/Mask_RCNN oldalon elérhető python implementációját használja. A program használatához szükséges környezetet a Google által biztosított Colab rendszerben alakítottuk ki. A rendelkezésre álló tanító minták annotálása a bináris maszkok manuális megjelölésvel (képenként egy-egy bináris maszkkal) történt. A konfigurációs osztályban az alapértelmezett értékekhez képest az alábbi két konstanst módosítottuk:

  • BATCH_SIZE: Iterációnként feldolgozott tanítóminták száma, ha értéke 1 és a teljes mintahalmaz mérete közé esik, akkor "mini-batch" tanításról beszélünk, melynek során a hálózat hibájának valódi gradiense helyett annak közelítését számolja ki az eljrárás. Ezt az értéket 8-ra állítottuk be.
  • STEPS_PER_EPOCH: epochonkénti lépések száma, ez a tanítóhalmazunk esetén 60-as érték mellett bizonyult ideálisnak.

Bár a trichoderma és lecanicillium mintákból többszáz minta állt rendelkezésre, viszont a többi spórából viszonylag kevés mintánk (10-30) volt, emiatt szükségesnek láttuk az adatok augmentációját (adatbővítést) geometriai transzformációk és mesterséges zajok kombinálásával. Erre a célra az Imgaug nevű függvénykönyvtárat használtuk, amellyel tükrözéseket, forgatásokat, intenzitás-skálázásokat és Gauss-zaj hozzáadását adtunk meg lehetséges transzformációknak.

A tanítást 605 epochon keresztül végeztük, megfigyeléseink szerint az 500-nál több epoch során generált osztályozó modellekkel már nem javult lényegesen az osztályozás pontossága az 500 epoch után kapott eredményhez képest. A teszt eredmények alapján elmondható, hogy az osztályozó a különálló spórákat lényegében jól felismeri, és sok eseteben az összetapadó spórákat is. Felismerési hibákhoz a tanítómintáktól lényegesen eltérő kamera-paraméterekkel készített felvételek, ill. a háttérben megjelenő artefaktumok vezethetnek. Az eredményeken úgy lehetne jelentősebben javítani, ha a jelenlegihez képest lényegesen nagyobb méretű (gombatípusonként akár több ezer spórát tartalmazó) tanítóhalmaz állna rendelkezésre többféle kamera paraméterrel készített felvételeken.

A tanítás eredményeként az eljárás generált egy h5 kiterjesztésű modell-fájlt, amely a tanítási súlyokat tartalmazza. Az osztályozás tesztelésére egy külön grafikus felhasználói felülettel rendelkező programot készítettem, amely az említett h5 fájlt beolvassa, így az nem igényel további tanítást. A teszt-konfigurációban az osztályozás eredményére vonatkozó, 0 és 1 közé eső megbízhatósági küszöbértéket (DETECTION_MIN_CONFIDENCE) 0.7-nek vettem, ami azt jelenti, hogy csak azokat az objektumokat tartjuk meg az eredményhalmazban, amelyeknek az osztálycímkéjét az osztályozó legalább 70 %-os bizonyossággal határozta meg. A program a szegmentálás és osztályozás eredményét szövegesen és vizuaálisan is megadja. Szöveges formában az egyes felismert spóratípusok számát adja meg, ezenkívül az input képen más-más színnel megjelöli a szegmentált spórák maszkját és befoglaló téglalapját, valamint feltünteti a megállapított gombafajtát is.

A colab környezetben készített program teljes forrása a sporafelismero_colab.ipnyb fájlban (IPython Notebook dokumentumban) van, beleértve a tanítást végző függvényt is. A program a tanítóhalmazt olyan png fájlokból állónak feltételezi, amelyeknek a neve egy-egy egész szám (pl. 1.png, 2.png, stb.). Spórafajtánként kell egy-egy almappát létrehozni, amelybe az adott fajtának megfelelő minták kerülnek (pl. „trichoderma”), azon belül szerepelnie kell a mintákat tartalmazó felvételeknek (pl. „trichoderma/Snap-5884.tif”), és egy-egy kép esetén a kép nevével ellátott mappa egy-egy „masks” nevű alkönyvtárában kell eltárolni a bináris maszkokat, png fájlonként egy-egy maszkot (pl. „trichoderma/Snap-5884/masks/”). Tanítás előtt természetesen le kell tölteni a https://github.com/matterport/Mask_RCNN github linkről elérhető forrást, és a telepítő scriptben szereplő cd parancsnál szereplő elérési útvonalban meg kell adni a forrásmappa helyét. A tanítást végző program forrásában meg kell adni egy-egy sztringként a tanítóhalmaz és az eddigi súlyokat tartalmazó fájl elérési útvonalát (dataset_path, weights_path), valamint azt, hogy hova írja ki a program a menetközben keletkező aktuális h5 fájlokat (model_path).

Programkód és futtatás

A program forráskódja és futtatható változata az alábbi könyvtárból tölthető le:
Spórafelismerő, Google Drive link

A betanított modell tesztelését lehetővé tevő, és grafikus felülettel rendelkező program forrása két python fájlból áll: sporafelismero_start.py,sporafelismero.py. Az előbbi futtatásával jön létre a grafikus felület, az utóbbi pedig magát a spórafelismerési eljárást tartalmazza, amely az „Algoritmus futtatása” gomb lenyomására hívódik meg. Ehhez szükséges, hogy a spore_weights.h5 fájl a forrással egy mappában legyen. A programnak fejlesztőkörnyezet nélkül is futtatható változata a sporafelismero.exe, amely a forráshoz hasonlóan feltételezi a spore.weights.h5 fájl meglétét az exe fájllal egy mappában.