HyperLPR3 - 高性能车牌识别框架
演示APP安装
- Android APP:扫描二维码
快速安装
python -m pip install hyperlpr3
支持:python3, Windows, Mac, Linux, 树莓派。
720p cpu 实时 (在MBP r15 2.2GHz haswell上测试)。
快速测试
# 图像URL
lpr3 sample -src https://koss.iyong.com/swift/v1/iyong_public/iyong_2596631159095872/image/20190221/1550713902741045679.jpg
# 图像路径
lpr3 sample -src images/test_img.jpg -det high
使用方法
# 导入opencv
import cv2
# 导入hyperlpr3
import hyperlpr3 as lpr3
# 实例化对象
catcher = lpr3.LicensePlateCatcher()
# 加载图像
image = cv2.imread("images/test_img.jpg")
# 打印结果
print(catcher(image))
启动WebAPI服务
# 启动服务器
lpr3 rest --port 8715 --host 0.0.0.0
启动后打开SwaggerUI的路径:http://localhost:8715/api/v1/docs 查看和测试在线识别API服务:
问答
Q:项目中的Android准确性是否与apk-demo一致?
A:请从发布页面编译或下载Android共享库并复制到Prj-Android进行测试。
Q:车牌训练数据来源?
A:由于训练使用的车牌数据涉及法律隐私等问题,本项目无法提供。开放更多大数据集 CCPD 注册数据集。
Q:是否提供训练代码?
A:目前资源提供了旧的训练代码,HyperLPR3的训练方法将在稍后整理并展示。
资源
-
即将添加... 欢迎贡献
其他版本
待办事项
- 支持WebApi服务的快速部署
- 支持多车牌和双层车牌
- 支持大角度车牌
- 轻量化识别模型
特性
- 720p速度更快,单核Intel 2.2G CPU (MacBook Pro 2015) 平均识别时间少于100ms
- 端到端车牌识别无需字符分割
- 识别率高,出入口场景的准确率约为95%-97%
- 支持跨平台编译和快速部署
注意事项:
- 本项目的C++和Python实现是分开的
- 编译C++项目时,必须使用OpenCV 4.0和MNN 2.0,否则无法编译
- Android项目编译ndk尽可能使用版本21
Python依赖
- opencv-python (>3.3)
- onnxruntime (>1.8.1)
- fastapi (0.92.0)
- uvicorn (0.20.0)
- loguru (0.6.0)
- python-multipart
- tqdm
- requests
跨平台支持
平台
- Linux: x86、Armv7、Armv8
- MacOS: x86
- Android: arm64-v8a、armeabi-v7a
嵌入式开发板
- Rockchip: rv1109rv1126(RKNPU)
C++依赖
- Opencv 4.0以上
- MNN 2.0以上
C/C++编译依赖
编译C/C++项目需要使用第三方依赖库。下载库后,解压并将其复制或软链接到根目录(与CMakeLists.txt同级)。百度网盘 提取码:eu31
Linux/Mac共享库编译
- 需要将依赖项放置或链接到项目根目录(与CMakeLists.txt同级)
- 我们建议你自行编译OpenCV并安装到系统中,这有助于减少因版本不匹配和系统依赖编译器问题导致的编译错误。但是,你也可以尝试使用我们提供的预编译OpenCV静态库进行编译。为此,你需要启用 LINUX_USE_3RDPARTY_OPENCV 开关。
# 执行脚本
sh command/build_release_linux_share.sh
编译到 build/linux/install/hyperlpr3 目录,其中包含:
- include - 头文件
- lib - 共享目录
- resource - 测试图像和模型目录
将所需文件复制到你的项目中
Linux/Mac Demo编译
您需要完成之前的编译步骤并确保其成功。编译后的文件将位于根目录:build/linux/install/hyperlpr3。您需要手动将它们复制到当前目录。
- 进入 Prj-Linux 文件夹
# 进入 Prj-linux
cd Prj-Linux
# 执行 sh 脚本
sh build.sh
编译后生成可执行程序:PlateRecDemo,运行程序
# 进入 build 目录
cd build/
# 第一个参数为模型目录,第二个参数为图像路径
./PlateRecDemo ../hyperlpr3/resource/models/r2_mobile ../hyperlpr3/resource/images/test_img.jpg
Linux/Mac 快速使用 SDK 代码示例
// 加载图像
cv::Mat image = cv::imread(image_path);
// 创建 ImageData
HLPR_ImageData data = {0};
data.data = image.ptr<uint8_t>(0); // 设置图像数据流
data.width = image.cols; // 设置图像宽度
data.height = image.rows; // 设置图像高度
data.format = STREAM_BGR; // 设置当前图像编码格式
data.rotation = CAMERA_ROTATION_0; // 设置当前图像旋转角度
// 创建缓冲区
P_HLPR_DataBuffer buffer = HLPR_CreateDataBuffer(&data);
// 配置车牌识别参数
HLPR_ContextConfiguration configuration = {0};
configuration.models_path = model_path; // 模型文件夹路径
configuration.max_num = 5; // 最大车牌数量
configuration.det_level = DETECT_LEVEL_LOW; // 检测器等级
configuration.use_half = false;
configuration.nms_threshold = 0.5f; // 非极大值抑制置信度阈值
configuration.rec_confidence_threshold = 0.5f; // 车牌号码文本阈值
configuration.box_conf_threshold = 0.30f; // 检测器阈值
configuration.threads = 1;
// 实例化 Context
P_HLPR_Context ctx = HLPR_CreateContext(&configuration);
// 查询 Context 状态
HREESULT ret = HLPR_ContextQueryStatus(ctx);
if (ret != HResultCode::Ok) {
printf("创建错误。\n");
return -1;
}
HLPR_PlateResultList results = {0};
// 执行车牌识别
HLPR_ContextUpdateStream(ctx, buffer, &results);
for (int i = 0; i < results.plate_size; ++i) {
// 获取识别结果
std::string type;
if (results.plates[i].type == HLPR_PlateType::PLATE_TYPE_UNKNOWN) {
type = "未知";
} else {
type = TYPES[results.plates[i].type];
}
printf("<%d> %s, %s, %f\n", i + 1, type.c_str(),
results.plates[i].code, results.plates[i].text_confidence);
}
// 释放缓冲区
HLPR_ReleaseDataBuffer(buffer);
// 释放 Context
HLPR_ReleaseContext(ctx);
Android: 编译共享库
- 第一步是安装第三方依赖项
- 您需要准备 NDK 并配置环境变量:$ANDROID_NDK
- 支持在 Linux/MacOS 上进行交叉编译
# 执行脚本
sh command/build_release_android_share.sh
编译到目录:build/release_android/,其中包含:
- arm64-v8a - 64位共享库
- armeabi-v7a - 32位共享库
编译完成后,将arm64-v8a和armeabi-v7a目录复制到Prj-Android/hyperlpr3/libs,并编译Prj-Android项目以使用。
使用 Docker 进行编译
如果需要使用 Docker 进行编译,我们提供了几种编译方式:
1. 使用 Docker 编译 Linux-x86 共享库
您需要安装 Docker 和 Docker-Compose,构建 hyperlpr_build 的镜像:
docker build -t hyperlpr_build .
开始编译共享库:
docker-compose up build_linux_x86_shared_lib
编译目录:build/linux
Android SDK 示例
我们提供了一个从 Android SDK 源码生成的示例项目:hyperlpr3-android-sdk,您可以根据需要编译共享库并使用该项目。
快速在 Android 中使用
如果您需要在自己的 Android 项目中快速集成我们的 SDK,您可以在项目的 build.gradle 中添加以下依赖项:
- 第一步. 在您的构建文件中添加 JitPack 仓库。在根目录的 build.gradle 文件中添加:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
- 第二步. 添加依赖项
dependencies {
implementation 'com.github.HyperInspire:hyperlpr3-android-sdk:1.0.3'
}
- 第三步. 在应用程序中使用 hyperlpr
// 初始化操作,仅需执行一次,通常在程序初始化时执行
HyperLPR3.getInstance().init(this, new HyperLPRParameter());
…
// 执行车牌识别
Plate[] plates = HyperLPR3.getInstance().plateRecognition(bitmap, HyperLPR3.CAMERA_ROTATION_0, HyperLPR3.STREAM_BGRA);
了解更多信息:Prj-Android
支持的车牌类型(中文)
支持
- 单行蓝牌
- 单行黄牌
- 新能源车牌
- 教练车牌
有限支持
- 白色警用车牌
- 使馆/港澳车牌
- 双层黄牌
- 武警车牌
待支持
- 民航车牌
- 双层武警车牌
- 双层军牌
- 双层农用车牌
- 双层个性化车牌
- 更多国家的车牌
注意:由于在训练过程中某些样本不均衡,一些特殊车牌的识别率较低,如(使馆/港澳车牌),在后续版本中将会有所改善。
示例
作者
- 颜靖宇 (tunmxy@163.com)
- Jack Yu (jack-yu-business@foxmail.com / https://github.com/szad670401)
- 肖肖 (xiaoxiao@xidian.edu.cn)
帮助
- HyperInspire QQ 群:529385694