APIMONSTER commited on
Commit
a0e95d4
·
verified ·
1 Parent(s): eefc184

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +52 -57
app.py CHANGED
@@ -1,49 +1,46 @@
 
1
  import numpy as np
2
- np.int = int # PaddleOCR’nin eski np.int kullanım yaması
3
 
4
- import cv2, json, tempfile, re, gradio as gr
 
5
  from ultralytics import YOLO
6
  from paddleocr import PaddleOCR
7
 
8
- # 1) Modelleri yükle
9
  yolo = YOLO("models/best.pt")
10
  ocr = PaddleOCR(
11
- det=False, # tespit yok
12
- rec=True, # sadece okuma
13
- rec_model_dir="models/ocr_model",
14
- rec_image_shape="3,32,128", # inference.yml ile uyumlu
15
- cls=True, # açı düzeltmesi
16
- use_angle_cls=True,
17
- use_space_char=True
18
  )
19
 
20
- # 2) Plaka formatlayıcı
21
- def format_turkish_plate(s):
22
  s = re.sub(r'[^A-Z0-9]', '', s.upper())
23
  m = re.match(r'^(\d{2})([A-Z]{1,3})(\d{2,4})$', s)
24
  return f"{m.group(1)} {m.group(2)} {m.group(3)}" if m else "Unknown"
25
 
26
- # 3) Görüntü için işlem
27
  def run_image(img, conf=0.25):
28
  bgr = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
29
  res = yolo(bgr, conf=conf)[0]
30
  out = bgr.copy()
31
 
32
- for box, score in zip(res.boxes.xyxy.cpu().numpy(),
33
- res.boxes.conf.cpu().numpy()):
34
  x1,y1,x2,y2 = box.astype(int)
35
  crop = out[y1:y2, x1:x2]
36
- if crop.size == 0: continue
37
 
38
- plate_img = cv2.resize(crop, (128, 32))
39
- try:
40
- recs = ocr.ocr(plate_img, det=False, cls=True)
41
- if recs and recs[0]:
42
- raw,ocr_score = recs[0][1][0], recs[0][1][1]
43
- else:
44
- raw,ocr_score = "", 0.0
45
- except:
46
- raw,ocr_score = "", 0.0
47
 
48
  plate = format_turkish_plate(raw)
49
  label = f"{plate} ({ocr_score:.2f})"
@@ -54,67 +51,65 @@ def run_image(img, conf=0.25):
54
 
55
  return cv2.cvtColor(out, cv2.COLOR_BGR2RGB), f"{len(res.boxes)} plate(s) detected"
56
 
57
- # 4) Video için işlem
58
  def run_video(video_file, conf=0.25):
59
  cap = cv2.VideoCapture(video_file)
60
  fps = cap.get(cv2.CAP_PROP_FPS)
61
  w,h = int(cap.get(3)), int(cap.get(4))
62
  outfp = tempfile.NamedTemporaryFile(suffix=".mp4", delete=False).name
63
  writer = cv2.VideoWriter(outfp, cv2.VideoWriter_fourcc(*"mp4v"), fps, (w,h))
64
- records = []; idx = 0
65
 
66
  while True:
67
  ret, frame = cap.read()
68
  if not ret: break
69
- idx += 1; t = idx/fps
 
70
 
71
  res = yolo(frame, conf=conf)[0]
72
  for (x1,y1,x2,y2) in res.boxes.xyxy.cpu().numpy().astype(int):
73
  crop = frame[y1:y2, x1:x2]
74
  if crop.size==0: continue
75
-
76
  plate_img = cv2.resize(crop, (128,32))
77
- try:
78
- recs = ocr.ocr(plate_img, det=False, cls=True)
79
- if recs and recs[0]:
80
- raw,ocr_score = recs[0][1][0], recs[0][1][1]
81
- else:
82
- raw,ocr_score = "", 0.0
83
- except:
84
- raw,ocr_score = "", 0.0
85
 
86
  plate = format_turkish_plate(raw)
87
- if plate!="Unknown":
88
- records.append({"time_s":round(t,2),"plate":plate,"conf":round(ocr_score,3)})
89
 
90
- cv2.rectangle(frame,(x1,y1),(x2,y2),(0,255,0),2)
91
- cv2.putText(frame,plate,(x1,y1-5),
92
- cv2.FONT_HERSHEY_SIMPLEX,0.6,(0,255,0),2)
93
 
94
  writer.write(frame)
95
 
96
  cap.release(); writer.release()
97
  with open("output.json","w") as f:
98
- json.dump(records,f,indent=2)
99
- return outfp, "Done"
100
 
101
- # 5) Gradio Arayüzü
102
  with gr.Blocks() as demo:
103
- gr.Markdown("## 🚗 License Plate Detection & Recognition")
104
  with gr.Row():
105
  with gr.Column():
106
- img_in = gr.Image(type="numpy", label="Upload Image")
107
- vid_in = gr.File(label="Upload Video (.mp4)")
108
- conf = gr.Slider(0,1,0.25,0.01, label="YOLO Confidence")
109
- btn_i = gr.Button("Run Image")
110
- btn_v = gr.Button("Run Video")
111
  with gr.Column():
112
- img_out = gr.Image(type="numpy", label="Annotated Image")
113
- vid_out = gr.Video(label="Annotated Video")
114
- status = gr.Textbox(label="Status / JSON Path")
115
 
116
- btn_i.click(run_image, [img_in,conf],[img_out,status])
117
- btn_v.click(run_video, [vid_in,conf],[vid_out,status])
118
 
119
  if __name__=="__main__":
120
- demo.launch()
 
1
+ # app.py
2
  import numpy as np
3
+ np.int = int # patch for PaddleOCR’s old np.int calls
4
 
5
+ import cv2, json, tempfile, re
6
+ import gradio as gr
7
  from ultralytics import YOLO
8
  from paddleocr import PaddleOCR
9
 
10
+ # 1) Load models
11
  yolo = YOLO("models/best.pt")
12
  ocr = PaddleOCR(
13
+ text_detection_model_dir=None,
14
+ text_recognition_model_dir="models/ocr_model",
15
+ use_textline_orientation=False,
16
+ lang="en"
 
 
 
17
  )
18
 
19
+ # 2) Turkish plate formatter
20
+ def format_turkish_plate(s: str) -> str:
21
  s = re.sub(r'[^A-Z0-9]', '', s.upper())
22
  m = re.match(r'^(\d{2})([A-Z]{1,3})(\d{2,4})$', s)
23
  return f"{m.group(1)} {m.group(2)} {m.group(3)}" if m else "Unknown"
24
 
25
+ # 3) Single‐image inference
26
  def run_image(img, conf=0.25):
27
  bgr = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
28
  res = yolo(bgr, conf=conf)[0]
29
  out = bgr.copy()
30
 
31
+ for box, yolo_score in zip(res.boxes.xyxy.cpu().numpy(),
32
+ res.boxes.conf.cpu().numpy()):
33
  x1,y1,x2,y2 = box.astype(int)
34
  crop = out[y1:y2, x1:x2]
35
+ if crop.size==0: continue
36
 
37
+ plate_img = cv2.resize(crop, (128,32))
38
+ recs = ocr.ocr(plate_img, cls=False)
39
+
40
+ if recs and recs[0]:
41
+ _, (raw, ocr_score) = recs[0]
42
+ else:
43
+ raw, ocr_score = "", 0.0
 
 
44
 
45
  plate = format_turkish_plate(raw)
46
  label = f"{plate} ({ocr_score:.2f})"
 
51
 
52
  return cv2.cvtColor(out, cv2.COLOR_BGR2RGB), f"{len(res.boxes)} plate(s) detected"
53
 
54
+ # 4) Video inference (same pattern)
55
  def run_video(video_file, conf=0.25):
56
  cap = cv2.VideoCapture(video_file)
57
  fps = cap.get(cv2.CAP_PROP_FPS)
58
  w,h = int(cap.get(3)), int(cap.get(4))
59
  outfp = tempfile.NamedTemporaryFile(suffix=".mp4", delete=False).name
60
  writer = cv2.VideoWriter(outfp, cv2.VideoWriter_fourcc(*"mp4v"), fps, (w,h))
61
+ records, idx = [], 0
62
 
63
  while True:
64
  ret, frame = cap.read()
65
  if not ret: break
66
+ idx += 1
67
+ t = idx / fps
68
 
69
  res = yolo(frame, conf=conf)[0]
70
  for (x1,y1,x2,y2) in res.boxes.xyxy.cpu().numpy().astype(int):
71
  crop = frame[y1:y2, x1:x2]
72
  if crop.size==0: continue
 
73
  plate_img = cv2.resize(crop, (128,32))
74
+ recs = ocr.ocr(plate_img, cls=False)
75
+
76
+ if recs and recs[0]:
77
+ _, (raw, ocr_score) = recs[0]
78
+ else:
79
+ raw, ocr_score = "", 0.0
 
 
80
 
81
  plate = format_turkish_plate(raw)
82
+ if plate != "Unknown":
83
+ records.append({"time_s":round(t,2), "plate":plate, "conf":round(ocr_score,3)})
84
 
85
+ cv2.rectangle(frame, (x1,y1),(x2,y2), (0,255,0), 2)
86
+ cv2.putText(frame, plate, (x1,y1-5),
87
+ cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0,255,0), 2)
88
 
89
  writer.write(frame)
90
 
91
  cap.release(); writer.release()
92
  with open("output.json","w") as f:
93
+ json.dump(records, f, indent=2)
94
+ return outfp
95
 
96
+ # 5) Gradio UI
97
  with gr.Blocks() as demo:
98
+ gr.Markdown("## 🚗 License Plate Detection + Recognition")
99
  with gr.Row():
100
  with gr.Column():
101
+ img_in = gr.Image(type="numpy")
102
+ vid_in = gr.File(label="Video (.mp4)")
103
+ conf = gr.Slider(0,1,0.25,0.01)
104
+ b1 = gr.Button("Run Image")
105
+ b2 = gr.Button("Run Video")
106
  with gr.Column():
107
+ img_out = gr.Image(type="numpy")
108
+ vid_out = gr.Video()
109
+ status = gr.Textbox()
110
 
111
+ b1.click(run_image, [img_in,conf], [img_out,status])
112
+ b2.click(run_video, [vid_in,conf], [vid_out,status])
113
 
114
  if __name__=="__main__":
115
+ demo.launch()