init commit

This commit is contained in:
2026-06-30 15:17:40 +03:00
commit e622129c30
8 changed files with 2588 additions and 0 deletions

View File

@@ -0,0 +1,261 @@
---
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)