雑多なノート

プログラミング初心者がメモとかを書きます。基礎的なこともメモとして。偏食系のアニオタ。

ネイティブプラグイン(aar)で外部ライブラリ(aar,jar)を使う

Android Studioでモジュールを作成して実行したらクラスが見つからないというエラーが出てしまった
gradeに書いてモジュールを作ったわけだけどaarファイルには含まれないらしい
Unityが見つけてくれないだけかもしれないけど

Assets->Plugins->Android->libsに置くことで認識してくれた

Failure to initialize, your hardware is not supported

Android上のUnityでネイティブプラグインを使ったアプリを作ってたときのこと.
外部ライブラリを追加した時点でこのエラーが表示されて起動しなくなった.

どうやら追加したライブラリのAARファイルにarmeabi-v7a以外の端末向けのネイティブコードが入ってたのが悪いらしい.
対応してないアーキテクチャ用のネイティブコードが入っていると混乱するんだとかなんとか.

消せばいいらしいが自分でビルドしたライブラリじゃないのでどうしようかと思ったらaarファイルを展開してディレクトリ消すだけで動いた.
aarファイルはapkファイルと同じく中身はZIPなので拡張子を.zipにするだけでエクスプローラーから見える.

jni以下にアーキテクチャ別にディレクトリがあるのでarmeabi-v7aを消す.
自分の場合はarm64-v8aとx86x86_64があったので消した.
消す必要があるのは一部だけっだったような気もするけど面倒だったので全消し.

これを再圧縮してUnityに突っ込んだところ無事動いた.


Error | Unity Community

tensorflowでfine-tuning

自前の画像で画像分類を行うfine-tuningを試してみる
まず必要なライブラリ群をそろえる

色々試したけど最終的に以下の内容で落ち着いた
かなり回り道をしたので色々間違ってるかもしれない

  • Bazel
  • Miniconda2
    • 最初は3.6でやったけどAndroidアプリのビルドでエラー出たので2.7に切り替え.設定ファイル弄れば回避できるらしかったけど不慣れなビルドツールで変なことしたくなかったので安定を選んだ
  • Numpy
    • Pip install numpyとapt-get install python-numpyの両方が必要だった


ソースコードはお馴染みのgithubから持ってくる

$ git clone https://github.com/tensorflow/tensorflow 
$ cd tensorflow
$ git checkout Branch


公式のチュートリアルに従って行う
まずはトレーニング用の画像を持ってくる
自分で用意しても良いんだろうけど今回は試しなので用意されているものを使う

cd ~
curl -O http://download.tensorflow.org/example_images/flower_photos.tgz
tar xzf flower_photos.tgz

中身は花の名前の付いたディレクトリが5つあり中には画像ファイルが600-800程度入っていた
このディレクトリ名がクラス名になるらしい
ディレクトリ名が自動的にクラス名になるのは簡単でいいかも

続いてビルド

bazel build tensorflow/examples/image_retraining:retrain

corei7のデスクトップパソコンで30分ほどかかった
初回のビルドが終わると次回からは早いらしい

そしてfine-tuningを行う

bazel-bin/tensorflow/examples/image_retraining/retrain --image_dir ~/flower_photos
    • image_dirには先ほどの花の画像群を展開した場所を指定する

私の環境ではpythonのモジュールが足らないだののエラーがでたのでpipでインストールを行った

このスクリプトを実行するとgoogleが作った高性能なモデルinception v3がダウンロードされそれに対してfine-tuningが行われる
正直中で何をやっているのかよくわからない

fine-tuningだからか思ったより学習には時間がかからなかった
学習されたモデルは/tmp/output_graph.pbに出力されラベルファイルが/tmp/output_label.txtに出力される


これで学習が完了したので実際にラベリングして確認してみる
先ほどと同じようにビルドと実行を行う

bazel build tensorflow/examples/image_retraining:label_image
bazel-bin/tensorflow/examples/image_retraining/label_image \
--graph=/tmp/output_graph.pb --labels=/tmp/output_labels.txt \
--output_layer=final_result:0 \
--image=$HOME/flower_photos/daisy/21652746_cc379e0eea_m.jpg

これで結果が出れば完了

bazelのインストール

なんとかアプリもリリースできたので次はディープラーニングだと思ってとりあえずデモ動かしてみることにした.
まずはビルド環境の導入.

Tensorflow導入のためにビルドツールBazelのインストールを行った
最初仮想環境のUbuntuでやろうとしたらメモリ不足で固まったのでBash on Windowsで行った
基本的に公式のチュートリアル(Ubuntu)の通りにやったらできた.

まずJDKのセットアップ.

sudo apt-get install openjdk-8-jdk

最新は9らしいが8を入れないと失敗する.
またUbuntu環境でやったときは先に2のリポジトリ追加を先にやったら失敗した

次にリポジトリの追加を行う

echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -

そして普通にインストール

sudo apt-get update && sudo apt-get install bazel


これで成功
入れるJDKのバージョン間違えたり先にリポジトリ追加しちゃったりして無駄に苦労してしまった

「SF Keeping」をリリースしました

Androidアプリ「SF Keeping」を公開しました.

play.google.com


名前から分かる通り交通系電子マネーの履歴を読み取るアプリです.
f:id:vayacico:20170825115240p:plain
目玉機能として家計簿サービスZaimとの連携機能を持っています.
こんな感じで履歴データにジャンルやカテゴリの情報を付加してZaimへ登録することができます.
f:id:vayacico:20170825115412p:plain
決済端末のIDと紐付けることによって一度利用した店舗は次回から自動で入力されます.
f:id:vayacico:20170825115800p:plain
簡易的ですが共有機能と店舗名自動取得機能ももってます.
端末IDは一意ではないらしく同じ端末IDを持つ店舗もあるらしいですがそこまでバッティングしないかとは思います.
一応ダブった場合でも選択できるようにはしてあります.


このアプリを作った経緯としては結構個人的なことが大きく,必要に迫られて作った感がありあます.
まぁ簡単に言うとオートチャージが便利すぎて使いすぎただけなのですが.
使いすぎたと思ってクレカの履歴見てもオートチャージとしか書かれてなくて何に使ったか分からないという状況に陥ったのが主な動機です.
その都度記録しろよという話ではあるんですがそれができたら使いすぎはしないというもの.
まぁそんなわけで「Suicaから家計簿に自動記録出来たら便利じゃね?」と思って作った次第であります.
店舗IDが一意でないという罠はありましたが自分で試した範囲だと被りはなかったのでそこまで被らないのかもしれません.
基本的にコンビニと食堂でしか使わないというのもありますが.

というわけで良かったら使ってやってください.

最後に,駅コードのデータベースの利用を許可してくださったDENNO NET様にこの場で感謝させていただきます.
ありがとうございました.

Suicaの入出金判別アルゴリズム

Suicaのデータを読み取ったは良いけど組み合わせが微妙に複雑
解説サイトによっても書いてることが違っているので自分のSuica使って調べたのをまとめてみる.

  • 機器種別:0x16(改札機)
    • 利用種別:0x01(出場)
      • 入出場種別:0x04(定期出場)
      • 入出場種別:0x02(通常出場)
      • 入出場種別:0x03(定期入場)
    • 利用種別:0x14(オートチャージ)
  • 機器種別:0xC7(物販)
  • 機器種別:0xC8(自販機?)
  • 機器種別:0x05(バス)

自分の環境ではこんなもんだった
色んなところで使ってけどここから外れたものは見つからない
wikiにはもっと沢山パターンあるんだけどどんな場合に見れるんだろ

とりあえずこれを実装した結果
f:id:vayacico:20170707232421p:plain

とりあえず上手くいってる
自分のSuicaをベースにしてやったからうまくいくのは当たり前だけど

卓上カレンダーの電子化

暑さにやられて衝動的にけものフレンズの卓上カレンダーを電子化した
C#でフォームのコントールと枠消してスキャン画像貼り付けてるだけだけど
一応日付によって変わるようには作った
今は亡きガジェット的な感じで

f:id:vayacico:20170701002109p:plain


勢いで作ったけどなんか微妙…
画面サイズのせいで小っちゃいし
うーん

家には置きにくい研究室も情報系の癖にあんまり置ける雰囲気じゃないから仕方ないとはいえ他にいい方法あったよなー
貴重な金曜日の夜に俺は何してんだかねー