如何基于 Java 使用Yolo等深度学习模型实现高精度中文车牌识别和车牌颜色识别(附完整源码)
本文将带你了解如何使用 SmartJavaAI 快速搭建一套完整的车牌检测与识别系统,无需理解底层模型,也无需手动处理繁琐的预处理/后处理逻辑。
SmartJavaAI是什么?
SmartJavaAI是专为JAVA 开发者打造的一个功能丰富、开箱即用的 JAVA AI算法工具包,致力于帮助JAVA开发者零门槛使用各种AI算法模型,开发者无需深入了解底层实现,即可轻松在 Java 代码中调用人脸识别、目标检测、OCR 等功能。底层支持包括基于 DJL (Deep Java Library) 封装的深度学习模型,以及通过 JNI 接入的 C++/Python 算法,兼容多种主流深度学习框架如 PyTorch、TensorFlow、ONNX、Paddle 等,屏蔽复杂的模型部署与调用细节,开发者无需了解 AI 底层实现即可直接在 Java 项目中集成使用,后续将持续扩展更多算法,目标是构建一个“像 Hutool 一样简单易用”的 JAVA AI 通用工具箱
## 车牌识别
车牌识别(License Plate Recognition, 简称 LPR)是一种基于计算机视觉的技术,用于自动检测图像或视频中的车牌位置,并识别车牌上的字符信息,通常包括省份简称、字母和数字等内容
🚀 快速开始
我们使用 SmartJavaAI来实现车牌识别
1、引入 Maven 依赖
在项目的pom.xml的dependencies中加入以下内容(全部功能),也可以根据需求单独引入OCR模块,具体可以查看 SmartJavaAI官方文档
<dependency>
<groupId>cn.smartjavaai</groupId>
<artifactId>smartjavaai-all</artifactId>
<version>1.0.22</version>
</dependency>
2、模型简介下载
支持的车牌检测模型如下:
| 模型名称 | 模型简介 | 模型开源网站 |
|---|---|---|
| YOLOV5 | 基于YOLOV5训练,支持12种中文车牌 | Github |
| yolov7-lite-t | (超小型模型)YOLOv7-Lite 架构的轻量级车牌检测模型 | Github |
| yolov7-lite-s | YOLOv7-Lite 架构的轻量级车牌检测模型 | Github |
支持的车牌识别模型如下:
| 模型名称 | 模型简介 | 模型开源网站 |
|---|---|---|
| PLATE_REC_CRNN | CRNN中文字符识别 | Github |
3、车牌识别流程:
车牌检测 -> 车牌矫正 -> 车牌识别
4、获取车牌检测模型:
PlateDetModelConfig config = new PlateDetModelConfig();
config.setModelEnum(PlateDetModelEnum.YOLOV5);
config.setModelPath("/model/plate/yolov5_plate_detect.onnx");
config.setDevice(device);
PlateDetModel plateDetModel = PlateModelFactory.getInstance().getDetModel(config);
PlateDetModelConfig参数说明
| 字段名称 | 字段类型 | 必选 | 默认值 | 说明 |
|---|---|---|---|---|
| modelEnum | CommonDetModelEnum | 是 | 无 | 车牌检测模型枚举 |
| modelPath | String | 是 | 无 | 检测模型路径,需手动指定 |
| confidenceThreshold | float | 否 | 0.3f | 置信度阈值 |
| iouThreshold | float | 否 | 0.5f | iou阈值 |
| topK | int | 否 | 100 | 检测结果数量 |
| device | DeviceEnum | 否 | CPU | 指定运行设备,支持 CPU/GPU |
| gpuId | int | 否 | 0 | gpu设备ID 当device为GPU时生效 |
| customParams | ConcurrentHashMap<String, Object> | 否 | 个性化配置 |
5、获取车牌识别模型:
PlateRecModelConfig recModelConfig = new PlateRecModelConfig();
recModelConfig.setModelEnum(PlateRecModelEnum.PLATE_REC_CRNN);
recModelConfig.setModelPath("/model/plate/plate_rec_color.onnx");
recModelConfig.setPlateDetModel(getPlateDetModel());
return PlateModelFactory.getInstance().getRecModel(recModelConfig);
PlateDetModelConfig参数说明
| 字段名称 | 字段类型 | 必选 | 默认值 | 说明 |
|---|---|---|---|---|
| modelEnum | CommonDetModelEnum | 是 | 无 | 车牌识别模型枚举 |
| modelPath | String | 是 | 无 | 检测模型路径,需手动指定 |
| plateDetModel | PlateDetModel | 是 | 无 | 车牌检查模型 |
| device | DeviceEnum | 否 | CPU | 指定运行设备,支持 CPU/GPU |
| gpuId | int | 否 | 0 | gpu设备ID 当device为GPU时生效 |
| customParams | ConcurrentHashMap<String, Object> | 否 | 个性化配置 |
6、车牌识别方法
调用车牌识别方法将自动完成:车牌检测+车牌矫正+车牌文字识别
PlateRecModel plateRecModel = getPlateRecModel();
R<List<PlateInfo>> result = plateRecModel.recognize("src/main/resources/plate/Quicker_20220930_180856.png");
if(result.isSuccess()){
log.info("车牌识别结果:{}", JsonUtils.toJson(result.getData()));
}else{
log.error("车牌识别失败:{}", result.getMessage());
}
车牌识别方法(裁剪后图片)
R<List<PlateInfo>> recognizeCropped(Image image);
识别并绘制识别结果
PlateRecModel plateRecModel = getPlateRecModel();
R<Void> result = plateRecModel.recognizeAndDraw("src/main/resources/plate/single_green.jpg", "output/plate_recognized2.jpg");
if(result.isSuccess()){
log.info("车牌识别成功");
}else{
log.error("车牌识别失败:{}", result.getMessage());
}
PlateInfo字段说明
- 返回并非json格式,仅用于字段讲解
[
{
"plateType": "SINGLE", //车牌类型:SINGLE-单层,DOUBLE-双层
"plateNumber": "川A8H458", //车号
"plateColor": "蓝色", //车牌颜色
"detectionRectangle": {
"x": 424,
"y": 298,
"width": 243,
"height": 130
},
"box": {
"topLeft": {
"x": 424.96429443359375,
"y": 351.9092102050781
},
"topRight": {
"x": 646.1655883789062,
"y": 297.97735595703125
},
"bottomRight": {
"x": 669.95361328125,
"y": 376.01025390625
},
"bottomLeft": {
"x": 445.5194091796875,
"y": 427.5689392089844
}
},
"score": 0.9076154
}
]
项目地址
- 完整代码地址:examples
- SmartJavaAI 开发文档:官方文档
- SmartJavaAI Gitee开源地址:Gitee
- SmartJavaAI Github开源地址:Github
- SmartJavaAI GitCode开源地址:GitCode
更多推荐


所有评论(0)