关于将tensorflow进行安卓模型迁移的基础思路以及核心代码解析 -tensorflowinferenceinterface

以SRCNN模型为例:

1.以三色通道为基础:
模型迁移整体流程(旧):

  1. 将灰度化后的图片裁剪成n个33*33的小块
  2. 将每个图片小块转化为float数组
  3. 将每个float数组依次输入至模型中
  4. 模型将每个小块数组进行模型处理,处理结果依次保存在一个大float数组 中,最后这个大数组就是最终的处理结果。
  5. float数组转图片。以下仅为个人想法,未经实践。
    第一种,将float数组转为mat对象,然后将mat对象直接转化为byte数组进行byte流输出图片。此种方法将MAT对象作为中介,难处是float和Mat这两个的互相转化,有些理不清,网上资料也很少。并且在转化过程中会损失一点清晰度。
    第二种方法,将float转化为Mat对象,用imwrite直接将Mat对象保存为图片在内存中,再将图片从相册取出来放进软件。困难在于float转Mat没整出来,imwrite是opencv的一个保存函数。
    总而言之,float转Mat是我这两种方法的关键之处,而第二种损失最少,最简单,但是会加大一丢丢运行时间(可能也不到1s)。

2.以Y通道为基础:
模型迁移整体流程(新):

  1. 将图片数组的Y通道单独提取出来,做成float数组
  2. 将Y通道的这个数组传入模型。经过运算保存。
  3. 将新的Y通道数组直接更新到图片数组上去
  4. 数组转图片

第二种方法如今比较通用,对比第一种方法,第二种方法更加快速和容易实践。

迁移模型所用到的tensorflowinferenceinterface核心代码:

Tensorflowinferenceinterface tf;

static {
    //System.loadLibrary("tensorflow_inference");
}
//加载个静态库

public void predict1(String blankimage) {   

tf.feed(INPUT_NAME,floatValues,1,33,33,1);
//将代码feed(喂)进接口,
//inferenceInterface.feed(inputName, floatValues, 1, inputSize, inputSize, 3);
//InputName是输入节点的名称,floatValues是图片的float数组,在前面已经定义过

/**inputSize, inputSize, 3是输入节点的shape,floatValues数组的大小是inputSize*inputSize*3;
输入的图片为33 * 33,维度根据输入数据确定**/

tf.run(new String[]{OUTPUT_NAME});
//运行模型. 定义一个叫OUTPUT_NAME的数组,并存储结果。这个只要名字写对就ok

tf.fetch(OUTPUT_NAME,PREDICTIONS);
//将模型fetch(取)出来,并保存在PREDICTION这个float数组里,OUTPUT_NAME是输出节点名
}

具体模型迁移过程会在项目完成后详细理一遍。
在这里插入图片描述

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 岁月 设计师:pinMode 返回首页