Android 调用Tensorflow C++实现
概述
功能:Android 端调用Tensorflow分为Java接口和C接口调用,本文主要说明C接口的调用。通过JNI方式将结果返回给Android上层并对数据渲染处理,实现对象检测功能。其中数据内容包括left,top,right,bottom坐标及标签内容和分数等)。如果想了解如何通过训练得到最优模型及推理过程,可以通过官网了解其原理。
Tensorflow官网.
效果如图:
调用过程
1.添加OpenCV,Tensorflow 动态库,配置CmakeLists。
代码如下:
cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_VERBOSE_MAKEFILE on)
set(OPENCV_BASE ${
CMAKE_SOURCE_DIR}/src/main/cpp/native)
set(OPENCV_SHARED ${
OPENCV_BASE}/libs) # OpenCV动态库
set(OPENCV_HEADER ${
OPENCV_BASE}/jni/include) # OpenCV头文件
set(TFLITE_BASE ${
CMAKE_SOURCE_DIR}/src/main/cpp/third_party/tensorflow_lite)
set(TFLITE_HEADER ${
TFLITE_BASE}/headers)
set(TFLITE_SHARED ${
TFLITE_BASE}/libs)
message("OPENCV_HEADER : " ${
OPENCV_HEADER})
message("OPENCV_SHARED : " ${
OPENCV_SHARED})
message("TFLITE_BASE :" ${
TFLITE_BASE})
include_directories(${
OPENCV_HEADER} ${
TFLITE_HEADER})
#link_directories(${
TFLITE_SHARED}/${
ANDROID_ABI})
add_library(tensorflowlite_jni
SHARED
IMPORTED)
set_target_properties(tensorflowlite_jni PROPERTIES
IMPORTED_LOCATION
${
CMAKE_SOURCE_DIR}/src/main/jniLibs/${
ANDROID_ABI}/libtensorflowlite_jni.so)
# 配置依赖库
add_library(libopencv_java4
SHARED
IMPORTED)
set_target_properties(libopencv_java4 PROPERTIES
IMPORTED_LOCATION
${
CMAKE_SOURCE_DIR}/src/main/jniLibs/${
ANDROID_ABI}/libopencv_java4.so)
add_library(native-gw
SHARED
src/main/cpp/native-gw.cpp)
target_link_libraries(native-gw
libopencv_java4
tensorflowlite_jni
android
log)
2.定义本地函数,结合OpenCV接口调用Camera2并返回Mat对象,将图片内存地址传递至本地函数。
代码如下:
@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
rgba = inputFrame.rgba();
newSingleThreadExecutor.execute(new Runnable() {
@Override
public void run() {
try {
show_detect_results(NativeLoad.TfLiteDetect(rgba.getNativeObjAddr()));
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace