Raah-9B

Raah (राह) means the way. Raah-9B is an open decision model for a photo of an Indian road: it returns a calibrated probability for each kind of damage in one forward pass. It does not write a caption.

  • Questions: pothole (D40), longitudinal crack (D00), transverse crack (D10), alligator cracking (D20).
  • Model: Clef-Flash (Qwen3.5-9B + LoRA r16 + joint decision head, 9.4B parameters), vision encoder frozen, fine-tuned on RDD2022 India, BharatPotHole, and close-up pothole photos.
  • Author: Yashaswi Galhotra · Licence: CC BY-SA 4.0 (share-alike)

Quickstart: download and run a road photo. The included raah.py loader handles the base model, adapter, decision head, and calibration together.

Results

Headline numbers are on 1,160 RDD2022 India dashcam photos from Delhi, Gurugram and Haryana (Arya et al., 2024), which Raah never trained on. 229 of the photos are labelled potholes.

Against its base model, Clef-Flash before this fine-tune, on those 1,160 photos:

Clef-Flash Raah-9B
pothole accuracy 83.7% 87.5%
pothole precision 61.4% 67.2%
pothole recall 47.2% 71.6%
pothole F1 0.533 0.693
pothole average precision 0.588 0.790

A model that never says “pothole” scores 80.3% accuracy on this set.

Against the other models scored

Raah-9B, GPT-6 Luna, OneJev 1.6 27B, Clef-Flash, and gpt-5-mini answered the same 1,160 photos. gpt-5-mini is the production vision model in Pothole Reporter. It returns a damage label, so it has no average precision. The probability models use thresholds frozen on validation.

accuracy precision recall F1 average precision
Raah-9B 87.5% 67.2% 71.6% 0.693 0.790
GPT-6 Luna 84.7% 63.0% 55.0% 0.587 0.575
Clef-Flash 83.7% 61.4% 47.2% 0.533 0.588
OneJev 1.6 27B 81.6% 54.2% 45.0% 0.492 0.533
gpt-5-mini 82.2% 66.2% 19.7% 0.303 —

Raah finds 164 of the 229 labelled potholes. GPT-6 Luna finds 126, Clef-Flash 108, OneJev 103, and gpt-5-mini 45.

Of those 229, gpt-5-mini named 45 a pothole cavity and 151 surface breakup, and marked 202 as damaged. Raah calls 114 of those 151 a pothole. On any of the four labelled damage types, Raah reaches accuracy 83.1% and F1 0.779. gpt-5-mini’s “damaged” decision reaches accuracy 72.6% and F1 0.655. A Raah photo counts as damaged when the pothole probability is at least 0.3143 or any other question is at least 0.5.

Alligator cracking, 261 photos. Accuracy, precision, recall and F1 use probability 0.5. Average precision does not.

accuracy precision recall F1 average precision
Raah-9B 90.8% 90.1% 66.3% 0.764 0.871
OneJev 1.6 27B 80.9% 95.5% 16.1% 0.275 0.625
GPT-6 Luna 78.8% 100% 5.7% 0.109 0.453
Clef-Flash 78.7% 100% 5.4% 0.102 0.516

Longitudinal cracks, 166 photos, same cutoff:

accuracy precision recall F1 average precision
Raah-9B 88.7% 80.7% 27.7% 0.413 0.585
OneJev 1.6 27B 82.8% 41.5% 50.0% 0.454 0.493
Clef-Flash 86.9% 76.9% 12.0% 0.208 0.429
GPT-6 Luna 86.1% 53.3% 24.1% 0.332 0.374

Transverse cracks are 9 photos. Average precision is 0.047 for Raah and OneJev, 0.027 for Clef-Flash, and 0.020 for GPT-6 Luna. Accuracy near 99% is not a detection result: 1,151 photos have no transverse crack. None of the models find this class.

Where the other models are stronger: transverse cracks, for every model scored. On longitudinal cracks at probability 0.5, OneJev’s F1 is higher because it says yes more often; its precision is lower, and Raah’s average precision is higher. On alligator cracking, Luna and Clef-Flash are perfectly precise because they almost never say yes. gpt-5-mini’s pothole precision is nearly the same as Raah’s. Gemini and Claude were not scored.

Where Raah is stronger: pothole F1 and average precision against every model in the table, pothole recall, and alligator cracking. It has the highest pothole precision of the five and the fewest missed potholes.

Open versus hosted. GPT-6 Luna and gpt-5-mini are proprietary models, billed per call. OneJev 1.6 27B was run locally for this test. Raah’s adapter and head are open: they run on your own GPU, on top of Clef-Flash, and a given version does not change. The full write-up is raah-9b-report.pdf.

Pothole thresholds, frozen on validation: Raah 0.3143, GPT-6 Luna 0.2004, Clef-Flash 0.2567, OneJev 0.3005. GPT-6 Luna: OpenAI, reasoning off. gpt-5-mini: Pothole Reporter’s road-damage-v5 prompt, high image detail, minimal reasoning; a pothole call is an acceptable photo, marked damaged, with type pothole cavity. OneJev 1.6 27B was run locally. Scored 18 October 2026; hosted models change over time. Their outputs were used for evaluation only, never as training data. Raah was trained on the sets named below; the hosted models’ training data is not public. Raah-9B is not affiliated with or endorsed by Cloudflare, the Qwen team, OmniJev, OpenAI, or Pothole Reporter.

Use it for

  • Pothole calls on a dashcam photo of an Indian road. The frozen line on this test is probability 0.3143.
  • The other three questions: longitudinal crack, transverse crack, and alligator cracking, each as its own probability.
  • Passing on the confident cases: keep photos below a threshold for a person. Set that line on your own photos. The line above was fit on RDD2022 India validation, and your roads will differ.

Good to know

  • Raah returns four damage probabilities. It does not judge whether a photo is usable, estimate size, or write a description.
  • It is strongest on potholes and alligator cracking. Transverse cracks are not a detection result.
  • The published test is Indian dashcam frames. It is not a test of phone close-ups, or of photos that are not a road.
  • Keep a person in the loop before a complaint is sent.

How the results were checked

  • Training, calibration and model selection used the training and validation splits. The 1,160-photo test was locked until the checkpoint and the pothole threshold were frozen. Near-duplicate frames stayed in the same split.
  • Each damage question has its own temperature, fitted on validation. The values are in calibration.json. The pothole temperature is 1.000.
  • Calling every photo undamaged scores 80.3% on potholes, 85.7% on longitudinal cracks, 99.2% on transverse cracks, and 77.5% on alligator cracking.

Running it

Use the included raah.py loader. It downloads the pinned Clef-Flash backbone, attaches Raah's adapter, loads the fine-tuned decision head, and applies the saved calibration automatically.

Hardware: Linux, Python 3.12, and an NVIDIA CUDA GPU with bfloat16 support. Tested on an L40S with 48 GB VRAM. Allow about 25 GB of download/cache space for the model files, plus space for Python dependencies. The first run downloads the weights; later runs reuse the cache. GPU compute is not included with the download.

Transformers pipeline

Install the pinned dependencies below, then run:

from transformers import pipeline

classifier = pipeline(
    "image-classification",
    model="YAlgoG/raah-9b",
    trust_remote_code=True,
)
print(classifier("road.jpg"))

This returns four independent calibrated damage probabilities as label/score entries. They do not sum to one. To also get the pothole decision at the frozen threshold:

result = classifier("road.jpg", return_details=True)
print(result["pothole"])
print(result["probabilities"])

trust_remote_code=True loads the custom Raah wrapper, which handles the adapter, decision head and calibration. Inference runs on your CUDA GPU. Use batch_size=1 (the default); lists of images are processed sequentially. Replace the generic example image in Hugging Face's popup with a road photo, and install this repository's pinned dependencies rather than only Transformers. With AutoModelForImageClassification, call model(images="road.jpg") to get the full result.

Command line

In a Python environment on your GPU machine:

pip install -U huggingface_hub
hf download YAlgoG/raah-9b raah.py requirements-inference.txt --local-dir raah
cd raah
pip install -r requirements-inference.txt
python raah.py /path/to/road.jpg

The output is JSON with probabilities for D40, D00, D10, and D20; a pothole boolean; and the frozen pothole_threshold of 0.3143. For several photos, load the model once:

python raah.py road1.jpg road2.jpg --output predictions.json

Python

After downloading the loader and installing its requirements:

from raah import Raah

model = Raah.from_pretrained("YAlgoG/raah-9b")
result = model.predict("road.jpg")  # also accepts a PIL image
print(result["probabilities"])
print(result["pothole"])

Keep model loaded to process more photos. Images are processed on your GPU and are not sent to an inference API. The loader executes Clef's release code from the pinned revision used for evaluation. Verified on two held-out images on an L40S: both pothole decisions matched the saved checkpoint, and all four probabilities agreed within 0.002. Peak allocated GPU memory was approximately 22.2 GiB for these images; larger inputs can need more.

This repository hosts downloadable weights and code. It is not a hosted inference endpoint. The generic AutoModel + PeftModel snippet does not load the complete Raah model; use Raah.from_pretrained above.

Training

init Cloudflare/clef-flash at 8b2e5fd17c09fd49bc2880b805d5323ec7ff4ff3 (base Qwen/Qwen3.5-9B)
recipe LoRA r16 / α32 / dropout 0.05 on the language-model linear layers, vision encoder frozen, joint head fine-tuned. Published checkpoint: learning rate 3e-5, head learning rate 1e-5, 2 epochs, batch 8 with 2-step accumulation, seed 0, chosen by validation pothole average precision.
training data what it labels licence
RDD2022 India, train split all four questions CC BY-SA 4.0
BharatPotHole pothole question CC BY-SA 4.0
Annotated Potholes Dataset pothole question, close-ups ODC DbCL 1.0

The photographs are not in this repository.

Licence and use restrictions

  • Raah-9B (adapter and head): CC BY-SA 4.0. RDD2022 and BharatPotHole are share-alike, so the adapter and head are share-alike.
  • The Figshare record used for RDD2022 (10.6084/m9.figshare.21431547) is tagged CC BY 4.0. The GitHub image notice and the dataset paper are CC BY-SA 4.0. This release follows the share-alike notice. A separate Mendeley copy of older India images is marked CC BY-NC 3.0. Raah was not trained from that file.
  • Base weights: Clef-Flash (Cloudflare) and Qwen3.5-9B (Qwen team), both Apache-2.0. This repository contains a modified derivative, a LoRA adapter and a retrained head. The base weights are not included. See NOTICE.md. Not affiliated with or endorsed by either.
  • If you train on these share-alike images, or on this adapter and head, publish your changes under CC BY-SA 4.0, credit the sources, and do not redistribute the photographs unless the image licence you used allows it.
  • Test photos were used for evaluation only and are not redistributed.

Acknowledgements

Cloudflare (Clef), the Qwen team, Deeksha Arya, Hiroya Maeda, Sanjay Kumar Ghosh, Durga Toshniwal and Yoshihide Sekimoto (RDD2022; Geoscience Data Journal, 2024), Rishi Raj Sahoo, Surbhi Saswati Mohanty and Subhankar Mishra (BharatPotHole / iWatchRoad; CODS 2025), and the Chitholian annotated pothole collection.

Citation

@misc{galhotra2026raah,
  title  = {Raah-9B: an open, calibrated decision model for Indian road damage},
  author = {Galhotra, Yashaswi},
  year   = {2026},
  url    = {https://huggingface.co/YAlgoG/raah-9b}
}
Downloads last month
42
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for YAlgoG/raah-9b

Finetuned
Qwen/Qwen3.5-9B
Adapter
(10)
this model