catalinaの備忘録スマートフォン用の表示で見るcatalinaの備忘録ソフトウェアやハードウェアの備忘録。後で逆引きできるように。黄金週間なので趣味プログラミングに没頭です。MTGのカードの種類を識別するPythonモジュールを作っていきたいと思います。今回でPython側でchainerを使う部分はひとまず完成です。525GChainerで学習させる前回Chainerをいじったとき、識別率が60%くらいで頭打ちになってしまいました。http://catalina1344.hatenablog.jp/entry/2017/04/09/222330せめてもう少しまともに識別できるようにしたいので、まずはここから。AlexNetを真似してみるalexnetを真似して、前回の学習モデルを少し改造してみました。畳み込み+MaxPoolingの層が3層、線形結合が3層です。最後の層の出力274が1-of-k符号化されたラベルそれぞれの確率です。dropoutや正規化は今は入れていません。h学習用のデータを学習モデルに合わせるMTGのカード画像は長方形なのですが、CNNの実装では正方形の画像を前提としていることが多いです。長方形画像を分類するNNを実装する方法がわからず仕舞いなので、入力画像自体を正方形にcropすることにしました。前回作ったデータ水増し用のプログラムにcrop機能を追加します。OpenCV便利ですね。img.clone();}これでwとhに同じ値を与えれば正方形にcropできます。w=h=223としました。して切り取ってノイズを付与して水増しすると次のようになります。ちなみに、カードのテキスト部分にも分類するための情報は含まれていますが、イラストのほうが情報量が多いのでイラスト側を残すことにしました。「わかったぞ!わかったぞ!わかっ・・・」みたいにフレーバーテキストだけで判別できるものもありますが、今は置いときます。ちなみにMTGのカードって、ある時期からプレインズウォーカーだけカード名に頭がめり込んでいるような気がします。(最初気づいたのは「世界を目覚めさせるものニッサ」のとき)昔はカード名の部分は見切れてた気がするのですが。学習結果を保存するchainerのexamplesが出力するスナップショットは識別フェーズでは使わない情報がついています。識別フェーズで必要なのは学習済みのモデルのデータ(重み係数とかバイアス項とか)なので、モデルだけ保存するコードを追加します。nn)Classifierの返すモデルでは損失関数を付与したモデルになってしまうので、その前でインスタンス化したネットワークをとっておき、学習終了時にこれをserializerで保存します。これで生成されたモデルのnpzファイルは10MByteくらいになりました。このエントリを書き終わってから気づきましたが、識別フェーズでもsoftmaxを通すので、別にClassifireしたモデル保存してもいいのかもしれません。学習の経過はこんなグラフになりました。前回は60%前後の正答率で打ち止めだったので、この数字だけ見ると改善はしているようです。過学習気味(学習用の水増しデータが似たようなものが多いから?)かもしれませんが、今の私には判断つかないので次に進みます。実行にかかる時間は、ミニバッチサイズ100として20epoch回すのに30分程度です。SSDの容量が厳しくなってきたのでHDD上に画像データを置いて実験しましたがお話になりませんでした。学習済みモデルをPythonで読み込んで使うコマンドラインから実行する実験コードを書きました。-iオプションで与えた画像ファイルを読み込んで、それをNNに入力してから結果を観測するだけのものです。main()学習に使ったデータとかを適当に突っ込んでみます。"dataset/121/121_3.png"output/121/121_3.pngresult=121とりあえず分類はできているようです。ピクセル列を4次元テンソルに変換している部分はchainerのdatasetあたりのコードから引っ張ってきたもので、理屈はまだよくわかっていません。(特に最初の次元は何を表しているものなのか。)感想これでMTGのカードのうち「カラデシュ」は分類できるようになりました。コマンドラインから叩くだけでは感動は少なめですが、ARアプリのための土台ができつつあります。「274種類のイラストを分類して任意のモデルを表示できる」という部分だけを誇大解釈すればVuforiaを超えたかもしれません。分類ラベルを増やすとどうなるか実際の映像からの分類でどれくらいの精度が出るかなどがあると思います。前者は学習時間がかかるので、夜間とかに実行しておくなど時間を有効活用して研究したいと思います。MTGはカード種類が多いですが、所詮は人工物なので階層的な分類が効果的なのかもしれないと思っています。(エキスパンションを識別してから、特定エキスパンション内で分類するなど)後者はHoloLensと連携できるようにしてから改善していく予定です。実際にモノを動かしながらやったほうが楽しいですし。次の予定これでカードイラストからカードを分類する仕組みをPython上で実現できました。次はいよいよHoloLensとの連携部分です。データの収集と分析といえばfluentdですが、HoloLens上に載せるには少々敷居が高そうです。HoloLensからChainerを走らせているPCへHTTP/PUTして、HoloLens側は分類結果を受け取るのがいいかなと思っています。それでは今回はこれくらいで。chainercvが0.6になって、rcnnの実装のひとつであるSSDの...2017-08-05外出先からDNNの学習状況を確認したい今回はchainerでの学習進捗を見るのが目的ですが、あんまりchai...2017-07-20カードゲームARの実現可能性検証なんとなくですが実現可能性は高い気がしてきました。»プロフィールid:Catalina1344ソフトウェアやハードウェアの備忘録。後で逆引きできるように。OpenMVSで3D再構築するOpenMVGを試してみる(環境構築+α)父の日ですね月別アーカイブ忍者AdMaxはてなブログをはじめよう!Catalina1344さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。