Neural Network Console Challengeに参加してみた　まとめ

#1 初めに
3月31日にチャレンジ期間が終了し、4月23日にオンライン表彰式が開催された[Neural Network Console Challenge](https://nnc-challenge.com/)。残念ながら（順当？）入賞はならなかったが、結果発表も終わったので提出した資料を公開してみる。実際に提出された資料とは順番が異なったり、差し替えたものも含まれている。
表彰式内では受賞作以外のアウトプットの紹介で同一タイトルの「撮影部位による分類」について言及いただいているので、私のアウトプットだとすればやはり少しうれしい。
このようなコンテストは初めての参加で何を成果として提出すればいいか、その方法に戸惑いもあったのでそこについても少し書いてみる。
なお、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606123/8ff945c0-7682-6a6a-617c-f37a52619cdb.png)
です。



#2 Neural Network Console Challenge　テーマ設定から提出まで
##概要～テーマを決める
![スライド3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606123/169ea74d-81bb-cc97-c8d1-6b51c315acfb.jpeg)
指定された分類に従って分類するのではなく、参加者が分類自体を考える、また当然ながら参加者がアノテーションをつけることが前提となるので、少しでも楽ができそうなテーマとしてあげられていた②『画像内人物をNNCで学習させ画角/焦点距離による画像分類を作り出す』を行おうとしていたのだが、断念。そのあたりは[その1](https://qiita.com/rsouma/items/da4e9c01f2255474039a)に詳しい。提出は④「チャレンジテーマを自由に設定」とし、分類は②の例として挙げられていた「正面向き/バストアップ/全身/背面」をヒントに行うことにした。
このページは提出資料の頭に概要として提出したものでAccuracy=0.725とも記載があるが、差し替え前の資料となる。以下差し替え前後の資料が混在している

##分類を行う
![スライド7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606123/2189060a-178e-000b-df06-4c6cd6a3b2cb.jpeg)
分類はバストアップ、ニーショットという用語を手掛かりに行ったが、バストアップという表現ではアノテーションの最中に定義があいまいとなって誤分類を多発させてしまったので、頭部から体のどの部分まで写っているかが明確になるよう頭部のみ、頭部から腰まで、全身と迷いが少なくなるような名称に変更した（5種）。この分類を使うと頭部が写っていない、複数人の場合、分類結果が二つ以上となる場合はどうするかという問題が出るが、とりあえずそれぞれの分類を作ることし、合計7種の分類とした。この時点では提出期限までに余裕があれば複数人の写真については複数分類（人物１は顔だけ、人物２は顔から肩まで）できる分類も考えていたが、時間ぎれで実現できず。全体を通して一番時間と手間がかかったのがこの部分であった。
##データセットを作る～学習環境
![スライド6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606123/78032278-84ba-79dd-aced-e1170ed47d9d.jpeg)
分類はNeural Network Console(以下NNC)のデータセット作成機能を使えるよう、画像ファイルを分類別にフォルダに分ける形で行った。学習はローカル環境で行った。GPUは昨年VRに興味がありを導入したGeForce RTX 2070Superで、学習時間がざっくり1時間ぐらいとなるように解像度を160×160とした。もっとも、受賞作はいずれもクラウド版を使用されておりもっと重いネットワークを使うべきだったと考えている。
##ネットワークの試行錯誤
肝心のネットワークについてはCNNを使って始めたところ、YoutubeのNeural Network Consoleのチャンネルで今回のチャレンジを意識した、[NNCチュートリアル：Exif情報を利用し簡単にオリジナルデータセットを用いた実験を行う](https://www.youtube.com/watch?v=tV306SWDhvw)という動画公開され、ほかにも精度向上のためのテクニックについても参考にさせていただいた。作業の大部分は夜でそれ以外の時間には検討したい部分、ImageAugmentationレイヤーやConvolutionレイヤーのパラメータを変更しNNCのスケジュール機能で予約、また自動探索機能を走らせ、夜に結果を確認するというサイクルで行った。
##データセットの見直し
ネットワークのパラメータ変更による効果はもちろんあるのだが、アノテーションの分類ミスの影響の方が大きかった。Confusion Matrixで不正解データを見ると必ず数個の間違い、分類は間違っていないが判定が間違っている、つまりアノテーションの間違いが見つかりその都度データセットを作り直した。最初のアノテーションとこの修正作業が作業時間の大部分を占めた。
![スライド8.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606123/d2dd2cc4-4879-7aa2-9380-ea44f937bbb9.jpeg)
結果できたのがこのネットワーク。当初はCNNにAttentionを加えた比較的シンプルなネットワークだったのだが、なんというか魔改造されてしまった。
##推論結果～しかし
![スライド9.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606123/3607638b-9115-f27b-b8ed-53f9de9a3f18.jpeg)
Accuracyは0.725でまずまず。これでアウトプットを仕上げて提出したのだが、この後ResNet-50のサンプルを解像度と分類数、ImageAugmentationの設定を変えて学習させたところ

##ResNet-50で改善
![スライド12.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606123/13091a4f-9624-cfdc-46a3-487dcd3e6766.jpeg)
Accuracyは0.758。と3%も上昇。急遽差し替えて提出したのが3月31日の23時57分。サンプルのResNet-50を使用したのでネットワークは割愛。

##結果詳細
![スライド4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606123/4ed8c05e-d94f-876a-be6d-8ba1e34f724f.jpeg)
ResNet-50での推論結果の抜粋。正解だったもののみの列挙。アスペクト比がおかしいのはNNCのConfusion Matrixから取り出したため。難易度が高いと思っていた人物が画面全体に占める割合が小さい写真や、乗り物に乗って体の一部が隠れているものも分類がうまくいっている。
提出後ExecutorのNumber of evaluationsの設定が16回Lastになっていることに気づき、Averageにすれば後2，3％は稼げたのではとがっかりする。
#3 提出物、提出方法
最終的に私が事務局に提出したのはこの記事で提示したPowerPoint資料をPDFにしたもののみ。学習結果としては推論結果の具体例とConfusion Matrixのみで、これだけだと捏造の可能性もあり提出者として気持ち悪い思いもあった。確実な証拠としてプロジェクトの提出については予定されており、3月25日に事務局から届いたメールには4/1~ 4/3期間でNNCの「Publish Project」機能にてプロジェクトを公開せよとの記載もあったため、3月31日の締め切りにはPDFのみを提出した。しかし、4月1日に来たメールではPublish Project」を行うことでChallenge完了という記述とともにNNCのWindows版利用者は対象外で、Cloud版利用者を対象
とありWindows版のみを使用した私には、結局提出する機会がなかった。また、同じメールには優秀プロジェクト選考には公開されたプロジェクトも参考にする旨の記載もあった。

#4 全体を通して
NNCはベクトルの分類、回帰で触れたことがあったが、画像に対する問題はサンプルレベルでしか触れたことがなく、また自分で課題を設定して、アノテーション、データセット作成、ネットワークを組み、改善させていく、必要なら参考となる先人の知恵をあたり、という一連の流れを改めて実践することができた。次回もできれば参加したいところである。