Citirea manuală a contoarelor este una dintre acele probleme care par simple la suprafață: un tehnician vizitează o proprietate, citește un număr și îl notează. În practică, generează o cantitate surprinzătoare de erori — cifre greșit citite, numere inversate, contoare inaccesibile și vizite costisitoare de re-citire. Pentru companiile de utilități care gestionează mii de contoare pe o regiune, aceste erori se acumulează rapid.
La AIVerse, am construit un sistem de citire automată a contoarelor pentru o companie de utilități din România. Iată cum funcționează concret.
Problema de Bază
Sistemul trebuia să:
- Citească afișajele contoarelor electrice în condiții variabile de iluminare
- Ruleze pe dispozitive Android folosite de tehnicienii din teren
- Funcționeze offline (conectivitate negarantată în zonele rurale)
- Atingă o acuratețe suficient de mare pentru a elimina necesitatea verificării manuale
O constrângere cheie: modelul trebuia să ruleze direct pe dispozitiv, nu pe un API în cloud. Latența, conectivitatea și confidențialitatea datelor indicau toate spre inferență on-device.
Pasul 1: Colectarea Datelor
Prima provocare în orice proiect de computer vision este datele. Aveam nevoie de mii de imagini cu contoare fotografiate în condiții reale — modele diferite de contoare, iluminare diferită, unghiuri diferite, geamuri murdare, afișaje cu cifre uzate.
Am colectat imagini în două moduri:
- Colectare din teren de către tehnicieni pe parcursul câtorva săptămâni
- Augmentare sintetică — luând imagini curate și aplicând transformări aleatorii (rotație, blur, variații de luminozitate, reflexii simulate)
După etichetare, aveam aproximativ 8.000 de imagini adnotate pentru mai multe tipuri de contoare. Fiecare imagine era adnotată cu bounding boxes în jurul zonei de afișaj și etichete pentru cifrele individuale.
Pasul 2: Alegerea Modelului — De Ce YOLOv5
Am evaluat mai multe arhitecturi înainte de a alege YOLOv5:
- EfficientDet — precis, dar prea lent pentru previzualizare în timp real pe dispozitive Android de gamă medie
- MobileNetSSD — rapid, dar cu dificultăți pe regiunile mici cu cifre și afișaje cu contrast scăzut
- YOLOv5s — echilibrul optim: inferență rapidă, acuratețe bună pe obiecte mici, implementare PyTorch curată, export TFLite simplu
YOLOv5s ne-a oferit aproximativ 94% acuratețe la nivel de cifră pe setul nostru de validare după fine-tuning, ceea ce s-a tradus în ~98% acuratețe a citirii complete (toate 5 cifre corecte).
Pasul 3: Antrenarea
Antrenarea a rulat pe un singur GPU (NVIDIA RTX 3090) timp de aproximativ 8 ore. Decizii cheie:
- Rezoluție intrare: 640×640 — mai mare decât implicit, îmbunătățește detecția cifrelor mici
- Transfer learning: pornit de la YOLOv5s preantrenat pe COCO, apoi fine-tuned pe setul nostru
- Augmentare: mozaic augmentation, flip orizontal dezactivat (cifrele de pe contoare nu ar trebui oglindite), variații de luminozitate/contrast
Am antrenat și un model secundar pentru localizarea afișajului — găsind mai întâi zona de afișaj, apoi decupând-o înainte de a rula detecția cifrelor. Această abordare în doi pași a îmbunătățit acuratețea pe fundal aglomerat.
Pasul 4: Conversia la TFLite
TensorFlow Lite este runtime-ul standard pentru ML on-device pe Android. Conversia din PyTorch (YOLOv5) în TFLite necesită un pas intermediar prin ONNX:
PyTorch → ONNX → TensorFlow SavedModel → TFLite
Conversia introduce o pierdere de acuratețe. Am benchmarkat cuantizarea FP32, FP16 și INT8:
| Format | Dimensiune model | Timp inferență (device gamă medie) | Pierdere acuratețe |
|---|---|---|---|
| FP32 | 14 MB | 280ms | baseline |
| FP16 | 7 MB | 180ms | ~0.3% |
| INT8 | 3.5 MB | 95ms | ~1.8% |
Am livrat INT8 — pierderea de acuratețe era acceptabilă, iar diferența de performanță era suficient de semnificativă pentru experiența utilizatorului.
Pasul 5: Aplicația Android
Aplicația Android a fost construită pe baza Android Camera2 API cu o previzualizare live care îi arată tehnicianului unde să îndrepte camera. Când modelul detectează un afișaj de contor cu o încredere ridicată, captează și procesează automat citirea.
Decizii cheie de UX:
- Overlay vizual care arată în timp real zona de contor detectată
- Scor de încredere afișat tehnicianului (poate reface dacă încrederea e scăzută)
- Citirile salvate local cu coordonate GPS și o fotografie — sincronizate cu backend-ul când există conectivitate
- Arhitectură offline-first: citirile se cumulează local și se uploadează în batch
Rezultate
După deployment pe o rețea de ~3.000 de contoare:
- Rata de eroare: de la ~4.2% (manual) la ~0.8% (automatizat)
- Timp de citire per contor: de la ~3 minute la ~45 secunde
- Rata de re-vizitare: redusă cu 60% în primul trimestru după deployment
Cele 0.8% erori rămase apar în principal la contoare cu afișaje fizic deteriorate sau cu reflexii extreme — cazuri în care sistemul semnalează o încredere scăzută și îl îndeamnă pe tehnician să citească manual.
Ce Am Învățat
Câteva lucruri care nu au fost evidente la început:
Calitatea datelor contează mai mult decât arhitectura modelului. Saltul de la primele 2.000 de imagini la 8.000 de imagini bine etichetate a îmbunătățit acuratețea mai mult decât orice schimbare de model.
Constrângerile de deployment on-device forțează decizii bune. Cerința de cuantizare INT8 ne-a împins să construim un pipeline mai curat și să testăm mai riguros. Inferența bazată pe cloud ar fi ascuns unele dintre aceste probleme.
Pipeline-urile în doi pași depășesc abordarea single-stage pentru această problemă. Localizezi mai întâi afișajul, apoi citești cifrele. Durează mai mult de construit, dar e semnificativ mai precis.
Ești interesat de o soluție similară pentru compania ta de utilități sau pentru un context industrial? Contactează-ne pentru a discuta cazul tău de utilizare.