This repository provides a safer, modular PoC for road-damage detection with shared inference logic across API, demo, and CLI.
0 -> crack1 -> pothole
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
python -m pip install --upgrade pip
pip install -r requirements-dev.txt -c constraints.txtapps/
api/main.py
demo/app.py
cli/infer_video.py
src/road_damage/
common/
data/
inference/
modeling/
configs/
data/
train/
eval/
tests/
unit/
integration/
regression/
Legacy paths remain for compatibility:
api/main.pydemo/app.pysrc/infer_video.py
python datasets/make_2class_dataset.py
python -m road_damage.data.validate --root data/rdd2class_yolo --report outputs/dataset_validation_report.jsonTrain wrapper (metadata + reproducibility lineage):
PYTHONPATH=src python -m road_damage.modeling.train --config configs/train/baseline.yaml --out outputs/trainEvaluate wrapper:
PYTHONPATH=src python -m road_damage.modeling.evaluate --config configs/eval/default.yaml --out outputs/evalVideo inference CLI:
python apps/cli/infer_video.py --source data/sample_video.mp4 --model_id default --out_dir outputsAPI:
uvicorn apps.api.main:APP --host 127.0.0.1 --port 8000Demo:
streamlit run apps/demo/app.py- Use config files in
configs/trainandconfigs/eval. - Set explicit seed in train config.
- Persist
train_metadata.json(commit SHA, config snapshot, dataset manifest hash). - Keep dataset validation and manifest checks in CI for dataset-touching changes.
- Python: 3.10–3.11
- CUDA: optional, CPU supported by default configs
- Ultralytics: pinned via
constraints.txt(8.3.120)
ci.yml: lint, type-check, tests, smoke inference/evalsecurity.yml: dependency vulnerability scan + secret scanning
- New shared inference core lives under
src/road_damage/inference. - Public API now prefers
model_id; direct arbitrary localmodel_pathis rejected unless mapped in whitelist (ROAD_DAMAGE_MODELS). - Existing
/predict_imageroute is preserved as v1 compatibility alias.
- If deployment issues occur, revert to previous commit/tag and keep old runtime entrypoints (
api/main.py,demo/app.py,src/infer_video.py) which are retained. - Disable new wrappers by running legacy commands against prior revision while investigating config or registry mismatches.