Androidアプリ開発」カテゴリーアーカイブ

画像分類アプリ 諦めました

今までAndroid上で動く画像分類アプリを作ろうと試行錯誤していましたが、就活が忙しくなってきたこと、完成の目処が立たないことからお蔵入りになりそうです。せっかく頑張ったのに陽の目を見ないのも悲しいのでせめて開発の過程で何を行い、何を学んだかをここに記したいと思います。

やろうとしていたこと

1.Android端末内の画像をサーバにアップロード

2.「Caffe」にて画像分類

※Caffe:機械学習で画像分類を行うツール。大量に用意した画像データをもとに機械学習を行うことで分類器を作成でき、この分類器に画像を投げると何が写っているのかを教えてくれる。

3.結果を端末で表示

たったこれだけ 超シンプル

辞める理由

1.精度が出ない

とりあえずこちらのデータセットを拝借し猫の品種を判別する分類器を作成してみたのですがどんな画像を投げても同じような値が出力されてまともに分類できませんでした。仕組みを理解せずブラックボックスのままツールを使用していたため改善策も思いつかず途方に暮れています。

2.学習にお金がかかる

分類器作成の際には膨大な量の処理を行うためハイスペックなマシンが必要です。AWSで無料で借りられるマシンではスペックが足りずスケールアップをする必要があるのですが、$0.23/時間の料金のマシンで12時間ほどかかります。また、学習終了時に外出していたり就寝していたりするとスケールダウンをするのが遅れるため余分に料金がかかってしまいます。大きな額ではないのですが貧乏学生には手痛い出費です。上手く行けば学習は一回だけで済むのですが、今回失敗した以上次成功するとも限らないためどの程度の費用がかかるか見通しもつきません。

3.意義を見出せない

先日公開された「Google Cloud Vision」のベータ版を使うと自分で分類器を用意しなくても簡単に画像分離ができてしまいます。Googleが提供しているAPIだけあって精度もべらぼうに高いです。こいつの存在を知った時モチベーションが崩れ落ちました。

やったこと

AWS

  • EC2でサーバを借りた(OSはUbuntu)
  • XAMPPのインストール
  • 固定IPアドレスの割り振り
  • Route53でドメインの取得

Android

  • ギャラリーを呼び出して端末内の画像選択
  • OK HTTPを用いた画像データのPOST
  • プログレスダイアログの表示
  • 画像分類ツール「Caffe」のインストール&学習 (これが一番辛かった)
  • PHPでコードの記述(echo、shell_exec、$_FILES)

おわりに

スーパープレゼンテーションというテレビ番組で機械学習による画像分類の存在を知ってすぐに「試してみたい!」と思いました。しかしネットを探しても素人が簡単に試す方法は見つからず、ツールのインストールから画像の用意、学習までを自分で行わなければいけませんでした。この面白い技術を誰でも手軽に使って遊べるようになればと思い今回のアプリ開発に着手したのですが、Cloud Visionがまさに私がやりたかったことを実現しており、わざわざ自作する必要もないのかなと思い開発を断念しました。完成させられなかったのは残念ですが勉強にはなったので良しとします。

Cloud Visionは従量課金制であること、サンプルを動かすにもある程度の知識を要することから誰もが使えるというわけではありませんが、今までよりもハードルはぐっと下がったように思います。時間ができたらCloud Visionを使ってブラウザ上で誰でも画像分類を試せるようにしたいなぁ(APIキーの秘匿とリクエストの制限がめんどくさそう)

【Android】HTTP通信がSPモードフィルタに引っかかる

以前紹介したOKHttpを用いたサーバとのHTTP通信ですが、普段使いの端末ではやたら長いHTMLタグの羅列がレスポンスとして返ってきます。

こんな感じ。

Screenshot_2016-02-25-02-45-33

文字列が長過ぎて見切れてしまっているのでAndroid Stutio上のログを確認。すると

「アクセス制限エラー http://www.xxxにアクセスできません」

の見慣れた文字が。

どうやら未成年Docomoユーザならお馴染みのSPモードフィルタによってサーバとの接続が制限されているようです。

フィルタリングサービスは携帯の契約時に加入させられ、その後成人しても解除せずにずるずると使い続けています。まさか自作で立てたサーバが制限対象になるとは思いませんでした。

他の開発者さんはどうやって対策をしているのでしょう。どこかに申請すればフィルタリング対象から外してもらえるとか?ググってもしっくりくる情報が得られません。

とにかく、アプリ開発時にHTTP通信を行う際にはフィルタリングに引っかからないように手を打つ必要があるようです。せっかくアプリをダウンロードしてもらっても使えないんじゃ意味無いですからね。

【Android】プログレスダイアログ(処理待ちのぐるぐる)を表示する

以前こちらの記事で端末内のデータをサーバに送信するためのコードを書きましたが、処理を開始してから結果が返ってくるまで若干時間がかかってしまいます。ボタンを押しても画面が白いままでは味気ないので処理中にプログレスダイアログを表示することにします。

参考にさせていただいたサイトはこちら

技術脳塗 非同期(スレッド)処理中にプログレスダイアログを表示する (シンプル)
https://sites.google.com/site/technoute/android/thread/thread_progress

上記サイト中の青文字の部分を自分のプログラムにコピペしただけで動きました。Nexus 5のエミュレータ上ではこのように表示されます。
amarecco0046

 

蛇足かもしれませんがコードも載せておきます。参考サイト中のコードはとてもシンプルでわかりやすいのですが、そこから更にプログレスダイアログ以外の部分を削げ落としております。とりあえず動かしたい人向けです。

【PHP】Android上でPHPスクリプトの実行に手間取った話。

開発中のアンドロイドアプリにてサーバにアクセスし、phpスクリプトを実行して結果を表示する機能を実装しようと試みました。

スクリプト内では外部コマンドを実行する関数(shell_exec)を使ってpythonのスクリプトを動かしています。このphp、ターミナル上では問題なく実行できるのですが、アンドロイドでは上手く行かず端末の画面は真っ白のままです。

原因を探るためにshell_execの部分に「2>&1」オプションを追加しました。

echo shell_exec( 'python ファイル名.py 2>&1' );

コマンド実行時にエラーが発生した際、通常はnullが返ってくるのですが「2>&1」オプションをつけるとエラーメッセージが返ってきます。

オプション追加後アンドロイドから実行すると画面には「ImportError: No module named xxx」と表示されるようになりました。どうやらモジュールのインポートに失敗しているようです。

恐らくですが、アンドロイド端末からの実行の際にはPYTHONPATHの設定が適用されないのだと思います。

そこでpythonスクリプトに以下の文を追加しました。

import sys
sys.path.append("/xxx/xxx")

/xxx/xxxにはエラーメッセージ中に書かれていたモジュールが格納されているディレクトリの絶対パスが入ります。これを記述することでライブラリを読み込むディレクトリのパスをpythonスクリプト内から指定できます。

これでようやくアンドロイドアプリでphpスクリプトの実行ができるようになりました。

【Android】OKHttpで画像ファイルをPOSTする

OKHttpを使ってjpegファイルをサーバにアップロード出来るようになったのでコードを載せておきます。

コメントが付いている部分だけ変更すればとりあえず動くはずです。コメント無いところはおまじないです。

サーバ側のPHP
ファイルを受け取ったら自身と同じディレクトリに保存する。