Object Detection
ultralytics
yolo11
street-photography

Jerusalem street poster detector

Fine-tune of yolo11n.pt that locates specific poster designs in street photographs and names which design it found. Trained on danielrosehill/jerusalem-poster-detection.

This is a proof of concept: that a small detector, trained on a few dozen hand-drawn boxes, can support graffiti and flyposting workflows โ€” surveying what is up, identifying which known artwork it is, and checking afterwards whether it came down. It is not a finished production model, and the honest reading of its numbers is at the bottom of this card.

Each class is one artwork, not a generic "poster" category, so the model answers which known design is on the wall and where its bounds are. The class list grows as new designs are surveyed; indices are append-only.

Classes

  • 0 โ€” chabad-rebbe-poster-1

Results

Validation was not held out. These weights are fitted on every image in the dataset, so the figures below measure how well the model reproduces what it was shown. They are not an estimate of performance on new photographs. The held-out numbers are in the training log.

Metric Value
mAP@50 0.992
mAP@50-95 0.815
Precision 0.975
Recall 0.962
Train images 13
Val images 13
Image size 1280
Epochs 400

Held-out evaluation

The shipped weights above are fitted on all 13 image(s). To measure generalisation, an identically configured run held out whole locations (L2, L3, L4, L5) and never saw them:

Metric Held out
mAP@50 0.649
mAP@50-95 0.270
Precision 0.765
Recall 0.571
Train / val images 7 / 6

These are the numbers to judge the model by. Inspected by eye at conf=0.25, it finds the real posters on unseen lampposts but also fires on a passer-by's dark coat and on bright sky-and-building patches, which is what a precision of 0.77 looks like in practice.

Validation held out whole locations (L1, L2, L3, L4, L5, L6, L7, L8), not random images: several frames in the dataset show the same lamppost from a few paces apart, and splitting per-image would score memorisation.

Usage

from ultralytics import YOLO
from huggingface_hub import hf_hub_download

weights = hf_hub_download("danielrosehill/jerusalem-poster-detector", "best.pt")
model = YOLO(weights)

for r in model.predict("street_photo.jpg", imgsz=1280, conf=0.25):
    for box in r.boxes:
        print(model.names[int(box.cls)], box.xyxy[0].tolist(), float(box.conf))

Predict at the image size it was trained on. Instances are small โ€” some occupy under 0.1% of the frame โ€” so running at the 640 default will miss them.

Limitations

Trained on 13 photographs from one photographer's walk down one street on one afternoon, so it has seen a narrow slice of lighting, weather and background. At that size the hyperparameters matter more than usual: the first run of this model, at Ultralytics' default lr0=0.01 with an unfrozen backbone and a batch larger than the training set, collapsed into predicting the whole frame as poster at confidence 1.0 while its training loss fell smoothly. The shipped configuration is lr0=0.001, freeze=10, batch=4. Posters appear intact, over-sprayed, torn and sun-bleached; other street material it has never seen โ€” memorial notices, election flyers, other stickers โ€” is exactly what it is most likely to fire on falsely. Verify before trusting counts.

Reproduce with scripts/train_detector.py in https://github.com/danielrosehill/Jerusalem-Graffiti.

Downloads last month
-
Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐Ÿ™‹ Ask for provider support

Dataset used to train danielrosehill/jerusalem-poster-detector