Датасет SKU-110K#
Датасет SKU-110K — это датасет для обнаружения объектов с одним классом, включающий 11 743 изображения торговых полок с высокой плотностью товаров. Он разделён на 8 219 изображений для обучения, 588 для валидации и 2 936 для тестирования. Каждый товар размечен одним ограничивающим прямоугольником в рамках единственного класса object — название отсылает к более чем 110 000 уникальных товарных единиц (SKUs), запечатлённых на изображениях, а не к 110 000 классам обнаружения. Датасет создан Эраном Голдманом и соавторами для статьи CVPR 2019 Точное обнаружение в плотно заполненных сценах. В нём более 1,7 миллиона размеченных товаров — в среднем около 147 на изображение, — что делает его сложным тестом для моделей компьютерного зрения в переполненных торговых пространствах.
Смотри: Как обучить Ultralytics YOLO26 обнаруживать все товары на полке магазина | SKU-110K 🛒

Основные особенности#
- Обнаружение объектов одного класса: Каждый товар размечен одним ограничивающим прямоугольником в рамках единственного класса
object(names: {0: object}); аннотации не содержат категорий для отдельных SKU. - Экстремальная плотность объектов: На изображениях торговых полок со всего мира в среднем около 147 плотно расположенных товаров. Часто рядом друг с другом находятся похожие или даже идентичные объекты.
- Большой масштаб: Более 110 000 уникальных SKU и свыше 1,7 миллиона размеченных ограничивающих прямоугольников на 11 743 изображениях — серьёзное испытание для современных детекторов объектов.
Структура набора данных#
Датасет SKU-110K разделён на три подмножества, в каждом из которых используется один класс object:
| Подвыборка | Изображения | Описание |
|---|---|---|
| Обучение | 8,219 | Изображения и аннотации для обучения модели |
| Валидация | 588 | Отложенные изображения для оценки во время обучения |
| Тестовая | 2,936 | Изображения для итоговой оценки обученной модели |
Применение#
Датасет SKU-110K широко используют для обучения и оценки моделей глубокого обучения в задачах обнаружения объектов, особенно в плотно заполненных сценах, например на торговых полках. Среди его применений:
- Управление товарными запасами и автоматизация розничной торговли
- Распознавание товаров на платформах электронной коммерции
- Проверка соответствия планограмме
- Системы самообслуживания в магазинах
- Роботизированный отбор и сортировка товаров на складах
Чтобы размечать собственные изображения полок, обучать модели и управлять датасетами для обнаружения товаров в рознице прямо в браузере, выполни весь рабочий процесс на платформе Ultralytics.
Файл YAML набора данных#
Файл SKU-110K.yaml задаёт конфигурацию датасета: пути к данным, названия классов и другие метаданные. Файл поддерживается в репозитории Ultralytics: https://github.com/ultralytics/ultralytics/blob/main/ultralytics/cfg/datasets/SKU-110K.yaml.
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
# SKU-110K retail items dataset https://github.com/eg4000/SKU110K_CVPR19 by Trax Retail
# Documentation: https://docs.ultralytics.com/datasets/detect/sku-110k
# Example usage: yolo train data=SKU-110K.yaml
# parent
# ├── ultralytics
# └── datasets
# └── SKU-110K ← downloads here (13.6 GB)
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: SKU-110K # dataset root dir
train: train.txt # train images (relative to 'path') 8219 images
val: val.txt # val images (relative to 'path') 588 images
test: test.txt # test images (optional) 2936 images
# Classes
names:
0: object
# Download script/URL (optional) ---------------------------------------------------------------------------------------
download: |
import shutil
from pathlib import Path
import numpy as np
import polars as pl
from ultralytics.utils import TQDM
from ultralytics.utils.downloads import download
from ultralytics.utils.ops import xyxy2xywh
# Download
dir = Path(yaml["path"]) # dataset root dir
parent = Path(dir.parent) # download dir
urls = ["http://trax-geometry.s3.amazonaws.com/cvpr_challenge/SKU110K_fixed.tar.gz"]
download(urls, dir=parent)
# Rename directories
if dir.exists():
shutil.rmtree(dir)
(parent / "SKU110K_fixed").rename(dir) # rename dir
(dir / "labels").mkdir(parents=True, exist_ok=True) # create labels dir
# Convert labels
names = "image", "x1", "y1", "x2", "y2", "class", "image_width", "image_height" # column names
for d in "annotations_train.csv", "annotations_val.csv", "annotations_test.csv":
x = pl.read_csv(dir / "annotations" / d, has_header=False, new_columns=names, infer_schema_length=None).to_numpy() # annotations
images, unique_images = x[:, 0], np.unique(x[:, 0])
with open((dir / d).with_suffix(".txt").__str__().replace("annotations_", ""), "w", encoding="utf-8") as f:
f.writelines(f"./images/{s}\n" for s in unique_images)
for im in TQDM(unique_images, desc=f"Converting {dir / d}"):
cls = 0 # single-class dataset
with open((dir / "labels" / im).with_suffix(".txt"), "a", encoding="utf-8") as f:
for r in x[images == im]:
w, h = r[6], r[7] # image width, height
xywh = xyxy2xywh(np.array([[r[1] / w, r[2] / h, r[3] / w, r[4] / h]]))[0] # instance
f.write(f"{cls} {xywh[0]:.5f} {xywh[1]:.5f} {xywh[2]:.5f} {xywh[3]:.5f}\n") # write labelИспользование#
SKU-110K автоматически скачивается при первом запуске обучения. Для 11 743 изображений потребуется около 13,6 ГБ свободного места на диске. Скрипт загрузки также скачивает исходные аннотации и преобразует их в формат YOLO; процесс может занять несколько минут.
Чтобы обучить модель YOLO26n на датасете SKU-110K в течение 100 эпох с размером изображения 640, используй приведённые ниже фрагменты кода. Полный список доступных аргументов см. на странице Обучение модели.
from ultralytics import YOLO
# Загрузить модель
model = YOLO("yolo26n.pt") # загрузить предварительно обученную модель (рекомендуется для обучения)
# Обучить модель
results = model.train(data="SKU-110K.yaml", epochs=100, imgsz=640)Примеры данных и аннотаций#
На изображениях SKU-110K показаны плотно расположенные товары на настоящих магазинных полках, где рядом стоят десятки почти одинаковых предметов. Вот пример изображения с аннотациями:

- Изображение плотно заполненной торговой полки: На этом изображении показан пример высокой плотности объектов на торговой полке. Объекты размечены ограничивающими прямоугольниками в рамках единственного класса
object.
Из-за высокой плотности товаров датасет SKU-110K особенно полезен для разработки надёжных решений компьютерного зрения для розничной торговли: большое количество объектов на изображении предъявляет к детекторам гораздо более высокие требования, чем типичные тесты.
Цитирование и благодарности#
Если ты используешь датасет SKU-110K в исследованиях или разработке, процитируй эту статью:
@inproceedings{goldman2019dense,
author = {Eran Goldman and Roei Herzig and Aviv Eisenschtat and Jacob Goldberger and Tal Hassner},
title = {Precise Detection in Densely Packed Scenes},
booktitle = {Proc. Conf. Comput. Vision Pattern Recognition (CVPR)},
year = {2019}
}Мы хотели бы поблагодарить Эрана Голдмана и соавторов за создание и поддержку датасета SKU-110K, ценного ресурса для сообщества исследователей компьютерного зрения. Подробнее о датасете SKU-110K и его создателях см. в репозитории датасета SKU-110K на GitHub.
Часто задаваемые вопросы#
Датасет SKU-110K — это датасет для обнаружения объектов одного класса, включающий 11 743 изображения торговых полок с высокой плотностью товаров. Его создали Эран Голдман и соавторы для статьи CVPR 2019. Каждый товар размечен одним ограничивающим прямоугольником класса
object. На изображениях представлено более 110 000 уникальных товарных единиц (SKUs), поэтому датасет подходит для оценки обнаружения объектов в переполненных сценах и создания систем компьютерного зрения для розничной торговли.Нет. В SKU-110K один класс: каждый товар размечен одним ограничивающим прямоугольником класса
object(names: {0: object}). Число «110K» в названии обозначает количество уникальных товарных единиц (SKUs), представленных на изображениях, а не количество классов обнаружения.Датасет SKU-110K содержит 11 743 изображения: 8 219 для обучения, 588 для валидации и 2 936 для тестирования. В нём один класс обнаружения —
object. Подробнее см. в разделе Структура датасета и конфигурацииSKU-110K.yaml.Датасет SKU-110K занимает около 13,6 ГБ и автоматически скачивается при первом запуске обучения с
data="SKU-110K.yaml"— вручную скачивать его не нужно. Другие, более компактные варианты см. в обзоре датасетов для обнаружения объектов.Обучить модель YOLO26 на датасете SKU-110K просто. Вот пример обучения модели YOLO26n в течение 100 эпох с размером изображения 640:
Пример обученияfrom ultralytics import YOLO # Загрузить модель model = YOLO("yolo26n.pt") # загрузить предварительно обученную модель (рекомендуется для обучения) # Обучить модель results = model.train(data="SKU-110K.yaml", epochs=100, imgsz=640)Полный список доступных аргументов см. на странице Обучение модели и в разделе советы по обучению моделей.



