← Înapoi la Blog
·6 min read

Cum Funcționează Citirea Automată a Contoarelor cu AI

O privire practică asupra modului în care modelele de computer vision pot elimina erorile de citire manuală a contoarelor — de la colectarea datelor și antrenarea modelului până la deployment edge pe dispozitive Android.

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:

  1. Colectare din teren de către tehnicieni pe parcursul câtorva săptămâni
  2. 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.