LocalFirst Vision YOLO (YOLOv8n)
Retail product-facing detectors used by LocalFirst Vision. Two YOLOv8n checkpoints:
| File | Role | Class 0 |
|---|---|---|
sku110k-yolov8n.pt | Shelf / dense SKU facings | object |
informal-table-yolov8n.pt | Table / single-item / informal | item |
These are Ultralytics YOLO weights and are licensed AGPL-3.0. The rest of the LocalFirst Vision server (FastAPI, DETR, recognition) is MIT — see the code repo NOTICE.
This is not legal advice. Loading these files pulls in the Ultralytics AGPL-3.0 stack.
What it does
Draws bounding boxes around product facings in a photo. It does not name the SKU — naming is a separate catalog-match / OCR / Gemini stage in the server.
Training data
- Shelf: fine-tuned from YOLOv8n on SKU-110K (10 epochs,
imgsz=640, Ultralytics 8.4.68). Val: mAP50 0.781, mAP50-95 0.443. - Table: further fine-tuned on proprietary merchant catalog / table photos that are not released. Do not expect this checkpoint to be reproducible from public data. Val mAP on that private mix is low (mAP50 0.308); it is a specialized incremental fit, not a public benchmark winner.
Inference config (must match to reproduce)
Source of truth: yolo/inference.yaml in the code repo (copied here).
Shelf
imgsz:min(640, max(640, max(H, W)))→ 640 for typical photosconf: 0.35iou(NMS): 0.55- ByteTrack on (
bytetrack.yaml) — this is what the API uses for shelf YOLO - class map:
{0: object}
Table
imgsz:min(1280, max(640, max(H, W)))conf: 0.25 (the API clamps any higherINVENTORY_YOLO_TABLE_CONF)iou(NMS): 0.40- ByteTrack off
- class map:
{0: item}
Pin ultralytics==8.4.76, torch==2.12.0, torchvision==0.27.0, numpy==2.3.5. Version drift is the usual reason loaded weights “don’t match.”
SHA256
edf36bde5506474c3ff8ffb2c568c0a3038b9a219227be793e24205667d96b83 sku110k-yolov8n.pt
4e701bafe46f53f6520afd6c8ca34a428e0ab402d23a8f4352d4d6b4c4d31e2b informal-table-yolov8n.pt
Load + infer (copy-paste)
from huggingface_hub import hf_hub_download
from ultralytics import YOLO
from PIL import Image
weights = hf_hub_download(
"jz67/localfirst-vision-yolo",
"sku110k-yolov8n.pt",
)
model = YOLO(weights)
im = Image.open("shelf.jpg").convert("RGB")
w, h = im.size
imgsz = min(640, max(640, max(w, h)))
result = model.track(
source=im, conf=0.35, iou=0.55, imgsz=imgsz,
tracker="bytetrack.yaml", persist=False, verbose=False,
)[0]
for b in result.boxes:
print(b.xyxy[0].tolist(), float(b.conf[0]), int(b.cls[0])) # class 0 = object
Table / single-item:
weights = hf_hub_download(
"jz67/localfirst-vision-yolo",
"informal-table-yolov8n.pt",
)
model = YOLO(weights)
imgsz = min(1280, max(640, max(w, h)))
result = model.predict(source=im, conf=0.25, iou=0.40, imgsz=imgsz, verbose=False)[0]
Or from the code repo: python yolo/infer_example.py shelf.jpg --role shelf
Intended use
Research and reproduction of LocalFirst Vision YOLO detection numbers. Not a general COCO detector. Not for identifying people. Merchant catalog images used in the table fine-tune are private and are not included.
License
AGPL-3.0. Ultralytics YOLO: https://ultralytics.com/license