参考链接:
- tensorflow 物体检测模型相关资料 https://github.com/tensorflow/models/tree/master/research/object_detection
- java api接口 https://tensorflow.google.cn/lite/apis#java
Running on mobile with TensorFlow Lite
以物体检测模型为例,生成一个APK文件,可以调用TensorFlow Lite模型,进而实现手机端能够运行物体检测模型。
整体分为以下几个步骤:
步骤一、训练一个TensorFlow 模型(或者从下载他人训练好的模型)
步骤二、生成.pb文件
步骤三、将.pb文件转化为.tflite文件
步骤四、使用Android Studio 导入TensorFlow安卓样例 ,替换成我们生成的tflite文件,重新编译APK
#配置依赖
https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/installation.md
#下载样例模型
下载文件并解压
$wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_2018_01_28.tar.gz
$ tar -xzvf ssd_mobilenet_v1_coco_2018_01_28.tar.gz
#设置环境变量
#指定pipeline.config、model.ckpt文件、输出文件的保存路径; 本次测试将样例模型文件放到了/root/tensorflow/mobile/目录下面
#并将 model.ckpt.data-00000-of-00001 重命名为model.ckpt
export CONFIG_FILE=/root/tensorflow/mobile/pipeline.config
export CHECKPOINT_PATH=/root/tensorflow/mobile/model.ckpt
export OUTPUT_DIR=/tmp/tflite
#Add Libraries to PYTHONPATH
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim
#生成.pb文件
python object_detection/export_tflite_ssd_graph.py \
--pipeline_config_path=$CONFIG_FILE \
--trained_checkpoint_prefix=$CHECKPOINT_PATH \
--output_directory=$OUTPUT_DIR \
--add_postprocessing_op=true
#查看生成结果,会发现有tflite_graph.pb 、 tflite_graph.pbtxt这两个结果文件
#将.pb文件转化为.tflite文件
# TensorFlow Lite Converter https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/toco
#生成整数型版本tflite模型
bazel run tensorflow/lite/toco:toco -- \
--input_file=$OUTPUT_DIR/tflite_graph.pb \
--output_file=$OUTPUT_DIR/detect.tflite \
--input_shapes=1,300,300,3 \
--input_arrays=normalized_input_image_tensor \
--output_arrays='TFLite_Detection_PostProcess','TFLite_Detection_PostProcess:1','TFLite_Detection_PostProcess:2','TFLite_Detection_PostProcess:3' \
--inference_type=QUANTIZED_UINT8 \
--mean_values=128 \
--std_values=128 \
--change_concat_input_ranges=false \
--allow_custom_ops \
--default_ranges_min=0 \
--default_ranges_max=255 \
#生成float 版本tflite模型
bazel run -c opt tensorflow/lite/toco:toco -- \
--input_file=$OUTPUT_DIR/tflite_graph.pb \
--output_file=$OUTPUT_DIR/float_detect.tflite \
--input_shapes=1,300,300,3 \
--input_arrays=normalized_input_image_tensor \
--output_arrays='TFLite_Detection_PostProcess','TFLite_Detection_PostProcess:1','TFLite_Detection_PostProcess:2','TFLite_Detection_PostProcess:3' \
--inference_type=FLOAT \
—allow_custom_ops
#查看生成结果,会发现有detect.tflite、 float_detect.tflite 这两个结果文件
Running our model on Android
项目工程文件:https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/examples/android
可以git clone https://github.com/tensorflow/tensorflow.git 然后到找到/tensorflow/lite/examples/android目录,直接import到 Android Studio 里面
将detect.tflite文件拷贝到 android/app/src/main/assets 目录下,并将coco_labels_list.txt复制一份,改名为labels_list.txt,结果如下图所示
对 DetectorActivity.java 进行修改,将物体检测模型替换成我们生成的模型(detect.tflite),并将模型对应的分类列表文件也进行替换(labels_list.txt, 因为我们下载的样例模型就是coco-trained模型,label_list.txt内容与 原来的coco_labels_list.txt一致即可)
重新编译运行,即可生成测试APK
查看build.gradle文科,可以确定该demo指定的目标运行系统的api level 为26
启动模拟器(如果没有模拟器,就创建一个api level为26的,cpu/abi 为x86架构的)
模拟器启动界面