számsor lokalizálása villanyóra képen

Sziasztok!

 

Eljátszottam a gondolattal, hogy írok egy appot amivel lefotózom a villanyórát és szövegként megkapom az állást. Igen, a befektetett energia nincs arányban azzal, hogy kéthavonta egyszer használni fogom, ez hobbiprojekt, ha lesz egyáltalán.

Gyors keresgélés után tesseract.js-t ráengedtem egy közepesen szar fényképre. Az eredmény: az órán lévő mindenféle szirszart is beolvasott, a számokat meg részben tévesen. Egy fokkal jobb eredmény született, ha kivágtam a számsort és csak azt olvastattam be, bár így is volt tévesztés de első körben azért ez lényegesen javít az eredményen. Azt a feladatot szeretném tehát megoldani, hogy egy fényképről kivágjam a számláló számait.

Grafikában nem nagyon vagyok otthon. Merrefelé induljak?

Hozzászólások

Értem, hogy mindenkinek van valami hobbija, de ezt a funkciót manapság már bármely telefon kameraappja tudja.

I don't run often, but when I do, I run as administrator.

Kellene lennie és nem csak a galériába mentett képen ismeri fel a szöveget hanem magán a kamera “live” képén is. Más kérdés hogy egy villanyórán nem biztos hogy fel fogja ismerni, de egy próbát megér, mégha nem is a projekted miatt, de tök hasznos funkció. 

nekem se sikerult 13minin (legutiolkso ios15) elocsalni ezt, ha sima szoveget (feher alapon nagy fekete betukkel) fotozok akkor se

 

hmm:

  1. Open the Settings app.
  2. Tap General.
  3. Tap Language & Region, then turn on Live Text.

ez ki volt kapcsolva, bekapcsoltam es muxik. de csak kb 5 nyelvet ismer, magyart nem :(

És hányszor használtad már és mire? itt megint az van, hogy lehet, hogy abszolút mércével pl pontosabb, vagy "többet tud" a lens (elérhető iOS-re is amúgy), az ördög -meg a használhatóság- viszont a részletekben van: iOS-en a live text funkció (nem egy külön app!) a rendszer része, mindenhol lehet szöveget beolvasni, ahol normál szövegbevitel van (nem kell az appnak külön támogatni sem, a billentyűzet helyén megjelenik a kamera képe). 

nemreg volt szo itt az egyik okosmeros topicban hogy valaki irt ESP-re tensorflow light-al ilyen ami vizorat es gazmerot is felismert AI-vel.

nem feltetlen. ma mar a convolution neural network a legegyszerubb es leghatekonyabb barmilyen kepfelismeresi problemara. egyszeru tanitani, hasznalata meg, foleg ha van valami gpu/mpu a gepben akkor baromi gyors.

nem veletlen van a tensorflow lite, pont az ilyen embedded eszkozokben, meg telefonokban valo hasznalatra fejlesztettek.

ezzel szemben a klasszikus OCR, ami pixel soronkent oda-vissza atlagolgat, aztan osszehasonlitgat elore definalt fontkeszletekkel, az gpu-val nem gyorsithato, a cpu meg a kis eszkozokben lassu hozza. raadasul sokkal erzekenyebb a feny, kontraszt, zaj stb kephibakra, mint egy tobbretegu CNN.

Ipari célra gyakorlatilag nem nagyon használunk AI-t. Erre a célra nagyon jól megfelel egy sima mintaillesztés. Ez azért nem az a kategória, hogy a macskát kell megkülönböztetni a kutyától. Jó esetben több éves távlatokban változik a karakterkészlet is. Meglévő megoldások (keyence, cognex, stb.) - kis túlzással - két kattintással megoldják mindenféle mesterséges intelligencia nélkül. :)

Gondolom van olyan free lib, akármi, amiben az alapvető képfeldolgozási rutinok megtalálhatóak. Gondolok mintaillesztésre, pozíciókövetésre, és hasonlóak. Nem pont ezekre gondoltam othoni alkalmazásra, Bár cognex kamerát, amit egy sima pc-hez tudsz csatlakoztatni, ebay-en használtan láttam már egy jobb webkamera áráért is. InSight meg szabadon letölthető hozzá.

A fent linkelt posztomban az Esp32Cam 5$.

Annál is és a használt ipari kameránál is a világítás a kritikus pont.  Csak az ipari kamerához valószínűleg kell még egy PC is, ahol a szoftver fut. Nem néztem, de érzésre egy RPI nem lesz elég (*fixme*)

Feljebb linkelve lett egy gyönyörűen kidolgozott cikk openCV felhasználásával (egyébként ott is ML segítségét veszik igénybe). Az elmegy az RPI-n és akkor az Esp32Cam csak mint buta kamera van használva 

Kamera. Ráböksz a fókuszálandó szövegre, jobb szélén ekkor megjelenik egy ikon, illetve bekeretezi a szöveget. Select/select all, Copy, aztán paste amibe csak akarod.

I don't run often, but when I do, I run as administrator.

Szerkesztve: 2022. 09. 06., k – 14:14

Ha lesz konkrét tapasztalat is és megosztod, azt megköszönjük!

Az általános szövegfelismerők működnek, de a megbízhatóságuk messze nem 100%. Ha ezt a problémát a lehető legmegbízhatóbb módon kellene megcsinálnom, akkor így csinálnám:

Nekem a felismerésben a régebbi tapasztalataim alapján az az érzésem hogy ez kezelhető bonyolultságú probléma lesz. Ha az irány, betekintési szög, méret és megvilágítás változhat, az a legnehezebb probléma általánosságban. Itt megoldható, hogy ez mind állandó legyen (pl fényre: fényzáró szekrényt és pl exponálásra bekapcsolt LED megvilágítást, és fix exponálási paramétereket feltételezve), emiatt kezelhető maradhat a probléma.

Ami még fejfájást okozhat az az, hogy a számjegyek elfordulva is lehetnek, ami mindenféle köztes állapotokat is lehetővé tesz.

Én így próbálnám megcsinálni:

 * Felvenném a legalsó számjegyek egy teljes körét. A képekhez rendelném, hogy éppen milyen számot látunk.

 * Előfeldolgoznám a képet, pl leskáláznám és 1 bites fekete-fehérre alakítanám - az élkeresés nem a legjobb megoldás, mert a zajt fel tudja nagyítani.

 * Hasonlósági függvényt definiálnék. Pl egyező pixelek szám a monokrómra alakított képen. A körbeforgó számjegyet mondjuk pixelenkénti lépésekben lehet referenciának használni, de nem kell túl sok pixelt használni.

 * A hasonlóság mértéke alapján hozzárendelném a látott képet a példához. (Legjobb egyezés szerint, vagy egy egyezési küszöböt előírva.)

 * Az eredményre tennék egy hihetőség vizsgálatot -> nyilván a számok szép komótosan növekedni tudnak csak. Ha ugrást tapasztalunk, akkor valami nem jó: riasztással, illetve az érték eldobásával jutalmazzuk ezt.

 * Ha CPU csökkentés kell (ugye drága az áram...), akkor az előző képhez hasonlítanám a jelenlegit és ha nincsen változás, akkor kihagynám a munkát. Az összehasonlítást pedig csak a sorban következő állapotokra futtatnám sorban és ha egyezést találnék, akkor leállnék. Tehát lényegében csak az utolsó számjegyre működne az összehasonlító algoritmus, a többire csak akkor amikor átfordul a számjegy.

 * Plusz önellenőrzés lehet, hogy egy függőleges elmozdulást is mérünk számjegyenként, valamiféle önkorrelációt nézve az előző képkockával. Erre is vannak példák OpenCV-n belül. Ez is lehet a CPU csökkentés alapja, illetve egy keresztbe ellenőrzés ami növeli a megbízhatóságot.

 

Ez így nem túl bonyolult és szerintem eléggé megbízhatóan tudna működni a régi tapasztalataim alapján.

Minden nagyobb cloud providernek van OCR szolgáltatása, meghívod az API-t, és megkapod a képen lévő stringeket és pozíciókat. Mégcsak nem is drága, például Azure-ben havi 5000 felismerés ingyenes, szóval hobbicélra / tesztelni bőven elég, és nekem sokkal jobb eredményt adott mint egy "alap" tesseract.

Szerkesztve: 2022. 09. 07., sze – 09:08

Információ ellenőrzéshez hasznos lehet matematikai eljárás, mellyel az ellenőrizhető, hogy a várható intervallumban van-e az érték. Ez segíthet a durva eltérést detektálni. Ehhez 2 dolgot kellene tárolni:

1) leolvasás ideje (epoch formátum tökéletes, sima integer)

2) leolvasott érték (szintén integer)

Majd a leolvasások közti időszakoknak átlag fogyást számolni. Ezt úgy, hogy a 2 egymás mellett lévő leolvasott érték különbségét osztod az ezekhez tartozó 2 timestamp különbségével. Mindig a nagyobból vond ki a kisebbet. Ez azt fogja mutatni, hogy mennyi fogyás volt mekkora időszak alatt.

A leolvasásnak nem kell bizonyos időnként megtörténnie, hanem bármilyen véletlen alkalom szerint is megfelelő.

Majd a kapott értékeknek (az utolsót kivéve) veszed az átlagát (m) és szórását (s). És megnézed, hogy az utolsó érték az alábbi intervallumon belül esik-e:

m - s * 3 < ? < m + s * 3

Ha nem, akkor hiba jelzést adsz magadnak.

Mivel 3 szigma megbízhatóságot írtam, ezért az első N db leolvasásig nem fog semmiképpen hibajelzést adni. Ez úgyis felfogható, mint egy tanulási időszak. Ezért jó hibatűréssel rendelkezik a fenti számítás, mely csak egy idő után fog jelezni hibát. És ez így pont jó, mert kell valamennyi adat a pontos számításhoz. Ehhez nyilván jónak kell lennie az első pár leolvasásnak, de azt úgyis ellenőrizned kell, hogy lásd, jól működik-e a megoldás.

Ez egy kis erőforrás igényű, egyszerű és gyors számítás.

Ha ugyanazt az órát fényképezed hasonló körülmények között, lehet hogy egyszerű pattern match (vagy template matchnek hívják?) is megtalálja a szöveg helyét, valami spcifikus pontokhoz viszonyítva a képen. 

“Any book worth banning is a book worth reading.”

Ha esetleg Python is játszik:
 

import sys
import cv2
import pytesseract as pt

''' Do OCR on the file and print the text to stdout. '''
def do_work(filname):
    img = cv2.imread(filname)
    text = pt.image_to_string(img)
    print text
Szerkesztve: 2022. 09. 09., p – 10:51

Szia!
Esetleg ebből kiindulva: https://github.com/jomjol/water-meter-measurement-system ? Ismered? https://3dmixers.com/m/241745-gas-meter-ai-on-the-edge
Nálam gázórára - nyomtatott esp32cam tartóval egész stabil, pontos.
annyi, hogy egy RPi3 ftp-re tolja a képeket és ott van opencv+tesseract és hihetőségvizsg. -> majd influxd-be és grafana.

Roland

Egy profi hitelesített egy fázisú fogyasztásmérő 20-30.000 Forint, és ott rengeteg más adat is rendelkezésedre áll, pl. frekvencia, meddő teljesítmény, feszültség, stb. Vagy ott van a Shelly EM, annak kicsit talán egyszerűbb a telelpítése.