5.30. Mallin täsmäys¶
Tähän mennessä käsitellyt tunnistimet vastaavat kysymyksiin yksittäisen kehyksen sisällöstä: missä blobit ovat, mihin viivat kulkevat, mitä painettu koodi sanoo. Toisenlainen kysymysluokka vertaa yhtä kuvaa toiseen. Näyttääkö tämä kaapatun kehyksen alue samalta kuin kalibroinnin aikana tallentamani vertailulaastari? Täsmäysmenetelmät vastaavat tähän kysymykseen.
Sävyllinen ja tilastollinen analyysi esitteli get_similarity()-menetelmän aiheeseen liittyvään kysymykseen – kuinka samankaltaisia nämä kaksi samankokoista kuvaa ovat kokonaisuutena? – jonka taustamittarina on SSIM. Jäljelle jäävä täsmäyskysymys on paikannukseen liittyvä: ei ”kuinka samankaltaisia nämä kaksi kuvaa ovat” vaan ”missä kohtaa tätä suurempaa kuvaa tuo pienempi laastari esiintyy?” Oikea työkalu paikannuskysymykseen on mallin täsmäys.
5.30.1. Peruskutsu¶
find_template() etsii ensimmäisen paikan, jossa pieni mallikuva esiintyy kaapatun kehyksen sisällä. Toteutus käyttää normalisoitua ristikorrelaatiota (NCC): malli liukuu kehyksen yli, paikkakohtainen täsmäyspistemäärä lasketaan mallin pikselien ja taustalla olevan kehyksen pikselien välisestä korrelaatiosta (normalisoituna paikallisia keskiarvoja ja varianssia vasten, jotta vahvistuksen muutokset eivät huijaa täsmäystä), ja ensimmäinen paikka, jonka pistemäärä ylittää arvon threshold, palautetaan rajauslaatikkona:
template = image.Image("/sdcard/template.bmp", copy_to_fb=False)
template.to_grayscale()
match = img.find_template(template, threshold=0.7,
search=image.SEARCH_DS)
if match is not None:
img.draw_rectangle(match, color=(255, 0, 0))
Menetelmä toimii vain harmaasävykuvilla. Kaappaa harmaasävyssä (luonnollinen valinta kaikille kameroille ilman värisensoria) tai muunna paikan päällä to_grayscale()-menetelmällä ennen kutsua. Sama koskee levyltä ladattua mallia: värimalli muunnetaan samalla menetelmällä, ja tulos on se, mitä täsmääjä odottaa.
threshold on liukuluku välillä 0.0 – 1.0. Arvo 1.0 vaatii täydellisen pikseli pikseliltä -täsmäyksen (jota ei koskaan tapahdu oikeilla kaapatuilla kuvilla), 0.0 hyväksyy mitä tahansa, ja arvot välillä 0.6 – 0.8 kattavat tavallisen tapauksen, jossa malli kaapattiin samankaltaisessa valaistuksessa eikä näkymä ole muuttunut dramaattisesti. Nosta kynnysarvoa vaimentaaksesi vääriä positiivisia; laske sitä hyväksyäksesi kohinaisempia täsmäyksiä useampien virheellisten osumien kustannuksella.
5.30.2. Hakustrategia¶
search valitsee kahden strategian välillä. image.SEARCH_EX on tyhjentävä haku: malli liukuu jokaisen step-pikselin paikan läpi kehyksessä ja palauttaa ensimmäisen kynnysarvon ylittävän osuman. image.SEARCH_DS on timanttihaku: täsmääjä näytteistää ensin karkeasti ja tarkentaa sitten parhaan pistemäärän ympärillä, mikä on dramaattisesti nopeampaa mutta voi jättää todellisen täsmäyksen huomaamatta, jos karkea vaihe sattui osumaan lähelle paikallista maksimia, joka voittaa globaalin. Reaaliaikaiseen putkeen, jossa malli on hyvin määritelty ja epätodennäköisesti sekoitettavissa, SEARCH_DS on oikea oletus; kertaluonteiseen kalibrointiin, jossa täsmäyksen huomaamatta jäämisen kustannus on suurempi kuin hitaamman skannauksen kustannus, SEARCH_EX on turvallisempi.
step ohjaa pikselien ohitusta tyhjentävän vaiheen aikana (timanttihaku hallinnoi omaa askeltaan). Suuremmat step-arvot nopeuttavat skannausta alipikselitarkkuuden kustannuksella. roi rajoittaa haun kehyksen tiettyyn alueeseen, mikä sekä kaventaa täsmääjän tarkastelua että vähentää työtä.
Palautettu arvo on (x, y, w, h) -rajauslaatikko-monikko, joka tunnistaa parhaan täsmäyksen, tai None, jos mikään paikka ei ylittänyt kynnysarvoa. Rajauslaatikko siirtyy suoraan draw_rectangle()- tai crop()-menetelmään käsittelyn seuraavaa vaihetta varten.
5.30.3. Mittakaava- ja kiertoansa¶
Mallin täsmäyksen klassinen sudenkuoppa on mittakaava- ja kiertoherkkyys. Täsmääjä vertaa mallia kehykseen pikseli pikseliltä; yhdellä etäisyydellä kaapattu malli ei täsmää samaan kohteeseen eri etäisyydellä kaapattuna, eikä suoraan edestä kaapattu malli täsmää samaan kohteeseen vinosti katsottuna. Kynnysarvo putoaa hiljaa täsmäystason alle, vaikka kohde olisi ihmissilmälle selvästi näkyvä, ja menetelmä palauttaa None.
Yksinkertaisiin tapauksiin on olemassa muutamia kiertotapoja. Sovellus voi kaapata useita malleja eri mittakaavoissa ja suorittaa find_template() kullekin järjestyksessä, hyväksyen ensimmäisen, joka ylittää kynnysarvon; kustannus skaalautuu mallien määrän mukaan. Sovellus voi esikäsitellä kehyksen rotation_corr()-menetelmällä tai napamuunnoksella (Geometriset muunnokset) poistaakseen haitallisen kierron ennen täsmäyksen suorittamista; täsmätyn mallin on silti täsmättävä korjattuun geometriaan.
Hyödyllinen idiomi laaduntarkastusputkille yhdistää mallin täsmääjän sävyllisen ja tilastollisen analyysin esittelemään samankaltaisuuspisteyttäjään: find_template() paikantaa osan kaapatussa kehyksessä, ja palautettu rajauslaatikko leikataan irti ja välitetään get_similarity()-menetelmälle vertailulaastaria vasten. Mallin täsmäysvaihe päättää missä osa on; samankaltaisuuspisteytysvaihe päättää onko osa hyväksyttävä. Molemmat vaiheet suoritetaan joka kehyksessä, mean-arvon kynnysarvo on läpäisy/hylkäys-portti, ja takaisin kehykseen piirretty täsmätty rajauslaatikko on IDE:n esikatselu, jota operaattori seuraa.