使用 Flask 和 PaddleOCR 的车牌识别项目安装与打包教程
文章目录
本教程基于 Flask 和 PaddleOCR,提供一个简易的车牌识别服务。
功能包括:
- 处理上传的图像文件,提取车牌文字信息。
- 通过 PaddleOCR 提供高效的 OCR 识别能力。
- 返回 JSON 格式的车牌识别结果。
本文将详细介绍如何安装环境、配置依赖、实现车牌识别逻辑,以及将项目打包提供给运维。
一、环境安装
1. 安装 Python
确保系统已安装 Python 3.7 或更高版本。
- 下载 Python:Python 官网
- 安装时勾选 Add Python to PATH,确保命令行可直接使用
python
和pip
。
2. 创建虚拟环境
推荐使用虚拟环境隔离依赖。
python -m venv venv
激活虚拟环境:
- Windows:
.\venv\Scripts\activate
- Linux/Mac:
source ./venv/bin/activate
3. 安装依赖
首先确保 pip
是最新版本:
pip install --upgrade pip
安装必要的依赖包:
pip install flask paddleocr pillow numpy
注意:如果系统的 CPU 不支持 AVX 指令集,请使用以下命令安装无 AVX 支持的 PaddleOCR:
pip install paddlepaddle==2.5.0 -f https://www.paddlepaddle.org.cn/whl/cpu/noavx.html
二、项目实现
代码文件 app.py
from flask import Flask, request, jsonify
from paddleocr import PaddleOCR
from io import BytesIO
from PIL import Image
import numpy as np
app = Flask(__name__)
# 初始化 PaddleOCR 模型
ocr = PaddleOCR(use_angle_cls=True, lang="ch")
@app.route('/recognize', methods=['POST'])
def recognize():
# 获取上传的文件
file = request.files.get('image')
# 如果没有上传文件,返回错误信息
if not file:
return jsonify({"error": "No file uploaded"}), 400
try:
# 从上传的文件读取图片并处理
image = Image.open(BytesIO(file.read())).convert("RGB")
image_np = np.array(image)
# 使用 PaddleOCR 进行车牌识别
result = ocr.ocr(image_np, cls=True)
# 提取识别结果中的车牌信息
plates = [line[1][0] for line in result[0]] # 提取所有识别的文字
return jsonify({"plates": plates})
except Exception as e:
# 发生异常时返回错误信息
return jsonify({"error": str(e)}), 500
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
三、打包流程
为了方便运维,我们需要将项目打包为可执行文件,便于分发。
1. 安装 pyinstaller
使用 pyinstaller
将项目打包为单独的可执行文件。
pip install pyinstaller
2. 生成可执行文件
在项目根目录下运行以下命令:
pyinstaller --onefile app.py
此命令将在 dist
文件夹中生成一个名为 app.exe
的文件。
3. 验证可执行文件
进入 dist
文件夹并运行打包后的文件:
cd dist
./app.exe
如果一切正常,服务将启动,监听 http://0.0.0.0:5000
。
四、测试车牌识别服务
1. 使用 Postman 或 curl 测试
可以使用以下命令测试服务:
curl -X POST -F "image=@<path_to_image>" http://127.0.0.1:5000/recognize
或者通过 Postman 工具发送图片文件至 /recognize
端点。
2. 校验车牌
识别结果通过 JSON 返回,例如:
{
"plates": ["粤B12345"]
}
如果需要进一步验证车牌格式,可以在代码中加入正则表达式检查,例如:
import re
def validate_plate(plate):
pattern = r'^[一-龥][A-Z][0-9A-Z]{5}$'
return bool(re.match(pattern, plate))
# 使用示例
for plate in plates:
if validate_plate(plate):
print(f"Valid plate: {plate}")
else:
print(f"Invalid plate: {plate}")
五、提供给运维的打包文件
最终交付给运维的文件应包括:
- 打包生成的可执行文件
app.exe
。 README.md
,说明如何运行服务。- 一个简单的脚本(可选),方便运维启动服务:
@echo off
start app.exe
pause
原文地址:https://blog.csdn.net/hyc010110/article/details/145043079
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!