Skip navigation

Gombaspórák osztályozása és felismerése

Kinyert alakjellemzők

A gombaspórák felismerését és osztályozását alakjellemzőkre alapoztuk. Az alábbi alakjellemzőket vettük figyelembe:

  • terület,
  • kerület,
  • körszerűség,
  • körszerűségi arány (circularity ratio),
  • Hu momentumok,
  • minimális befoglaló téglalap,
  • gradiens irány-hisztogram (HOG)

Osztályozás kNN-nel és XGBOOST-tal

Először a kNN osztályozással próbáltuk meghatározni bizonyos alakjellemzőkből és gradiens irány-hisztogramból álló jellemzővektor alapján, hogy melyik spóra melyik gombafajhoz tartozik. Ezzel a módszerrel 65,21%-os pontossággal tudtuk meghatározni a gombák típusát. Más jellegű munkák kapcsán megismertem az XGBOOST nevű osztályozó algoritmust, amely többosztályos osztályozási problémára igen jó eredményt adott. Az XGBOOST algoritmus egy döntési fa alapú módszer, amelyet az utóbbi időben nagyon gyakran használnak olyan problémákra, ahol viszonylag kevés a minta elemszáma, hosszú a példányok jellemzővektora, valamint több osztály elkülönítésére van szükség. (Megjegyzem, hogy két osztály meghatározására is használható.) Java nyelven nem találtam byte-kódra fordított változatot, ezért a forrásból fordítottam az algoritmust megvalósító függvénykönyvtárat. Az osztályozót beépítettem a programkódba, így már nem csak a kNN, hanem az XGBOOST is alkalmazható.

Eredmények tekintetében az XGBOOST (kézi paraméter hangolás után) 71,73%-os pontosságot ért el ugyanazon az adathalmazon, amelyen a kNN-t vizsgáltam, így több, mint 6%-os javulást értünk el.

További jellemzőket kinyerését építettem be a programomba. Az alakvizsgálatok során nagyon eredményesen használt Hu momentumokat nyertem ki a szegmentált képekből. További teszteket futtattam a korábbi képekre. A módosítás és az új jellemzők kinyerésének hatására javult a pontosság. A kNN-es osztályozás eredménye 76,92% lett, az XGBOOST-os osztályozás pedig 90,1%-os pontosságot ért el.

Programkódok fordítása és futtatása

A spóradetektáló algoritmusok programjai az alábbi könyvtárszerkezetben vannak elrendezve:

  • modules
    • bin: futtatható állományok könyvtára
    • classes: lefordított Java fájlok helye
    • images: képek mappája
    • resources: külső függvénykönyvtárak mappája
    • results: eredmények mappája (ahol kell)
    • src: forráskódok mappája
    • videos: videófájlok mappája (a spórákhoz nem kell)

A futtatható állományok a bin könyvtárban vannak. A Java programok fordításához futtassuk le (Linux rendszer alatt) a compile_java_sources.sh szkriptet. Megjegyzés: Windows rendszer alatt ez a szkript MinGW alatt futtatható közvetlenül, de az utasításokat kimásolva Windows parancssorban is futtatható a fordító parancs.

Jellemzőkinyerés futtatása

A jellemzőkinyerő program futtatható kötegelten, felhasználói interakció nélkül a test_spore_feature_extraction.sh szkripttel, amelyben meg vannak adva, hogy az egyes spóraképek mely könyvtárban találhatóak. 

Egyedi képekre a programot az alábbi módon kell futtatni (például Trichoderma spórákat tartalmazó képekre):

java -Djava.library.path=/usr/lib64/ -cp /usr/lib/java/opencv-344.jar:../classes:classification/:tests/:segmentation:/evaluation:/skeleton/:utils/:. tests.java.SporeFeatureExtractionTest $i "trychoderma2.csv" "Trychoderma";

A kinyert jellemzők a paraméterekben megadott CSV (a fenti példában trychoderma2.csv) fájlban találhatóak.

Annotált képekre is lehet futtatni kötegelten a jellemzőkinyerő programot. Erre a test_annotated_feature_extraction.sh program szolgál, melyet az alábbi módon lehet futtatni (Linux rendszeren vagy Windows alatt MinGW-vel):

./test_annotated_feature_extraction.sh

Egyéni fájlokra a fenti szkript fájlból érdemes kimásolni a futtatási parancsot, például:

java -Djava.library.path=/usr/lib64/ -cp /usr/lib/java/opencv-344.jar:../classes:classification/:tests/:segmentation:/evaluation:/skeleton/:utils/:. tests.java.AnnotatedSporeFeatureExtractionTest $i "annotated_agaricus.csv" $ANNOTATED_FILE;

Látható, hogy itt is egy CSV fájlba lesz kimentve minden kinyert jellemző.

Spórák osztályozása

Az osztályozás gépi tanulási módszerekkel történik, amelynek első lépése a tanítás. Ehhez olyan képeket kell használnunk, ahol egyértelmű, hogy milyen spóra van a képen (annotált képek), vagy olyanokat, ahol csak egyféle spróra van a képen. Az osztályozás kiértékeléséhez egy kiértékelő halmazra is szükség van. Ezt a két halmazt a korábban, a CSV fájlokban eltárolt jellemzők felhasználásával a prepare_train_test_dataset.sh programmal választjuk szét.

A program futtatása:

./prepare_train_test_dataset.sh  input.csv train.csv test.csv

Az osztályozáshoz a test_spore_classification.sh shell szkript fájlt kell futtatni, amely kötegelten végzi el az osztályozást a benne megadott CSV állományokon. Jelenleg csak az Agaricus spórára fut le, de a szkript fájlban szerepel a többi spórára vonatkozó futtatási parancs is.

Egyedi feldolgozáshoz az alábbi parancsot kell kiadni egy tanuló és a teszt halmaz esetében (a példa most az Agaricusra vonatkozik):

java -Djava.library.path=$OPENCV_JAVA_LIB -cp $OPENCV_JAVA_LIB/opencv-3415.jar -cp $OPENCV_JAVA_LIB -cp $OPENCV_JAVA_LIB/opencv-3415.jar:../resources/xgboost4j_2.12-1.0.0-SNAPSHOT.jar:../resources/commons-logging-1.2.jar:../resources/kryo-5.0.0-RC4.jar:../classes:classification/:tests/:segmentation:/evaluation:/skeleton/:utils/:. tests.java.SporeClassificationTest ${AGARICUS_TRAINING_DATA} ${AGARICUS_TRAINING_DATA};

Demonstráció

Az alábbi videóban bemutatjuk a programok futását (ugyanaz, mint az előző oldalon):

  • detekció
  • osztályozás
  • kiértékelés

Demó videó