--- title: Набор данных Naruto Sign — описание и статистика tags: [dataset, classification, naruto-hand-sign, edgenext, hpo] status: draft supervisor: мнс Павленко Б.В. date: 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](https://github.com/kanlanc/naruto-hand-sign-detection): «one of the 12 signs»; [Roboflow vgu](https://universe.roboflow.com/vgu-aeaes/naruto-hand-sign): `dog, bird, horse, tiger, monkey, snake, boar, dragon, hare, ox, ram, rat`). > - В части реализаций добавляют **служебные классы**: «Zero» (исходная позиция/ладони сложены) — см. [nupuriya, GitHub](https://github.com/nupuriya/Naruto-Hand-Sign-Detection) (13 меток: 12 + «Zero»); либо «Unknown» (нет печати в кадре) — см. [renzobenemerito](https://renzobenemerito.github.io/Naruto-Hand-Seals-Classification/) (**13 классов** = 12 + Unknown). > - **Вывод для студента:** число классов = 12 (базовый случай) либо 13 (если в скачанном наборе есть `Zero`/`Unknown`). Проверить по числу подпапок ImageFolder скриптом §7. --- ## 2. Статистика (по найденным источникам) Сводка по основным публичным кандидатам: | Источник | Задача | Классов | Всего изображений | Формат | Лицензия | Ссылка | |----------|--------|---------|-------------------|--------|----------|--------| | **Kaggle — vikranthkanumuru** (рекоменд. для классификации) | Classification | 12 | не указано публично (≈ тысячи кадров после аугментации) | ImageFolder (папка/класс) | см. карточку Kaggle (сверить) | [Kaggle](https://www.kaggle.com/datasets/vikranthkanumuru/naruto-hand-sign-dataset) | | renzobenemerito (GitHub Pages) | Classification | 13 (12+Unknown) | ≈ 3 250+ (≈ 250/класс до аугментации) | ImageFolder | не указана | [сайт](https://renzobenemerito.github.io/Naruto-Hand-Seals-Classification/) | | Roboflow — **vgu** | Object Detection | 12 | 15 891 | COCO/YOLO/… (экспорт) | Roboflow Universe (CC, сверить) | [Roboflow](https://universe.roboflow.com/vgu-aeaes/naruto-hand-sign) | | Roboflow — yylunxie | Object Detection | 12 | 1 200 | экспорт | сверить | [Roboflow](https://universe.roboflow.com/yylunxie/naruto-hand-sign-p8toe) | | Roboflow — Eddy Miner | Object Detection | 12 | 6 142 | экспорт | сверить | [Roboflow](https://universe.roboflow.com/eddy-miner-mwie9/naruto-t7o4a) | > [!important] Рекомендация > Для классификационного HPO-эксперимента с **EdgeNeXt** берём **Kaggle (vikranthkanumuru)** — он изначально в формате ImageFolder и заточен под классификацию (ResNet18/50, MobileNetV2, FastAI-ноутбуки строятся прямо на нём — [Kaggle notebooks](https://www.kaggle.com/code/vikranthkanumuru/naruto-hand-sign-detection-from-scratch/data)). Roboflow-наборы — детекционные (bbox), для классификации потребуется crop по bbox; используйте их как **запасной источник** или для расширения объёма. ### Что известно достоверно - **Число классов:** 12 (базовый), подтверждено [GitHub kanlanc](https://github.com/kanlanc/naruto-hand-sign-detection) и [Roboflow vgu](https://universe.roboflow.com/vgu-aeaes/naruto-hand-sign). - **Происхождение данных:** видеозаписи выполнения печатей, кадры извлечены через **OpenCV** «frame by frame», нечёткие кадры удалены вручную ([Medium, Vikranth Kanumuru](https://medium.com/kanlanc/how-to-make-a-naruto-hand-signs-classifier-using-deep-learning-eb91367cb131)). Часть кадров — вклад сообщества (студенты 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](https://medium.com/kanlanc/how-to-make-a-naruto-hand-signs-classifier-using-deep-learning-eb91367cb131)); Roboflow-детектор vgu даёт mAP@50 ≈ 99.5% — но это детекция на крупном (15.9k) наборе, не классификация на малом. --- ## 4. Как скачать ### 4.1. Kaggle — основной источник (ImageFolder, классификация) ```bash # kagglehub (рекомендуется — кэширует и отдаёт локальный путь) pip install kagglehub ``` ```python import kagglehub # вернёт путь к распакованному набору path = kagglehub.dataset_download("vikranthkanumuru/naruto-hand-sign-dataset") print("Dataset path:", path) # внутри — папки-классы (ImageFolder) ``` ```bash # Альтернатива: официальный Kaggle API (нужен ~/.kaggle/kaggle.json) pip install kaggle kaggle datasets download -d vikranthkanumuru/naruto-hand-sign-dataset -p ./data --unzip ``` ### 4.2. Roboflow — запасной/детекционный источник ```python # 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 не найдено ```python # Если появится зеркало — типовой паттерн: from datasets import load_dataset ds = load_dataset("imagefolder", data_dir="./data") # локальный ImageFolder ``` > [!warning] > Точные числа (объём, per-class, разрешение, лицензия) **обязательно сверить после скачивания** скриптом §7. Наиболее вероятные кандидаты-источники: ① [Kaggle vikranthkanumuru](https://www.kaggle.com/datasets/vikranthkanumuru/naruto-hand-sign-dataset) (классификация, приоритет), ② [Roboflow vgu](https://universe.roboflow.com/vgu-aeaes/naruto-hand-sign) (детекция, объём 15.9k). --- ## 5. Рекомендованный протокол подготовки данных 1. **Фиксированный seed** для воспроизводимости: ```python 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. ```python # Стратифицированный групповой 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` | ✅ Да | Дешёвая регуляризация, обычно безопасна | ```python 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. Скрипт подсчёта статистики (запустить после скачивания) Поля, которые студент **обязан заполнить** в отчёте по факту загрузки: число классов, всего изображений, изображений на класс (+мин/макс/коэф. дисбаланса), распределение разрешений, формат, наличие/отсутствие штатного сплита, лицензия. ```python """Подсчёт статистики 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)](https://www.kaggle.com/datasets/vikranthkanumuru/naruto-hand-sign-dataset) - [GitHub — kanlanc/naruto-hand-sign-detection (ResNet18/50, 12 classes)](https://github.com/kanlanc/naruto-hand-sign-detection) - [Medium — Vikranth Kanumuru: How to Make a Naruto Hand Signs Classifier (создание датасета, аугментации)](https://medium.com/kanlanc/how-to-make-a-naruto-hand-signs-classifier-using-deep-learning-eb91367cb131) - [renzobenemerito — Naruto Hand Seals Classification (13 классов: 12 + Unknown, ≈250/класс)](https://renzobenemerito.github.io/Naruto-Hand-Seals-Classification/) - [GitHub — nupuriya/Naruto-Hand-Sign-Detection (12 + «Zero»)](https://github.com/nupuriya/Naruto-Hand-Sign-Detection) - [Roboflow Universe — vgu/naruto-hand-sign (15 891 img, 12 classes, mAP@50 ≈ 99.5%, detection)](https://universe.roboflow.com/vgu-aeaes/naruto-hand-sign) - [Roboflow Universe — yylunxie/naruto-hand-sign (1 200 img, detection)](https://universe.roboflow.com/yylunxie/naruto-hand-sign-p8toe) - [Roboflow Universe — Eddy Miner/naruto (6 142 img, detection)](https://universe.roboflow.com/eddy-miner-mwie9/naruto-t7o4a) - [Kaggle notebook — Naruto Hand Sign Detection from scratch](https://www.kaggle.com/code/vikranthkanumuru/naruto-hand-sign-detection-from-scratch/data)