SKU-110K 데이터셋#
SKU-110K 데이터셋은 11,743개의 고밀도 소매점 선반 이미지로 구성된 단일 클래스 객체 탐지 데이터셋이며, 학습 이미지 8,219개, 검증 이미지 588개, 테스트 이미지 2,936개로 분할되어 있습니다. 모든 제품에는 단일 클래스 object 아래 하나의 바운딩 박스가 어노테이션되어 있습니다. 이 이름은 110,000개의 탐지 클래스가 아니라 장면 전체에 등장하는 110,000개 이상의 고유 재고 관리 단위(SKUs)를 의미합니다. Eran Goldman 외 연구진이 CVPR 2019 논문 Precise Detection in Densely Packed Scenes를 위해 제작했으며, 170만 개가 넘는 제품이 어노테이션되어 있습니다. 이미지당 평균 약 147개의 제품이 포함되어 있어, 혼잡한 소매 환경의 컴퓨터 비전 모델을 평가하는 까다로운 벤치마크입니다.
Watch: How to Train Ultralytics YOLO26 to Detect Every Product on a Retail Shelf | SKU-110K 🛒

주요 기능#
- 단일 클래스 탐지: 모든 제품은 단일 클래스
object(names: {0: object}) 아래 하나의 바운딩 박스로 라벨링되어 있으며, SKU별 카테고리 라벨은 포함되지 않습니다. - 극도로 높은 객체 밀도: 전 세계 매장 선반 이미지에는 이미지당 평균 약 147개의 제품이 빽빽하게 배치되어 있으며, 서로 유사하거나 심지어 동일해 보이는 객체가 가까운 거리에 배치된 경우가 많습니다.
- 대규모 데이터셋: 11,743개 이미지에 걸쳐 110,000개 이상의 고유 SKU와 170만 개가 넘는 어노테이션된 바운딩 박스가 최첨단 객체 탐지기를 시험합니다.
데이터셋 구조#
SKU-110K 데이터셋은 세 개의 하위 집합으로 나뉘며, 모두 단일 object 클래스를 공유합니다.
| 분할 | 이미지 | 설명 |
|---|---|---|
| 학습 | 8,219 | 모델 학습을 위한 이미지 및 어노테이션 |
| 검증 | 588 | 학습 중 평가를 위해 따로 보관된 이미지 |
| 테스트 | 2,936 | 학습된 모델의 최종 평가를 위한 이미지 |
응용 분야#
SKU-110K 데이터셋은 객체 탐지 작업, 특히 소매점 선반 진열처럼 고밀도로 채워진 장면에서 딥러닝 모델을 학습하고 평가하는 데 널리 사용됩니다. 주요 활용 분야는 다음과 같습니다.
- 소매 재고 관리 및 자동화
- 이커머스 플랫폼의 제품 인식
- 플라노그램 준수 여부 검증
- 매장 셀프 계산대 시스템
- 창고의 로봇 피킹 및 분류
자체 선반 이미지를 어노테이션하고, 학습하며, 브라우저에서 소매 탐지 데이터셋을 관리하려면 Ultralytics Platform으로 전체 워크플로를 실행합니다.
데이터셋 YAML#
SKU-110K.yaml 파일은 데이터셋 구성, 즉 데이터셋 경로, 클래스 이름 및 기타 메타데이터를 정의합니다. 이 파일은 https://github.com/ultralytics/ultralytics/blob/main/ultralytics/cfg/datasets/SKU-110K.yaml의 Ultralytics 리포지토리에서 관리됩니다.
# 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.6GB의 여유 디스크 공간이 필요합니다. 다운로드 스크립트는 원본 어노테이션도 가져와 YOLO 형식으로 변환하며, 이 과정에는 몇 분이 걸릴 수 있습니다.
이미지 크기 640으로 SKU-110K 데이터셋에서 YOLO26n 모델을 100 에포크 동안 학습하려면 다음 코드 스니펫을 사용할 수 있습니다. 사용 가능한 인자 전체 목록은 모델 학습 페이지를 참조하세요.
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n.pt") # load a pretrained model (recommended for training)
# Train the model
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 데이터셋을 제작하고 유지 관리한 Eran Goldman 외 연구진에게 감사의 뜻을 전합니다. SKU-110K 데이터셋과 제작자에 대한 자세한 내용은 SKU-110K 데이터셋 GitHub 리포지토리를 참조하세요.
FAQ#
SKU-110K 데이터셋은 Eran Goldman 외 연구진이 CVPR 2019 논문을 위해 제작한 11,743개의 고밀도 소매점 선반 이미지로 구성된 단일 클래스 객체 탐지 데이터셋입니다. 모든 제품에는
object바운딩 박스 하나가 라벨링되어 있으며, 이미지에는 110,000개가 넘는 고유 재고 관리 단위(SKUs)가 포함되어 있어 혼잡한 장면의 객체를 탐지하고 소매 컴퓨터 비전 시스템을 구축하기 위한 강력한 벤치마크입니다.아니요. SKU-110K는 단일 클래스 데이터셋으로, 모든 제품은
object(names: {0: object}) 클래스 아래 하나의 바운딩 박스로 어노테이션됩니다. 이름의 "110K"는 탐지 클래스 수가 아니라 이미지 전체에 등장하는 고유 재고 관리 단위(SKU)의 수를 의미합니다.SKU-110K 데이터셋에는 11,743개의 이미지(학습 8,219개, 검증 588개, 테스트 2,936개)와 단일 탐지 클래스
object이 포함되어 있습니다. 자세한 내용은 데이터셋 구조 섹션과SKU-110K.yaml구성 파일을 참조하세요.SKU-110K는 약 13.6GB이며,
data="SKU-110K.yaml"으로 처음 학습을 실행할 때 자동으로 다운로드되므로 수동 다운로드가 필요하지 않습니다. 더 작은 옵션을 살펴보려면 탐지 데이터셋 개요를 참조하세요.SKU-110K 데이터셋에서 YOLO26 모델을 학습하는 과정은 간단합니다. 다음은 이미지 크기 640으로 YOLO26n 모델을 100 에포크 동안 학습하는 예시입니다.
학습 예제from ultralytics import YOLO # Load a model model = YOLO("yolo26n.pt") # load a pretrained model (recommended for training) # Train the model results = model.train(data="SKU-110K.yaml", epochs=100, imgsz=640)



