AI-SCHOLARハッカソン参加記録〜初心者がハマる画像解析の落とし穴にハマった話〜

お久しぶりです!
最近、なんだかんだ仕事が忙しくなってきたことに加え、プチ転職活動、人生初の副業案件、そして、これから紹介するAI-SCHOLARさんのプロジェクト型ハッカソンへの参加、とブログ更新の時間が取れていませんでした(言い訳)。

というわけで、ハッカソン参加レポートを書きます!

8月中旬のある日、ークライアントが実際に抱える潜在的な課題に対して、参加者自らがクライアントのニーズを最大限解決しうるKPI(重要業績評価指標)を設定し、どのようにして解決するのかにフォーカスー というハッカソンの謳い文句に興味を惹かれました。

出所:PR TIMES「AI-SCHOLARが実践形式のプロジェクト型ハッカソンを開催。テーマは「データセット評価」」(https://prtimes.jp/main/html/rd/p/000000088.000015648.html)

そして、後先考えずこのハッカソンに応募し、結果、寝れずに死にそうになったのですが(ちょっとだけ盛ってますw)、大変良い経験をさせて頂いたので、記事に残しておきたいと思いました。

今後も開催予定とのことですので、ご興味持たれた方は是非!!(めちゃくちゃいい経験になると思います!)

あと、超僅差ですが、最優秀賞を頂いたので、ちょっとだけ自慢させてください!笑

以下、忙しい人向けのまとめです。

ハッカソンの概要:

  • ハッカソンの狙いは、AI知識はあるけど実課題を解決したことがないギャップを埋めること
  • お題に対して2週間で開発とレポート作成まで行う(個人またはチームで取り組む)
  • 賞金はないが現役DS/企業からフィードバックあり。企業が望めば採用直結も?
  • 今回のお題は、画像データをアノテーションする業者を評価すること

私の提出・発表内容:

  • 私は右も左も分からないまま、CNNとMetric Learningをベースに手法を開発した
  • 結果、見事に落とし穴にハマった!

ハッカソンでの学び:

  • 画像という特殊領域で初心者がハマりがちなポイントを身をもって体験した(ので、きっと次は同じ過ちを繰り返さないはず!!)
  • コンサル的な仕事のスタイルが必ずしも良いとは限らないことを、企業からのフィードバックで体感した(なんとなく知っていたが、「知る」から「分かる」になった感じです)
  • 世間狭すぎ!(審査員と妻が学生時代の同級生であることが判明しました笑)

ハッカソンの概要

ハッカソンの狙い

主催のAI-SCHOLARさんによると、AI知識はあるけど実課題を解決したことがないギャップを埋めること、即戦力人材を育成すること、などが狙いのようです。

私は一応、実課題を解決したことがある立場の人間なのですが(笑)、今回のお題(後述しますが、画像解析のお題です)は未経験も同然だったので、大変学びがありました。

ハッカソンの形式

ハッカソンは2週間という超短期間のハードスケジュールで実施されました!!
論点設計から、仮説出し、検証用のコード作成、レポート作成と盛り沢山で、前職以来(戦略コンサルやってました)、久しぶりに完徹しました。。懇親会で「寝れずに辛かった」話をアピールしたので、次回はもう少し長くなるかもです笑

以下、概要です。

  • 個人またはチームで応募できる(私は個人で応募しました)
  • お題が提示されてから2週間で開発して、レポートとコードを提出する
  • 提出物をもとにファイナリストが数組選出されプレゼンが行われる
  • AI-SCHOLAR/企業の関係者数名がプレゼンを審査する
  • 賞金はないが、企業が望めば採用ルートもあるとのこと

今回のお題

3組のアノテーション団体に画像のアノテーションを依頼した結果(アノテーションの精度)を、データを使って評価するというお題でした。設定は次のようなものです。

  • 画像データをAfghan Hound、Fried Chickenなど、全11クラスにアノテーションするというタスクを、3組のアノテーション団体に依頼した
  • アノテーション団体には同じタスクを依頼したが、渡した画像データはそれぞれ異なる(1団体につき2000枚ほど)
  • アノテーション団体毎に異なるアノテーションの誤り率が設定されている(今回の裏設定では、0%、5%、20%でした)

我々参加者には、以下のように、Google Driveにてアノテーション団体毎・クラス毎に格納された画像データが共有されました。

画像データセットの例

ハッカソンでは、「なぜ、このお題を解く必要があるのか」、という背景(ビジネス上の課題)も以下の通り提示されました。

  • 作業団体、作業者のアノテーションの精度を評価するには「確からしさ」と「コスト」のトレードオフがある
  • アノテーション作業の一部チェックするとして、チェックする割合が多ければ多いほど正しく評価できるが、その分コストが上がる
  • よって、アノテーション者の評価をデータから判断したい

私の提出・発表内容

お題提示から、提出までの2週間、私は次のように時間を使いました。

  • 1-7日目:
    • ビジネス上の課題を、分析上のどんな問題に落とし込むべきかを考える
      →アノテーションミスのあるデータの特定や、ミス件数の推定、団体毎のミスの多さの推定など、いくつか問題設定が考えられそう
    • 分析上の問題を解決するための手法を考える
      →ちょっとだけデータをいじったところ、画素データをそもまま使うのは厳しそう。CNN不可避か。。
      →画像解析で異常を検出する手法を調査したところ、Metric Learningが使えそう
  • 8-12日目:
    • 手法を実装してみる
      →Qiitaの記事とgitのコードを参考に実装。しかし、Kerasで学習済みモデルに層を加えるところで無駄に苦戦。。
    • 検証のための実験を設計する
      →Fashion MNISTを使って、いくつか実験をやってみようと、あれこれ設定を考える
  • 13-14日目:
    • 実験するも、違和感のある結果しか出ず、完徹する
      →残論点は山ほどあったけど、タイムオーバーなので、レポートに落として提出。。

徹夜したことが幸いしてか、僅差でファイナリストに選出して頂いたので、下記の発表資料で最終プレゼンに臨みました!

詰め込みすぎてわかりにくい資料になってしまったので、下記で補足したいと思います。
結構細かいので、細かい話に興味ない方は、飛ばしてください!!

提出物の到達度

理論による裏付けまでできればベストなのですが、今回2週間という短い期間だったので、「数値実験で手法の妥当性の裏付けが取れればいいなあ」、と思って取り組んでいました。
しかし、不慣れな画像解析に苦戦し、とても裏付けできたと言えるレベルには到達できませんでした。。

分析上の論点設計

今回のお題は、アノテーターを評価することなのですが、その背景として、「ミスの少ないアノテーターを効率よく選定したい」というモチベーションがあります。この背景を踏まえると、今回解くべき分析問題にはいくつかバリエーションがあるように思いました。

お題に必要最低限に答えるなら、「C. ミスの寡多の推定(アノテーター間で比較してミスが多いのはどの団体?)」が解ければ良いのですが、ビジネス背景を踏まえると、「A. ミスのあるデータの特定(どのデータにアノテーションミスがあるの?)」まで踏み込めると最高なので、今回はスライドで提示した3つの分析問題を解くことを意識しました。

提案手法

まず、具体的な手法を考える前に、11クラスのうちどのクラスに割り当てられるべきかを当てる「多クラス分類」として解くアプローチと、間違ったアノテーションか否かを当てる「二値分類」として解くアプローチがあると思い、使えそうな技術の候補を整理してみました。

私自身が画像ど素人ということもあり、できれば画素データをそのまま使ってシンプルに問題を解きたかったのですが、EDAフェーズでデータをいじってみて、多クラス分類で解く場合、CNNを使ったアプローチが不可欠であることを悟りました。

また、2値分類として解く場合については、Qiita記事を漁ったところ、Metric Learningを使ったアプローチが使えそうだと思いました。Metric Learningとは、同じクラスに属するデータは近く、異なるクラスに属するデータは遠くなる特徴量空間への変換を学習する手法らしいです。特徴量空間に変換した後の出力を異常検知にかければ、アノテーションミスを検出できるのではないか、と考えました。

多クラス分類にせよ、二値分類にせよCNNをベースに開発する必要があるので、今回はベースとなるモデルとしてMobileNetV2を選定しました。理由は、「QiitaのMetric Learningの記事で同モデルが使われていたから」と安直なものでした。結果、痛い目を見ることになりました。

上記スライドの①はシンプルにMobileNetV2を使ったもの、②はMobileNetV2にL2-Softmax層を追加したもの、③はMobileNetV2にL2-Softmax層を追加したモデルで学習した上で、スコア算出時には最終層の手前の層の出力をLOFにインプットしたもの(Metric Learningと異常検知を組み合わせたもの)です

②は③のモデルで最終層を取り除かずに多クラス分類モデルとして扱ったものとも言えます。Metric Learningを調べていて、そのまま分類モデルとして使ったらどうなるのか気になったので、個人的な興味で試してみました。

また、①〜③とも共通してimagenetで学習済みのモデルをファインチューニングして使っています。ファインチューニングしたのは、次に紹介する数値実験で良い精度が得られたからです。実はこれも裏目に出ることに。。

本格的な検証に入る前に、この手法が機能しそうか簡易検証しておきたいと思い、Fashion MNISTのデータセットを使った数値実験を行いました。数値実験では、少量のアノテーションミスのデータを用意しておき、アノテーションミスと、正しいアノテーションとを分類する二値分類問題におけるAUCを確認することにしました。

結果、当初筋が良い思っていた③のMetric Learningと異常検知を組み合わせた手法は、AUC0.53と散々な結果に。。①・②の多クラス分類のアプローチは、精度が良さそうだったので、以降の数値実験では、こちらの手法を使うことにしました。

数値実験による検証

数値実験を設計する上での、悩みの種は、「どんなシチュエーションを想定して手法を適用するのか」という点です。

  1. 精度を優先させるために、学習データだけはアノテーションミスが無いように人手で確認しておく
  2. データ確認の手間を省くために、人手によるアノテーションミスの確認を行わず、アノテーションミスが含まれるデータで学習とアノテーターの評価を行う
  3. データ確認の手間を省きつつ、精度の検証もできるように、アノテーションミスが含まれるデータで学習と、アノテーターの評価、”アノテーター評価の精度評価”まで行う

上記のように、いくつかシチュエーションが考えられます。1. 2. では、作ったモデルの正しさは、数値実験で確かめることになるので、裏付けとしては弱いのですが、をアノテーションミスを含むデータで、”アノテーター評価の精度評価”、までやるのは難易度が高いと感じたので、今回は、1. 2. のシチュエーションで数値実験することにしました。

とりあえずシチュエーション1でやってみようと思い、学習データを500件(アノテーションミスを含まない)として多クラス分類モデルを構築して、残り6500件のデータに含まれるアノテーションミスを評価してみました。

何度か学習データを変えて実験しましたが、なんとAUC0.95~0.98と大変良い精度が得られました!

※冒頭の問題設定で定義した、分析問題(A. ミスデータ特定、B. ミス件数推定、C. ミス寡多推定)によって異なる評価指標を割り当てているのですが、ここでは詳細を割愛します。

シチュエーション1では、「アノテーションミスの無い学習データを何件用意すれば良いのか」が検証ポイントになります。ですので、学習データを100件に減らして、同様の実験を行いました。すると、手法①では、データ件数を100件に減らしてもなお、AUC0.95と高い精度が出ることに。。これはおかしい。。

おそらく、imagenetでファインチューニングしていることが原因ではないかと考察したものの、この問題が発覚したのが提出直前だったので、追加実験の時間もなく諦めることに。。

実験結果を割愛しましたが、シチュエーション2(学習データにアノテーションミスを含む場合)でも、シチュエーション1(学習データにアノテーションミスを含まない場合)と同様の結果が得られていました。

今回はアノテーションミスの無い学習データを作る時間もなかったため、シチュエーション2で、最も問題の難易度が低いであろう「C. ミス寡多推定(どのグループがミス多いのか?)」を解く手法を適用して、アノテーターの評価結果を提出しました。

ハッカソンでの学び

上記の通り、大したことはできていないのですが、初めて本格的な画像解析のお題に取り組んで、さらにアウトプットに対して、立場の異なる審査員の様々な視点からフィードバックをいただいたことで、大変学びあるハッカソンとなりました。

今回、いただいたフィードバックも踏まえ学んだことは以下の通りです。

  • 技術に関するもの
    • ①適切なモデル・検証用データセットを選ぶ
    • ②ファインチューニングでは汎化性能に注意する
    • ③拡張子の処理にも気を配る
  • 仕事の進め方に関するもの:
    • ④コンサル的な仕事の進め方がよくない場合も
    • ⑤枯れた技術をうまく活用する
  • その他:
    • ⑥世間は狭い

①適切なモデル・検証用データセットを選ぶ

今回、「調べた事例で使われていたから」、「知っているから」という理由だけで、モデルとしてMobileNetV2を、検証用データセットとして、Fashion MNISTを選定しました。
しかし、このチョイスは適切ではなかったようで、審査員からのフィードバックで以下のような指摘を受けました。

  • 今回のように学習用のデータセットが少ない場面では、パラメータ数が多いMobileNetV2は適さない
  • Fashion MNISTは画像サイズが小さいため検証用データセットとして適切ではない

これらは、クリティカルなポイントだったようなので、もっと慎重に選定べきだったと反省しました。

②ファインチューニングでは汎化性能に注意する

これは私自身の考察に基づく反省です。
Fashion MNISTでは、ファインチューニングを用いることによって、精度改善が見られましたが、今回のお題で与えれられたデータセットでもそうなるかは分かりません。

実は今回私が提出したアノテーション団体の評価は、AI-SCHOLARさん側で設定していた裏設定と異なるものだったようで、やはり、正しく手法の検証ができたとは言えないようでした。

ファインチューニングを使ったものと、使わないものを両方検証するなど、工夫して検証を行う必要があったと反省しました。

③拡張子の処理にも気を配る

これは審査員からのコメントですが、精度を上げていく段階では、拡張子の違いも丁寧に扱う必要があるようです(知りませんでした!)。今回は拡張子(データセットにはjpg, pngが混在)の違いを特に気にせず、PILライブラリにお任せだったのですが、1%の精度改善を争う世界では、こんなことまで気にしなければならないのか、と画像解析の不思議な世界を垣間見た気分でした。

④コンサル的な仕事の進め方がよくない場合も

今回のプレゼンでは、2位チームと超僅差で最優秀賞をいただくことができました。

私はいくつかの仮説を幅広に検証したのに対して、2位チームは、「学習用データを人手でチェックしたうえで、Data Augmentationで水増しする」という1つの手法をしっかり詰めて結果を出しておられました。

異なるアプローチに対して、審査員の評価が割れたため、ポジティブ・ネガティブ両方のコメントをいただけたのが、非常によかったです。

特に、スタートアップの企業担当者の方からは、幅広に検証するよりも、きっちり筋の良い手法を詰めるアプローチを評価するコメントが上がっており、印象的に残りました。

私のアプローチは、多くのステークホルダーの合意をとって仕事を進めるうえでは有効かもしれませんが、スタートアップのようにスピードを重視する場面では必ずしも良いアプローチではないのでしょう。

⑤枯れた技術をうまく活用する

こちらも、2位チームからの学びです。
2位チームは、「Data Augmentationで水増しする手法」をとっていたのですが、審査員からは、このような枯れた技術(裏を返すと成果が出ることが保証されている技術)を使ってきっちり成果を出した点を評価するコメントが上がっていました。

私はそもそも、「画像領域で枯れた技術が何なのか」すら知らない状況だったのですが。。笑

発表会のあと懇親会の時間をいただけたので、「どんなメディアを見れば、枯れた技術の情報を得られるのか」、審査員の方に質問したのですが、答えは「そんなメディアはない。技術を使ってみる、あるいは、詳しい人に聞くしかない」とのことでした。
今回のハッカソンのような機会をうまく活用して、技術に触れたり、知っている人に助言をもらうことの大事さを実感した次第でした!

⑥世間は狭い

それは、懇親会で起こりました。

懇親会のzoom画面を見ていた妻が、

「この審査員の人、私の同級生かもしれん」

と異変に気付いたのです。

確認したところマジでした。世間の狭さを思い知りました笑

今回に限らず、最近、ほんの少しだけおじさんになってきたので、仕事相手が知り合いの知り合いだったり、知り合いから仕事を頼まれたりと、一層世間が狭くなってきた気がします。

どこで誰と繋がるか分からないですし、「きっちり仕事をすることって大事だなあ」、と思う今日この頃です。

先日ブログ記事に書いた通り、大企業あるあるで勤務先の分析組織は解散することになったのですが、そんなわけですので、最後まで手を抜かず仕事したいと思います。

最後に

最後までご覧いただきありがとうございました!!

最後に、本ハッカソンに時間を割いてくださったAI-SCHOLARの皆様、ならびに、審査員の皆様に、この場を借りて御礼申し上げたいと思います。

以上!

コメントを残す