Files
PracticeClassif/_research/SECTION_naruto_dataset.md
2026-06-30 15:17:40 +03:00

21 KiB
Raw Blame History

title, tags, status, supervisor, date
title tags status supervisor date
Набор данных Naruto Sign — описание и статистика
dataset
classification
naruto-hand-sign
edgenext
hpo
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. Рекомендованный протокол подготовки данных

  1. Фиксированный 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)
    
  2. Стратифицированный split (сохраняет долю классов): 70/15/15 или 80/10/10.
  3. Без утечки (no leakage): кадры из одного видео/последовательности не должны попадать одновременно в train и test. Если в именах файлов есть идентификатор видео/серии — группировать по нему (GroupShuffleSplit / StratifiedGroupKFold), а не по отдельным кадрам. Если идентификатора нет — дедупликация near-duplicate (perceptual hash) и/или предупреждение в отчёте, что оценка может быть оптимистичной.
  4. Стандартизация размера под 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 (±1015°) ⚠️ Умеренно Лёгкий наклон ОК; помнить, что часть кадров уже повёрнута автором (§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

Источники