機械学習ダイアリー ~CNNおさわり編~

お客様、当店ではおさわり禁止となっております。いいじゃないの減るもんじゃなしぐへへ。
こんにちは、やっと学習走らせるまでに至ったmzです。

内容的に機械学習を学習する関連メモとかぶる部分があります。でもそんなの関係ないね。

これは何?

機械学習童貞がはじめての体験でキャーキャー言ってるだけなの日記。既にチェリーを捨てた人が得るものは何もありませんしそもそも機械学習にキョーミがない人にもいまいちな読み物であることでしょう。
それでもいい? よし通れ。

目的

そもそものはじまりは「声質変換」ひいては「合成音声」をやりたい! であった。
でーtacoやらmellotronやら触れたはいいが、学習で出力されるハズのcheckpointが出ない。0byteや40byteのカスみたいなファイルがちょろちょろ出るばかりである。便秘なのか下痢なのかはっきりしたまえ。
filelistの書式がまずかった気がしてるのだが確証は得られず、とりあえず実動させ感触(=初心者にもワカりやすい手ごたえ)を得るためにも次なる目標となる画像生成(CNN)へと着手するのだった。音声関連はRNNが主流、と思ってたけどCNNですごいのもあるみたい。

一応ウチなりの理解としてそれぞれ所感を書いておこう。ちゃんとした解説はそこらにごまんとあるし。

 CNN Convolutional Neural Network
畳み込みと呼ばれる、ひとつの圧縮をもって学習するNN。
ちょっと前に配信内でアンチエイリアス(以下AA)技法にたとえた。それに沿った解説をしてみる。

AAとはフォント等のジャギー、ドットでカクカクしたとこを見目良くスムースに、ヌルッと整える効果のこと。フォントに限らずフツーに画像でもいい。フォントも画像だたわけめ。てなわけで以下はフォントのAAについてです。
ひとつのピクセル(1×1)の色を決めるのに、たとえばその周辺3×3=9ピクセルの領域を見る。そして9ピクセル中7ピクセルが文字色としたらその平均をとって実際のピクセル値を決定する。
文字ピクセルの濃度だけでなく背景色になじませなきゃいけないので……

fontColor / 9 * 7
backColor / 9 * (9 – 7)

このふたつを加算したものがピクセルカラーとなる。文字色の値が0(Black)でも背景になじんで安心。逆になんか汚く見えることもあり得る。どこが安心じゃい!

CNNでもこの3×3、まあ別に3×3でも5×5でもサイズは任意で決められるのだが一定の領域を見て手がかりを探る。
この領域を【フィルタ】といいますねん。今日はこれだけでも覚えて帰ってください。
畳み込みではピクセルの色ではなく特徴マップに書き込む。その前に活性化関数通したりするけどこまかいこたぁいいんだよ。概念さえ伝われば。
そのあとに用いられるプーリングと呼ばれる処理も圧縮と呼ぶにふさわしい工程。なんだけど昨今はこれが「無い方がええやん?」とはぶかれる傾向らしい。

 RNN Recurrent Neural(ry
再帰型のニューラルネットワーク。連続性のあるデータ、時系列含むデータを扱うのが得意。音声のほか文章の前後関係を見るとかそんなん。
なので音声合成といえばこれや! と思ってたのだが前述のとおりCNNによる合成音声も発展してるらしいよ。
こっちはCNNほど詳しないねん、ごめんな。

最終的には音声もやるとして、今は画像認識と、抽出した特徴量で画像生成が目標。音声でやりたいことも似たようなトコ。

アノテーション激闘編

進捗実際どうなのかってぇと、ここ数日ラベル付きデータ用意するのに奔走してて昨日やっと画像10枚ぶん完成。
このラベル付け作業をアノテーションといいます。
言葉の意味はまあまあワカっても、何を隠そう(隠してない)こちらは素人童貞。プロ童貞でもある。どう足掻いてもガッチガチの童貞なんですがそれは。
というわけでまずはアノテーションのやり方を調べる。

アノテーションツールとして名前をよく見るのがvottとlabelImg。vottはかのMicrosoft御大からリリースされており、こちらへ飛びつくmz。
ver2.2のexeをDL、実行するとインストーラじゃなくいきなり実行ファイルで軽くちびる。嘘、ちびってない。くしゃみや屈んだ拍子にモニョモニョってことは、まあ、うん、年だから。
ともあれラベリング作業を行う。画像はCOM3D2で素っ裸の女の子をキャプチャして使用。なんで素っ裸かっていうと私のヘキ、ではなくて人体学ばせるのに服が邪魔との判断のもと。簡単にいろんなポーズしてもらえるんで便利です。
こういう素材って通常は既存のデータセット使ったりスクレイピングで得るわけだけど、小データであれ、第一に自分が思うように学習させられる状態を作りたいんですね。いきなり42GBのデータセットなんて使わんでしょ。これもGoogle Colabの容量足りんくて落とせないのが困ったちゃんなんだが。
余談ですが女の子はもずにゃんによく似た子を作りました。微妙にリアル系の顔立ちになってる。素っ裸の画像しかなくて見せられませんがメガネをかけてないことだけ申し添えておきます。そのうちメガネっ娘も学習させたい。

アノテーションで次の画像へ移る際、勝手に保存(成果が生成)される。出力を確認すると、なんかjsonファイル。
これをどうにかして画像とセットで読み込ませるのか? そう思ってた時期が俺にもありました。
出力されたjsonのファイル名が、”3d8bc4ce56fほにゃらら-asset.json”みたくわけわかめな名前なんですよね。でー中に対応する画像ファイルのパス記述がある。

( ゚-゚).。oO( お前それローカルで生成したらColabで使えんやんけ!

ってなるよね。なったけど、なったのは散々アノテーション作業で試行錯誤してからのこと。
そのうえコチラ

どうやらv2のバージョンはYOLO形式を対応していないようです。(使えないじゃん!)

の文言を拝見、YOLOとはなんぞや、となりつつ猛烈にいやな予感がするのう、とvott切り捨て大決定! FuXk!!
他と出力データ形式が一緒のワケないしここまでのアノテーション作業はパア。なぜオレはあんなムダな時間を……

次に目星つけたのがlabelImg。
調べる限りGUIっぽいが配布はソース……? win10民に帰化して久しい私、混乱。lubuntuは心の故郷。普通にubuntuでエェやろ。
もはやどうやったのかうろ覚えなんだけどcmdからpipでインストールできたはずだ……が、どこから起動するのかわからーぬ。
確かインストール後のメッセージで「labelimgは(user folder)\AppData\Roaming\Python\Python36\Scriptsにインストールされてるよーん」などほざきよるから見に行ったらexeがあり、デスクトップにショートカット置いて事なきを得た。
vottにあった多角形領域指定ができないのは悲喜こもごもといった風情で、領域指定が簡素化するメリットと細かく指定できないデメリットが同居。たとえばvottで髪のギザギザしたとことか指定できなくなったからhairラベル自体なくした。headでエェやろと。もひとつ、vottで四肢を左右の上下肢、手足まで分割して指定してたのだがlabelImgへ移行後は左右分けるだけで腕~手、脚~足をいっしょくたにしてしまった。あなた疲れてるのよ。いやそれも尤もだが微に入り細に入る指定ができなくなったのもあるよね。
ざっくばらんな領域指定と、こまかーーーくやれる指定と。NN的にどちらがいいのか私には判断つかぬ。座標情報の多い多角形のが時間かかりそうなのは言うをまたぬがざっくばらんで雑味が多いのもまた精度を低める要因になりそうでな。

そういう事情もあってlabelImgによるアノテーションは非常に楽ちん。出力ファイルも画像ファイル名を引き継いだシンプルなテキストファイルだ。中身はクラス(ラベル)インデックス・矩形の座標情報のみとこれまたシンプル。こういうのでいいんだよこういうので。
でーvottのときはjsonから更なる変換作業が必要と判明してたがlabelImgはそこまで難しくない。一応train.txtとtest.txtっていう訓練と評価それぞれで使うファイルリストが必要になり、それ準備する用のprocess.pyてのもdarknetパッケージに用意されてる。でもうちほどファイル少なきゃ手動で全然用意できる内容、ただのシャッフルしたファイルリストだし。

darknetとYOLO

ここにきて突如現れたdarknet. これはフレームワーク(開発環境寄りの何かと思いねぇ)で、この上にいろんなものを乗せて走らせる。今回はYOLOをのっける。
darknetのColabへのインストールはコチラを参考に行った。darknetフォルダ内でmakeするだけで簡単、所要時間それなり。他のもろもろも上記をソースに行ってるんでこれから何か始める人はウチよりあちらを見たまえ。
Colabで動きゃいいからローカルにdarknetインストールする必要はないよ、してもいいけど。cloneだけ必要。

YOLOは優れた物体検出システム。やっと指先が触れた程度の私に詳しく聞かないで。ここで詳しく説明されている。
うち新参者なのにバージョン依存問題についてわかりみしかない。CでコーディングされてるってのもかつてC++畑で育った私にゃ親近感。

darknetは入ったがYOLOはどこじゃい、と私なんぞは愚考したもの。ですが特段git cloneなど必要なし、あらかじめdarknetにおおよそ含まれてる。少量のファイル作成・編集など多少お膳立てをしてやるだけでいい。(上記リンク先参照)
このお膳立てもColab上でできなくもないかも? でもめんどいからローカルでやるのがいいかと思う。

学習開始に至るまで上記リンク先でやれたがひとつ謎が。下記学習開始コード引用。

! ./darknet detector train task1/crater.data task1/yolov3.cfg darknet53.conv.74 -dont_show -map

crater.dataとyolov3.cfgがヨクワカラナイ。
拡張子でアタリをつけて

! ./darknet detector train obj.data task1/yolov3-obj.cfg darknet53.conv.74 -dont_show -map

としたらもりもり動き出した。でもobj.dataの置き場所間違えてんかなコレ。
cfgファイルはまあ、あれコピって編集したやつ使わんの? ってなるわいな。crater.dataに関してはいきなり出た名詞なもんだから「誰だお前は!」になるよね。地獄から来た男!
私がなにかしら見逃してるだけなら申し訳ない。