21 KiB
title, tags, status, supervisor, date
| title | tags | status | supervisor | date | |||||
|---|---|---|---|---|---|---|---|---|---|
| Набор данных Naruto Sign — описание и статистика |
|
draft | мнс Павленко Б.В. | 2026-06-26 |
Набор данных Naruto Sign — описание и статистика
[!warning] Дисклеймер о точности чисел Карточки датасетов на Kaggle закрыты для анонимного доступа (HTTP 403), а Roboflow-страницы — для серверного фетча. Поэтому точные per-class счётчики и разрешение исходных кадров нужно сверить ПОСЛЕ скачивания скриптом из §7. Все приведённые ниже агрегированные числа (число классов, порядок величин по объёму) подтверждены минимум двумя независимыми источниками; там, где источник даёт лишь приблизительную цифру, это явно помечено «≈».
1. Что это за датасет и задача
Задача — многоклассовая классификация изображений (single-label image classification): на вход подаётся RGB-кадр с руками, выполняющими ручную печать (hand seal / hand sign) из аниме Naruto; модель предсказывает один класс из набора. Это не детекция и не сегментация — для целей HPO-эксперимента с EdgeNeXt используется именно классификационная постановка (ImageFolder → softmax).
Канонический набор печатей в Naruto соответствует 12 знакам китайского/японского зодиака (Jūnishi). Каноничный список с японскими названиями:
| # | EN (class label) | JP (rōmaji) | Зодиак |
|---|---|---|---|
| 1 | Bird | Tori | Птица |
| 2 | Boar | I | Кабан |
| 3 | Dog | Inu | Собака |
| 4 | Dragon | Tatsu | Дракон |
| 5 | Hare | U | Заяц |
| 6 | Horse | Uma | Лошадь |
| 7 | Monkey | Saru | Обезьяна |
| 8 | Ox | Ushi | Бык |
| 9 | Ram | Hitsuji | Овен |
| 10 | Rat | Ne | Крыса |
| 11 | Snake | Mi | Змея |
| 12 | Tiger | Tora | Тигр |
[!note] Фактический список зависит от источника
- Kaggle (vikranthkanumuru) и большинство Roboflow-наборов используют ровно 12 классов выше (GitHub kanlanc, README: «one of the 12 signs»; Roboflow vgu:
dog, bird, horse, tiger, monkey, snake, boar, dragon, hare, ox, ram, rat).- В части реализаций добавляют служебные классы: «Zero» (исходная позиция/ладони сложены) — см. nupuriya, GitHub (13 меток: 12 + «Zero»); либо «Unknown» (нет печати в кадре) — см. renzobenemerito (13 классов = 12 + Unknown).
- Вывод для студента: число классов = 12 (базовый случай) либо 13 (если в скачанном наборе есть
Zero/Unknown). Проверить по числу подпапок ImageFolder скриптом §7.
2. Статистика (по найденным источникам)
Сводка по основным публичным кандидатам:
| Источник | Задача | Классов | Всего изображений | Формат | Лицензия | Ссылка |
|---|---|---|---|---|---|---|
| Kaggle — vikranthkanumuru (рекоменд. для классификации) | Classification | 12 | не указано публично (≈ тысячи кадров после аугментации) | ImageFolder (папка/класс) | см. карточку Kaggle (сверить) | Kaggle |
| renzobenemerito (GitHub Pages) | Classification | 13 (12+Unknown) | ≈ 3 250+ (≈ 250/класс до аугментации) | ImageFolder | не указана | сайт |
| Roboflow — vgu | Object Detection | 12 | 15 891 | COCO/YOLO/… (экспорт) | Roboflow Universe (CC, сверить) | Roboflow |
| Roboflow — yylunxie | Object Detection | 12 | 1 200 | экспорт | сверить | Roboflow |
| Roboflow — Eddy Miner | Object Detection | 12 | 6 142 | экспорт | сверить | Roboflow |
[!important] Рекомендация Для классификационного HPO-эксперимента с EdgeNeXt берём Kaggle (vikranthkanumuru) — он изначально в формате ImageFolder и заточен под классификацию (ResNet18/50, MobileNetV2, FastAI-ноутбуки строятся прямо на нём — Kaggle notebooks). Roboflow-наборы — детекционные (bbox), для классификации потребуется crop по bbox; используйте их как запасной источник или для расширения объёма.
Что известно достоверно
- Число классов: 12 (базовый), подтверждено GitHub kanlanc и Roboflow vgu.
- Происхождение данных: видеозаписи выполнения печатей, кадры извлечены через OpenCV «frame by frame», нечёткие кадры удалены вручную (Medium, Vikranth Kanumuru). Часть кадров — вклад сообщества (студенты VIT) + кадры с YouTube.
- Уже применённая автором аугментация: повороты «left, right, up, down» (Medium). То есть в скачанном наборе часть кадров уже синтетически повёрнута — это важно для §6.
Что НЕ известно публично (заполнить после скачивания)
- Точное число изображений всего и по классам (Kaggle карточка закрыта → 403).
- Разрешение исходных кадров (вероятно неоднородное, т.к. из видео разных источников).
- Готовый train/val/test split — у Kaggle-набора штатного сплита, скорее всего, нет (плоский ImageFolder). Сплит делаем сами (§5).
- Точная лицензия Kaggle-набора — посмотреть в блоке «License» на странице датасета.
3. Особенности и сложности для классификации
| Фактор | Влияние | Митигиция |
|---|---|---|
| Происхождение из видео | Соседние кадры почти идентичны → утечка train↔test, если бить случайно | Сплит по видео/последовательности, не по кадру (§5) |
| Дисбаланс классов | Часть печатей сложнее выполнять/снимать → меньше кадров | Стратифицированный сплит + взвешенный loss / oversampling |
| Схожесть печатей | Ram/Hitsuji ↔ Snake/Mi ↔ Dragon/Tatsu визуально близки (сложенные ладони) | Confusion matrix, label smoothing, достаточное разрешение |
| Вариативность фона/освещения | Кадры из разных видео и от разных контрибьюторов | Color jitter, нормализация; домен-агностичность |
| Ракурс рук, лево/право | Зеркальные конфигурации меняют семантику печати | Осторожно с horizontal flip (§6) |
| Малый объём (≈ сотни–тысячи) | Высокий риск переобучения, особенно для capacity-моделей | Сильная регуляризация, transfer learning (ImageNet-pretrained EdgeNeXt), ранняя остановка |
| Уже повёрнутые автором кадры | Двойная аугментация поворотами раздувает корреляции | Не накручивать большие rotation поверх |
Косвенное подтверждение «лёгкости» при правильном сетапе и «домен-переноса»: модель, обученная на реальных руках, классифицировала аниме-скриншоты (Medium); Roboflow-детектор vgu даёт mAP@50 ≈ 99.5% — но это детекция на крупном (15.9k) наборе, не классификация на малом.
4. Как скачать
4.1. Kaggle — основной источник (ImageFolder, классификация)
# kagglehub (рекомендуется — кэширует и отдаёт локальный путь)
pip install kagglehub
import kagglehub
# вернёт путь к распакованному набору
path = kagglehub.dataset_download("vikranthkanumuru/naruto-hand-sign-dataset")
print("Dataset path:", path) # внутри — папки-классы (ImageFolder)
# Альтернатива: официальный Kaggle API (нужен ~/.kaggle/kaggle.json)
pip install kaggle
kaggle datasets download -d vikranthkanumuru/naruto-hand-sign-dataset -p ./data --unzip
4.2. Roboflow — запасной/детекционный источник
# pip install roboflow
from roboflow import Roboflow
rf = Roboflow(api_key="YOUR_KEY")
# workspace/project/version берутся из URL датасета на Universe
project = rf.workspace("vgu-aeaes").project("naruto-hand-sign")
dataset = project.version(1).download("folder") # 'folder' ≈ классификационный экспорт
Для классификации из детекционного набора: либо экспорт
folder/multiclass, либо crop изображений по bbox в отдельные папки-классы.
4.3. HuggingFace — на момент проверки (июнь 2026) канонического narutosign датасета в HF Hub не найдено
# Если появится зеркало — типовой паттерн:
from datasets import load_dataset
ds = load_dataset("imagefolder", data_dir="./data") # локальный ImageFolder
Warning
Точные числа (объём, per-class, разрешение, лицензия) обязательно сверить после скачивания скриптом §7. Наиболее вероятные кандидаты-источники: ① Kaggle vikranthkanumuru (классификация, приоритет), ② Roboflow vgu (детекция, объём 15.9k).
5. Рекомендованный протокол подготовки данных
- Фиксированный seed для воспроизводимости:
import random, numpy as np, torch SEED = 42 random.seed(SEED); np.random.seed(SEED) torch.manual_seed(SEED); torch.cuda.manual_seed_all(SEED) - Стратифицированный split (сохраняет долю классов): 70/15/15 или 80/10/10.
- Без утечки (no leakage): кадры из одного видео/последовательности не должны попадать одновременно в train и test. Если в именах файлов есть идентификатор видео/серии — группировать по нему (
GroupShuffleSplit/StratifiedGroupKFold), а не по отдельным кадрам. Если идентификатора нет — дедупликация near-duplicate (perceptual hash) и/или предупреждение в отчёте, что оценка может быть оптимистичной. - Стандартизация размера под EdgeNeXt: EdgeNeXt штатно работает на 256×256 (или 224×224 для меньших вариантов). Train:
RandomResizedCrop(256); Val/Test:Resize(256) → CenterCrop(256). Нормализация — статистика ImageNet (mean=[0.485,0.456,0.406],std=[0.229,0.224,0.225]), т.к. EdgeNeXt берётся ImageNet-pretrained.
# Стратифицированный групповой split без утечки по видео
from sklearn.model_selection import StratifiedGroupKFold
# paths, labels, groups (group = id видео/последовательности из имени файла)
sgkf = StratifiedGroupKFold(n_splits=5, shuffle=True, random_state=SEED)
train_idx, test_idx = next(sgkf.split(paths, labels, groups))
6. Аугментации для ручных знаков
[!danger] Horizontal flip — НЕ применять (по умолчанию) Печати — это конкретная конфигурация левой/правой руки (какая рука сверху, направление пальцев). Зеркалирование меняет семантику жеста и может перевести один знак в визуально-другую/невалидную конфигурацию. Для hand-seal классификации
RandomHorizontalFlipсоздаёт label noise → отключить. Вертикальный flip тем более не физичен.
| Аугментация | Применять? | Комментарий |
|---|---|---|
RandomHorizontalFlip |
❌ Нет | Меняет лево/право руки → искажает класс |
RandomVerticalFlip |
❌ Нет | Нефизично для рук |
RandomRotation (±10–15°) |
⚠️ Умеренно | Лёгкий наклон ОК; помнить, что часть кадров уже повёрнута автором (§2) — не накручивать большие углы |
ColorJitter (brightness/contrast/saturation) |
✅ Да | Робастность к освещению/камере; hue — слабо |
RandomResizedCrop |
✅ Да | Масштаб/положение рук варьируется; scale=(0.7,1.0) |
RandAugment |
✅ Да (без flip-операций) | Сильная регуляризация на малом наборе; исключить горизонтальные отражения из набора политик при возможности |
mixup |
⚠️ Осторожно | Помогает против оверфита, но смешивает руки → менее интерпретируемо; полезен как HPO-гиперпараметр |
cutmix |
⚠️ Осторожно | Может «отрезать» дискриминативную руку → шум; пробовать с малой вероятностью |
RandomErasing |
✅ Да | Дешёвая регуляризация, обычно безопасна |
import torchvision.transforms as T
IMAGENET_MEAN, IMAGENET_STD = [0.485,0.456,0.406], [0.229,0.224,0.225]
train_tf = T.Compose([
T.RandomResizedCrop(256, scale=(0.7, 1.0)),
T.RandomRotation(12), # лёгкий наклон, без flip
T.ColorJitter(0.2, 0.2, 0.2, 0.02),
T.RandAugment(num_ops=2, magnitude=7), # без горизонтального отражения
T.ToTensor(),
T.Normalize(IMAGENET_MEAN, IMAGENET_STD),
T.RandomErasing(p=0.25),
])
eval_tf = T.Compose([
T.Resize(256), T.CenterCrop(256),
T.ToTensor(), T.Normalize(IMAGENET_MEAN, IMAGENET_STD),
])
# ВАЖНО: НЕ добавлять T.RandomHorizontalFlip() — меняет семантику печати.
7. Скрипт подсчёта статистики (запустить после скачивания)
Поля, которые студент обязан заполнить в отчёте по факту загрузки: число классов, всего изображений, изображений на класс (+мин/макс/коэф. дисбаланса), распределение разрешений, формат, наличие/отсутствие штатного сплита, лицензия.
"""Подсчёт статистики ImageFolder-набора Naruto Sign."""
from pathlib import Path
from collections import Counter
from PIL import Image
DATA_DIR = Path("./data") # корень с подпапками-классами
EXTS = {".jpg", ".jpeg", ".png", ".bmp", ".webp"}
per_class = Counter()
resolutions = Counter()
for cls_dir in sorted(p for p in DATA_DIR.iterdir() if p.is_dir()):
imgs = [f for f in cls_dir.rglob("*") if f.suffix.lower() in EXTS]
per_class[cls_dir.name] = len(imgs)
for f in imgs:
try:
with Image.open(f) as im:
resolutions[im.size] += 1 # (W, H)
except Exception as e:
print(f"[BAD] {f}: {e}")
total = sum(per_class.values())
n_cls = len(per_class)
print(f"Классов: {n_cls} | Всего изображений: {total}")
for c, n in per_class.most_common():
print(f" {c:12s}: {n:5d} ({100*n/total:.1f}%)")
if per_class:
mx, mn = max(per_class.values()), min(per_class.values())
print(f"Дисбаланс max/min = {mx/mn:.2f} (max={mx}, min={mn})")
print("ТОП-5 разрешений (W x H):")
for (w, h), n in resolutions.most_common(5):
print(f" {w}x{h}: {n}")
[!note] Чек-лист отчёта студента
- Источник и версия датасета (URL + дата скачивания)
- Число классов (12 или 13?) и точные метки папок
- Всего изображений + таблица per-class + коэф. дисбаланса
- Распределение разрешений (однородно?)
- Лицензия (скопировать формулировку с карточки)
- Есть ли group-id (видео) для no-leak split? Если нет — отметить риск
- Зафиксированный seed и доли train/val/test
Источники
- Kaggle — Naruto Hand Sign Dataset (vikranthkanumuru)
- GitHub — kanlanc/naruto-hand-sign-detection (ResNet18/50, 12 classes)
- Medium — Vikranth Kanumuru: How to Make a Naruto Hand Signs Classifier (создание датасета, аугментации)
- renzobenemerito — Naruto Hand Seals Classification (13 классов: 12 + Unknown, ≈250/класс)
- GitHub — nupuriya/Naruto-Hand-Sign-Detection (12 + «Zero»)
- Roboflow Universe — vgu/naruto-hand-sign (15 891 img, 12 classes, mAP@50 ≈ 99.5%, detection)
- Roboflow Universe — yylunxie/naruto-hand-sign (1 200 img, detection)
- Roboflow Universe — Eddy Miner/naruto (6 142 img, detection)
- Kaggle notebook — Naruto Hand Sign Detection from scratch