Shingoの数学ノート

プログラミングと機械学習のメモ

Kaggle奮闘記 〜Kuzushiji Recognition〜

日付:    カテゴリ: Kaggle


最近、仕事やらkaggleやら応用情報やら数検やらで忙しかったので更新が滞っていました(泣)
だいぶ落ち着いてきたので、最近まで頑張っていたkaggleについて書いていこうと思います。


Kuzushiji Recognition

今回のコンペはくずし字認識。なんと日本語のコンペです。その分メダルはなかったのですが(笑)

私の成績は80/293。なかなか難しいコンペでした。

くずし字2

今回コンペのまとめ、反省をしつつブログを書いていきます。


くずし字コンペのタスク

以下のような古書の文字が書いてある場所とその文字がなにであるかを当てます。

くずし字1

大きく分けて、領域検出と文字認識のタスクがあります。


領域検出

領域検出といえばFaster RCNNやSSD、YOLOだと思っていましたが、kaggleカーネルでcenternetというものを知りました。
centernetのカーネルはこちら
結局精度高かったのでこちらを使用しました。すばらしいカーネルありがとうございます。
テストデータに対して当てはめるとこんな感じの予測をします。

くずし字3

文字認識

最近pytorchを覚えたので、pytorchで作ってみました。 pnasnet5-largeという学習済みモデルを使用しています。
予測した文字を正方形に切り取って、グレースケール化や回転、拡大、平行移動をかけました。文字認識のため、反転はしませんでした。
また、5枚以下の画像は5枚に、400枚以上の画像は400枚にして枚数の偏りを減らしました。

くずし字4

予測時間が非常に長いです(RTX2080Tiで30時間かかっていました。)
以下は予測結果です。

くずし字5

個人的には意外と予測できてる!という感じでしたが、上位陣の人はどれくらい当たっているものでしょうか。非常に気になります。


やってよかった点

  1. Faster RCNNを実装することができた
  2. centernetを知ることができた
  3. 大金叩いて買ったGPUを活かすことができた
  4. pytorchを使えるようになった
  5. 学習済みモデルの偉大さを知った

反省点・やってみたかったこと

物体検出に関して

  1. centernetを学びたかった
  2. centernetの理論が何となくしかわかっていないので、しっかり勉強したい。
  3. 前処理をしっかりしてFaster RCNNでも予測したい
  4. 文字が小さいのでcropはしてたが、カーネルのように画像に応じたcropはしていなかった。これをすればもう少し精度が上がった可能性がある。
  5. いくつかの組み合わせで精度を上げたい
  6. 自分で作成したモデルが雑魚すぎて組み合わせたら精度が下がってしまった。精進します。

文字認識について

  1. 前処理をいろいろ試したかった
  2. グレースケールは必要だったのか、回転や平行移動はどれくらいがよいのか。
  3. 4000分類もいらなかった
  4. 約4000値分類だが、実際予測したラベルは2800種類。頻出していない文字は思い切って捨ててもよかったかも
  5. 文字の並びで推測できた?
  6. やっていいのかわからないが、人が文字を読む時って前後の文字から推測するはずなので、このコンペでもそれが使えたかもしれない。自然言語処理を生かせるときだったかも。
  7. 予測に30時間はかかりすぎでは?
  8. resnet101くらいでよかったかもしれない。まあ精度上げるためなのでしょうがない。

全体的に

  1. 評価指標F値がどうすれば上がるのかを考える必要があった
  2. そもそもメダルなしコンペだと知った頃には引き返せないところまで来ていた

最後に

勉強になった楽しいコンペでした。開催してくださった方、kaggleカーネル投稿してくれた方ありがとうございました。
コードを綺麗にしたので、需要があればコードあげます。(ただ、カーネルで十分な気も(笑))

2/18追記:この記事でコードあげました



Comment Box is loading comments...