From c8a541ec1161b5dc773593281c813e006796f395 Mon Sep 17 00:00:00 2001 From: spdis Date: Sun, 31 Aug 2025 16:11:18 +0800 Subject: [PATCH 1/7] Merge pull request 'yolorestart' (#1) from yolopart_restart into main Reviewed-on: https://gitea.spdis.top/spdis/License_plate_recognition/pulls/1 --- .idea/License_plate_recognition.iml | 2 +- .idea/misc.xml | 2 +- OCR_part/ocr_interface.py | 37 +++++++---------------------- requirements.txt | 5 ++++ 4 files changed, 16 insertions(+), 30 deletions(-) diff --git a/.idea/License_plate_recognition.iml b/.idea/License_plate_recognition.iml index 2328911..57ba54e 100644 --- a/.idea/License_plate_recognition.iml +++ b/.idea/License_plate_recognition.iml @@ -2,7 +2,7 @@ - + diff --git a/.idea/misc.xml b/.idea/misc.xml index 9475f0b..aeaf94a 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,5 +3,5 @@ - + \ No newline at end of file diff --git a/OCR_part/ocr_interface.py b/OCR_part/ocr_interface.py index 294e568..92b8048 100644 --- a/OCR_part/ocr_interface.py +++ b/OCR_part/ocr_interface.py @@ -1,36 +1,17 @@ import numpy as np +from paddleocr import TextRecognition +import cv2 def initialize_ocr_model(): - """ - 初始化OCR模型 - - 返回: - bool: 初始化是否成功 - """ - # OCR模型初始化代码 - # 例如: 加载预训练模型、设置参数等 - + model = TextRecognition(model_name="PP-OCRv5_server_rec") print("OCR模型初始化完成(占位)") - return True + return model def ocr_predict(image_array): - """ - OCR车牌号识别接口函数 - - 参数: - image_array: numpy数组格式的车牌图像,已经过矫正处理 - - 返回: - list: 包含7个字符的列表,代表车牌号的每个字符 - 例如: ['京', 'A', '1', '2', '3', '4', '5'] - """ - # 这是OCR部分的占位函数 - # 实际实现时,这里应该包含: - # 1. 图像预处理 - # 2. OCR模型推理 - # 3. 后处理和字符识别 - - # 临时返回占位结果 - placeholder_result = ['待', '识', '别', '0', '0', '0', '0'] + # 保持原有模型调用方式 + output = initialize_ocr_model().predict(input=image_array) + # 结构化输出结果 + results = output[0]["rec_text"] + placeholder_result = results.split(',') return placeholder_result diff --git a/requirements.txt b/requirements.txt index 57cb5ac..f5e0e68 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,6 +11,11 @@ PyQt5>=5.15.0 # 图像处理 Pillow>=8.0.0 +#paddleocr +python -m pip install paddlepaddle-gpu==3.0.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu118/ +python -m pip install "paddleocr[all]" + + # 可选:如果需要GPU加速 # torch>=1.9.0 # torchvision>=0.10.0 -- 2.47.2 From 3829cf76ee203823e999d6ed112747ac83732342 Mon Sep 17 00:00:00 2001 From: spdis Date: Sun, 31 Aug 2025 16:11:18 +0800 Subject: [PATCH 2/7] Merge pull request 'yolorestart' (#1) from yolopart_restart into main Reviewed-on: https://gitea.spdis.top/spdis/License_plate_recognition/pulls/1 --- .idea/License_plate_recognition.iml | 2 +- .idea/misc.xml | 2 +- OCR_part/ocr_interface.py | 37 +++++++---------------------- requirements.txt | 5 ++++ 4 files changed, 16 insertions(+), 30 deletions(-) diff --git a/.idea/License_plate_recognition.iml b/.idea/License_plate_recognition.iml index 2328911..57ba54e 100644 --- a/.idea/License_plate_recognition.iml +++ b/.idea/License_plate_recognition.iml @@ -2,7 +2,7 @@ - + diff --git a/.idea/misc.xml b/.idea/misc.xml index 9475f0b..aeaf94a 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,5 +3,5 @@ - + \ No newline at end of file diff --git a/OCR_part/ocr_interface.py b/OCR_part/ocr_interface.py index 294e568..92b8048 100644 --- a/OCR_part/ocr_interface.py +++ b/OCR_part/ocr_interface.py @@ -1,36 +1,17 @@ import numpy as np +from paddleocr import TextRecognition +import cv2 def initialize_ocr_model(): - """ - 初始化OCR模型 - - 返回: - bool: 初始化是否成功 - """ - # OCR模型初始化代码 - # 例如: 加载预训练模型、设置参数等 - + model = TextRecognition(model_name="PP-OCRv5_server_rec") print("OCR模型初始化完成(占位)") - return True + return model def ocr_predict(image_array): - """ - OCR车牌号识别接口函数 - - 参数: - image_array: numpy数组格式的车牌图像,已经过矫正处理 - - 返回: - list: 包含7个字符的列表,代表车牌号的每个字符 - 例如: ['京', 'A', '1', '2', '3', '4', '5'] - """ - # 这是OCR部分的占位函数 - # 实际实现时,这里应该包含: - # 1. 图像预处理 - # 2. OCR模型推理 - # 3. 后处理和字符识别 - - # 临时返回占位结果 - placeholder_result = ['待', '识', '别', '0', '0', '0', '0'] + # 保持原有模型调用方式 + output = initialize_ocr_model().predict(input=image_array) + # 结构化输出结果 + results = output[0]["rec_text"] + placeholder_result = results.split(',') return placeholder_result diff --git a/requirements.txt b/requirements.txt index 57cb5ac..f5e0e68 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,6 +11,11 @@ PyQt5>=5.15.0 # 图像处理 Pillow>=8.0.0 +#paddleocr +python -m pip install paddlepaddle-gpu==3.0.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu118/ +python -m pip install "paddleocr[all]" + + # 可选:如果需要GPU加速 # torch>=1.9.0 # torchvision>=0.10.0 -- 2.47.2 From 9879cb1547efe58b3f5a6b5887480b340f82e921 Mon Sep 17 00:00:00 2001 From: Viajero <2737079298@qq.com> Date: Sun, 31 Aug 2025 18:36:36 +0800 Subject: [PATCH 3/7] Merge pull request 'yolorestart' (#1) from yolopart_restart into main Reviewed-on: https://gitea.spdis.top/spdis/License_plate_recognition/pulls/1 --- OCR_part/ocr_interface.py | 27 ++++++++++++++++++--------- main.py | 14 +++++++------- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/OCR_part/ocr_interface.py b/OCR_part/ocr_interface.py index 92b8048..f699aad 100644 --- a/OCR_part/ocr_interface.py +++ b/OCR_part/ocr_interface.py @@ -2,16 +2,25 @@ import numpy as np from paddleocr import TextRecognition import cv2 +class OCRProcessor: + def __init__(self): + self.model = TextRecognition(model_name="PP-OCRv5_server_rec") + print("OCR模型初始化完成(占位)") + + def predict(self, image_array): + # 保持原有模型调用方式 + output = self.model.predict(input=image_array) + # 结构化输出结果 + results = output[0]["rec_text"] + placeholder_result = results.split(',') + return placeholder_result + +# 保留原有函数接口 +_processor = OCRProcessor() + def initialize_ocr_model(): - model = TextRecognition(model_name="PP-OCRv5_server_rec") - print("OCR模型初始化完成(占位)") - return model + return _processor def ocr_predict(image_array): - # 保持原有模型调用方式 - output = initialize_ocr_model().predict(input=image_array) - # 结构化输出结果 - results = output[0]["rec_text"] - placeholder_result = results.split(',') - return placeholder_result + return _processor.predict(image_array) diff --git a/main.py b/main.py index 1600611..d2412d5 100644 --- a/main.py +++ b/main.py @@ -9,10 +9,10 @@ from PyQt5.QtCore import QTimer, Qt, pyqtSignal, QThread from PyQt5.QtGui import QImage, QPixmap, QFont, QPainter, QPen, QColor import os from yolopart.detector import LicensePlateYOLO -#from OCR_part.ocr_interface import ocr_predict -#from OCR_part.ocr_interface import initialize_ocr_model +from OCR_part.ocr_interface import ocr_predict +from OCR_part.ocr_interface import initialize_ocr_model # 使用CRNN进行车牌字符识别 -from CRNN_part.crnn_interface import crnn_predict +# from CRNN_part.crnn_interface import crnn_predict from CRNN_part.crnn_interface import initialize_crnn_model class CameraThread(QThread): @@ -164,8 +164,8 @@ class MainWindow(QMainWindow): self.init_camera() # 初始化OCR/CRNN模型(具体用哪个模块识别车牌号就写在这儿) - #initialize_ocr_model() - initialize_crnn_model() + initialize_ocr_model() + # initialize_crnn_model() def init_ui(self): @@ -392,8 +392,8 @@ class MainWindow(QMainWindow): try: # 使用OCR接口进行识别 # 可以根据需要切换为CRNN: crnn_predict(corrected_image) - #result = ocr_predict(corrected_image) - result = crnn_predict(corrected_image) + result = ocr_predict(corrected_image) + # result = crnn_predict(corrected_image) # 将字符列表转换为字符串 if isinstance(result, list) and len(result) >= 7: -- 2.47.2 From 8eef0d9414ef1cfeaecaa87c5ed3f17c9979b85f Mon Sep 17 00:00:00 2001 From: Viajero <2737079298@qq.com> Date: Sun, 31 Aug 2025 18:42:35 +0800 Subject: [PATCH 4/7] Merge pull request 'yolorestart' (#1) from yolopart_restart into main Reviewed-on: https://gitea.spdis.top/spdis/License_plate_recognition/pulls/1 --- OCR_part/ocr_interface.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OCR_part/ocr_interface.py b/OCR_part/ocr_interface.py index f699aad..71812d3 100644 --- a/OCR_part/ocr_interface.py +++ b/OCR_part/ocr_interface.py @@ -24,3 +24,5 @@ def initialize_ocr_model(): def ocr_predict(image_array): return _processor.predict(image_array) + + -- 2.47.2 From afba7af80b12c6f12d1e898b841ad189ee44a842 Mon Sep 17 00:00:00 2001 From: spdis Date: Mon, 1 Sep 2025 00:01:38 +0800 Subject: [PATCH 5/7] OCR --- .idea/License_plate_recognition.iml | 2 +- .idea/misc.xml | 2 +- .idea/vcs.xml | 2 +- OCR_part/ocr_interface.py | 23 ++++++++++++++++++++++- 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/.idea/License_plate_recognition.iml b/.idea/License_plate_recognition.iml index 57ba54e..fb56de3 100644 --- a/.idea/License_plate_recognition.iml +++ b/.idea/License_plate_recognition.iml @@ -2,7 +2,7 @@ - + diff --git a/.idea/misc.xml b/.idea/misc.xml index aeaf94a..fb9fc56 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,5 +3,5 @@ - + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 8306744..288b36b 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -1,7 +1,7 @@ - + \ No newline at end of file diff --git a/OCR_part/ocr_interface.py b/OCR_part/ocr_interface.py index 71812d3..4f88aef 100644 --- a/OCR_part/ocr_interface.py +++ b/OCR_part/ocr_interface.py @@ -22,7 +22,28 @@ def initialize_ocr_model(): return _processor def ocr_predict(image_array): - return _processor.predict(image_array) + # 获取原始预测结果 + raw_result = _processor.predict(image_array) + + # 将结果合并为字符串(如果是列表的话) + if isinstance(raw_result, list): + result_str = ''.join(raw_result) + else: + result_str = str(raw_result) + + # 过滤掉'·'字符 + filtered_str = result_str.replace('·', '') + + # 转换为字符列表 + char_list = list(filtered_str) + + # 确保返回长度为7的列表 + if len(char_list) >= 7: + # 如果长度大于等于7,取前7个字符 + return char_list[:7] + else: + # 如果长度小于7,用空字符串补齐到7位 + return char_list + [''] * (7 - len(char_list)) -- 2.47.2 From 1c914cf89f64ef90399122a4c7bfc84177eef4e0 Mon Sep 17 00:00:00 2001 From: spdis Date: Mon, 1 Sep 2025 15:23:44 +0800 Subject: [PATCH 6/7] OCR --- main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.py b/main.py index d2412d5..2b06182 100644 --- a/main.py +++ b/main.py @@ -11,9 +11,9 @@ import os from yolopart.detector import LicensePlateYOLO from OCR_part.ocr_interface import ocr_predict from OCR_part.ocr_interface import initialize_ocr_model -# 使用CRNN进行车牌字符识别 +# 使用CRNN进行车牌字符识别(可选)同时也要修改第395,396行 # from CRNN_part.crnn_interface import crnn_predict -from CRNN_part.crnn_interface import initialize_crnn_model +# from CRNN_part.crnn_interface import initialize_crnn_model class CameraThread(QThread): """摄像头线程类""" -- 2.47.2 From f342d37d630cac25b6b5a94e88eee1dc26eeccae Mon Sep 17 00:00:00 2001 From: spdis Date: Mon, 1 Sep 2025 15:33:05 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E7=9A=84=E5=87=BD=E6=95=B0=E5=90=8D=EF=BC=8C=E7=8E=B0?= =?UTF-8?q?=E5=9C=A8=E6=83=B3=E7=94=A8=E5=93=AA=E4=B8=AA=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E7=9B=B4=E6=8E=A5=E5=AF=BC=E5=85=A5=E5=8D=B3=E5=8F=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CRNN_part/crnn_interface.py | 4 ++-- OCR_part/ocr_interface.py | 4 ++-- main.py | 20 +++++++++----------- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/CRNN_part/crnn_interface.py b/CRNN_part/crnn_interface.py index 594595f..bfa9218 100644 --- a/CRNN_part/crnn_interface.py +++ b/CRNN_part/crnn_interface.py @@ -207,7 +207,7 @@ class LicensePlatePreprocessor: print(f"图像预处理失败: {e}") return None -def initialize_crnn_model(): +def LPRNinitialize_model(): """ 初始化CRNN模型 @@ -274,7 +274,7 @@ def initialize_crnn_model(): traceback.print_exc() return False -def crnn_predict(image_array): +def LPRNmodel_predict(image_array): """ CRNN车牌号识别接口函数 diff --git a/OCR_part/ocr_interface.py b/OCR_part/ocr_interface.py index 4f88aef..2d36093 100644 --- a/OCR_part/ocr_interface.py +++ b/OCR_part/ocr_interface.py @@ -18,10 +18,10 @@ class OCRProcessor: # 保留原有函数接口 _processor = OCRProcessor() -def initialize_ocr_model(): +def LPRNinitialize_model(): return _processor -def ocr_predict(image_array): +def LPRNmodel_predict(image_array): # 获取原始预测结果 raw_result = _processor.predict(image_array) diff --git a/main.py b/main.py index 2b06182..2eee603 100644 --- a/main.py +++ b/main.py @@ -9,11 +9,11 @@ from PyQt5.QtCore import QTimer, Qt, pyqtSignal, QThread from PyQt5.QtGui import QImage, QPixmap, QFont, QPainter, QPen, QColor import os from yolopart.detector import LicensePlateYOLO -from OCR_part.ocr_interface import ocr_predict -from OCR_part.ocr_interface import initialize_ocr_model +from OCR_part.ocr_interface import LPRNmodel_predict +from OCR_part.ocr_interface import LPRNinitialize_model # 使用CRNN进行车牌字符识别(可选)同时也要修改第395,396行 -# from CRNN_part.crnn_interface import crnn_predict -# from CRNN_part.crnn_interface import initialize_crnn_model +# from CRNN_part.crnn_interface import LPRNmodel_predict +# from CRNN_part.crnn_interface import LPRNinitialize_model class CameraThread(QThread): """摄像头线程类""" @@ -163,9 +163,8 @@ class MainWindow(QMainWindow): self.init_detector() self.init_camera() - # 初始化OCR/CRNN模型(具体用哪个模块识别车牌号就写在这儿) - initialize_ocr_model() - # initialize_crnn_model() + # 初始化OCR/CRNN模型(函数名改成一样的了,所以不要修改这里了,想用哪个模块直接导入) + LPRNinitialize_model() def init_ui(self): @@ -390,10 +389,9 @@ class MainWindow(QMainWindow): return "识别失败" try: - # 使用OCR接口进行识别 - # 可以根据需要切换为CRNN: crnn_predict(corrected_image) - result = ocr_predict(corrected_image) - # result = crnn_predict(corrected_image) + # 预测函数(来自模块) + # 函数名改成一样的了,所以不要修改这里了,想用哪个模块直接导入 + result = LPRNmodel_predict(corrected_image) # 将字符列表转换为字符串 if isinstance(result, list) and len(result) >= 7: -- 2.47.2