4.1 KiB
Easy local ALPR (Automatic License Plate Recognition)
This script is a REST API server that uses ultimateALPR-SDK to process images and return the license plate information. The server is created using Flask and the ultimateALPR SDK is used to process the images.
This script is intended to be used as a faster local alternative to the large and resource heavy CodeProject AI software.
Important
The ultimateALPR SDK is a lightweight and much faster alternative (on CPU and GPU) to the CodeProject AI software but it has a few limitations with it's free version:
- The last character of the license plate is masked with an asterisk
- The SDK supposedly has a limit of requests per program execution (never encountered yet) but I have implemented a workaround for this by restarting the SDK after 3000 requests just in case.
Usage
The server listens on port 5000 and has one endpoint: /v1/image/alpr. The endpoint accepts POST requests with an image file in the 'upload' field. The image is processed using the ultimateALPR SDK and the license plate information is returned in JSON format. The reponse follows the CodeProject AI ALPR API format. So it can be used as a drop-in replacement for the CodeProject AI ALPR API.
Parameters
-
upload: (File) The image file to process. (see Pillow.Image.open() for supported formats)
-
grid_size: (Integer, optional) The grid size to use when no match have been found on the whole image (default: 4)
-
wanted_cells: (String, optional) The wanted cells to use when no match have been found on the whole image (default: all cells)
- format:
1,2,3,4,...
(comma separated list of integers, max: grid_size^2) - Example for a grid_size of 3:
1 | 2 | 3 4 | 5 | 6 7 | 8 | 9
Response
- format:
{
"success": (Boolean) // True if successful.
"message": (String) // A summary of the inference operation.
"error": (String) // (Optional) An description of the error if success was false.
"predictions": (Object[]) // An array of objects with the x_max, x_min, max, y_min bounds of the plate, label, the plate chars and confidence.
"processMs": (Integer) // The time (ms) to process the image (includes inference and image manipulation operations).
}
Included models in built executable
When using the built executable, only the latin charset models are bundled by default. If you want to use a different
charset, you need to set the charset in the JSON_CONFIG variable and rebuild the executable with the according
models found here
To build the executable, you can use the build_alpr_api.sh
script, which will create an executable named alpr_api
in
the dist
folder.
Setup development environment
Use automatic setup script
You can use the build_and_setup_ultimatealvr.sh
script to automatically install the necessary packages and build the ultimateALPR SDK wheel, copy the assets and the libs.
Important
Make sure to install the package python3-dev (APT) python3-devel (RPM) before running the build and setup script.
The end structure should look like this:
.
├── alpr_api.py
├── assets
│ ├── fonts
│ └── models
├── libs
│ ├── libxxxxxx.so
│ ├── ...
│ └── libxxxxxx.so
└── ...
Important notes
When running, building or developing the script, make sure to set the LD_LIBRARY_PATH
environment variable to the libs folder
(limitation of the ultimateALPR SDK).
export LD_LIBRARY_PATH=libs:$LD_LIBRARY_PATH
Error handling
GLIBC_ABI_DT_RELR not found
If you encounter an error like this:
/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_ABI_DT_RELR' not found
Then make sure your GLIBC version is >= 2.36