2018.01.12 独言

TENSORFLOW LITEを試してみた。

 

社内の研修にてTENSORFLOW LITEを試してみた。

目次

TensorFlow Lite

TensorFlow Lite

  • https://www.tensorflow.org/
  • https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/lite
  • モバイル用途などでの軽量なTensorFlow
  • 現在デベロッパープレビューの状態

転移学習(transfer learning)

  • すでに用意されているモデルデータを流用して独自モデルを構築する
  • ゼロから学習するより高速

TensorFlow Liteのデモアプリ

デモアプリのモデルデータの差し替え

  • 転移学習によってモデルデータを構築し、デモアプリのモデルの差し替えを行う
  • 転移学習および差し替えの方法は以下のページに書かれている通り:
    • TensorFlow用のモデルの構築 https://codelabs.developers.google.com/codelabs/tensorflow-for-poets/
    • 構築したモデルをTensorFlow Lite用のものへ変換する&デモアプリのモデルを差し替えるhttps://codelabs.developers.google.com/codelabs/tensorflow-for-poets-2-tflite/
  • 学習には20個以上の画像を用意することが推奨されている。これはウェブスクレイピングで集めるとよい。以下のURLにスクレイピングを行うpythonスクリプトが掲載されている:
  • また、学習には複数のクラス(種類)が必要となる。例えばペットボトルの種類を学習するには「いろはす」「コカ・コーラ」「綾鷹」など複数の種類を用意する。
  • あとはcodelabsのページに従ってモデルを差し替えれば、もともとのモデルの代わりに転移学習したモデルが用いられるはずである。

特定の物体を認識する

  • デモアプリを特定の物体を認識するように改造したい
  • デモアプリは適合率上位3種類の名前を表示するように作られている
  • この名前リストに認識したい物体の名前が含まれているかを調べればよい
  • モデルデータ差し替えのときに利用したソースコードを改変する
  • javaクラスの最後に以下のメソッドを追加する:

 

private List<String> printTopKLabelsList() {
for (int i = 0; i < labelList.size(); ++i) {
sortedLabels.add(
new AbstractMap.SimpleEntry<>(labelList.get(i), labelProbArray[0][i]));
if (sortedLabels.size() > RESULTS_TO_SHOW) {
sortedLabels.poll();
}
}
List<String> foundLabelList = new ArrayList<>();
final int size = sortedLabels.size();
for (int i = 0; i < size; ++i) {
Map.Entry<String, Float> label = sortedLabels.poll();
foundLabelList.add(label.getKey());
}
return foundLabelList;
}

  • また、classiflyFtrameメソッドの下に以下のメソッドを追加する:

List<String> classifyFrameList(Bitmap bitmap) {
if (tflite == null) {
Log.e(TAG, “Image classifier has not been initialized; Skipped.”);
final List<String> error = new ArrayList<>();
error.add(“Uninitialized Classifier.”);
return error;
}
convertBitmapToByteBuffer(bitmap);
// Here’s where the magic happens!!!
long startTime = SystemClock.uptimeMillis();
tflite.run(imgData, labelProbArray);
long endTime = SystemClock.uptimeMillis();
Log.d(TAG, “Timecost to run model inference: ” + Long.toString(endTime – startTime));

// Smooth the results across frames.
applyFilter();

// Print the results.
List<String> textToShow = printTopKLabelsList();
return textToShow;
}

  • javaクラスのclassifyFrameメソッドを書き換える
  • String textToShow = classifier.classifyFrame(bitmap);の行をコメントアウトし、以下のように書き換える

List<String> labelList = classifier.classifyFrameList(bitmap);

  • あとはこの取得したlabelListにラベルが含まれているかを調べて、任意の処理をすればよい。例えばラベル「notebook」が含まれている場合にダイアログを表示したい場合は以下のようにする(この例を使う場合はクラス内の先頭のほうでdialogIsShownフィールドを宣言しておく):

if(labelList.contains(“notebook”) && !dialogIsShown) {
dialogIsShown = true;
new AlertDialog.Builder(getActivity())
.setTitle(“Recognition”)
.setMessage(“It’s a notebook!”)
.setPositiveButton(“OK”, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// OK button pressed
dialogIsShown = false;
}
})
.show();
}

結果、ここから何を作っていくか。

そこが課題になりますが、Python/YOLOの動きも含めて、検討を深めていきたい。

 

 

 

アプリズム(apprhythm)は新しいIT技術に積極果敢に挑戦している会社です。

特にAI(人工知能)に力を入れており、

AIを用いた音声認識、画像認識、導線分析などのソリューションメニューを提供しています。

 

株式会社アプリズム

〒541-0053 大阪市中央区本町4-5-18 本町YSビル3F