License_Plate_Model

License Plate Recognition Challenge

Model for License Plate Recognition Challenge

MIT
Object Detection
PyTorch
English
by @AIOZAI
1
0

Last updated: 2 hours ago


License Plate Recognition Model

License Python System

Challenge participants: Develop robust models for license plate detection and recognition.

Table of Contents

Quick Start

Clone the repository:

git clone [email protected]:AIOZAI/License_Plate_Model.git

Or download directly: License Plate Recognition Baseline

Then, navigate into the project directory and follow the steps below:

# 1. Install dependencies (Do not add any other libraries to requirements.txt file)
pip install -r requirements.txt

# 2. Start developing your solution. Follow the tutorial below to implement your AI model

# 3. Run the demo to test your implementation
python demo.py

# 4. Verify Your Submission
python -m my_ai_lib.predict_submission

Note: You need to implement your license plate detection and recognition solution following the tutorial guide.

Introduction

License Plate Recognition is a key task in intelligent transportation and traffic monitoring. This AI-powered task focuses on detecting vehicles' license plates and accurately recognizing the characters they contain using computer vision and deep learning. By enabling automated extraction of license plate information from images, the system supports applications such as traffic management, smart parking, toll collection, and law enforcement, helping improve overall efficiency, accuracy, and safety.

In this challenge, participants will be provided with:

  • Model Access: License Plate Recognition Baseline

    • Code baseline to develop solutions.
    • Predefined libraries and tools in requirements.txt (Do not add any other libraries to requirements.txt file).
  • Dataset Access: License Plate Recognition Dataset

    • Training dataset to train your AI models.
    • Testing dataset to predict labels for generating the submission file.

Goal: Build and improve solutions based on provided resources while fostering creativity in model design and training strategies.

Requirements

System Requirements

  • Python 3.10+
  • CUDA-compatible GPU (recommended)

Dependencies

Install all required packages:

pip install -r requirements.txt

Project Structure

Your AI library should follow this structure:

repository/
├── my_ai_lib/                   # Your AI library
│   ├── __init__.py              # Required: Library initialization
│   ├── run.py                   # Required: Main workflow function
│   ├── predict_submission.py    # Required: Submission function
│   └── [your_modules]/          # Your custom modules
├── models/                      # Model weights directory
├── demo.py                      # Demo script
├── requirements.txt             # Dependencies
└── README.md                    # Documentation

Description

  • The input and output of the AI model are defined in my_ai_lib/run.py.
  • The AI model is designed to process a single input item (an image file path).
  • In my_ai_lib/predict_submission.py, we process all items in the test dataset and save the results to result.csv in the required submission format.
  • Please refer to the instructions below for more details.

Key Components

ComponentDescriptionStatus
my_ai_lib/Core AI library directoryRequired
my_ai_lib/__init__.pyLibrary initializationRequired
my_ai_lib/predict_submission.pyGenerate predictions for challenge submission.Required
my_ai_lib/run.pyMain AI workflowRequired
demo.pyDemo and testing scriptRequired

Detailed Tutorial

Step 1: Initialize Your AI Library

1.1 Define my_ai_lib/__init__.py

from .run import run

This file exposes the run() function from run.py as an attribute of my_ai_lib, so you can call it as my_ai_lib.run().

1.2 Define Input/Output Objects in my_ai_lib/run.py

Create your custom input and output classes:

from pathlib import Path
from typing import Any, Union, Literal
from aioz_ainode_adapter.schemas import InputObject, OutputObject, FileObject

class LicensePlateInput(InputObject):
    # image_path is the local path to the vehicle image
    image_path: str

class LicensePlateOutput(OutputObject):
    # predict_label contains bounding boxes and license plate number
    predict_label: str

Step 2: Understanding AIOZ Schema Objects

The aioz_ainode_adapter library defines 3 core object types based on pydantic.BaseModel:

🔸 InputObject

Define the format for input when the AIOZ-AI-Node system sends to your AI library.

Default Parameters:

ParameterTypeDescription
deviceChoiceDevice for your model: ["cuda", "cpu", "gpu"]
model_storage_directoryStringDirectory containing model weights

Important: Always use model_storage_directory for model weight paths, as AIOZ-AI-Node will specify this location.

🔸 OutputObject

Define the format for output when your AI library sends to the AIOZ-AI-Node system.

🔸 FileObject

Define the format for the file, if your output has a file. This object has two fields:

FieldTypeDescription
dataChoiceFile data: io.BufferedReader, Path, or URL
nameStringFile name

Example FileObject creation:

output_file = FileObject(data=open("file/path.csv", "rb"), name="output.csv")

Note:

  • Input files must be local file paths or URLs
  • Output files must be FileObject instances

Step 3: Implement the Main Workflow

3.1 Define Your AI Task Function

def do_ai_task(
        image_path: str,
        model_storage_directory: Union[str, Path],
        device: Literal["cpu", "cuda", "gpu"] = "cpu",
        *args, **kwargs) -> str:
    """
    Detect and recognize license plates in the image.

    Args:
        image_path: Path to the image file
        model_storage_directory: Path to directory containing trained model weights
        device: Device to run inference on ("cpu", "cuda", or "gpu")

    Returns:
        predict_label: A string containing predicted results
    """
    # 1. Load and preprocess image from image_path
    # Example using OpenCV:
    # import cv2
    # img = cv2.imread(image_path)

    # 2. Run prediction using your trained model

    # 3. Format the result string
    predict_label = "1 0.927 0.191 0.808 0.208 0.103 AI48004"
    return predict_label

3.2 Implement the Required run() Function

def run(input_obj: InputObject) -> OutputObject:
    """
    Main entry point for the License Plate Recognition library.

    Args:
        input_obj: Input object containing image path and parameters

    Returns:
        output_obj: Object containing the predicted label
    """
    try:
        # Validate and parse input
        license_plate_input = LicensePlateInput.model_validate(input_obj.model_dump())

        # Execute AI task
        predict_label = do_ai_task(
            image_path=license_plate_input.image_path,
            model_storage_directory=license_plate_input.model_storage_directory,
            device=license_plate_input.device
        )
        # Create output object
        output_obj = LicensePlateOutput(predict_label=predict_label)
    except Exception as e:
        raise Exception(e)

    return output_obj

Critical: The run() function name is mandatory and cannot be changed. The do_ai_task() function can be renamed and customized.

Step 4: Create Demo Script

Create demo.py to test your implementation:

import my_ai_lib
from aioz_ainode_adapter.schemas import InputObject

def main():
    """Demo function to test the License Plate Recognition library."""
    # Example input: path to a vehicle image
    image_path = "path/to/vehicle_image.jpg"

    input_obj = InputObject(
        image_path=image_path
    )
    output_obj = my_ai_lib.run(input_obj)
    print(f"Output: {output_obj}")

if __name__ == '__main__':
    main()

The my_ai_lib.run() function receives an InputObject and returns an OutputObject.

Run this command to test your implementation:

python demo.py

Expected console output:

Input: device='cpu' model_storage_directory='models' image_path='path/to/vehicle_image.jpg'
Output: predict_label='1 0.927 0.191 0.808 0.208 0.103 AI48004'

Step 5: Add Model Weights

Place your trained model files in the models/ directory:

models/
├── model.pth          # Your trained model
├── config.json        # Model configuration
└── etc.

Step 6: Create Prediction Script (For Private Submissions)

Implement the predict_submission() function in my_ai_lib/predict_submission.py

Requirements

  • Function accepting test data folder path (string)
  • Load your trained model
  • Process test dataset (images in test data folder)
  • Generate predictions
  • Save results as ./result.csv

Implementation Template

from aioz_ainode_adapter.schemas import InputObject
import my_ai_lib
import os
import csv

def predict_submission(test_data_folder: str):
    """
    Generate predictions for challenge submission.

    Args:
        test_data_folder: Path to test data directory
    """
    # TODO: Implement your solution here
    # Example:
    # 1. Locate test images folder (use os.walk() to find files)
    test_folder = test_data_folder
    for root, dirs, files in os.walk(test_data_folder):
        if any(f.endswith(('.jpg', '.jpeg', '.png')) for f in files):
            test_folder = root
            break

    results = []
    image_files = [f for f in os.listdir(test_folder) if f.endswith(('.jpg', '.jpeg', '.png'))]

    print(f"Found {len(image_files)} images in {test_folder}")

    # 2. Process each image
    for filename in image_files:
        image_path = os.path.join(test_folder, filename)

        # Call the run function with the image path
        output_obj = my_ai_lib.run(InputObject(image_path=image_path))

        # id is the filename, predict_label is the prediction
        results.append({"id": filename, "predict_label": output_obj.predict_label})

    # 3. Save to ./result.csv
    with open("./result.csv", "w", newline="") as f:
        writer = csv.DictWriter(f, fieldnames=["id", "predict_label"])
        writer.writeheader()
        writer.writerows(results)

    print(f"Saved {len(results)} predictions to ./result.csv")

def main():
    """Main function for testing submission."""
    predict_submission("path/to/test/data")

if __name__ == '__main__':
    main()

Important: The result.csv must match the challenge's sample submission format.

Verify Your Submission

python -m my_ai_lib.predict_submission

Submission Guidelines

Submit a CSV file with two columns:

  • id: The unique identifier (image filename) for each image in the test set (e.g., 0001.jpg).
  • predict_label: A string representing the predicted result(s) for the image, in the format class confidence_score x_center y_center box_width box_height license_number:
    • class: object category (1: license plate).
    • confidence_score: the confidence score of the prediction (range 0-1).
    • x_center, y_center: normalized coordinates of the bounding box center.
    • box_width, box_height: normalized width and height of the bounding box.
    • license_number: the predicted license plate number.

If an image contains multiple plates, concatenate the predictions in the same cell, separated by a single space.

Note: x_center and box_width are normalized by image_width; y_center and box_height are normalized by image_height.

Example:

IDpredict_label
0001.jpg1 0.927 0.191 0.808 0.208 0.103 AI48004
0002.jpg1 0.927 0.191 0.808 0.208 0.103 BM74043 1 0.555 0.123 0.138 0.338 0.443 HL14623

See the submission guide for full instructions.

License

This repository is licensed under the MIT License.