OCA.DEV
arrow_back ALL PROJECTSTÜM PROJELER

plakatanima

COMPLETE • MEASURED END TO END

Turkish licence plate recognition: a synthetic data generator calibrated against real plates, a CTC sequence recogniser fine-tuned on them, a constrained beam search over the Turkish plate grammar written in C++, temporal voting across frames, and the whole pipeline exported to TensorRT and measured on a rented GPU. Türk plakası tanıma: gerçek plakalara göre kalibre edilmiş sentetik veri üreteci, onlarla ince ayar yapılmış CTC dizi tanıyıcısı, C++'ta yazılmış Türk plaka dilbilgisine kısıtlı ışın araması, kareler arası zamansal oylama, ve TensorRT'ye aktarılıp kiralık GPU'da ölçülmüş bir pipeline.

18 / 34 plates read, fully automatic plaka okundu, tam otomatik
272 real plates labelled by hand elle etiketlenmiş gerçek plaka
8.93 ms GPU-side per frame, T4 GPU tarafı, kare başına, T4
24.7× YOLO, TensorRT FP16 YOLO, TensorRT FP16

Two numbers, and only one of them is the system İki sayı var, sistemin sayısı bunlardan biri

HELD-OUT TEST SET — 34 PLATES, 157 CROPS
Corners marked by hand 22 / 34  (64.7%)
Corners found by a model 18 / 34  (52.9%)

The second row is the system's real number. The first shows what the recogniser can do on its own, but it assumes four corners a human marked; in deployment a model finds those corners and its error lands on top of everything else. The page leads with both because only one of them is what a camera would deliver. İkinci satır sistemin gerçek sayısı. Birincisi tanıyıcının kendi başarısını gösteriyor ama insanın işaretlediği dört köşeyi varsayıyor; dağıtımda o köşeleri bir model buluyor ve hatası her şeyin üstüne biniyor. Sayfa ikisini birden veriyor çünkü bir kameranın üreteceği olan yalnızca biri.

AND THE GAP IS NOT RESOLVED

Even that four-plate difference is not something this sample can settle. Of the ten discordant plates, seven are losses and three are gains — McNemar gives p ≈ 0.34. A four-plate gap on 34 plates looks decisive and is not, so the log says so rather than banking the difference as a finding. O dört plakalık fark bile bu örneklemin çözebileceği bir şey değil. Ayrık on plakanın yedisi kayıp, üçü kazanç — McNemar p ≈ 0,34 veriyor. 34 plakada dört plakalık fark kesin görünüyor ama değil; günlük de farkı bulgu diye kasaya koymak yerine bunu yazıyor.

Discordant plates10
Losses / gains7 / 3
McNemarp ≈ 0.34

How it got there — including the step that cost four plates Oraya nasıl gelindi — dört plakaya mal olan adım dâhil

Stage Plates read What it added
Synthetic data only 4 / 34 A generator alone does not cross the gap to real glass, rain and motion blur.
+ fine-tune on real plates 18 / 34 The single largest jump, and the reason the labelling effort was worth it.
+ constrained decoder in C++ 22 / 34 Beam search over the Turkish plate grammar rules out strings a plate cannot be.
+ corners found by a model 18 / 34 The honest configuration. Removing the human costs back everything the decoder won.

The road was not straight. The first training run scored zero, the second stalled at 0.42, the generator turned out never to produce 54% of real plates, and at one point the pipeline invented plates with full confidence on crops that had nothing readable in them. All of it measured and fixed, none of it deleted. Yol düz gelmedi. İlk eğitim sıfır verdi, ikincisi 0,42'de takıldı, üretecin gerçek plakaların %54'ünü hiç üretmediği ortaya çıktı, ve boru hattı bir ara okunacak hiçbir şey olmayan kırpmalarda tam güvenle plaka uydurdu. Hepsi ölçülüp düzeltildi, hiçbiri silinmedi.

Speed, and what it is notHız, ve ne olmadığı

MEASURED ON A RENTED T4
Local CPU, per frame115.4 ms · 8.7 FPS
GPU-side work on a T48.93 ms
TensorRT FP16 — YOLO24.7×
TensorRT FP16 — recogniser5.4×
FP16 fidelity157 / 157 identical
Box drift under FP160.022 px mean

It is not real-time at 60 fps, and says so 60 fps'te gerçek zamanlı değil, ve bunu yazıyor

The footage is recorded at 60 fps and the system does not keep up with that. What saves it is the shape of the problem rather than the hardware: a vehicle stays in frame for seconds, and the temporal vote only needs a handful of frames to settle on a plate. Quoting the GPU number alone would have implied a real-time claim the measurement does not support. Kayıt 60 fps ve sistem bu hıza yetişmiyor. Onu kurtaran donanım değil, problemin şekli: bir araç kadrajda saniyelerce kalıyor ve zamansal oylamanın bir plakaya karar vermesi için birkaç kare yetiyor. Yalnızca GPU sayısını vermek, ölçümün desteklemediği bir gerçek zamanlılık iddiası ima ederdi.

FP16 was checked for accuracy, not just speed: all 157 crops decode to the same plates and YOLO's boxes move 0.022 px on average. A speedup that quietly changed an answer would not be a speedup. FP16 yalnızca hız için değil doğruluk için de kontrol edildi: 157 kırpmanın tamamı aynı plakalara çözülüyor ve YOLO'nun kutuları ortalama 0,022 piksel oynuyor. Bir cevabı sessizce değiştiren hızlanma, hızlanma sayılmaz.

Where the measurement beat the expectation Ölçümün beklentiyi yendiği yerler

01

The generator was calibrated, not guessedÜreteç tahmin edilmedi, kalibre edildi

272 real plates were labelled first, then the generator was tuned to them. The plan assumed ±35° of horizontal angle; the measurement said about 7°, because the dashcam sits behind and above the car ahead. Scale was sampled uniformly with a median of 167 px where the real median is 105, so real widths are bootstrapped now. Önce 272 gerçek plaka etiketlendi, sonra üreteç onlara göre ayarlandı. Plan ±35° yatay açı varsayıyordu; ölçüm yaklaşık 7° dedi, çünkü dashcam öndeki aracın arkasında ve yukarısında duruyor. Ölçek ortancası 167 piksel olacak şekilde düzgün örnekleniyordu, gerçeğin ortancası 105; artık gerçek genişlikler bootstrap ediliyor.

Horizontal yaw±35° assumed → ~7° measured
Median plate width167 px → 105 px
Coverage of real plates54% never generated, then fixed
02

A GPU table where all four rows were the CPU Dört satırının dördü de CPU olan bir GPU tablosu

A benchmark reported a 1.02× TensorRT speedup, which looked reasonable — the models are small, so little gain is plausible. The script's own stderr was printing "falling back to CPU" while its table said "TensorRT FP16". A wrong number that matches expectation is more dangerous than one that looks wrong, so the benchmark now proves which provider actually ran before it prints anything. Bir ölçüm 1,02x TensorRT hızlanması raporladı ve makul göründü — modeller küçük, az kazanç beklenir. Betiğin kendi stderr'i "CPU'ya düşülüyor" yazarken tablosu "TensorRT FP16" diyordu. Beklentiye uyan yanlış sayı, yanlış görünen yanlış sayıdan daha tehlikeli; ölçüm artık bir şey yazdırmadan önce hangi sağlayıcının gerçekten çalıştığını kanıtlıyor.

Reported then1.02× "TensorRT FP16"
Actually runningCPU, all four rows
After the fix24.7× YOLO · 5.4× recogniser
03

Three negative results, keptÜç olumsuz sonuç, saklandı

Multi-task learning on a shared trunk made both tasks worse. The C++ pipeline came out slower than Python — Python was never the bottleneck. TensorRT FP32 gained nothing on models this small. Each of these would have been just as believable in reverse, which is exactly why they are in the log instead of being quietly dropped. Ortak gövdeli çok görevli öğrenme iki işi birden bozdu. C++ boru hattı Python'dan yavaş çıktı — darboğaz hiçbir zaman Python değilmiş. TensorRT FP32 bu küçüklükteki modellerde hiçbir şey kazandırmadı. Üçünün de tersi aynı derecede inandırıcı görünürdü; sessizce düşürülmek yerine günlükte durmalarının sebebi tam olarak bu.

Multi-task, shared trunkworse at both
C++ pipeline vs Pythonslower
TensorRT FP32no gain at this size

Why the data is not in the repository Veri neden repoda değil

A plate is personal data in Türkiye. A bare crop might pass as context-free, but the filename encodes the source video and the second, and the label file ties the text to it — the combination is plate plus place plus time. The trained weights are out for the same reason. What is published is the code and the synthetic pipeline, which runs on one command and needs nobody's data. Plaka Türkiye'de kişisel veri. Çıplak bir kırpma bağlamsız sayılabilirdi ama dosya adı kaynak videoyu ve saniyeyi kodluyor, etiket dosyası da metni ona bağlıyor — birleşim plaka artı yer artı zaman ediyor. Eğitilmiş ağırlıklar da aynı sebeple dışarıda. Yayımlanan şey kod ve sentetik pipeline; tek komutla çalışıyor ve kimsenin verisine ihtiyaç duymuyor.

WHAT LABELLING ACTUALLY YIELDED
Vehicle crops reviewed2,119
Had a readable plate38% — 811 crops / 272 plates
No plate visible706
Plate there but unreadable602

That 38% is the unwritten condition under every accuracy number in the log: it sets the pipeline-level yield before any model is involved. Bu %38, günlükteki her doğruluk sayısının yazılmamış koşulu: hiçbir model işin içine girmeden önce pipeline düzeyindeki verimi belirliyor.

Where it standsŞu anki durum

Phase Scope Status
0Synthetic generator + real data collectionDONE
1Corner regression + an acceptance gateDONE
2CTC recogniser + fine-tuning on real platesDONE
3Constrained decoding in C++ + confidence calibrationDONE
4ONNX + TensorRT FP16, measured on a T4DONE
5Temporal voting, ByteTrack, C++ pipelineDONE
6Edge-device latency measurementsOUT OF SCOPE — NO HARDWARE

The plan wanted a Jetson Orin Nano, a global-shutter camera and IR lighting. None of it exists here, so the edge phase is written down as out of scope instead of estimated, and the thesis sentence changed from "30 FPS on device" to "measured on cloud GPU; no device measurement was taken". Plan Jetson Orin Nano, global shutter kamera ve IR aydınlatma istiyordu. Hiçbiri yok; bu yüzden uç cihaz fazı tahmin edilmek yerine kapsam dışı yazıldı ve tez cümlesi "uç cihazda 30 FPS"ten "bulut GPU'da ölçüldü, uç cihaz ölçümü yapılmadı"ya döndü.

Read furtherDevamını oku