![logo_t](./images/logo.png)

## HyperLPR3 - High Performance License Plate Recognition Framework.

#### [![1](https://badge.fury.io/py/hyperlpr3.svg "title")](https://pypi.org/project/hyperlpr3/)[![1](https://img.shields.io/pypi/pyversions/hyperlpr3.svg "title")](https://pypi.org/manage/project/hyperlpr3/releases/) 
[中文文档](README_CH.md)

### Quick installation

`python -m pip install hyperlpr3`

###### support：python3, Windows, Mac, Linux, Raspberry Pi。


###### 720p cpu real-time (st on MBP r15 2.2GHz haswell).

#### Quick Test

```bash
# image url
lpr3 sample -src https://koss.iyong.com/swift/v1/iyong_public/iyong_2596631159095872/image/20190221/1550713902741045679.jpg

# image path
lpr3 sample -src images/test_img.jpg -det high
```

#### How to Use

```python
# import opencv
import cv2
# import hyperlpr3
import hyperlpr3 as lpr3

# Instantiate object
catcher = lpr3.LicensePlateCatcher()
# load image
image = cv2.imread("images/test_img.jpg")
# print result
print(catcher(image))

``` 
#### Start the WebAPI service

```bash
# start server
lpr3 rest --port 8715 --host 0.0.0.0
```
Path to open SwaggerUI after startup：[http://localhost:8715/api/v1/docs](http://localhost:8715/api/v1/docs) View and test the online Identification API service:

![swagger_ui](./images/swagger-ui.png)


#### Q&A

Q：Whether the accuracy of android in the project is consistent with that of apk-demo？

A：Please compile or download the Android shared library from the release and copy it to Prj-Android for testing。

Q：Source of training data for license plates？

A：Since the license plate data used for training involves legal privacy and other issues, it cannot be provided in this project. Open more big data sets [CCPD](https://github.com/detectRecog/CCPD) registration dataset。

Q：Provision of training code？

A：The resources provide the old training code, and the training methods for HyperLPR3 will be sorted out and presented later。


#### Resources

- [五分钟搞定: 中文车牌识别光速部署与使用](https://blog.csdn.net/weixin_40193776/article/details/129258107)

- [Linux/MacOS使用：C/C++库编译](https://blog.csdn.net/weixin_40193776/article/details/129295679)

- [Android使用：SDK编译与部署](https://blog.csdn.net/weixin_40193776/article/details/129354938)

- To be added... Contributions welcome

#### Other Versions

- [HyperLPRv1](https://github.com/szad670401/HyperLPR/tree/v1)

- [HyperLPRv2](https://github.com/szad670401/HyperLPR/tree/v2)

### TODO

- Support for rapid deployment of WebApi services
- Support multiple license plates and double layers
- Support large Angle license plate
- Lightweight recognition model


### Specialty

- 720p faster, single core Intel 2.2G CPU (MaBook Pro 2015) average recognition time is less than 100ms
- End-to-end license plate recognition does not require character segmentation
- The recognition rate is high, and the accuracy of the entrance and exit scene is about 95%-97%
- Support cross-platform compilation and rapid deployment

### Matters Need Attention:

- The C++ and Python implementations of this project are separate
- When compiling C++ projects, OpenCV 4.0 and MNN 2.0 must be used, otherwise it will not compile
- Android project compilation ndk as far as possible to use version 21

### Python Dependency
- opencv-python (>3.3)
- onnxruntime (>1.8.1)
- fastapi (0.92.0)
- uvicorn (0.20.0)
- loguru (0.6.0)
- python-multipart
- tqdm
- requests 

### Cross-platform support

#### Platform
- Linux: x86、Armv7、Armv8
- MacOS: x86
- Android: arm64-v8a、armeabi-v7a
  
#### Embedded Development Board
- Rockchip: rv1109rv1126(RKNPU)

### CPP Dependency

- Opencv 4.0 above
- MNN 2.0 above

### C/C++ Compiling Dependencies

Compiling C/C++ projects requires the use of third-party dependency libraries. After downloading the library, unzip it, and put it into the root directory (the same level as CMakeLists.txt) by copying or soft linking.[baidu drive](https://pan.baidu.com/s/138O2bSlPN0H81OYP6zc3yQ) code: 5duf

### Linux/Mac Shared Library Compilation

- Need to place or link dependencies in the project root (same level as CMakeLists.txt)

```bash
# execute the script
sh command/build_release_linux_share.sh

```
Compiled to the **build/linux/install/hyperlpr3** dir，Which contains：
- include - header file
- lib - shared dir
- resource - test-images and models dir

Copy the files you need into your project

### Linux/Mac Compiling the Demo

- You need to complete the compilation action of the previous step，And ensure that the compilation is successful and the compiled file is placed in the root directory: **build/linux/install/hyperlpr3**
- Go to the **Prj-Linux** folder
```bash
# go to Prj-linux
cd Prj-Linux
# make build and enter
mkdir build && cd build
# Start compiling
cmake .. && make -j
```
The executable program is generated after compilation: **PlateRecDemo**，and Run the program
```bash
# first param models dir, second param image path
./PlateRecDemo ../hyperlpr3/resource/models/r2_mobile ../hyperlpr3/resource/images/test_img.jpg
```
### Linux/Mac Quick Use SDK Code Example
```C
// Load image
cv::Mat image = cv::imread(image_path);
// Create a ImageData
HLPR_ImageData data = {0};
data.data = image.ptr<uint8_t>(0);         // Setting the image data flow
data.width = image.cols;                   // Setting the image width
data.height = image.rows;                  // Setting the image height
data.format = STREAM_BGR;                  // Setting the current image encoding format
data.rotation = CAMERA_ROTATION_0;         // Setting the current image corner
// Create a Buffer
P_HLPR_DataBuffer buffer = HLPR_CreateDataBuffer(&data);

// Configure license plate recognition parameters
HLPR_ContextConfiguration configuration = {0};
configuration.models_path = model_path;         // Model folder path
configuration.max_num = 5;                      // Maximum number of license plates
configuration.det_level = DETECT_LEVEL_LOW;     // Level of detector
configuration.use_half = false;
configuration.nms_threshold = 0.5f;             // Non-maxima suppress the confidence threshold
configuration.rec_confidence_threshold = 0.5f;  // License plate number text threshold
configuration.box_conf_threshold = 0.30f;       // Detector threshold
configuration.threads = 1;
// Instantiating a Context
P_HLPR_Context ctx = HLPR_CreateContext(&configuration);
// Query the Context state
HREESULT ret = HLPR_ContextQueryStatus(ctx);
if (ret != HResultCode::Ok) {
    printf("create error.\n");
    return -1;
}
HLPR_PlateResultList results = {0};
// Execute LPR
HLPR_ContextUpdateStream(ctx, buffer, &results);

for (int i = 0; i < results.plate_size; ++i) {
	// Getting results
    std::string type;
    if (results.plates[i].type == HLPR_PlateType::PLATE_TYPE_UNKNOWN) {
        type = “Unknown";
    } 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);
}

// Release Buffer
HLPR_ReleaseDataBuffer(buffer);
// Release Context
HLPR_ReleaseContext(ctx);
```

### Android: Compile the Shared Library
- The first step is to install third-party dependencies
- You need to prepare NDKS and configure environment variables: $ANDROID_NDK
- Supports cross-compilation on Linux/MacOS
```bash
# execute the script
sh command/build_release_android_share.sh
```
Compiled to the: **build/release_android/**，Which contains：
- arm64-v8a - 64bit shard library
- armeabi-v7a - 32bit shard library

After compiling，Copy**arm64-v8a**and**armeabi-v7a** dirs to **Prj-Android/hyperlpr3/libs**，And compile the **Prj-Android** project to use.

###  

### License Plate Type is Supported(Chinese)

#### 支持
- [x] 单行蓝牌
- [x] 单行黄牌
- [x] 新能源车牌
- [x] 教练车牌
#### 有限支持
- [x] 白色警用车牌
- [x] 使馆/港澳车牌
- [x] 双层黄牌
- [x] 武警车牌
#### 待支持
- [ ] 民航车牌
- [ ] 双层武警
- [ ] 双层军牌
- [ ] 双层农用车牌
- [ ] 双层个性化车牌
- [ ] License plates from more countries

###### Note:Due to some imbalanced samples during training, some special license plates have low recognition rates, such as (Embassy/Hong Kong and Macao license plates), which will be improved in the subsequent versions.


### Demo APP Install

- Android APP：[Scan QR Code](http://fir.tunm.top/hyperlpr)

#### Help

- HyperInspire QQ Group: 529385694

