
Start
03/12/2025
Close
04/02/2026
5 months agoPothole Detection Challenge
Pothole detection for safer roads
Challenge Rewards:
4500 AIOZParticipants
46
Submissions
497
Pothole Detection Model
Challenge participants: Build robust pothole detection model solutions.
Table of Contents
- Quick Start
- Introduction
- Requirements
- Project Structure
- Detailed Tutorial
- Submission Guidelines
- License
Quick Start
Download code baseline
# 1. Install dependencies (Do not add any other libraries to requirments.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 pothole detection model following the tutorial guide.
Introduction
Pothole detection is a critical application in smart city infrastructure and road maintenance. This AI-powered solution enables automated identification of road surface defects, particularly potholes, using computer vision and deep learning techniques. The system can process road images to detect and locate potholes, contributing to safer driving conditions and more efficient road maintenance planning.
AIOZ Pothole Detection Challenge
In this challenge, participants will be provided with:
-
Model Access: Pothole Detection Model
- Code baseline to develop solutions.
- Predefined libraries and tools in
requirements.txt(Do not add any other libraries to requirments.txt file).
-
Dataset Access:Pothole Detection Data
- 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 in requirements.txt (Do not add any other libraries to requirements.txt):
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.
- 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
| Component | Description | Status |
|---|---|---|
my_ai_lib/ | Core AI library directory | Required |
my_ai_lib/__init__.py | Library initialization | Required |
my_ai_lib/run.py | Main AI workflow | Required |
my_ai_lib/predict_submission.py | Submission function | Required |
demo.py | Demo and testing script | Required |
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 the my_ai_lib, allowing it to be called via 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 MyInput(InputObject):
input_image: str
example_param: Any
class MyOutput(OutputObject):
text: str
output_image: FileObject
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 it to your AI library.
Default Parameters:
| Parameter | Type | Description |
|---|---|---|
device | Choice | Device for your model: ["cuda", "cpu", "gpu"] |
model_storage_directory | String | Directory containing model weights |
Important : Always use
model_storage_directoryfor 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:
| Field | Type | Description |
|---|---|---|
data | Choice | File data: io.BufferedReader, Path, or URL |
name | String | File 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(
input_image: Union[str, Path],
example_param: Any,
model_storage_directory: Union[str, Path],
device: Literal["cpu", "cuda", "gpu"] = "cpu",
*args, **kwargs) -> Any:
"""
Define AI task: load model, pre-process, post-process, etc.
Args:
input_image: Path to input image
example_param: Example parameter
model_storage_directory: Directory containing model weights
device: Computing device
Returns:
Result
"""
# Define your AI task workflow. Below is an example
text = "This is the AI task result"
output_image = open("wiki/aioz.png", "rb") # io.BufferedReader
return text, output_image
3.2 Implement the Required run() Function
def run(input_obj: InputObject) -> OutputObject:
"""
Main entry point for your AI library.
Args:
input_obj: Input object containing all parameters
Returns:
OutputObject: Results of AI processing
"""
# Validate and parse input
my_input = MyInput.model_validate(input_obj.model_dump())
print(f"Input: {my_input}")
# Execute AI task
text, output_image = do_ai_task(
input_image=my_input.input_image,
example_param=my_input.example_param,
model_storage_directory=my_input.model_storage_directory,
device=my_input.device
)
# Create output object
output_file = FileObject(data=output_image, name="output_image.png")
output_obj = MyOutput(text=text, output_image=output_file)
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 your AI library."""
input_obj = InputObject(
input_image="wiki/aioz.png",
example_param="example"
)
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: type='InputObj' device='cuda' model_storage_directory='models' input_image='wiki/aioz.png' example_param='example'
Output: type='OutputObj' text='This is the AI task result' output_image=FileObject(type='FileObj', data=<_io.BufferedReader name='wiki/aioz.png'>, name='output_image.png')
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.
- Generate predictions.
- Save results as
./result.csv
Implementation Template:
from aioz_ainode_adapter.schemas import InputObject
import my_ai_lib
def predict_submission(test_data_folder: str):
"""
Generate predictions for challenge submission.
Args:
test_data_folder: Path to test data directory
"""
# Load your model
# Process test data
# Generate predictions
# Save to ./result.csv
# Example:
# Find test data in folder (contains image files - can use os.walk() to find all image files)
# Loop with each image:
# - You define InputObject
# input_obj = InputObject(
# input_image=str(img_path),
# example_param=str(example),
# )
# - Output (label is predicted from your model): output = my_ai_lib.run(input_obj)
# - Write the predicted label (output.text) to result.csv (format: id, predict_label)
pass
def main():
"""Main function for testing submission."""
predict_submission("path/to/test/data")
if __name__ == '__main__':
main()
Important: The
result.csvmust match the challenge's sample submission format.
Verify Your Submission:
python -m my_ai_lib.predict_submission
Submission Guidelines
Submission format
Submit a csv file with two columns:
id: The unique identifier (image name) for each image from test set(e.g., 0001.jpg)predict_label: A string representing the predicted results in the image, this string has format:class confidence_score x_center y_center box_width box_height:class: object category (1 : pothole).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.
Note: x_center and box_width are normalized by image_width; y_center and box_height are normalized by image_height.
Example:
- An object
id, predict_label
0001.jpg, 1 0.927 0.191 0.808 0.208 0.103
- Two objects
id, predict_label
0002.jpg, 1 0.927 0.191 0.808 0.208 0.103 1 0.555 0.123 0.138 0.338 0.443
License
This repository is licensed under the MIT License.