一、介绍
易车库EasyPR是一个基于开源库的车牌识别系统,由中国科学院自动化研究所-AI车联网创新中心研发,最早于2013年发布第一个版本。EasyPR具有以下特点:
- 支持中国大陆、香港、澳门、台湾等多个地区的车牌识别
- 识别率高,准确率达到90%,能够处理极端场景(如雨天、夜晚、刻意遮挡等)下的车牌识别问题
- 易于扩展,支持用户自定义识别模型的训练和部署
- 易于使用,提供C++、Python、Java三种语言的接口
二、安装
1. 环境要求
EasyPR支持Windows、Linux、macOS等操作系统,需要安装如下几个必需的库:
- OpenCV 3.0以上(必须)
- Tesseract OCR引擎(可选)
- Caffe深度学习框架(可选)
2. 安装命令
以Ubuntu 18.04为例进行安装,其他操作系统请根据官网提供的指南进行安装。
sudo apt-get -y update
sudo apt-get -y install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get -y install libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
sudo apt-get -y install libopencv-dev python3-opencv
git clone https://github.com/liuruoze/EasyPR.git
cd EasyPR/
mkdir build && cd build/
cmake ..
make -j8
sudo make install
三、使用
1. C++接口
#include <iostream>
#include <easypr.h>
using namespace easypr;
int main(int argc, char *argv[]) {
std::string imgPath = argv[1];
cv::Mat src = cv::imread(imgPath);
CPlateRecognize pr;
pr.setResultShow(false);
pr.setDetectType(PR_DETECT_CMSER);
std::vector<CPlate> plateVec;
pr.plateRecognize(src, plateVec);
for (auto plate : plateVec) {
std::cout << "plate str: " << plate.getPlateStr() << std::endl;
std::cout << "plate color: " << getPlateColorStr(plate.getPlateColor()) << std::endl;
std::cout << "confidence: " << plate.getConfidence() << std::endl << std::endl;
}
return 0;
}
2. Python接口
import cv2
from libeasypr import easypr
img_path = input("Enter image path: ")
src = cv2.imread(img_path)
pr = easypr.PlateRecognizer()
pr.setResultShow(False)
pr.setDetectType(easypr.PR_DETECT_CMSER)
plateVec = pr.plateRecognize(src)
for plate in plateVec:
print("plate str: {}".format(plate.getPlateStr()))
print("plate color: {}".format(easypr.getPlateColorStr(plate.getPlateColor())))
print("confidence: {}".format(plate.getConfidence()))
print()
3. Java接口
import java.util.List;
import java.util.Scanner;
import cn.liwh.easycar.easypr.EasyPR;
public class PlateRecognizerDemo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Enter image path: ");
String imgPath = sc.nextLine();
EasyPR pr = EasyPR.create("./lib/libjniEasyPR.so");
List<String> plateVec = pr.plateRecognize(imgPath);
for (String plate : plateVec) {
System.out.println("plate str: " + plate);
}
}
}
四、训练自定义模型
默认的EasyPR模型在较为极端的场景下可能会出现识别错误的情况,但是,EasyPR提供了用户自行训练并部署模型的功能,从而让我们可以在特定的场景下提高识别率。
EasyPR提供了如下几个命令来完成自定义模型的训练:
- prepare_dataset.py:用于生成训练数据集
- train_ann.py:用于训练神经网络模型,并存储模型权重
- gen_anni.py:用于将神经网络模型转换为C++代码,并存储在/easypr/core/dnn/include/anni_gen.h中
这里就不展开详细说明如何使用这些命令训练模型,读者可以参考EasyPR官方文档中的相关内容。