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

262 lines
21 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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` (±1015°) | ⚠️ Умеренно | Лёгкий наклон ОК; помнить, что часть кадров уже повёрнута автором (§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)