Slide 1

Slide 1 text

Deep Learning以外の⼿法で ユニクロコンに参戦してみた @mamas16k Kaggle Tokyo Meetup #3

Slide 2

Slide 2 text

Outline 0.はじめに 1.ユニクロコンペとは? 2.結果 3.⼿法 4.上位の⼈の⼿法まとめ

Slide 3

Slide 3 text

0.はじめに • Twitter ID: mamas16k • 物理系の学部2年⽣ • 機械学習暦・プログラミング暦共に1年ぐらいの初⼼者 • データ分析系の企業でインターンしてました • ユニクロコンは初の機械学習コンペ 今回のKaggle Meetupの初⼼者枠なので、あまり真に受けずにた くさんマサカリを投げてくれると有り難いです><

Slide 4

Slide 4 text

1.ユニクロコンペとは? • Kaggleではなく、オプトDSLで2017年4⽉ ~ 7⽉に開催 • スポンサー:Fast Retailing (ユニクロの親会社) • 服、靴下、ベルト等の画像を24⾊にmulticlass分類 (ベージュ、⿊、⻘、茶⾊、緑、カーキ、オレンジ, etc) ※権利関係の都合で、全⼒でフリー素材を使います。 http://illustrain.com/?cat=79

Slide 5

Slide 5 text

オプトのコンペの特徴(Kaggleとの違い) • 参加者がほとんど⽇本⼈の機械学習コンペ • KernelやDiscussionが存在しない。チームマージのルール、 Public LBのルールなど、多少違う点がある。 • ⽇本語であるため参加の敷居が低く、Kaggleと並⾏してやって みても良い? (今オプト引っ越しコンペ出てて、10/31締め切りなのでヤバイです・・・)

Slide 6

Slide 6 text

1-1. 全クラスの画像例 beige blue black brown dark_brown dark_gray dark_green gray dark_orange green khaki light_gray

Slide 7

Slide 7 text

1-1. 全クラスの画像例 light_green navy natural off_white olive orange pink red purple white wine yellow

Slide 8

Slide 8 text

1-2. クラスごとの画像数 Rank Color N_samples 1 blue 2036 2 navy 1623 3 black 1582 4 gray 1129 5 pink 855 6 red 650 7 dark_gray 592 8 white 589 9 off_white 589 10 green 386 11 beige 315 12 purple 314 Rank Color N_samples 13 olive 211 14 wine 210 15 light_gray 200 16 orange 193 17 brown 190 18 dark_green 181 19 natural 138 20 yellow 121 21 dark_brown 120 22 light_green 87 23 dark_orange 49 24 khaki 39 合計: 12404枚

Slide 9

Slide 9 text

ユニクロコン名物:三連靴下 ※ 1枚の画像です

Slide 10

Slide 10 text

1-3. metricsについて • Balanced accuracyで評価される。 ⼀⾔で⾔えば、24 classに対するaccuracyの平均

Slide 11

Slide 11 text

2. 結果 • 70.791%で6位でした。ついでに特別賞と10万円をゲット

Slide 12

Slide 12 text

3. ⼿法 コンペを始める前に思ったこと: ・⾊分類であれば、空間的情報はあまり関係しないのでは? ・関係ないのであれば、通常のCNNの空間⽅向に対する⾼い表 現⼒はほとんど無駄になっているのでは? ・上⼿く「⾊」分類であるということを⽣かせないか?

Slide 13

Slide 13 text

3-1. おおまかな⼿法 ①Deep Learningを使わずに、⾊に関する特徴を頑張って抽出 ②metricsの最適化にprobability calibrationを⽤いた。 ③XGBoost, LightGBMのStacking (5-foldで、最終層のモデルは、Logistic Regression)

Slide 14

Slide 14 text

3-2. 画像からの特徴抽出 • ⼤きく分けて⼆つの⼿法を⽤いた。 ①統計量を取る路線 ②ヒストグラムを特徴にする路線 ※閾値処理で⽩い背景を分離し、背景以外について⾏う (分離しないとwhiteの分類に悪影響があると考えられる)

Slide 15

Slide 15 text

3-2-1. 素朴なやり⽅(統計量路線) • R, G, Bの分布について統計量を取り、特徴にする。 Kaggle PlanetコンペのKernelで発⾒した。 R, G, Bについてそれぞれ平均、標準偏差、最⼤値、最⼩値、歪 度、尖度を特徴にしている。 https://www.kaggle.com/greenmtn/xgb-starter-lb-0- 88232/output

Slide 16

Slide 16 text

3-2-1. 素朴なやり⽅(統計量路線) • 変換のイメージ図 ⽩ 背 景 を 分 離 Gの平均: 188.7 Gの分散: 33.25 Gの最⼤値: … Gの最⼩値: … Rの平均: 110.8 Rの分散: 8.921 Rの最⼤値: … Rの最⼩値: … Bの平均: 158.7 Bの分散: 22.7 Bの最⼤値: … Bの最⼩値: …

Slide 17

Slide 17 text

3-2-2. 素朴なやり⽅(ヒストグラム路線) • R, G, Bについてヒストグラムを作り、特定の範囲における画素 数を特徴量にする。 例えば、ビン数を256にすると、R, G, B各々から256個の特徴が 得られるため、合計して 256 + 256 + 256 = 768個の特徴量が得られる。 特徴量の数と計算時間はトレードオフの関係になる。

Slide 18

Slide 18 text

3-2-2. 素朴なやり⽅(ヒストグラム路線) range 0 ~ 16 … 80 ~ 96 96 ~ 112 … 242 ~ 256 n_pixels 0 … 2115 10414 … 0 range 0 ~ 16 … 192 ~ 208 208 ~ 224 … 242 ~ 256 n_pixels 0 … 35906 3 … 0 range 0 ~ 16 … 160 ~ 176 176 ~ 192 … 242 ~ 256 n_pixels 0 … 35963 2 … 0 count count count

Slide 19

Slide 19 text

3-2-3.素朴なやり⽅の問題点 実際は、この⼆つの素朴なやり⽅では良い精度は出ない。 理由として以下の3つが挙げられる。 (1)⾊空間の知覚均等性 (2)組み合わせに関する情報⽋損 (3)空間的な情報⽋損

Slide 20

Slide 20 text

(1)⾊空間の知覚均等性 • RGB⾊空間において各画素は"の元として表されるが、 元同⼠の“距離”は⼈間の知覚的な差と⼀致しない。 つまり、距離は遠いが⼈間にはほぼ同じ⾊ 距離は近いが⼈間にはかなり違う⾊ というケースが存在する。 ※ここで”距離”はユークリッド距離を指す。実際は、Delta E CIE 2000などの知覚に合うよう補正した距離の計算⽅法が存在 して、Pythonでも実装されているようである。 http://python- colormath.readthedocs.io/en/latest/delta_e.html

Slide 21

Slide 21 text

(1)⾊空間の知覚均等性 ・CIE 1931 XYZ⾊空間におけるマクアダム楕円 楕円の内部の点は⼈間が区別できない⾊の範囲 を指すらしい。 ⼈間の知覚と⾊空間における距離が⼤きく離れ ていることがわかる。 ※ここらへん真剣に勉強したわけではないので、 あまりアテにしないで下さい

Slide 22

Slide 22 text

(2)組み合わせに関する情報⽋損 • 組み合わせの⽋損の問題を考えるために、画像のR, G, BのGの 部分だけランダムにシャッフルしてみる G だ け ラ ン ダ ム シ ャ ッ フ ル

Slide 23

Slide 23 text

(2)組み合わせに関する情報⽋損 ※簡単のため、閾値処 理は⾏っていない

Slide 24

Slide 24 text

(2)組み合わせに関する情報⽋損 組み合わせの情報が無視されるため、1次元ヒストグラ ムに変換すると全く同じものとして扱われる! ( )=( )

Slide 25

Slide 25 text

(3)空間的な情報⽋損 空間的情報は完全に⽋損している ( )=( )

Slide 26

Slide 26 text

(1)知覚均等性問題への対処 ①⾊空間を増やす ⾊空間ごとに特定の⾊を(⾒分けやすい/⾒分けにくい)というこ とがありそうなので、増やせば精度が上がる ②ビンの数を増やす ヒストグラムの分割の幅を⼩さくすれば、細かい差にも対応出来 るかもしれない(ただし計算時間の増加と過学習のリスクがある)

Slide 27

Slide 27 text

⾊空間を増やす⽅法 • Pythonであれば、OpenCV, Scikit-Image, colour-science, colormath等のライブラリを使えば良い。 • 最終的には33個の⾊空間を使った。 • (RGB, XYZ, YCC, HSV, HLS, Lab, Luv, YUV, YPP, YIQ, etc.)

Slide 28

Slide 28 text

(2)組み合わせ問題への対処 ①⾊空間を増やす ⾊空間変換によって(R, G, B)の組み合わせが考慮される ②2次元的、3次元的な特徴を作る 2次元ヒストグラム, 3次元ヒストグラム, 2次元統計量, 3次元統計量を作った

Slide 29

Slide 29 text

2次元ヒストグラム(2D-histogram) 0 0 0 0 10 0 0 3 10 0 0 3 15 3 0 0 1 5 0 0 0 0 0 0 0 0 0 0 0 10 0 0 2 10 0 0 0 14 6 0 0 0 1 0 0 0 0 0 0 0 0 0 0 9 0 0 0 3 0 0 0 13 0 3 0 0 0 5 7 0 0 0 0 0 0 flatten flatten flatten GB count count count ※Count後の値は偽物です (スペースの都合)

Slide 30

Slide 30 text

2次元統計量(2D-stats) (RGグラフにおける) , の平均: … , の分散: … , の最⼤値: … GB 極座標に 変換 極座標に 変換 極座標に 変換 (GBグラフにおける) , の平均: … , の分散: … , の最⼤値: … (BRグラフにおける) , の平均: … , の分散: … , の最⼤値: …

Slide 31

Slide 31 text

3次元ヒストグラム(3D-histogram) ※Count後の値は偽物です (スペースの都合) RGB プ ロ ッ ト 0 0 0 0 10 0 0 3 10 0 0 3 15 3 0 0 1 5 0 0 0 0 0 0 0 0 0 0 0 10 0 0 3 10 0 0 3 15 3 0 0 1 5 0 0 0 0 0 0 0 0 0 0 0 10 0 0 3 10 0 0 3 15 3 0 0 1 5 0 0 0 0 0 0 0 0 0 0 0 10 0 0 3 10 0 0 3 15 3 0 0 1 5 0 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 flatten

Slide 32

Slide 32 text

3次元統計量(3D-stats) ※Count後の値は偽物です (スペースの都合) RGB プ ロ ッ ト 球座標に 変換 , , の平均: … , , の分散: … , , の最⼤値: …

Slide 33

Slide 33 text

(3)空間的な情報⽋損に対する対処 • サボった。僕のResNet-50君はあまり精度がよくなかった・・ (おそらく)今回の敗因・・・ • Deepでなくとも、SIFTとかHOGを⼊れてBag-Of-Keypointsと かするべきだったかもしれない 4位の⼈のBlog 「⼥性ものはオフホワイトになりやすい。」 http://threeprogramming.lolipop.jp/blog/?p=1092 やっぱり空間的情報は⼤事だった

Slide 34

Slide 34 text

結果 ⽤いた特徴量 Accuracy(5-fold CV, Local validation) 1次元ヒストグラム(bins = 256) 0.7716 2次元ヒストグラム(bins = 8) 0.7738 3次元ヒストグラム(bins = 16) 0.7735 1次元統計量 0.7767 2次元統計量 0.7789 3次元統計量 0.7701 全部をconcatしたもの 0.7792 ⽤いた統計量: 平均、標準偏差、最⼤、最⼩、中央、最頻値、尖度、 歪度、(15, 33, 66, 83)percentile ⽤いた⾊空間: 33個

Slide 35

Slide 35 text

ちなみに・・・ Q. こんなに⾊空間変換や職⼈的な特徴抽出をし なくても、CNNで⾊空間ヒストグラムを学習 させれば良いのでは?

Slide 36

Slide 36 text

ちなみに・・・ A. KerasのConv3Dを⽤いて3D-CNNで⾊空間ヒストグラムを学習 させたのですが、精度は0.75程度で、単純にflattenしてMLPに かけた場合と変わりませんでした。 ただ、データ数が⾜りないのが原因かもしれないので、誰か巨⼤ な⾊分類データセットがある⼈がいたら3D-CNNで⾊空間ヒスト グラムを学習させてみてほしいです(もしかしたら⾮常に有効な ⼿法かも?)

Slide 37

Slide 37 text

3-3. metricsの最適化 • Balanced accuracyはaccuracyの平均 ⇛クラスごとのサンプルサイズの逆数に⽐例した重みが与えられ ている (データが多いクラスの画像には⼩さな評価、 データが少ないクラスの画像には⼤きな評価、ということ) ⇛予測”確率“に対してサンプルサイズの逆⽐に⽐例した重みをか けてやってargmaxを取ればbalanced accuracyは簡単に最⼤化出 来る!(しかも、Imbalanced Dataへの対処も同時に⾏える)

Slide 38

Slide 38 text

3-3. metricsの最適化 • しかし・・・ 多くの機械学習モデル(KNN, SVM, GBDT, RandomForest, etc..) は各クラスに所属する確率を出⼒することが出来る。 これは本当に「確率」になっているのだろうか? ⾔い換えれば、 実際の出現頻度と出⼒された確率は⼀致しているのか?

Slide 39

Slide 39 text

3-3-1. 確率の補正の⼿法について http://scikit-learn.org/stable/modules/calibration.html • 横軸が出⼒された確率、縦軸 が実際の出現頻度 • Logistic Regressionを除けば、 全てのモデルが実際の出現頻 度と⽐べて確率が⼤幅にずれ ている。→補正が必要!

Slide 40

Slide 40 text

3-3-1. 確率の補正の⼿法について • 補正の⽅法は単純で、予測確率→実際の出現頻度の回帰モデル を作れば良い。 • ただし、必ず単調⾮減少関数でなければならず、線形回帰では 表現⼒が⾜りないため、 Isotonic Regressionを⽤いる。

Slide 41

Slide 41 text

Isotonic Regression • 線形回帰よりも複雑な関数を表現 でき、かつ単調⾮減少関数になっ ていることがわかる。

Slide 42

Slide 42 text

Probability calibration • 確率を補正する⽅法を⼀般にProbability Calibrationと呼び、 Scikit-Learnで実装されている。使い⽅は次のようになる。 • cvで何foldにするかを指定でき、補正の際はそれぞれのfoldで 補正された予測結果を平均するらしい。ちなみにcvはデフォル トでstratifiedKfoldを⽤いている。

Slide 43

Slide 43 text

Probability calibration こんな感じ from sklearn.datasets import load_iris from xgboost import XGBClassifier from sklearn.calibration import CalibratedClassifierCV from sklearn.model_selection import train_test_split X, y = load_iris(return_X_y = True) X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.33) model = XGBClassifier() isotonic = CalibratedClassifierCV(model, cv = 5, method = 'isotonic') isotonic.fit(X_train, y_train) y_pred = isotonic.predict_proba(X_val)

Slide 44

Slide 44 text

確率補正の結果 • 単純にXGBoostの出⼒した確率にサンプル数の逆⽐をかけると balanced accuracyはPublic LBで68%程度だった。 • Stackingの最終層のモデルをLogisticRegressionにすることで 確率が補正され、Public LBで70%弱になった。 • 最終層のLogistic Regressionに対してprobability calibrationを ⾏うと、Public LBで70%強になった。 ※正確な数字がなくてすいません><

Slide 45

Slide 45 text

3-3-2. Imbalanced Dataへの対処 (1)XGBoostでClass_weightを指定して学習 →上⼿く学習できなかった (2)SMOTEでOversampling →全てのクラスの画像数を最多クラスと同じにして学習させたが、 依然として多数クラスへの予測が多く、良い精度は出なかった

Slide 46

Slide 46 text

3-3-2. Imbalanced Dataへの対処 • (3)UndersamplingしてBagging • →(1), (2)よりも良い結果だったが、probability calibrationを⽤ いた⼿法のほうがPublic LBでもLocalでも良い精度だった。

Slide 47

Slide 47 text

4-1. 上位の⼈の⼿法 • 表彰会で1位, 2位, 3位の⼈がプレゼンテーションを⾏っていた ので、軽くまとめて紹介します。 • その他、Twitter/Blog 等で⼿法を公開していた⼈についても紹 介します。

Slide 48

Slide 48 text

9位 (Private LB Score: 0.70348) • ResNet-50のFine-Tuning • 100 ModelのEnsemble • Kerasでclass_weightにサンプル数の逆⽐で重み付け • 精度はResnet > inception, xceptionだった • augmentationはあまり効果がなかったため⾏わなかった https://togetter.com/li/1129936?page=2

Slide 49

Slide 49 text

4位 (Private LB Score: 0.71536) • VGG16(finetune), resnet(finetune), 1 * 1フィルタを適⽤した CNN, 1 * 1フィルタのみのCNNの4つのモデルのアンサンブル (それぞれ10 ~ 20個の平均) • 確率 * サンプルサイズの逆⽐で最適化(class_weightによる学習 よりも精度が良かったらしい) • Accuracyではなくloglossを重視

Slide 50

Slide 50 text

4位 (Private LB Score: 0.71536) • Stackingモデルも加えてloglossを最⼩化するよう各モデルを加 重平均 • loglossを最⼩化するために確率にn乗をかける http://threeprogramming.lolipop.jp/blog/?p=1092 ※実は確率n乗は僕もやっていたのですが、すぐoverfitしてしまって難しかったです。というか、 probability calibrationを⾏って最適な nを求めたら綺麗に0.95 < n < 1.05ぐらいになったので、必要 なくなったという感じでした。

Slide 51

Slide 51 text

3位(Private LB Score: 0.71931) • ResNet50, Inception-V3, Xception, DenseNet169(全てfinetune) • ResNet50, ResNext, DenseNet121(全てscratchで学習) • DenseNet121(HSVで学習), DenseNet121(L *a *bで学習) • Spatial transformer network→VGG-likeなCNN • GLCM correlation matrixで特徴抽出 • 平均、分散等の統計量を計算

Slide 52

Slide 52 text

3位(Private LB Score: 0.71931) ①ResNet50, Inception-V3, Xception, DenseNet169, ResNet50, ResNext, DenseNet121, DenseNet121, DenseNet121, ②Spatial transformer network→VGG-likeなCNN ③GLCM correlation matrixで特徴抽出 ④平均、分散等の統計量を計算

Slide 53

Slide 53 text

3位(Private LB Score: 0.71931) ⑤2次元ヒストグラム(HSV, L *a *b), 3次元ヒストグラム(RGB) • ① ~ ⑤を全てconcatしてFC層→softmax • Class_weightをつけて学習 • 確率に重み付けして補正

Slide 54

Slide 54 text

2位(Private LB Score: 0.72273) • 3次元ヒストグラム(RGB, bins = 16)とHOGを特徴にして XGBoost, RandomForest, LogisticRegression • Deep LearningはVGG-16 • LabelをOne-hotにせずにじませる (model reguralization via label smoothing)

Slide 55

Slide 55 text

2位(Private LB Score: 0.72273) • Trainデータに対する⾊毎の正解率を⽤いてTestデータに対す る予測確率を補正 • Oversamplingとaugmentationでclass imbalanceに対処 • Stacking NN系列だけでは精度は伸びず、他の特徴量を使ったXGBoostを 組み合わせると良いらしい

Slide 56

Slide 56 text

1位(Private LB Score: 0.72679) • 4⼈チームで参加 • (⾮常に⼤きなshake-upだったらしい?) • 3⼈の予測をsoft-votingした後に確率に重み(サンプル数の逆 ⽐?)をかける

Slide 57

Slide 57 text

1位(Private LB Score: 0.72679) ⼀⼈⽬: • 画像を分割して特徴抽出し、XGBoost, RandomForest, ET • 4層程度の浅いCNNで分類 ⼆⼈⽬: • ResNet-50 三⼈⽬: • 2層のCNNとInceptionV3をconcatしたらしい。 (浅いCNNと深いCNNの組み合わせで特徴を保持する)

Slide 58

Slide 58 text

まとめ • 30空間ほど⾊空間を⽤いて、 1次元 ~ 3次元⾊空間ヒストグラムと 1次元 ~ 3次元⾊空間統計量を抽出し、特徴として⽤いた • Probability calibrationを⽤いて正確な確率を求めるのが metrics(balanced accuracy)の最適化に対して最も有効だった • 他の⼈の⼿法を紹介した。被っている部分も多かった。

Slide 59

Slide 59 text

結論 • やっぱり画像系コンペはDeep Learningが最強 • ⾊分類や、各クラスの画像の⾊の分布が⼤きく異なるデータ セットの分類であれば、⾊空間ヒストグラムからの職⼈的な特 徴抽出も精度改善には多少役に⽴つかもしれない。

Slide 60

Slide 60 text

No content

Slide 61

Slide 61 text

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