You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

85 lines
2.9 KiB

5 months ago
import gradio as gr
import cv2
import time
from ultralytics import YOLO
from paddleocr import PaddleOCR
import numpy as np
import detect_tools as tools
from imgTest import get_license_result
import os
os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"
# 加载YOLOv8检测模型
model_path = 'models/best.pt'
yolo_model = YOLO(model_path, task='detect')
# 加载车牌识别模型
cls_model_dir = 'paddleModels/whl/cls/ch_ppocr_mobile_v2.0_cls_infer'
rec_model_dir = 'paddleModels/whl/rec/ch/ch_PP-OCRv4_rec_infer'
ocr = PaddleOCR(use_angle_cls=False, lang="ch", det=False, cls_model_dir=cls_model_dir, rec_model_dir=rec_model_dir)
def Car_detection():
def predict_image(query_image):
start_time = time.time()
# 图像预处理
img = cv2.cvtColor(query_image, cv2.COLOR_BGR2RGB)
print(f"Image preprocessing time: {time.time() - start_time:.2f}s")
# 使用YOLOv8检测车辆和车牌位置
yolo_start = time.time()
results = yolo_model(img)[0]
yolo_output = img.copy() # 复制原图像用于显示YOLO结果
location_list = results.boxes.xyxy.tolist()
print(f"YOLO detection time: {time.time() - yolo_start:.2f}s")
# 处理每个检测到的车牌区域
license_numbers = []
for location in location_list:
x1, y1, x2, y2 = list(map(int, location))
crop_img = img[y1:y2, x1:x2]
# 使用PaddleOCR识别车牌号
license_num, confidence = get_license_result(ocr, crop_img)
if license_num:
license_numbers.append(license_num)
else:
license_numbers.append("无法识别")
# 在YOLO结果图上绘制检测框
cv2.rectangle(yolo_output, (x1, y1), (x2, y2), (0, 255, 0), 2)
return yolo_output, "\n".join(license_numbers)
title = "<h1 align='center'>基于Opencv图像处理的车牌检测与识别</h1>"
description = "上传一张包含车辆的图像,系统将检测车辆并识别车牌号码"
# examples = [['images/car.jpg'], ['images/car.png'], ['images/car_test.jpg']]
with gr.Blocks() as demo:
gr.Markdown(title)
gr.Markdown(description)
with gr.Row():
with gr.Column(scale=1):
img = gr.components.Image(label="上传图片")
btn = gr.Button("点击检测与识别")
with gr.Column(scale=1):
out_1 = gr.components.Image(label="YOLO定位结果:", height="auto")
out_2 = gr.components.Textbox(label="车牌识别结果:", type="text", lines=6)
inputs = [img]
outputs = [out_1, out_2]
btn.click(fn=predict_image, inputs=inputs, outputs=outputs)
# gr.Examples(examples, inputs=inputs)
return demo
if __name__ == "__main__":
with gr.TabbedInterface(
[Car_detection()],
["Opencv车牌检测与识别"],
) as demo:
demo.launch(show_api=False, inbrowser=True)