Lépések 1. tanító és teszt halmaz összeállítása / megszerzése 2. jellemzők kinyerése 3. tanító eljárás választása Sok vagy kevés adat áll-e rendelkezésünkre? Mennyi tanítási idő/memória áll rendelkezésre? Lineárisan szeparálhatók-e az osztályok? Milyen típusú jellemzőink vannak ( nominális (pl.: férfi/nő), ordinális (betegség stádiuma: 1, 2, 3, 4), intervallum (pl.: súly, magasság) Mennyire hajlamos túltanulni az algoritmus? 4. Előkészítés tanításhoz Szükség lehet a jellemzők normalizálására Szükség lehet a hiányzó adatok pótlására Szükség lehet a dimenziószám redukálására ( a túlzottan hasonló jellemzők eltávolítására, az osztályt legjobban leíró jellemzők kiválasztására. Pl. PCA) 5. Tanítás 6. Tesztelés
Példák jellemzőkre: - minden pixelérték egy jellemző pl. neurális hálózat esetében csak kis képekre, nem invariáns sem a megvilágításra, sem a geom. trf-ekere - alakleírók csak ha megfelelően tudod szegmentálni az objektumot, vagy annak releváns részletét - textúraleírók momentumok, Hu momentumok (invariáns a skálázásra, forgatásra) HOG jellemzők ( hisztogram of Oriented Gradients) Haar szerű jellemzők
Töltsd le a képeket (a kép osztályonként van tárolva =>a kép mappája a címke): https://arato.inf.unideb.hu/szeghalmy.szilvia/kepfeld/img/tanitas.zip https://arato.inf.unideb.hu/szeghalmy.szilvia/kepfeld/img/tablak.zip Minden egyes könyvtárra: Olvasd fel az összes képet Nyerj ki képről M darab jellemzőt (válassz önállóan, majd a végén összevetjük az eredményeket) Mentsd ki a jellemzőket egy jellemzok.csv nevű fájlba: soronként: címke,jellemző_0,jellemző_1,,jellemző_m-1 <címke>: a kép könyvtára (számként)
A tanításhoz döntési fát használunk Okok: 1. nem a jellemző vektorok távolsága alapján dolgozik (nem gond, ha nagyon eltérő jellemzők vannak) 2. nem akarunk itt aludni (viszonylag gyors lesz a felépítés) Tanító eljárások használatához szükséges include fájl: ml.hpp Olvassuk fel az előző progi által mentett jellemző fájlt TrainData* TrainData::loadFromCSV(adatfájl, vanfejlec, cimke_idx); adatfájl: a csv fájl neve elérési úttal (a példánkban "jellemzok.txt) vanfejlec: 0 vagy 1. Ha 1, akkor a fájl első sorát kihagyja az olvasásnál (a példánkban 0) cimke_idx: melyik oszlopban áll a jellemzők osztálya (a példánkban 0)
Állítsd be, hogy a minták közül mennyit használjunk a tanításhoz, mennyit a teszteléshez ( az értéket nyugodtan változtasd, ha akarod ): data->settraintestsplitratio(0.5f); Válassz paramétereket DTrees::Params par; par.maxdepth = 6; par.minsamplecount = 20; par.cvfolds = 0; Hozzd létre egy döntési fa osztályt: Ptr<Dtrees> dtree = DTrees::create(p); Építsd fel a fát: model->train(data); //maximális mélység //egy levélnél hány minta kell minimum //keresztvalidáláshoz képzett csoportok Ellenőrizd a tanítás sikerességét/sikertelenségét: dtree->calcerror(data, tanító_vagy_teszt, cimkek); tanító_vagy_teszt: true/false cimkek: noarray() vagy Mat típusú változó. Mentsd el a modellt: dtree->save("dtree_model.xml");
Általában külön programban használjuk fel, ezért beolvasnánk a modellt (most nem kell, hiszen már létezik a fa) : Ptr<DTrees> dtree = StatModel::load<DTrees>("dtree_model.xml"); Olvass fel egy vagy több képet, és számítsd ki a jellemzőket. Tárold el egy CV_32FC1-es mátrixban. Minden sor egy objektum jellemzőt tartalmazza, a korábbi sorrendnek megfelelően. Egyetlen kép és 7 darab jellemző esetén a tárolásra használt mátrix: Mat sample(1, 7, CV_32F); A felolvasott modellel becsültesd meg a címkét: int cimke = (int)(dtree->predict(sample) + 0.5); (ha több mintával dolgoztál, akkor egy mátrixot is adj át, melyben visszakapod a becsült címkéket) Jelenítsd meg a kapott értéket
Kiindulási pont: a leírni kívánt objektum Például: körvonal, maszk, maszk alatti képrész Terület: contourarea(kontúr, orientáció); Kerület: arclength(kontúr, zárt-e); Befoglaló téglalap: boundingrect(kontúr); Minimális területű befoglaló téglalap: RotatedRect minarearect(kontúr); Befoglaló ellipszis: RotatedRect fitellipse(kontúr) Befoglaló kör: minenclosingcircle(inputarray kontúr, Point2f& kp, float& sugar);
konvex burok kerülete konvexitás = objektum kerülete cv::convexhull(contour, convhull, false, true ); cirkularitás = terület vagy 4π terület kerület 2 kerület 2 (körre maximális) kompaktság = kerület2 terület vagy 4 terület π átmérő vagy 4π terület átmérő átmérő = max d(p, q) p,q C ekvivalensköratmerő = 2 terület π C: kontúr szálhossz = 0.25(kerület + kerület 2 16 terület) szálszelesség = 0.25(kerület kerület 2 16 terület) excentricitás = főtengely hossza melléktengely hosza Tengelyek meghatározása pl. a befoglaló ellipszis alapján vagy a leghosszabb obj-n belüli szakaszt véve főtengelynek, és arra merőleges leghosszabbat melléktengelynek.
OpenCV-ben Moments m = moments( kép/kontúr, bináris-e?); //bináris-e a kép (kontúrnál alap) Bináris-e: NEM I(x,y) a világosságkód érték, x, y a kép koordinátái Bináris-e: IGEN x, y csak az objektumpontok koordinátái, I (x,y) = 1-nek tekintve Jellemzők: m.mpq, ahol pq: 00, 10, 01, 11, 20, 02, 21, 12, 30, 03 A p+q-adrendű térbeli (geometriai) momentum számítása m pq = x y x p y q I(x, y) Súlypont számítása: C(x, y) = m 10 m 00, m 01 m 00 (Bináris képnél a koordináták átlaga, szürkeskálásnál az intenzitásértékkel súlyozott átlaga)
OpenCV-ben Moments m = moments( kép, bináris-e); //bináris-e: maszk vagy kép Bináris-e: NEM I(x,y) a világosságkód érték, x, y a kép koordinátái Bináris-e: IGEN x, y csak az objektumpontok koordinátái, I (x,y) = 1-nek tekintve Jellemzők: m.mupq, ahol pq: 11, 20, 02, 21, 12, 03, 30 A p+q-adrendű centrális momentum számítása mu pq = (x x ) p (y y) q I(x, y) x y
OpenCV-ben Moments m = moments( kép, bináris-e); Bináris-e: NEM I(x,y) a világosságkód érték, x, y a kép koordinátái Bináris-e: IGEN x, y csak az objektumpontok koordinátái, I (x,y) = 1-nek tekintve Jellemzők: m.nupq, ahol pq: 11, 20, 02, 21, 12, 30, 03 A p+q-adrendű normalizát centrális momentum számítása mu pq nu pq = 1 + (p + q)/2 mu pq a p+q-ad rendű centrális momentum
OpenCV-ben Moments m = moments( kép, bináris-e); double hu[7]; HuMoments humoments(m, hu); //bináris-e: maszk vagy kép //momentumok tárolására //HU momentumok számítása Normalizált centrális momentumokból számolhatók Affin transzformációkra invariáns (skálázás, forgatásra, ) (digitális világ: az eredeti és az elfogatott/skálázott obejektum HU momentumai különbözhetnek) A tulajdonságaiból következően hasznos pl. ha a felismerendő alakzat forgatás invariáns ne használd, ha a felismerendő alakzatnak fontos a mérete, orientációja