画像分類データセット作成時のノウハウと注意点 〜ラーメン二郎データセットの事例を交えて〜 #yjfukuoka

5.7K Views

June 20, 19

スライド概要

画像分類データセット作成における、データ収集からクリーニング等のノウハウをラーメン二郎データセット作成時の事例を交えてお話します。(ヤフー福岡 Tech Meetup #4 発表資料) #yjfukuoka

profile-image

2023年10月からSpeaker Deckに移行しました。最新情報はこちらをご覧ください。 https://speakerdeck.com/lycorptech_jp

シェア

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

画像分類データセット作成時のノウハウと注意点 ~ラーメン二郎データセットの事例を交えて~ ヤフー福岡 Tech Meetup #4 2019年6月21日 土井賢治 1

2.

自己紹介 名前:土井 賢治 (@knjcode) 2018/4 ヤフー株式会社へ転職 (関東から福岡へ移住) 機械学習を活用してヤフオク!のサービスを改善 ・偽物出品検知AI ・出品時のタイトル推薦 2.1

3.

偽物出品検知AI 出典: https://about.yahoo.co.jp/pr/release/2018/11/30a/ 2.2

4.

出品時のタイトル推薦 アップロードした画像から商品名を自動で推薦 写真: https://en.wikipedia.org/wiki/Google_Home 2.3

5.

本日の内容 ディープラーニングによる画像分類の事例 モデルの学習フロー データセット作成からモデルの利用までの流れ データ前処理とその必要性 データセット自作時のポイント データのクリーニング有無による精度の違い まとめ 3

6.

ディープラーニングによる画像分類の事例 ラーメン二郎 全店舗識別 bot @jirou_deep に画像をリプライすると店舗名を答えます 4

7.

本題の前に、モデルの学習の流れを紹介します (データセットはすでにあるとして) 5.1

8.

データセットの分割 まず、データセットを学習用、評価用、テスト用に分割する (例えば、train/validation/test 8:1:1 の割合) 出典: https://tarangshah.com/blog/2017-12-03/train-validation-and-test-sets/ ※: 上記は一例で、他にも cross validation法等、様々な手法があります 5.2

9.

モデルを学習する 学習用データのみを使う データ全体を学習するステップ(epochと呼ぶ)を複数回繰り返す (例えば、下図では30epoch学習) 5.3

10.

モデルの選択 評価用データでの識別精度が最も高くなるepochのモデルを選ぶ 赤線: 学習用データでの識別精度(Accuracy) 青線: 評価用データでの識別精度(Accuracy) 上図の例では、30epoch学習した結果、 評価データでの精度が最も良い15epochを選ぶ 5.4

11.

さらに テスト用データを使って選択したモデルの識別精度を確認 5.5

12.

なぜ評価・テスト用データが必要か モデルは学習に利用したデータは高精度で予測できる 入力画像と正解ラベルを何度も学習している 汎化能力の高いモデルを作りたい 汎化能力=未知のデータに対する識別能力 汎化の度合いを測るために、学習用以外にもデータを残しておく すべてのデータを学習に使った場合、学習のどの時点(epoch)の モデルの精度が良いのか確認できない 5.6

13.

学習用とテスト用の2分割ではダメ? 学習時の設定(ハイパーパラメータと呼ぶ)を変えながらモデルの 学習を複数回繰り返すことが多い テスト用データだけでは、テスト用データに対して識別性能が高く なる設定を選ぶ可能性がある(テストデータに過剰適合してしまう) 評価用とテスト用の2つのデータを用意しておき、評価用データで 性能が高くなるモデルを選び、テストデータで最終的なモデルの 識別精度を評価することで、過剰適合を緩和できる 5.7

14.

ポイント モデルの性能を評価するためには データセットの一部を学習に使わず 残しておく必要がある 5.8

15.

データセット作成からモデルの利用までの流れ データセット作成 データ前処理 学習 (モデルの作成) モデルの評価 (識別精度等) モデルのデプロイ 本日は「データ前処理」を中心に解説します 6

16.

データセット作成 オープンなデータセットを使う cifar10 / cifar100 クラス数 : 10または100 学習用データ5万枚、評価用データ1万枚 ImageNet クラス数 : 1000 学習用データ約120万枚、評価用データ5万枚 からダウンロードして利用できる Web データセットを自作する 手動で画像を収集 写真撮影して収集 から収集等 Web データセットを自作する場合には、 画像とラベル(何の画像か)をセットで収集します 7

17.

データ前処理 データセットのクリーニング 不要な画像はないか 例えば、ラーメンが全く写っていない等 分類ミス(ラベルの誤り)はないか 三田本店の画像に新宿歌舞伎町店のラベルが付いている等 重複した画像はないか 同一の画像が複数の正解ラベルに重複して含まれていないか 8.1

18.

データ前処理の必要性 分類ミス(正解ラベルの誤り)があると モデルをうまく学習できない ディープラーニングは大量のデータから、 うまく画像を分類できる特徴を学習しようとするが 間違った正解ラベルがあると学習に悪影響を及ぼす 重複した画像があると データを学習用/評価用/テスト用に分割する際に それぞれのデータセットに重複した画像が含まれてしまう 学習に使った画像で画像の識別精度を評価/テスト することになり、精度を不当に高く見積もってしまう → 学習後に良いモデルが選べない 8.2

19.

データセット自作時のポイント 1. 2. 3. 4. 画像収集時にメタデータも収集する 同一ファイルを除去 類似(重複)画像を除去 最終的に目視で不要なファイルを除去 9.1

20.

1. 画像収集時にメタデータも収集する コメントやラベル 例えば、twitterやインスタグラムでは画像に コメントやタグがついているので、あわせて収集 情報 EXIF 画像にEXIF情報が含まれる場合もある 例えば、撮影位置情報から店舗が推測できる等 9.2

21.

2. 同一ファイルを除去 バイナリレベルで同一のファイルを除去 fdupes/jdupes というツールが便利 バイナリレベルで一致するファイルを高速に検索し 条件を指定して一括削除も可能 特にjdupesはfdupesのforkで本家より処理が高速 ただし、EXIF等のメタデータが異なるとバイナリ不一致に $ jdupes --recurse --delete --omitfirst --order=time <target_dir> 配下の同一ファイルを1つ残して削除する例 ファイル更新時刻が最も古いものを残す) target_dir ( 9.3

22.

3. 類似(重複)画像を除去 リサイズ、再圧縮等でバイナリが異なる類似画像も除去したい 知覚ハッシュ関数(perceptual hash)を利用する 人間の感覚で似ている画像に対して近い値(ハミング距離が短い)を 生成するハッシュ関数(例えば、phash等が有名) 利用例 画像のphash値が同一のファイルは1枚残して削除する 画像のphash値のハミング距離が4以下の画像ペアは1枚残して削除する、等 9.4

23.

左:三田本店 値の例 右:画像を明るくしたもの phash 9.5

24.

左:三田本店 phash 値の例 右:神田神保町店 9.6

25.

perceptual hash による類似画像除去 データセットの全画像のhash値を計算して、 総当たりでハミング距離の計算が必要 結構手間がかかる imgdupes というツールを使うと便利 各種知覚ハッシュアルゴリズムとハミング距離の閾値を指定して、 重複画像をリストップ/除去できる 重複画像をコンソールに表示して確認しながらの削除も可能 (要iTerm2) 9.7

26.

デモ imgdupesを使って Caltech101データセットの重複ファイルを除去 (iTerm2上で重複画像を確認しながら削除する例) $ pip install imgdupes $ pip install ngt # require Python 3.7 on macOS $ imgdupes -rdc 101_ObjectCategories phash 2 --ngt 9.8

27.

補足)重複画像に異なるラベルがついている場合 ( 類似画像を検索すると同じ画像に異なるラベルがついている事がよくある この場合、どちらかのラベルが誤っていることになる 正解が分かればそれを残し、分からなければ両方削除 上記を考慮し、バイナリレベルで同一ファイルを除去する際に、 データ全体に対してではなく、ラベル単位で同一ファイルを除去している 9.9

28.

4. 最終的に目視で不要なファイルを除去 これまでの工程で除去できていない不要なファイルを 目視で除去する 例えば、ラーメン二郎bot用のデータセットでは、 店舗外観、自撮り、券売機等の画像を除去している 一度不要なファイルを除去した後は、このデータを元に 要/不要画像の分類モデルを作成し前処理に使うこともできる ラーメンの写真とそれ以外(店舗外観、自撮り、券売機等)の 2つのクラスに画像を分類するモデルを学習し、新たに収集した データセットに対して、このモデルを使い前処理を行う 9 . 10

29.

参考) オープンなデータセットも 意外とクリーンではない ( ディープラーニングによる画像分類モデルの 性能比較によく利用される cifar10/cifar100 や ImageNet にも重複画像がちょくちょくある 出典: CIFAR-10 and CIFAR-100 datasets 10 . 1

30.

cifar10 に含まれる重複画像の例(その1) 似たような画像が大量にある 10 . 2

31.

cifar10 に含まれる重複画像の例(その2) と に同一の画像がある train test 10 . 3

32.

cifar100 に含まれる重複画像の例(その1) クラス と crabクラス に同一の画像がある spider 10 . 4

33.

cifar100 に含まれる重複画像の例(その2) クラス と snakeクラス に同一の画像がある しかも、それぞれ test と train に含まれる画像) worm ( 10 . 5

34.

データのクリーニング有無による精度の違い ラーメン二郎データセット(クリーニング済み)と クリーニング前のデータセットでそれぞれモデルを 学習し精度の違いを比較してみる 11 . 1

35.

データセットの詳細 学習用データセットを2パターン用意 データセット 画像枚数 クリーニング済み 20,000枚 クリーニング無し 30,000枚 クラス数 40 (各店舗500枚) 40 (各店舗750枚) クリーニングで学習データが3万から2万枚に減った想定 検証では端数を捨て、切りの良い枚数にしています ※ 11 . 2

36.

評価、テストデータ 評価データ: 3,200枚 (各店舗80枚) テストデータ: 3,200枚 (各店舗80枚) 学習データのクリーニング有無による モデルの識別精度を比較したいため、 評価データ、テストデータについては、 クリーニング済みのものを共通して利用 11 . 3

37.

学習条件 モデル: ResNet50 (ImageNet学習済みモデルの転移学習) バッチサイズ: 256 オプティマイザ: Adabound (final_lr=0.5) weight decay: 5e-4 学習率(初期値): 0.001 学習エポック数: 30 (10,20エポックで学習率を0.1倍) warmup epoch: 5 (学習率を徐々に増加し5epoch目に学習率の初 期値となるよう調整) データ拡張: 左右反転、RandomResizedCrop, RandomRotation 試行回数: 5回 (同一条件で5回学習し、結果の平均および標準偏 差を算出) 11 . 4

38.

データセット クリーニング済み クリーニングなし 検証結果 識別精度(40クラス平均) 標準偏差 94.37% 0.10 91.28% 0.19 クリーニング済みデータセットのほうが 学習用画像の枚数が少ないにも関わらず 約3%程度、識別精度が良い 11 . 5

39.

まとめ 画像収集時にラベル(クラス)情報も収集 画像のメタデータも利用して分類する データセットのクリーニング 同一ファイルや類似ファイルはツールで効率的に除去できる クリーニングしたデータセットのほうがモデルの精度が良い クリーニング後にデータ分割する 正しくモデルを評価するため オープンデータセットも意外とクリーニングされていない 自作するときは注意しよう 12

40.

参考 Train, Validation and Test Sets fdupes (https://github.com/adrianlopezroche/fdupes) jdupes (https://github.com/jbruchon/jdupes) imgdupes (https://github.com/knjcode/imgdupes) CIFAR-10 and CIFAR-100 datasets ※ ※ 「ラーメン二郎」は創業者 山田拓美氏の登録商標です 資料中のラーメン二郎写真は撮影者の許可を得て掲載 13

41.

ご清聴ありがとうございました 14