[Japanese/English]
物体検出を用いてNARUTOの印を検出するモデルとサンプルプログラムです。
右図:© NARUTO -ナルト- 9話『写輪眼のカカシ』岸本斉史作/集英社/studioぴえろ
※日本の著作権法 第二十条「同一性保持権」1における「改変」に相当する可能性があるため、
右図にはバウンディングボックスのオーバーレイ表示は行っておりません。
Deep写輪眼:オブジェクト検出 EfficientDet を用いた NARUTO の印認識
このリポジトリは、NARUTO2 の印を認識するための訓練済みモデルとサンプルプログラムを公開しています。
忍術の発動は、一部の忍術をのぞき手で印を結ぶことが必要です。
また、性質変化は印に特徴が現れるため(火遁→寅の印、土遁→亥の印など)、
印を素早く認識することが出来れば、忍同士の戦闘においてアドバンテージを得ることが出来ます。
印の認識にはディープラーニングの物体検出モデルの一つEfficientDet-D0を使用することで、
過去に試験的に作成していたDeep写輪眼(MobileNetV2 SSD 300x300利用)よりも精度を大幅にアップしました。
(Tensorflow2 Object Detection API3を使用)
- Tensorflow 2.3.0 or Later
- OpenCV 3.4.2 or Later
- Pillow 6.1.0 or Later (Ninjutsu_demo.pyを動かす場合のみ)
データセットは非公開です(訓練済みのモデルは公開します)
※日本の著作権法 第四十七条の七「複製権の制限により作成された複製物の譲渡」4に準拠
また、自分で撮影した画像、アニメ画像の他に、naruto-hand-sign-dataset5を利用しています。
データセットはネット上で収集した画像と、自前で撮影した画像で構成されているため、
背景色や服装によっては検出精度が落ちたり、誤検出する可能性があります。
Issueで誤検出した条件を教えていただると助かります。
可能であれば、誤検出する条件の画像(子~亥、壬、合掌)をいただけると大変助かります。
その際、いただいた画像は学習データセットに追加してモデルの再訓練に使用します。
14種類(子~亥、壬、合掌)の印に対応しています。
子(Ne/Rat) | 丑(Ushi/Ox) | 寅(Tora/Tiger) | 卯(U/Hare) |
辰(Tatsu/Dragon) | 巳(Mi/Snake) | 午(Uma/Horse) | 未(Hitsuji/Ram) |
申(Saru/Monkey) | 酉(Tori/Bird) | 戌(Inu/Dog) | 亥(I/Boar) |
壬(Mizunoe) | 合掌(Gassho/Hnad Claps) | - | - |
総枚数:6377枚(内アニメ画像:2651枚)
タグ付き枚数:4903枚
タグ無し枚数:1474枚
アノテーションボックス数:6037個
訓練済みモデルをmodelディレクトリ配下で公開しています。
- EfficientDet D0
- MobileNetV2 SSD FPNLite 640x640
- MobileNetV2 SSD FPNLite 640x640(TensorFlow Liteモデル:Float16量子化)
- MobileNetV2 SSD 300x300
│ simple_demo.py │ simple_tflite_demo.py │ Ninjutsu_demo.py │ ├─model │ ├─EfficientDetD0─saved_model │ ├─MobileNetV2_SSD_300x300─saved_model │ └─MobileNetV2_SSD_FPNLite_640x640─┬─saved_model │ └─tflite ├─setting─┬─labels.csv │ └─jutsu.csv │ └─utils
忍術判定のデモです。
印の履歴から術データ(jutsu.csv)にマッチする術名を表示します。
訓練済みモデルを格納しています。
ラベルデータ(labels.csv)と術名データ(jutsu.csv)を格納しています。
- labels.csv
印のラベル名を保持しています。
- A列:英語の印
- B列:日本語の印
- jutsu.csv
術名と必要印を保持しています。
- A列:日本語の術種別(火遁等)
- B列:英語の術種別(火遁等)
- C列:日本語の術名
- D列:英語の術名
- E列以降:術の発動に必要な印
FPS計測用モジュール(cvfpscalc.py)と文字列描画用モジュール(cvdrawtext.py)を格納しています。
Ninjutsu_demo.pyのみで使用します。
デモの実行方法は以下です。
python simple_demo.py
python simple_tflite_demo.py
python Ninjutsu_demo.py
また、デモ実行時には、以下のオプションが指定可能です。
オプション指定
- --device
カメラデバイス番号の指定
デフォルト:- simple_demo.py:0
- simple_tflite_demo.py:0
- Ninjutsu_demo.py:0
- --file
動画ファイル名の指定 ※指定時はカメラデバイスより優先し動画を読み込む
デフォルト:- simple_demo.py:None
- simple_tflite_demo.py:None
- Ninjutsu_demo.py:None
- --fps
処理FPS ※推論時間がFPSを下回る場合のみ有効
デフォルト:- simple_demo.py:10
- simple_tflite_demo.py:10
- Ninjutsu_demo.py:10
- --width
カメラキャプチャ時の横幅
デフォルト:- simple_demo.py:960
- simple_tflite_demo.py:960
- Ninjutsu_demo.py:960
- --height
カメラキャプチャ時の縦幅
デフォルト:- simple_demo.py:540
- simple_tflite_demo.py:540
- Ninjutsu_demo.py:540
- --model
モデル読み込みパス
デフォルト:- simple_demo.py:'model/EfficientDetD0/saved_model'
- simple_tflite_demo.py:'model/MobileNetV2_SSD_FPNLite_640x640/tflite/model.tflite'
- Ninjutsu_demo.py:'model/EfficientDetD0/saved_model'
- --score_th
物体検出閾値
デフォルト:- simple_demo.py:0.75
- simple_tflite_demo.py:0.3
- Ninjutsu_demo.py:0.75
- --skip_frame
カメラ or 動画読み込み時に何枚おきに処理を実行するか
デフォルト:- simple_demo.py:0
- simple_tflite_demo.py:0
- Ninjutsu_demo.py:0
- --input_shape
モデルへインプットする画像の一辺の長さ
- simple_tflite_demo.py:640
- --sign_interval
前回の印検出時から指定時間(秒)経過すると印の履歴をクリア
デフォルト:- Ninjutsu_demo.py:2.0
- --jutsu_display_time
術成立時に術名を表示する時間(秒)
デフォルト:- Ninjutsu_demo.py:5
- --use_display_score
印検出スコアを表示するか否か
デフォルト:- Ninjutsu_demo.py:False
- --erase_bbox
バウンディングボックスのオーバーレイ表示を消去するか否か
デフォルト:- Ninjutsu_demo.py:False
- --use_jutsu_lang_en
術名表示に英語表記を使用するか否か
デフォルト:- Ninjutsu_demo.py:False
- --chattering_check
印を何回連続で検出したら印の成立とみなすか(印の検出チラつき対策)
デフォルト:- Ninjutsu_demo.py:1
- --use_fullscreen
フルスクリーン表示を利用するか否か(試験的機能)
デフォルト:- Ninjutsu_demo.py:False
また、からあげさんのブログにて、より詳細な環境構築/実行方法を記載いただきました。
こちらも参考にしてもらえばと思います。
アプリケーションの応用事例を紹介します。
モデルトレーニング時は、からあげさんの説明記事6を参考にいたしました。
また、からあげさんのブログ7にて、Deep写輪眼をご紹介いただきました。
大変ありがとうございます。
- ^日本:著作権法 第二十条「同一性保持権」
- ^岸本斉史作『NARUTO』集英社、1999年-2014年
- ^Tensorflow Object Detection API
- ^日本:著作権法 四十七条の七「複製権の制限により作成された複製物の譲渡」
- ^Kaggle 公開データセット:naruto-hand-sign-dataset
- ^「Object Detection API」で物体検出の自前データを学習する方法(TensorFlow 2.x版)
- ^からあげさんのブログ:AIでNARUTO気分!「Deep写輪眼」で遊んでみよう
高橋かずひと(https://twitter.com/KzhtTkhs)
NARUTO-HandSignDetection is under MIT license.