鈍足ランナーのIT日記

走るのが好きな5流のITエンジニアのブログ。

趣味の範囲は広いけど、どれも中途半端なクソブロガー楽しめるWebアプリを作ってあっと言わせたい。サーバーサイドPerl(Mojolicious)、クライアントサイドVue.js。Arduinoにも触手を伸ばす予定。

Gotanda.pm Petit-Hackathon楽しみました

どうしてもつくりたいアプリがあった

vis.jsを使って、どうしても作りたいアプリがあったので申し込みました。
7名程度だったので、懇親もできそうだし!
気合を入れて、七時過ぎに行きましたが、@karupaneruraさんが先におりまして
雑談しながらアプリを書いて行きました。
モバイルファクトリーさん、会場&お菓子提供ありがとうございます。

はかどりました

DB系のテストをどうするのかとか、Win32対応の仕方など、議論を聴きながら、
自分の実装に没頭。
jsの実装、forEachでやるべきところをfor inと書いていてハマしましたが、
まずは、動くところまでいけました。感謝感謝。かなり集中してコードが書けました。

懇親できたっす

@CodeHexさんや、@kfly8さん、@yukikimoto2さんと同席で、YAPC::沖縄の話やら、
大学での研究の話題など盛り上がりました。楽しかったです。
遠方でなければ、もう少し入れたのにー。

そんな感じで、楽しめました。

夏休みのギリギリですが自由研究終わりました!機械学習でアブラゼミとクマゼミの抜殻を見分けられるか?

自分に課したこの夏の自由研究。
機械学習でセミの抜け殻で、セミの種類を分類するを
なんとかやることができました。

今回用いたのはMxNetというライブラリのPerl版を使いました。

こちらがアブラゼミの抜け殻
f:id:kechiya:20170826141156p:plain
こちらがクマゼミの抜け殻
f:id:kechiya:20170826141140p:plain

どの方向で撮るのがいいのか、よくわからなかったのですが、横向きにして見ました。

ただし、アブラゼミとミンミンゼミの抜け殻は私の目には区別がつかなくて、
ミンミンゼミの抜け殻も混ざってしまっていると思います。

ソースはこちらです。
github.com

とりあえず、8割ラインの識別はクリアしました。
学習データ30枚、テストデータ15枚の貧弱な構成となっています。
内部ではグレースケールに変えて読み込んでいます。

協力者募集中

白い背景で128x128pixのjpg抜け殻の画像データをプルリクエストなどで
いただけると喜ぶかもしれません。
ツクツクボウシ、ヒグラシなど絶賛募集中です。
このモデルを発展させて、来年の小学生の自由研究に活用していただける方が出たら面白いかもかも?!

ミンミンゼミ、クマゼミ、アブラゼミの分類を機械学習させる

教師あり学習なのでセミの抜け殻に詳しくならないといけません。

blog.goo.ne.jp

触覚に毛が多く、触覚の2節より3節が長い→アブラゼミ
触覚に毛が少なく、触覚の2節と3節が同じ長さ→ミンミンゼミ
おへそがある→クマゼミ

PerlでMNISTを画像ファイルでやりたい

AI::MXNetを最近使って機械学習を勉強中。
0-9の手書き文字の認識するサンプルMNISTはサンプルコードもあるのですが
MNISTデータは28*28次元のバイナリデータでして、応用しようとしても
そのままだと使いづらい、画像データ(pngなど)でやりたいのです。

Githubを調べた結果MNISTのバイナリデータをpngに変換するツールがありました。
github.com

pngファイルになりますので。コントロールファイル形式(パス一覧のようなもの)のファイルをperlスクリプトで作りました。

use strict;
use warnings;

open my $train, ">./training.ctl";
open my $test, ">./testing.ctl";
my @png = glob "./*/*/*.png";
for my $png(@png){
  $png =~ /(training|testing)\/(\d)\/(\d+)\.png/;
  my $file;
  if ($1 eq "training" ){
      $file = $train;
  }
  else{
      $file = $test;
  }
  printf $file "%s\t%s\t./%s/%s/%s.png\n", $3 , $2, $1 , $2, $3;
}

close $train;
close $test;

コントロールファイルの内容はこんな感じです。

index    label    pngファイルのパス

コントロールファイルから今度はmxnetのファイル形式のrecord形式に変えてあげます
im2recというコマンドがmxnetには用意されています。color=0とする所が肝です
グレースケールのrecordファイルになります。

im2rec testing.crl ./ testing.rec encoding=.png color=0

詳細は、以下を参照してください。
github.com

テストが通らない!!

しかし、テストが通らない。仕方ない甘えではありますが、Issueを発行して
聞いてみようということで聞いてみました。

github.com

AI::MXNetモジュールの作者さんから回答があっという間にいただけました。
感謝の極みです。データをシャッフルしないとだめとか、色々と添削をいただきました。
これでテストが通りました!!!

やっと、次の段階に進むことができます。

AI::MXNetでイメージのロードに挑戦できた

 use AI::MXNet qw('mx');                                                     
 my $ite = mx->img->ImageIter(
   {path_root => "" , batch_size => 1, data_shape=> [3,224,224],label_width =    >1, path_imglist => "data/custom.lst"});
  for $data (@{$ite}){
    print $data->[0];
 }

Use of uninitialized value $fname in concatenation (.) or string 

エラーを吐いて読むことができない。
これはバグなのかpath_rootを渡したいのだけど、渡せないのはなぜだろう。。。

github.com

バグだったようで、作者の方から迅速な返事もあり。解決しました。サンプルソースまで添削していただけました。
どんどん、アウトプットしていきましょう。
jpgなどの画像データをパスリスト作っておくとndarrayへ格納できるようになります。
data_shapeと画像のサイズを揃えて置かないと叱られますので注意です。

  1  use AI::MXNet qw('mx');                                                    
  2  use Data::Dumper;
  3  my $ite = mx->img()->ImageIter(
  4  {  batch_size => 1, data_shape=> [3,183,275],label_width =>1, path_imglist     => "custom.lst", path_root => '.' });
  5  for $data (@{$ite}){
  6    print Dumper($data);
  7    print $data->data->[0]->aspdl;
  8    print $data->label->[0]->aspdl;
  9  }