1 Neural Network Console Challengeに参加する
10000枚ものオリジナルのデータはなかなか触れることはなく、興味本位で参加してみたので、その記録。幸い最近自宅PCのGPUをRadeon9800XT以来使い続けたATI/AMDをやめ、Geforce RTX2070Superに変えたので自宅PCだけでなんとかなるかとの目算もあった。
2 テーマを決める
さっくり申し込みを行おうとするが、肝心のデータを見る前に早速テーマ選定を求められる。
アノテーションが面倒なのは苦痛だったので、軽い気持ちで簡単にEXIFからデータが得られそうな「焦点距離」というキーワードのはいった『画像内人物をNNCで学習させ画角/焦点距離による画像分類を作り出す』を選ぶ。画像分類である以上、教師データの分類はしなければならないが、まず焦点距離による分類を行いこれを参考にして分類をつけていけば作業の手間はかなり減るはず。面倒なのはいやなのだ。
いや、もっと簡単に焦点距離の範囲で分類し、それに適当な名前をつければ課題終了ではなどと思う。
3アノテーションをつける準備
早速10000枚のデータをダウンロードする。
画像ファイルからEXIFからデータを取り出してみる
教師データとして配布された画像ファイルのEXIFから焦点距離を取り出す。pythonで適当にスクリプトを書き、焦点距離を含むファイル数を確認すると、10000枚のファイル全てに記録されているわけではなく、2000枚程度は記録無し。差し引き最大で8000枚が使えることになる。
画像ファイルの解像度変換を考えてみる
画像ファイルはおおむね長辺640ドットのJPG形式。しかし、アスペクト比は一定ではなくいろいろなサイズが混在しており解像度を調整する必要がある。しかし、画像から焦点距離を推論する場合、アスペクト比の異なる画像を一律、同じ解像度にすると縦長ないし横長になって悪影響を及ぼさないか、と頭によぎる。結論として、アスペクト比を維持したまま長辺が160ドットになるよう縮小し、足りない上下ないし、左右にグレーの帯をつけることにする。
Pythonでスクリプトを書く
処理対象の画像ファイルに対して、解像度変換とEXIFデータの取り出し、パス+ファイル名,焦点距離の形式でCSVファイルを作成するスクリプトを書いて、実行。
NNCで学習を行うためのファイル作成。
とりあえず2000枚で試してみることにして、Trainに1800枚Testに200枚を当てる。
作成したファイルを開き、まずランダムに並び替え。ファイル名順だと同一被写体、同一シチュエーションの画像が近接するのでできるだけいろいろなデータが得られるようにこの処置。Train用として上から1800枚を切り取り、別ファイルに貼り付け、1行目にNNC指定ののヘッダ(x,y)をはりつけ、CSV形式で保管。同じ行為をTest用として200件で実施。Excelで作ったCSVファイルは条件によりUTF-8(BOM付き)となってしまい、NNCでの処理時にエラーが出るので、メモ帳で再度開きUTF-8として上書き保存。
4NNCで実際に学習してみる
4層ほどのCNNを作って画像から焦点距離を推測できるかを試してみる。
小一時間待って、結果を見てみるとどうもいまいち。改めて画像を一枚ずつ見てみる。
これ、トリミングされてるやん。
画像ファイルのEXIFに記録される焦点距離はカメラないし、RAWファイルを現像しJPGにするときに現像ソフトが記録する。EXIFは撮影時の条件を記録しているだけなので、現像時あるいは現像後にトリミングされても焦点距離は変化しない(多分)。つまり、トリミングされた画像では、画像内に焦点距離を表す情報は含まれておらず、学習できないのでは?
焦点距離の説明
https://www.rentio.jp/matome/2018/04/beginner-guide-focal-length/
5振り出しに戻る
画像分類を行う手間や労力をすくするため焦点距離を使うこと、焦点距離別に分類して適当な名前をつけることを考えたが、画像と画像に記録された焦点距離に関係が薄いことがわかり振り出しに戻る。