
从环境搭建到系统落地,一篇踩坑无数的完整实战笔记。
前言
最近完成了基于 PaddleOCR 的车牌识别系统,从环境配置到代码开发踩了无数坑,尤其是 Python 版本、依赖冲突、pip 下载这些,折腾了两天才跑通。把整个过程记录下来,希望能帮到后面做类似项目的同学。
项目最终效果:一个带 GUI 的桌面程序,支持导入图片、检测车牌、识别字符、格式校验、结果可视化、历史记录存储。
一、技术选型
| 模块 | 选型 | 原因 |
|---|---|---|
| OCR 引擎 | PaddleOCR 2.7.0 | 中文车牌识别效果好,开源免费 |
| 深度学习框架 | PaddlePaddle 2.6.2 | PaddleOCR 依赖 |
| GUI 框架 | PySide6 6.6.0 | Qt 官方版,LGPL 免商业授权 |
| 图像处理 | OpenCV 4.6.0.66 | PaddleOCR 限定了版本上限 |
| 开发语言 | Python 3.10 | 兼容 PaddlePaddle 的最稳版本 |
二、环境搭建(踩坑重灾区)
坑 1:Python 版本不能太高
系统原来装的是 Python 3.14 ,结果 pip install paddlepaddle 直接失败。
原因 :PaddlePaddle 2.6.x 官方只支持到 Python 3.12,3.13/3.14 没有预编译包。
解决:安装 Python 3.10。
bash
py -0 # 查看系统所有 Python 版本
注意:Python 3.10.22 是「source-only release」,不提供安装包。要下 3.10.11,这是最后一个带 Windows 安装包的版本。
坑 2:paddlepaddle 2.6.0 从 PyPI 下架了
按教程写的 paddlepaddle==2.6.0,pip 报:
text
ERROR: Could not find a version that satisfies the requirement paddlepaddle==2.6.0
(from versions: 2.6.2, 3.0.0b2, ...)
解决 :改用 2.6.2,这是目前可用的最接近版本。
坑 3:opencv-python 版本冲突
text
paddleocr 2.7.0.0 depends on opencv-python<=4.6.0.66
之前 requirements.txt 里写的是 4.8.1.78,冲突了。
解决:requirements.txt 改成:
text
paddlepaddle==2.6.2
paddleocr==2.7.0
PySide6==6.6.0
opencv-python==4.6.0.66
numpy>=1.24,<2.0
坑 4:pip 下载大文件慢
pip 下载 100MB+ 的 whl 文件只有 300KB/s,但浏览器直接点链接能跑满带宽。
原因:pip 是单线程顺序下载,浏览器会多线程分段并发拉取。
解决 :浏览器下载 whl 到本地,再 pip install xxx.whl。
text
https://mirrors.aliyun.com/pypi/packages/.../paddlepaddle-2.6.2-cp310-cp310-win_amd64.whl
顺便说一句,配好默认镜像源能让 pip 快不少:
bash
python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ python -m pip config set global.trusted-host mirrors.aliyun.com
坑 5:每个项目都建 venv,硬盘爆炸
一开始每个项目都建独立 venv,结果一个车牌识别项目的 venv 就有 1.8G。
解决:把库装到 Python 3.10 全局,所有项目共用。
bash
# 退出虚拟环境后,装到全局
py -3.10 -m pip install -r requirements.txt
或者把现有 venv 的 site-packages 内容直接复制到全局:
text
.venv\Lib\site-packages\* → C:\...\Python310\Lib\site-packages\
注意 :跳过 _virtualenv.py、_virtualenv.pth、pip/、setuptools/ 这些 venv 专属文件。
验证:
bash
py -3.10 -c "import paddle, paddleocr, cv2, PySide6, numpy; print('OK')"
输出 OK 就成功了。删掉 venv,省 1.8G。
三、项目架构(OOP 分层)
毕设要体现工程化,不能写成一坨脚本。采用分层 + 面向对象设计:
paddle_lpr/
├── main.py # 入口
├── config.py # 全局配置(dataclass)
├── core/ # 业务层(不依赖任何 UI 库)
│ ├── base.py # 抽象基类
│ ├── image_utils.py # 中文路径图像读写
│ ├── detector.py # 车牌检测
│ ├── recognizer.py # 字符识别
│ ├── validator.py # 格式校验+纠错
│ └── engine.py # 识别引擎(组合器)
├── ui/ # 界面层
│ ├── widgets.py
│ └── main_window.py
├── workers/ # 多线程
│ └── recognize_worker.py
└── db/ # 持久化
└── history_dao.py

核心原则:
-
core/严禁 import PySide6,业务逻辑可独立复用 -
ui/只调用core/暴露的接口 -
抽象基类定义接口,子类实现具体逻辑
架构图
┌─────────────┐
│ ui/ │ ← 界面层
│ main_window │
└──────┬──────┘
│ Signal/Slot
┌──────▼──────┐
│ workers/ │ ← 线程层
│ QThread │
└──────┬──────┘
│
┌──────▼──────┐
│ core/ │ ← 业务层(不依赖UI)
│ engine │
│ ┌─────────┐ │
│ │detector │ │
│ │recognizer│ │
│ │validator│ │
│ └─────────┘ │
└──────┬──────┘
│ DAO
┌──────▼──────┐
│ db/ │ ← 持久化
│ SQLite │
└─────────────┘
设计模式落点
| 模式 | 落点 |
|---|---|
| 模板方法 | BaseComponent.initialize() → _load_model() |
| 组合模式 | PlateRecognitionEngine 组合三个组件 |
| 观察者 | PySide6 Signal/Slot 解耦 UI 与业务 |
| DAO | HistoryDAO 封装 SQLite 访问 |
| 单例思想 | PaddleOCR 引擎只初始化一次 |
核心抽象基类
python
from abc import ABC, abstractmethod
class BaseDetector(ABC):
@abstractmethod
def detect(self, image) -> list:
"""输入 BGR 图像,返回检测框列表"""
pass
class BaseRecognizer(ABC):
@abstractmethod
def recognize(self, image) -> dict:
"""输入车牌裁剪图,返回 {text, confidence}"""
pass
引擎只依赖这两个接口,未来换 YOLO 检测器或别的识别模型,只要继承基类就行。
车牌格式校验(创新点)
用规则约束纠正 OCR 形近字误判:
python
class PlateValidator:
CONFUSION_MAP = {
'O': '0', 'Q': '0', 'D': '0',
'I': '1', 'L': '1',
'Z': '2', 'S': '5',
'B': '8', 'G': '6', 'T': '7',
}
def validate(self, text: str) -> dict:
# 长度校验、省份简称校验、第二位字母校验
# 新能源尾位 D/F 保留
...
四、界面效果

五、踩坑总结
| 坑 | 教训 |
|---|---|
| Python 3.14 装不上 paddle | 用 3.10,稳 |
| paddlepaddle 2.6.0 下架 | 用 2.6.2 |
| opencv 版本冲突 | 按 paddleocr 要求锁 4.6.0.66 |
| pip 下载慢 | 浏览器下载 + 本地安装 |
| 每个项目建 venv 硬盘爆炸 | 全局装一次,所有项目共用 |
| 手动复制 site-packages | 跳过 _virtualenv.py 等专属文件 |
六、后续可扩展方向
-
视频流识别 :
cv2.VideoCapture+QTimer逐帧识别 -
批量处理 :文件夹遍历 + CSV 导出 +
QProgressDialog -
模型微调:在 CCPD 数据集上微调 PaddleOCR,作为论文「改进章节」
-
深色主题:QSS 切换样式表
七、总结
这个项目踩坑主要集中在环境配置,Python 版本、依赖版本、镜像源、磁盘占用,每个都是几小时起步。真正写代码反而因为 OOP 架构设计清晰,效率高很多。
给做类似毕设的同学几点建议:
-
Python 用 3.10,别折腾新版本
-
依赖版本严格按官方要求锁死,别自己升级
-
大文件用浏览器下载,pip 单线程太慢
-
库装全局,别每个项目建 venv
-
OOP 分层架构,论文有东西写,答辩有亮点
如有定制需要DD我,如果这篇文章帮到你,点个赞再走~有问题评论区见。
