image-classification
差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
| image-classification [2026/01/02 08:51] – bokupi | image-classification [2026/01/02 09:24] (現在) – [データの準備] bokupi | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| - | ====== 画像分類 | + | ====== 画像分類の実験 |
| - | + | ||
| - | ====== はじめに | + | |
| DeepLearningによる画像分類タスクの実験です。 | DeepLearningによる画像分類タスクの実験です。 | ||
| 行 15: | 行 13: | ||
| 毎回データをアップロードするのが手間だったりしますが、実験用途で使う分には、トータルで利便が勝ります。 | 毎回データをアップロードするのが手間だったりしますが、実験用途で使う分には、トータルで利便が勝ります。 | ||
| - | ====== データの準備 | + | 以下にGoogle Colabで使ったipynbノートブックファイルを載せておきます。大した容量ではないですが、拡張子でアップロード制限を受けてしまうので、zip形式にしています。 |
| + | |||
| + | {{ : | ||
| + | |||
| + | ====== 準備 ====== | ||
| + | |||
| + | ===== データの準備 ===== | ||
| ResNet50に入力できる画像のサイズは224×224となります。そのためイラスト全体を使用すると縦横比がおかしくなったり、細かいパーツやタッチに関する情報が潰れてしまう懸念がありました。そこで学習の対象を「顔」のみとするべく、縦横1対1の比率で切り抜きを行ないました。画像サイズは学習時の事前処理でリサイズするので、この段階で揃えません。 | ResNet50に入力できる画像のサイズは224×224となります。そのためイラスト全体を使用すると縦横比がおかしくなったり、細かいパーツやタッチに関する情報が潰れてしまう懸念がありました。そこで学習の対象を「顔」のみとするべく、縦横1対1の比率で切り抜きを行ないました。画像サイズは学習時の事前処理でリサイズするので、この段階で揃えません。 | ||
| 行 27: | 行 31: | ||
| </ | </ | ||
| - | 自分が描いたイラストはサンプルとして提供しても良いのですが、他人が描いたイラストの方は当然提供できないので、保留します。 | + | キャラクター分類のタスクで使ったデータは、自分が描いたイラストのみ使用しているので、サンプルとして提供します。 |
| + | 著者分類は他人が描いたイラストを含み、当然それは提供できません。 | ||
| - | ====== ライブラリインストール ====== | + | {{ :data.zip |}} |
| + | ===== ライブラリの準備 | ||
| 標準では入っていないライブラリを利用するので、インストールしておきます。 | 標準では入っていないライブラリを利用するので、インストールしておきます。 | ||
| 行 37: | 行 43: | ||
| </ | </ | ||
| - | ====== 学習モデルの用意 | + | ====== 学習処理のコーディング ====== |
| + | |||
| + | ===== 学習モデルの用意 ===== | ||
| ここからコーディングとなります。まずは学習モデルを用意します。 | ここからコーディングとなります。まずは学習モデルを用意します。 | ||
| 行 67: | 行 75: | ||
| </ | </ | ||
| - | ====== 学習モデルの構造を確認 | + | ===== 学習モデルの構造を確認 ===== |
| 下記で学習モデルの構造を確認できます。 | 下記で学習モデルの構造を確認できます。 | ||
| 行 79: | 行 87: | ||
| </ | </ | ||
| - | ====== データセットとデータローダの用意 | + | ===== データセットとデータローダの用意 ===== |
| 学習データを扱えるように、データセットとデータローダを用意します。 | 学習データを扱えるように、データセットとデータローダを用意します。 | ||
| 行 119: | 行 127: | ||
| </ | </ | ||
| - | ====== 学習の実施 | + | ===== 学習の実施 ===== |
| 学習を行ないます。 | 学習を行ないます。 | ||
| 行 160: | 行 168: | ||
| </ | </ | ||
| - | 下記のように正解率が収束すれば、学習が上手くいっている可能性が高いです。 | + | 下記のように正解率が収束すれば、学習が上手くいっている可能性が高いです。本当に上手く学習できているかは、後述のgrad-CAMなどを用いて判断します。 |
| < | < | ||
| 行 176: | 行 184: | ||
| ====== 評価 ====== | ====== 評価 ====== | ||
| + | |||
| + | ===== テスト用データローダを流用して評価 ===== | ||
| 学習したモデルを用いて、再度推論を実施し、その判断根拠をGrad-CAMで可視化します。 | 学習したモデルを用いて、再度推論を実施し、その判断根拠をGrad-CAMで可視化します。 | ||
| 行 229: | 行 239: | ||
| </ | </ | ||
| - | ====== 評価 | + | ===== データローダを使わずに画像を直接指定して評価 ===== |
| 続いて、データローダを使わず、直接画像ファイルを使って推論して、grad-CAMによる可視化を行ないます。 | 続いて、データローダを使わず、直接画像ファイルを使って推論して、grad-CAMによる可視化を行ないます。 | ||
| 行 306: | 行 316: | ||
| ====== 考察 ====== | ====== 考察 ====== | ||
| - | 著者分類は全く上手くいきませんでしたが、自分以外の著者のイラストについて、特定の著者に統一しなかったことが学習が安定しなかった原因かもしれません。まあ、元々難しいタスクなので、それだけが原因とは思いません。しかし、自分以外の著者のイラストの範囲が広すぎて、自分に近い画風の人とかけ離れた画風の人があった場合、上手くいかないように思えます。 | + | ===== 著者分類について ===== |
| + | |||
| + | 結論として、著者分類は全く上手くいきませんでした。自分以外の著者のイラストについて、特定の著者に統一しなかったことが学習が安定しなかった原因かもしれません。まあ、元々難しいタスクなので、それだけが原因ではないでしょう。しかし、自分以外の著者のイラストの範囲が広すぎて、自分に近い画風の人とかけ離れた画風の人があった場合、上手くいかないように思えます。 | ||
| + | |||
| + | 下記がgrad-CAMによる判断根拠の可視化です。各階層のフィルタが反応した箇所を示しているヒートマップですが、画像ごとに捉えている特徴が全然一致しておらず、まともな学習が出来ていないことが分かります。たまたま全テストデータに正解を出せる可能性もありますが、未知のデータには対応できないでしょう。 | ||
| + | |||
| + | {{: | ||
| + | |||
| + | ===== キャラクター分類について ===== | ||
| + | |||
| + | 同じキャラクターを描いた枚数が少なく、コメコメを描いた3枚が最高でしたので、2枚を学習用データ、1枚をテスト用データに使いました。キャラクター分類ならそれなりに精度が出るだろうと思ったのですが、全然安定しません。原因として考えられたのは、学習用データが2枚とも笑顔で、テスト用データがふくれっ面であったことです。表情に囚われずに判定できるか見たくて、意図的にそうしたのですが、上手くいかないようですね。学習用データを笑顔1枚、ふくれっ面1枚とし、テスト用データを笑顔1枚としたら、学習が安定しました。 | ||
| + | |||
| + | 下記がgrad-CAMによる判断根拠の可視化です。1段目のフィルタは全体の輪郭を捉えており、2段目のフィルタは目を捉えているように見えます。3段目はコメコメの特徴的な眉毛を捉えているようです。4段目はよく分かりません。後段になるほど特徴量が圧縮されてきて、人間の知覚とは離れていくようです。 | ||
| + | |||
| + | {{: | ||
image-classification.1767343894.txt.gz · 最終更新: by bokupi
