近期由於手上項目需要,摸索了一下Android以及TensorFlow-Android
代碼的部分跟python版本大同小異,下面附上代碼
首現是初始化,這部分應該沒啥問題
am = assetManager;
inferenceInterface = new TensorFlowInferenceInterface(am, MODEL_FILE);
接下來是圖片格式,Android中圖片的格式為Bitmap,須先轉為Float Array
這部分應該也沒啥問題,如果有需要可以包成函數
int w = bitmap.getWidth();
int h = bitmap.getHeight();
float[] floatValues = new float[w * h * 3];
int[] intValues = new int[w * h];
bitmap.getPixels(intValues, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
for (int i = 0; i < intValues.length; ++i) {
final int val = intValues[i];
floatValues[i * 3] = ((val >> 16) & 0xFF);
floatValues[i * 3 + 1] = ((val >> 8) & 0xFF);
floatValues[i * 3 + 2] = (val & 0xFF);
}
接下來就是處理的部份,並且把處理好的結果存到floatValues中
INPUT_NODE是輸入的節點名稱
可以有很多輸入跟輸出
這邊建議還是另外開個Array,因為有時候處理好的圖片大小會跟原本不一致,可能導致超過大小
不過官方的demo這樣寫,所以就沒另外改了
inferenceInterface.feed(INPUT_NODE, floatValues, 1, bitmap.getHeight(), bitmap.getWidth(), 3);
inferenceInterface.run(new String[]{OUTPUT_NODE}, true);
inferenceInterface.fetch(OUTPUT_NODE, floatValues);
到這裡基本就處理好了,只要在把Float Array轉int Array 再轉Bitmap
for (int i = 0; i < intValues.length; ++i) {
intValues[i] =
0xFF000000
| (((int) (floatValues[i * 3])) << 16)
| (((int) (floatValues[i * 3 + 1])) << 8)
| ((int) (floatValues[i * 3 + 2]));
}
Bitmap new_bitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.RGB_565);
new_bitmap.setPixels(intValues, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
閱讀更多 »