關於將tensorflow進行安卓模型遷移的基礎思路以及核心程式碼解析 -tensorflowinferenceinterface

Aki-Tomoya發表於2020-11-28

以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是輸出節點名
}

具體模型遷移過程會在專案完成後詳細理一遍。
在這裡插入圖片描述

相關文章