delete lite,slim, iosdemo and android demo of dyrgaph branch for now (#1403)
delete lite,slim, iosdemo and android demo of dyrgaph branch for nowrelease/2.0-rc1-0
parent
e84ea2667f
commit
53b514e39d
@ -1,9 +0,0 @@
|
|||||||
*.iml
|
|
||||||
.gradle
|
|
||||||
/local.properties
|
|
||||||
/.idea/*
|
|
||||||
.DS_Store
|
|
||||||
/build
|
|
||||||
/captures
|
|
||||||
.externalNativeBuild
|
|
||||||
|
|
@ -1 +0,0 @@
|
|||||||
/build
|
|
@ -1,94 +0,0 @@
|
|||||||
import java.security.MessageDigest
|
|
||||||
|
|
||||||
apply plugin: 'com.android.application'
|
|
||||||
|
|
||||||
android {
|
|
||||||
compileSdkVersion 29
|
|
||||||
defaultConfig {
|
|
||||||
applicationId "com.baidu.paddle.lite.demo.ocr"
|
|
||||||
minSdkVersion 23
|
|
||||||
targetSdkVersion 29
|
|
||||||
versionCode 1
|
|
||||||
versionName "1.0"
|
|
||||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
|
||||||
externalNativeBuild {
|
|
||||||
cmake {
|
|
||||||
cppFlags "-std=c++11 -frtti -fexceptions -Wno-format"
|
|
||||||
arguments '-DANDROID_PLATFORM=android-23', '-DANDROID_STL=c++_shared' ,"-DANDROID_ARM_NEON=TRUE"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ndk {
|
|
||||||
// abiFilters "arm64-v8a", "armeabi-v7a"
|
|
||||||
abiFilters "arm64-v8a", "armeabi-v7a"
|
|
||||||
ldLibs "jnigraphics"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
buildTypes {
|
|
||||||
release {
|
|
||||||
minifyEnabled false
|
|
||||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
externalNativeBuild {
|
|
||||||
cmake {
|
|
||||||
path "src/main/cpp/CMakeLists.txt"
|
|
||||||
version "3.10.2"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
implementation fileTree(include: ['*.jar'], dir: 'libs')
|
|
||||||
implementation 'androidx.appcompat:appcompat:1.1.0'
|
|
||||||
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
|
|
||||||
testImplementation 'junit:junit:4.12'
|
|
||||||
androidTestImplementation 'com.android.support.test:runner:1.0.2'
|
|
||||||
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
|
|
||||||
}
|
|
||||||
|
|
||||||
def archives = [
|
|
||||||
[
|
|
||||||
'src' : 'https://paddlelite-demo.bj.bcebos.com/libs/android/paddle_lite_libs_v2_6_1.tar.gz',
|
|
||||||
'dest': 'PaddleLite'
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'src' : 'https://paddlelite-demo.bj.bcebos.com/libs/android/opencv-4.2.0-android-sdk.tar.gz',
|
|
||||||
'dest': 'OpenCV'
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'src' : 'https://paddleocr.bj.bcebos.com/deploy/lite/ocr_v1_for_cpu.tar.gz',
|
|
||||||
'dest' : 'src/main/assets/models/ocr_v1_for_cpu'
|
|
||||||
]
|
|
||||||
]
|
|
||||||
|
|
||||||
task downloadAndExtractArchives(type: DefaultTask) {
|
|
||||||
doFirst {
|
|
||||||
println "Downloading and extracting archives including libs and models"
|
|
||||||
}
|
|
||||||
doLast {
|
|
||||||
// Prepare cache folder for archives
|
|
||||||
String cachePath = "cache"
|
|
||||||
if (!file("${cachePath}").exists()) {
|
|
||||||
mkdir "${cachePath}"
|
|
||||||
}
|
|
||||||
archives.eachWithIndex { archive, index ->
|
|
||||||
MessageDigest messageDigest = MessageDigest.getInstance('MD5')
|
|
||||||
messageDigest.update(archive.src.bytes)
|
|
||||||
String cacheName = new BigInteger(1, messageDigest.digest()).toString(32)
|
|
||||||
// Download the target archive if not exists
|
|
||||||
boolean copyFiles = !file("${archive.dest}").exists()
|
|
||||||
if (!file("${cachePath}/${cacheName}.tar.gz").exists()) {
|
|
||||||
ant.get(src: archive.src, dest: file("${cachePath}/${cacheName}.tar.gz"))
|
|
||||||
copyFiles = true; // force to copy files from the latest archive files
|
|
||||||
}
|
|
||||||
// Extract the target archive if its dest path does not exists
|
|
||||||
if (copyFiles) {
|
|
||||||
copy {
|
|
||||||
from tarTree("${cachePath}/${cacheName}.tar.gz")
|
|
||||||
into "${archive.dest}"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
preBuild.dependsOn downloadAndExtractArchives
|
|
@ -1,21 +0,0 @@
|
|||||||
# Add project specific ProGuard rules here.
|
|
||||||
# You can control the set of applied configuration files using the
|
|
||||||
# proguardFiles setting in build.gradle.
|
|
||||||
#
|
|
||||||
# For more details, see
|
|
||||||
# http://developer.android.com/guide/developing/tools/proguard.html
|
|
||||||
|
|
||||||
# If your project uses WebView with JS, uncomment the following
|
|
||||||
# and specify the fully qualified class name to the JavaScript interface
|
|
||||||
# class:
|
|
||||||
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
|
||||||
# public *;
|
|
||||||
#}
|
|
||||||
|
|
||||||
# Uncomment this to preserve the line number information for
|
|
||||||
# debugging stack traces.
|
|
||||||
#-keepattributes SourceFile,LineNumberTable
|
|
||||||
|
|
||||||
# If you keep the line number information, uncomment this to
|
|
||||||
# hide the original source file name.
|
|
||||||
#-renamesourcefileattribute SourceFile
|
|
@ -1,26 +0,0 @@
|
|||||||
package com.baidu.paddle.lite.demo.ocr;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.support.test.InstrumentationRegistry;
|
|
||||||
import android.support.test.runner.AndroidJUnit4;
|
|
||||||
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instrumented test, which will execute on an Android device.
|
|
||||||
*
|
|
||||||
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
|
|
||||||
*/
|
|
||||||
@RunWith(AndroidJUnit4.class)
|
|
||||||
public class ExampleInstrumentedTest {
|
|
||||||
@Test
|
|
||||||
public void useAppContext() {
|
|
||||||
// Context of the app under test.
|
|
||||||
Context appContext = InstrumentationRegistry.getTargetContext();
|
|
||||||
|
|
||||||
assertEquals("com.baidu.paddle.lite.demo", appContext.getPackageName());
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,39 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
package="com.baidu.paddle.lite.demo.ocr">
|
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
|
||||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
|
||||||
<uses-permission android:name="android.permission.CAMERA"/>
|
|
||||||
|
|
||||||
|
|
||||||
<application
|
|
||||||
android:allowBackup="true"
|
|
||||||
android:icon="@mipmap/ic_launcher"
|
|
||||||
android:label="@string/app_name"
|
|
||||||
android:roundIcon="@mipmap/ic_launcher_round"
|
|
||||||
android:supportsRtl="true"
|
|
||||||
android:theme="@style/AppTheme">
|
|
||||||
<!-- to test MiniActivity, change this to com.baidu.paddle.lite.demo.ocr.MiniActivity -->
|
|
||||||
<activity android:name="com.baidu.paddle.lite.demo.ocr.MainActivity">
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="android.intent.action.MAIN"/>
|
|
||||||
<category android:name="android.intent.category.LAUNCHER"/>
|
|
||||||
</intent-filter>
|
|
||||||
</activity>
|
|
||||||
<activity
|
|
||||||
android:name="com.baidu.paddle.lite.demo.ocr.SettingsActivity"
|
|
||||||
android:label="Settings">
|
|
||||||
</activity>
|
|
||||||
<provider
|
|
||||||
android:name="androidx.core.content.FileProvider"
|
|
||||||
android:authorities="com.baidu.paddle.lite.demo.ocr.fileprovider"
|
|
||||||
android:exported="false"
|
|
||||||
android:grantUriPermissions="true">
|
|
||||||
<meta-data
|
|
||||||
android:name="android.support.FILE_PROVIDER_PATHS"
|
|
||||||
android:resource="@xml/file_paths"></meta-data>
|
|
||||||
</provider>
|
|
||||||
</application>
|
|
||||||
|
|
||||||
</manifest>
|
|
Before Width: | Height: | Size: 62 KiB |
File diff suppressed because it is too large
Load Diff
@ -1,117 +0,0 @@
|
|||||||
# For more information about using CMake with Android Studio, read the
|
|
||||||
# documentation: https://d.android.com/studio/projects/add-native-code.html
|
|
||||||
|
|
||||||
# Sets the minimum version of CMake required to build the native library.
|
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 3.4.1)
|
|
||||||
|
|
||||||
# Creates and names a library, sets it as either STATIC or SHARED, and provides
|
|
||||||
# the relative paths to its source code. You can define multiple libraries, and
|
|
||||||
# CMake builds them for you. Gradle automatically packages shared libraries with
|
|
||||||
# your APK.
|
|
||||||
|
|
||||||
set(PaddleLite_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../PaddleLite")
|
|
||||||
include_directories(${PaddleLite_DIR}/cxx/include)
|
|
||||||
|
|
||||||
set(OpenCV_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../OpenCV/sdk/native/jni")
|
|
||||||
message(STATUS "opencv dir: ${OpenCV_DIR}")
|
|
||||||
find_package(OpenCV REQUIRED)
|
|
||||||
message(STATUS "OpenCV libraries: ${OpenCV_LIBS}")
|
|
||||||
include_directories(${OpenCV_INCLUDE_DIRS})
|
|
||||||
aux_source_directory(. SOURCES)
|
|
||||||
set(CMAKE_CXX_FLAGS
|
|
||||||
"${CMAKE_CXX_FLAGS} -ffast-math -Ofast -Os"
|
|
||||||
)
|
|
||||||
set(CMAKE_CXX_FLAGS
|
|
||||||
"${CMAKE_CXX_FLAGS} -fvisibility=hidden -fvisibility-inlines-hidden -fdata-sections -ffunction-sections"
|
|
||||||
)
|
|
||||||
set(CMAKE_SHARED_LINKER_FLAGS
|
|
||||||
"${CMAKE_SHARED_LINKER_FLAGS} -Wl,--gc-sections -Wl,-z,nocopyreloc")
|
|
||||||
|
|
||||||
add_library(
|
|
||||||
# Sets the name of the library.
|
|
||||||
Native
|
|
||||||
# Sets the library as a shared library.
|
|
||||||
SHARED
|
|
||||||
# Provides a relative path to your source file(s).
|
|
||||||
${SOURCES})
|
|
||||||
|
|
||||||
find_library(
|
|
||||||
# Sets the name of the path variable.
|
|
||||||
log-lib
|
|
||||||
# Specifies the name of the NDK library that you want CMake to locate.
|
|
||||||
log)
|
|
||||||
|
|
||||||
add_library(
|
|
||||||
# Sets the name of the library.
|
|
||||||
paddle_light_api_shared
|
|
||||||
# Sets the library as a shared library.
|
|
||||||
SHARED
|
|
||||||
# Provides a relative path to your source file(s).
|
|
||||||
IMPORTED)
|
|
||||||
|
|
||||||
set_target_properties(
|
|
||||||
# Specifies the target library.
|
|
||||||
paddle_light_api_shared
|
|
||||||
# Specifies the parameter you want to define.
|
|
||||||
PROPERTIES
|
|
||||||
IMPORTED_LOCATION
|
|
||||||
${PaddleLite_DIR}/cxx/libs/${ANDROID_ABI}/libpaddle_light_api_shared.so
|
|
||||||
# Provides the path to the library you want to import.
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
# Specifies libraries CMake should link to your target library. You can link
|
|
||||||
# multiple libraries, such as libraries you define in this build script,
|
|
||||||
# prebuilt third-party libraries, or system libraries.
|
|
||||||
|
|
||||||
target_link_libraries(
|
|
||||||
# Specifies the target library.
|
|
||||||
Native
|
|
||||||
paddle_light_api_shared
|
|
||||||
${OpenCV_LIBS}
|
|
||||||
GLESv2
|
|
||||||
EGL
|
|
||||||
jnigraphics
|
|
||||||
${log-lib}
|
|
||||||
)
|
|
||||||
|
|
||||||
add_custom_command(
|
|
||||||
TARGET Native
|
|
||||||
POST_BUILD
|
|
||||||
COMMAND
|
|
||||||
${CMAKE_COMMAND} -E copy
|
|
||||||
${PaddleLite_DIR}/cxx/libs/${ANDROID_ABI}/libc++_shared.so
|
|
||||||
${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libc++_shared.so)
|
|
||||||
|
|
||||||
add_custom_command(
|
|
||||||
TARGET Native
|
|
||||||
POST_BUILD
|
|
||||||
COMMAND
|
|
||||||
${CMAKE_COMMAND} -E copy
|
|
||||||
${PaddleLite_DIR}/cxx/libs/${ANDROID_ABI}/libpaddle_light_api_shared.so
|
|
||||||
${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libpaddle_light_api_shared.so)
|
|
||||||
|
|
||||||
add_custom_command(
|
|
||||||
TARGET Native
|
|
||||||
POST_BUILD
|
|
||||||
COMMAND
|
|
||||||
${CMAKE_COMMAND} -E copy
|
|
||||||
${PaddleLite_DIR}/cxx/libs/${ANDROID_ABI}/libhiai.so
|
|
||||||
${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libhiai.so)
|
|
||||||
|
|
||||||
add_custom_command(
|
|
||||||
TARGET Native
|
|
||||||
POST_BUILD
|
|
||||||
COMMAND
|
|
||||||
${CMAKE_COMMAND} -E copy
|
|
||||||
${PaddleLite_DIR}/cxx/libs/${ANDROID_ABI}/libhiai_ir.so
|
|
||||||
${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libhiai_ir.so)
|
|
||||||
|
|
||||||
add_custom_command(
|
|
||||||
TARGET Native
|
|
||||||
POST_BUILD
|
|
||||||
COMMAND
|
|
||||||
${CMAKE_COMMAND} -E copy
|
|
||||||
${PaddleLite_DIR}/cxx/libs/${ANDROID_ABI}/libhiai_ir_build.so
|
|
||||||
${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libhiai_ir_build.so)
|
|
@ -1,48 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by fu on 4/25/18.
|
|
||||||
//
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
#import <vector>
|
|
||||||
#import <numeric>
|
|
||||||
|
|
||||||
#ifdef __ANDROID__
|
|
||||||
|
|
||||||
#include <android/log.h>
|
|
||||||
|
|
||||||
#define LOG_TAG "OCR_NDK"
|
|
||||||
|
|
||||||
#define LOGI(...) \
|
|
||||||
__android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
|
|
||||||
#define LOGW(...) \
|
|
||||||
__android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)
|
|
||||||
#define LOGE(...) \
|
|
||||||
__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
|
|
||||||
#else
|
|
||||||
#include <stdio.h>
|
|
||||||
#define LOGI(format, ...) \
|
|
||||||
fprintf(stdout, "[" LOG_TAG "]" format "\n", ##__VA_ARGS__)
|
|
||||||
#define LOGW(format, ...) \
|
|
||||||
fprintf(stdout, "[" LOG_TAG "]" format "\n", ##__VA_ARGS__)
|
|
||||||
#define LOGE(format, ...) \
|
|
||||||
fprintf(stderr, "[" LOG_TAG "]Error: " format "\n", ##__VA_ARGS__)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
enum RETURN_CODE {
|
|
||||||
RETURN_OK = 0
|
|
||||||
};
|
|
||||||
|
|
||||||
enum NET_TYPE{
|
|
||||||
NET_OCR = 900100,
|
|
||||||
NET_OCR_INTERNAL = 991008
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline T product(const std::vector<T> &vec) {
|
|
||||||
if (vec.empty()){
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return std::accumulate(vec.begin(), vec.end(), 1, std::multiplies<T>());
|
|
||||||
}
|
|
||||||
|
|
@ -1,138 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by fujiayi on 2020/7/5.
|
|
||||||
//
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
|
|
||||||
#include <jni.h>
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
#include <android/bitmap.h>
|
|
||||||
#include <opencv2/opencv.hpp>
|
|
||||||
#include "common.h"
|
|
||||||
|
|
||||||
inline std::string jstring_to_cpp_string(JNIEnv *env, jstring jstr) {
|
|
||||||
// In java, a unicode char will be encoded using 2 bytes (utf16).
|
|
||||||
// so jstring will contain characters utf16. std::string in c++ is
|
|
||||||
// essentially a string of bytes, not characters, so if we want to
|
|
||||||
// pass jstring from JNI to c++, we have convert utf16 to bytes.
|
|
||||||
if (!jstr) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
const jclass stringClass = env->GetObjectClass(jstr);
|
|
||||||
const jmethodID getBytes =
|
|
||||||
env->GetMethodID(stringClass, "getBytes", "(Ljava/lang/String;)[B");
|
|
||||||
const jbyteArray stringJbytes = (jbyteArray) env->CallObjectMethod(
|
|
||||||
jstr, getBytes, env->NewStringUTF("UTF-8"));
|
|
||||||
|
|
||||||
size_t length = (size_t) env->GetArrayLength(stringJbytes);
|
|
||||||
jbyte *pBytes = env->GetByteArrayElements(stringJbytes, NULL);
|
|
||||||
|
|
||||||
std::string ret = std::string(reinterpret_cast<char *>(pBytes), length);
|
|
||||||
env->ReleaseByteArrayElements(stringJbytes, pBytes, JNI_ABORT);
|
|
||||||
|
|
||||||
env->DeleteLocalRef(stringJbytes);
|
|
||||||
env->DeleteLocalRef(stringClass);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline jstring cpp_string_to_jstring(JNIEnv *env, std::string str) {
|
|
||||||
auto *data = str.c_str();
|
|
||||||
jclass strClass = env->FindClass("java/lang/String");
|
|
||||||
jmethodID strClassInitMethodID =
|
|
||||||
env->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
|
|
||||||
|
|
||||||
jbyteArray bytes = env->NewByteArray(strlen(data));
|
|
||||||
env->SetByteArrayRegion(bytes, 0, strlen(data),
|
|
||||||
reinterpret_cast<const jbyte *>(data));
|
|
||||||
|
|
||||||
jstring encoding = env->NewStringUTF("UTF-8");
|
|
||||||
jstring res = (jstring) (
|
|
||||||
env->NewObject(strClass, strClassInitMethodID, bytes, encoding));
|
|
||||||
|
|
||||||
env->DeleteLocalRef(strClass);
|
|
||||||
env->DeleteLocalRef(encoding);
|
|
||||||
env->DeleteLocalRef(bytes);
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline jfloatArray cpp_array_to_jfloatarray(JNIEnv *env, const float *buf,
|
|
||||||
int64_t len) {
|
|
||||||
if (len == 0) {
|
|
||||||
return env->NewFloatArray(0);
|
|
||||||
}
|
|
||||||
jfloatArray result = env->NewFloatArray(len);
|
|
||||||
env->SetFloatArrayRegion(result, 0, len, buf);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline jintArray cpp_array_to_jintarray(JNIEnv *env, const int *buf,
|
|
||||||
int64_t len) {
|
|
||||||
jintArray result = env->NewIntArray(len);
|
|
||||||
env->SetIntArrayRegion(result, 0, len, buf);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline jbyteArray cpp_array_to_jbytearray(JNIEnv *env, const int8_t *buf,
|
|
||||||
int64_t len) {
|
|
||||||
jbyteArray result = env->NewByteArray(len);
|
|
||||||
env->SetByteArrayRegion(result, 0, len, buf);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline jlongArray int64_vector_to_jlongarray(JNIEnv *env,
|
|
||||||
const std::vector<int64_t> &vec) {
|
|
||||||
jlongArray result = env->NewLongArray(vec.size());
|
|
||||||
jlong *buf = new jlong[vec.size()];
|
|
||||||
for (size_t i = 0; i < vec.size(); ++i) {
|
|
||||||
buf[i] = (jlong) vec[i];
|
|
||||||
}
|
|
||||||
env->SetLongArrayRegion(result, 0, vec.size(), buf);
|
|
||||||
delete[] buf;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline std::vector<int64_t> jlongarray_to_int64_vector(JNIEnv *env,
|
|
||||||
jlongArray data) {
|
|
||||||
int data_size = env->GetArrayLength(data);
|
|
||||||
jlong *data_ptr = env->GetLongArrayElements(data, nullptr);
|
|
||||||
std::vector<int64_t> data_vec(data_ptr, data_ptr + data_size);
|
|
||||||
env->ReleaseLongArrayElements(data, data_ptr, 0);
|
|
||||||
return data_vec;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline std::vector<float> jfloatarray_to_float_vector(JNIEnv *env,
|
|
||||||
jfloatArray data) {
|
|
||||||
int data_size = env->GetArrayLength(data);
|
|
||||||
jfloat *data_ptr = env->GetFloatArrayElements(data, nullptr);
|
|
||||||
std::vector<float> data_vec(data_ptr, data_ptr + data_size);
|
|
||||||
env->ReleaseFloatArrayElements(data, data_ptr, 0);
|
|
||||||
return data_vec;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline cv::Mat bitmap_to_cv_mat(JNIEnv *env, jobject bitmap) {
|
|
||||||
AndroidBitmapInfo info;
|
|
||||||
int result = AndroidBitmap_getInfo(env, bitmap, &info);
|
|
||||||
if (result != ANDROID_BITMAP_RESULT_SUCCESS) {
|
|
||||||
LOGE("AndroidBitmap_getInfo failed, result: %d", result);
|
|
||||||
return cv::Mat{};
|
|
||||||
}
|
|
||||||
if (info.format != ANDROID_BITMAP_FORMAT_RGBA_8888) {
|
|
||||||
LOGE("Bitmap format is not RGBA_8888 !");
|
|
||||||
return cv::Mat{};
|
|
||||||
}
|
|
||||||
unsigned char *srcData = NULL;
|
|
||||||
AndroidBitmap_lockPixels(env, bitmap, (void **) &srcData);
|
|
||||||
cv::Mat mat = cv::Mat::zeros(info.height, info.width, CV_8UC4);
|
|
||||||
memcpy(mat.data, srcData, info.height * info.width * 4);
|
|
||||||
AndroidBitmap_unlockPixels(env, bitmap);
|
|
||||||
cv::cvtColor(mat, mat, cv::COLOR_RGBA2BGR);
|
|
||||||
/**
|
|
||||||
if (!cv::imwrite("/sdcard/1/copy.jpg", mat)){
|
|
||||||
LOGE("Write image failed " );
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
return mat;
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,140 +0,0 @@
|
|||||||
// Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
#include "ocr_crnn_process.h"
|
|
||||||
#include <iostream>
|
|
||||||
#include <vector>
|
|
||||||
#include <iostream>
|
|
||||||
#include <cstring>
|
|
||||||
#include <fstream>
|
|
||||||
#include <cmath>
|
|
||||||
|
|
||||||
const std::string CHARACTER_TYPE = "ch";
|
|
||||||
const int MAX_DICT_LENGTH = 6624;
|
|
||||||
const std::vector<int> REC_IMAGE_SHAPE = {3, 32, 320};
|
|
||||||
|
|
||||||
static cv::Mat crnn_resize_norm_img(cv::Mat img, float wh_ratio) {
|
|
||||||
int imgC = REC_IMAGE_SHAPE[0];
|
|
||||||
int imgW = REC_IMAGE_SHAPE[2];
|
|
||||||
int imgH = REC_IMAGE_SHAPE[1];
|
|
||||||
|
|
||||||
if (CHARACTER_TYPE == "ch")
|
|
||||||
imgW = int(32 * wh_ratio);
|
|
||||||
|
|
||||||
float ratio = float(img.cols) / float(img.rows);
|
|
||||||
int resize_w = 0;
|
|
||||||
if (ceilf(imgH * ratio) > imgW)
|
|
||||||
resize_w = imgW;
|
|
||||||
else
|
|
||||||
resize_w = int(ceilf(imgH * ratio));
|
|
||||||
cv::Mat resize_img;
|
|
||||||
cv::resize(img, resize_img, cv::Size(resize_w, imgH), 0.f, 0.f, cv::INTER_CUBIC);
|
|
||||||
|
|
||||||
resize_img.convertTo(resize_img, CV_32FC3, 1 / 255.f);
|
|
||||||
|
|
||||||
for (int h = 0; h < resize_img.rows; h++) {
|
|
||||||
for (int w = 0; w < resize_img.cols; w++) {
|
|
||||||
resize_img.at<cv::Vec3f>(h, w)[0] = (resize_img.at<cv::Vec3f>(h, w)[0] - 0.5) * 2;
|
|
||||||
resize_img.at<cv::Vec3f>(h, w)[1] = (resize_img.at<cv::Vec3f>(h, w)[1] - 0.5) * 2;
|
|
||||||
resize_img.at<cv::Vec3f>(h, w)[2] = (resize_img.at<cv::Vec3f>(h, w)[2] - 0.5) * 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cv::Mat dist;
|
|
||||||
cv::copyMakeBorder(resize_img, dist, 0, 0, 0, int(imgW - resize_w), cv::BORDER_CONSTANT,
|
|
||||||
{0, 0, 0});
|
|
||||||
|
|
||||||
return dist;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
cv::Mat crnn_resize_img(const cv::Mat &img, float wh_ratio) {
|
|
||||||
int imgC = REC_IMAGE_SHAPE[0];
|
|
||||||
int imgW = REC_IMAGE_SHAPE[2];
|
|
||||||
int imgH = REC_IMAGE_SHAPE[1];
|
|
||||||
|
|
||||||
if (CHARACTER_TYPE == "ch") {
|
|
||||||
imgW = int(32 * wh_ratio);
|
|
||||||
}
|
|
||||||
|
|
||||||
float ratio = float(img.cols) / float(img.rows);
|
|
||||||
int resize_w = 0;
|
|
||||||
if (ceilf(imgH * ratio) > imgW)
|
|
||||||
resize_w = imgW;
|
|
||||||
else
|
|
||||||
resize_w = int(ceilf(imgH * ratio));
|
|
||||||
cv::Mat resize_img;
|
|
||||||
cv::resize(img, resize_img, cv::Size(resize_w, imgH));
|
|
||||||
return resize_img;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
cv::Mat get_rotate_crop_image(const cv::Mat &srcimage, const std::vector<std::vector<int>> &box) {
|
|
||||||
|
|
||||||
std::vector<std::vector<int>> points = box;
|
|
||||||
|
|
||||||
int x_collect[4] = {box[0][0], box[1][0], box[2][0], box[3][0]};
|
|
||||||
int y_collect[4] = {box[0][1], box[1][1], box[2][1], box[3][1]};
|
|
||||||
int left = int(*std::min_element(x_collect, x_collect + 4));
|
|
||||||
int right = int(*std::max_element(x_collect, x_collect + 4));
|
|
||||||
int top = int(*std::min_element(y_collect, y_collect + 4));
|
|
||||||
int bottom = int(*std::max_element(y_collect, y_collect + 4));
|
|
||||||
|
|
||||||
cv::Mat img_crop;
|
|
||||||
srcimage(cv::Rect(left, top, right - left, bottom - top)).copyTo(img_crop);
|
|
||||||
|
|
||||||
for (int i = 0; i < points.size(); i++) {
|
|
||||||
points[i][0] -= left;
|
|
||||||
points[i][1] -= top;
|
|
||||||
}
|
|
||||||
|
|
||||||
int img_crop_width = int(sqrt(pow(points[0][0] - points[1][0], 2) +
|
|
||||||
pow(points[0][1] - points[1][1], 2)));
|
|
||||||
int img_crop_height = int(sqrt(pow(points[0][0] - points[3][0], 2) +
|
|
||||||
pow(points[0][1] - points[3][1], 2)));
|
|
||||||
|
|
||||||
cv::Point2f pts_std[4];
|
|
||||||
pts_std[0] = cv::Point2f(0., 0.);
|
|
||||||
pts_std[1] = cv::Point2f(img_crop_width, 0.);
|
|
||||||
pts_std[2] = cv::Point2f(img_crop_width, img_crop_height);
|
|
||||||
pts_std[3] = cv::Point2f(0.f, img_crop_height);
|
|
||||||
|
|
||||||
cv::Point2f pointsf[4];
|
|
||||||
pointsf[0] = cv::Point2f(points[0][0], points[0][1]);
|
|
||||||
pointsf[1] = cv::Point2f(points[1][0], points[1][1]);
|
|
||||||
pointsf[2] = cv::Point2f(points[2][0], points[2][1]);
|
|
||||||
pointsf[3] = cv::Point2f(points[3][0], points[3][1]);
|
|
||||||
|
|
||||||
cv::Mat M = cv::getPerspectiveTransform(pointsf, pts_std);
|
|
||||||
|
|
||||||
cv::Mat dst_img;
|
|
||||||
cv::warpPerspective(img_crop, dst_img, M, cv::Size(img_crop_width, img_crop_height),
|
|
||||||
cv::BORDER_REPLICATE);
|
|
||||||
|
|
||||||
if (float(dst_img.rows) >= float(dst_img.cols) * 1.5) {
|
|
||||||
/*
|
|
||||||
cv::Mat srcCopy = cv::Mat(dst_img.rows, dst_img.cols, dst_img.depth());
|
|
||||||
cv::transpose(dst_img, srcCopy);
|
|
||||||
cv::flip(srcCopy, srcCopy, 0);
|
|
||||||
return srcCopy;
|
|
||||||
*/
|
|
||||||
cv::transpose(dst_img, dst_img);
|
|
||||||
cv::flip(dst_img, dst_img, 0);
|
|
||||||
return dst_img;
|
|
||||||
} else {
|
|
||||||
return dst_img;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by fujiayi on 2020/7/3.
|
|
||||||
//
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
#include <opencv2/opencv.hpp>
|
|
||||||
#include "common.h"
|
|
||||||
|
|
||||||
extern const std::vector<int> REC_IMAGE_SHAPE;
|
|
||||||
|
|
||||||
cv::Mat get_rotate_crop_image(const cv::Mat &srcimage, const std::vector<std::vector<int>> &box);
|
|
||||||
|
|
||||||
cv::Mat crnn_resize_img(const cv::Mat &img, float wh_ratio);
|
|
||||||
|
|
||||||
template<class ForwardIterator>
|
|
||||||
inline size_t argmax(ForwardIterator first, ForwardIterator last) {
|
|
||||||
return std::distance(first, std::max_element(first, last));
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
@ -1,17 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by fujiayi on 2020/7/2.
|
|
||||||
//
|
|
||||||
#pragma once
|
|
||||||
#include <vector>
|
|
||||||
#include <opencv2/opencv.hpp>
|
|
||||||
|
|
||||||
std::vector<std::vector<std::vector<int>>>
|
|
||||||
boxes_from_bitmap(const cv::Mat &pred, const cv::Mat &bitmap);
|
|
||||||
|
|
||||||
std::vector<std::vector<std::vector<int>>>
|
|
||||||
filter_tag_det_res(
|
|
||||||
const std::vector<std::vector<std::vector<int>>> &o_boxes,
|
|
||||||
float ratio_h,
|
|
||||||
float ratio_w,
|
|
||||||
const cv::Mat &srcimg
|
|
||||||
);
|
|
@ -1,186 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by fujiayi on 2020/7/1.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "ocr_ppredictor.h"
|
|
||||||
#include "preprocess.h"
|
|
||||||
#include "common.h"
|
|
||||||
#include "ocr_db_post_process.h"
|
|
||||||
#include "ocr_crnn_process.h"
|
|
||||||
|
|
||||||
namespace ppredictor {
|
|
||||||
|
|
||||||
OCR_PPredictor::OCR_PPredictor(const OCR_Config &config) : _config(config) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
OCR_PPredictor::init(const std::string &det_model_content, const std::string &rec_model_content) {
|
|
||||||
_det_predictor = std::unique_ptr<PPredictor>(
|
|
||||||
new PPredictor{_config.thread_num, NET_OCR, _config.mode});
|
|
||||||
_det_predictor->init_nb(det_model_content);
|
|
||||||
|
|
||||||
_rec_predictor = std::unique_ptr<PPredictor>(
|
|
||||||
new PPredictor{_config.thread_num, NET_OCR_INTERNAL, _config.mode});
|
|
||||||
_rec_predictor->init_nb(rec_model_content);
|
|
||||||
return RETURN_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int OCR_PPredictor::init_from_file(const std::string &det_model_path, const std::string &rec_model_path){
|
|
||||||
_det_predictor = std::unique_ptr<PPredictor>(
|
|
||||||
new PPredictor{_config.thread_num, NET_OCR, _config.mode});
|
|
||||||
_det_predictor->init_from_file(det_model_path);
|
|
||||||
|
|
||||||
_rec_predictor = std::unique_ptr<PPredictor>(
|
|
||||||
new PPredictor{_config.thread_num, NET_OCR_INTERNAL, _config.mode});
|
|
||||||
_rec_predictor->init_from_file(rec_model_path);
|
|
||||||
return RETURN_OK;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* for debug use, show result of First Step
|
|
||||||
* @param filter_boxes
|
|
||||||
* @param boxes
|
|
||||||
* @param srcimg
|
|
||||||
*/
|
|
||||||
static void visual_img(const std::vector<std::vector<std::vector<int>>> &filter_boxes,
|
|
||||||
const std::vector<std::vector<std::vector<int>>> &boxes,
|
|
||||||
const cv::Mat &srcimg) {
|
|
||||||
// visualization
|
|
||||||
cv::Point rook_points[filter_boxes.size()][4];
|
|
||||||
for (int n = 0; n < filter_boxes.size(); n++) {
|
|
||||||
for (int m = 0; m < filter_boxes[0].size(); m++) {
|
|
||||||
rook_points[n][m] = cv::Point(int(filter_boxes[n][m][0]), int(filter_boxes[n][m][1]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cv::Mat img_vis;
|
|
||||||
srcimg.copyTo(img_vis);
|
|
||||||
for (int n = 0; n < boxes.size(); n++) {
|
|
||||||
const cv::Point *ppt[1] = {rook_points[n]};
|
|
||||||
int npt[] = {4};
|
|
||||||
cv::polylines(img_vis, ppt, npt, 1, 1, CV_RGB(0, 255, 0), 2, 8, 0);
|
|
||||||
}
|
|
||||||
// 调试用,自行替换需要修改的路径
|
|
||||||
cv::imwrite("/sdcard/1/vis.png", img_vis);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<OCRPredictResult>
|
|
||||||
OCR_PPredictor::infer_ocr(const std::vector<int64_t> &dims, const float *input_data, int input_len,
|
|
||||||
int net_flag, cv::Mat &origin) {
|
|
||||||
|
|
||||||
PredictorInput input = _det_predictor->get_first_input();
|
|
||||||
input.set_dims(dims);
|
|
||||||
input.set_data(input_data, input_len);
|
|
||||||
std::vector<PredictorOutput> results = _det_predictor->infer();
|
|
||||||
PredictorOutput &res = results.at(0);
|
|
||||||
std::vector<std::vector<std::vector<int>>> filtered_box
|
|
||||||
= calc_filtered_boxes(res.get_float_data(), res.get_size(), (int) dims[2], (int) dims[3],
|
|
||||||
origin);
|
|
||||||
LOGI("Filter_box size %ld", filtered_box.size());
|
|
||||||
return infer_rec(filtered_box, origin);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<OCRPredictResult>
|
|
||||||
OCR_PPredictor::infer_rec(const std::vector<std::vector<std::vector<int>>> &boxes,
|
|
||||||
const cv::Mat &origin_img) {
|
|
||||||
std::vector<float> mean = {0.5f, 0.5f, 0.5f};
|
|
||||||
std::vector<float> scale = {1 / 0.5f, 1 / 0.5f, 1 / 0.5f};
|
|
||||||
std::vector<int64_t> dims = {1, 3, 0, 0};
|
|
||||||
std::vector<OCRPredictResult> ocr_results;
|
|
||||||
|
|
||||||
PredictorInput input = _rec_predictor->get_first_input();
|
|
||||||
for (auto bp = boxes.crbegin(); bp != boxes.crend(); ++bp) {
|
|
||||||
const std::vector<std::vector<int>> &box = *bp;
|
|
||||||
cv::Mat crop_img = get_rotate_crop_image(origin_img, box);
|
|
||||||
float wh_ratio = float(crop_img.cols) / float(crop_img.rows);
|
|
||||||
cv::Mat input_image = crnn_resize_img(crop_img, wh_ratio);
|
|
||||||
input_image.convertTo(input_image, CV_32FC3, 1 / 255.0f);
|
|
||||||
const float *dimg = reinterpret_cast<const float *>(input_image.data);
|
|
||||||
int input_size = input_image.rows * input_image.cols;
|
|
||||||
|
|
||||||
dims[2] = input_image.rows;
|
|
||||||
dims[3] = input_image.cols;
|
|
||||||
input.set_dims(dims);
|
|
||||||
|
|
||||||
neon_mean_scale(dimg, input.get_mutable_float_data(), input_size, mean, scale);
|
|
||||||
|
|
||||||
std::vector<PredictorOutput> results = _rec_predictor->infer();
|
|
||||||
|
|
||||||
OCRPredictResult res;
|
|
||||||
res.word_index = postprocess_rec_word_index(results.at(0));
|
|
||||||
if (res.word_index.empty()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
res.score = postprocess_rec_score(results.at(1));
|
|
||||||
res.points = box;
|
|
||||||
ocr_results.emplace_back(std::move(res));
|
|
||||||
}
|
|
||||||
LOGI("ocr_results finished %lu", ocr_results.size());
|
|
||||||
return ocr_results;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<std::vector<std::vector<int>>>
|
|
||||||
OCR_PPredictor::calc_filtered_boxes(const float *pred, int pred_size, int output_height,
|
|
||||||
int output_width, const cv::Mat &origin) {
|
|
||||||
const double threshold = 0.3;
|
|
||||||
const double maxvalue = 1;
|
|
||||||
|
|
||||||
cv::Mat pred_map = cv::Mat::zeros(output_height, output_width, CV_32F);
|
|
||||||
memcpy(pred_map.data, pred, pred_size * sizeof(float));
|
|
||||||
cv::Mat cbuf_map;
|
|
||||||
pred_map.convertTo(cbuf_map, CV_8UC1);
|
|
||||||
|
|
||||||
cv::Mat bit_map;
|
|
||||||
cv::threshold(cbuf_map, bit_map, threshold, maxvalue, cv::THRESH_BINARY);
|
|
||||||
|
|
||||||
std::vector<std::vector<std::vector<int>>> boxes = boxes_from_bitmap(pred_map, bit_map);
|
|
||||||
float ratio_h = output_height * 1.0f / origin.rows;
|
|
||||||
float ratio_w = output_width * 1.0f / origin.cols;
|
|
||||||
std::vector<std::vector<std::vector<int>>> filter_boxes = filter_tag_det_res(boxes, ratio_h,
|
|
||||||
ratio_w, origin);
|
|
||||||
return filter_boxes;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<int> OCR_PPredictor::postprocess_rec_word_index(const PredictorOutput &res) {
|
|
||||||
const int *rec_idx = res.get_int_data();
|
|
||||||
const std::vector<std::vector<uint64_t>> rec_idx_lod = res.get_lod();
|
|
||||||
|
|
||||||
std::vector<int> pred_idx;
|
|
||||||
for (int n = int(rec_idx_lod[0][0]); n < int(rec_idx_lod[0][1] * 2); n += 2) {
|
|
||||||
pred_idx.emplace_back(rec_idx[n]);
|
|
||||||
}
|
|
||||||
return pred_idx;
|
|
||||||
}
|
|
||||||
|
|
||||||
float OCR_PPredictor::postprocess_rec_score(const PredictorOutput &res) {
|
|
||||||
const float *predict_batch = res.get_float_data();
|
|
||||||
const std::vector<int64_t> predict_shape = res.get_shape();
|
|
||||||
const std::vector<std::vector<uint64_t>> predict_lod = res.get_lod();
|
|
||||||
int blank = predict_shape[1];
|
|
||||||
float score = 0.f;
|
|
||||||
int count = 0;
|
|
||||||
for (int n = predict_lod[0][0]; n < predict_lod[0][1] - 1; n++) {
|
|
||||||
int argmax_idx = argmax(predict_batch + n * predict_shape[1],
|
|
||||||
predict_batch + (n + 1) * predict_shape[1]);
|
|
||||||
float max_value = predict_batch[n * predict_shape[1] + argmax_idx];
|
|
||||||
if (blank - 1 - argmax_idx > 1e-5) {
|
|
||||||
score += max_value;
|
|
||||||
count += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
if (count == 0) {
|
|
||||||
LOGE("calc score count 0");
|
|
||||||
} else {
|
|
||||||
score /= count;
|
|
||||||
}
|
|
||||||
LOGI("calc score: %f", score);
|
|
||||||
return score;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NET_TYPE OCR_PPredictor::get_net_flag() const {
|
|
||||||
return NET_OCR;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,70 +0,0 @@
|
|||||||
#include "ppredictor.h"
|
|
||||||
#include "common.h"
|
|
||||||
|
|
||||||
namespace ppredictor {
|
|
||||||
PPredictor::PPredictor(int thread_num, int net_flag, paddle::lite_api::PowerMode mode) :
|
|
||||||
_thread_num(thread_num), _net_flag(net_flag), _mode(mode) {
|
|
||||||
}
|
|
||||||
|
|
||||||
int PPredictor::init_nb(const std::string &model_content) {
|
|
||||||
paddle::lite_api::MobileConfig config;
|
|
||||||
config.set_model_from_buffer(model_content);
|
|
||||||
return _init(config);
|
|
||||||
}
|
|
||||||
|
|
||||||
int PPredictor::init_from_file(const std::string &model_content){
|
|
||||||
paddle::lite_api::MobileConfig config;
|
|
||||||
config.set_model_from_file(model_content);
|
|
||||||
return _init(config);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename ConfigT>
|
|
||||||
int PPredictor::_init(ConfigT &config) {
|
|
||||||
config.set_threads(_thread_num);
|
|
||||||
config.set_power_mode(_mode);
|
|
||||||
_predictor = paddle::lite_api::CreatePaddlePredictor(config);
|
|
||||||
LOGI("paddle instance created");
|
|
||||||
return RETURN_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
PredictorInput PPredictor::get_input(int index) {
|
|
||||||
PredictorInput input{_predictor->GetInput(index), index, _net_flag};
|
|
||||||
_is_input_get = true;
|
|
||||||
return input;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<PredictorInput> PPredictor::get_inputs(int num) {
|
|
||||||
std::vector<PredictorInput> results;
|
|
||||||
for (int i = 0; i < num; i++) {
|
|
||||||
results.emplace_back(get_input(i));
|
|
||||||
}
|
|
||||||
return results;
|
|
||||||
}
|
|
||||||
|
|
||||||
PredictorInput PPredictor::get_first_input() {
|
|
||||||
return get_input(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<PredictorOutput> PPredictor::infer() {
|
|
||||||
LOGI("infer Run start %d", _net_flag);
|
|
||||||
std::vector<PredictorOutput> results;
|
|
||||||
if (!_is_input_get) {
|
|
||||||
return results;
|
|
||||||
}
|
|
||||||
_predictor->Run();
|
|
||||||
LOGI("infer Run end");
|
|
||||||
|
|
||||||
for (int i = 0; i < _predictor->GetOutputNames().size(); i++) {
|
|
||||||
std::unique_ptr<const paddle::lite_api::Tensor> output_tensor = _predictor->GetOutput(i);
|
|
||||||
LOGI("output tensor[%d] size %ld", i, product(output_tensor->shape()));
|
|
||||||
PredictorOutput result{std::move(output_tensor), i, _net_flag};
|
|
||||||
results.emplace_back(std::move(result));
|
|
||||||
}
|
|
||||||
return results;
|
|
||||||
}
|
|
||||||
|
|
||||||
NET_TYPE PPredictor::get_net_flag() const {
|
|
||||||
return (NET_TYPE) _net_flag;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue