[Android] Update ppseg jni via new api and optimize jni vis func (#734)

* [Android] Update ppseg jni via new api and optimize jni vis funcs

* delete local refs
This commit is contained in:
DefTruth
2022-11-29 09:34:34 +08:00
committed by GitHub
parent 03e360d71d
commit bfffbc7712
4 changed files with 172 additions and 50 deletions

View File

@@ -250,12 +250,10 @@ public class SegmentationMainActivity extends Activity implements View.OnClickLi
}
boolean modified = false;
long tc = System.currentTimeMillis();
SegmentationResult result = new SegmentationResult();
result.setCxxBufferFlag(true);
long tc = System.currentTimeMillis();
predictor.predict(ARGB8888ImageBitmap, result);
timeElapsed += (System.currentTimeMillis() - tc);

View File

@@ -859,6 +859,13 @@ bool AllocateSegmentationResultFromJava(
return false;
}
// mInitialized boolean: Z
jboolean j_seg_initialized =
env->GetBooleanField(j_seg_result_obj, j_seg_initialized_id_cc);
if (j_seg_initialized == JNI_FALSE) {
return false;
}
// If 'mEnableCxxBuffer' set as true, then, we only Allocate from
// cxx context to cxx result. Some users may want to use this
// method to boost the performance of segmentation.
@@ -872,32 +879,23 @@ bool AllocateSegmentationResultFromJava(
}
// Allocate from cxx context to cxx result
auto c_cxx_buffer = reinterpret_cast<vision::SegmentationResult *>(j_cxx_buffer);
// TODO: May use 'swap' to exchange the administrative privileges ?
// c_result_ptr->shape.swap(c_cxx_buffer->shape);
// c_result_ptr->label_map.swap(c_cxx_buffer->label_map);
// c_result_ptr->contain_score_map = c_cxx_buffer->contain_score_map;
// if (c_cxx_buffer->contain_score_map) {
// c_result_ptr->score_map.swap(c_cxx_buffer->score_map);
// }
c_result_ptr->shape.assign(
c_cxx_buffer->shape.begin(), c_cxx_buffer->shape.end());
c_result_ptr->label_map.assign(
c_cxx_buffer->label_map.begin(), c_cxx_buffer->label_map.end());
// (*c_result_ptr) = std::move(*c_cxx_buffer);
c_result_ptr->shape = c_cxx_buffer->shape;
const size_t label_len = c_cxx_buffer->label_map.size();
c_result_ptr->label_map.resize(label_len);
std::memcpy(c_result_ptr->label_map.data(), c_cxx_buffer->label_map.data(),
label_len * sizeof(uint8_t));
c_result_ptr->contain_score_map = c_cxx_buffer->contain_score_map;
if (c_cxx_buffer->contain_score_map) {
c_result_ptr->score_map.assign(
c_cxx_buffer->score_map.begin(), c_cxx_buffer->score_map.end());
const size_t score_len = c_cxx_buffer->score_map.size();
c_result_ptr->score_map.resize(score_len);
std::memcpy(c_result_ptr->score_map.data(), c_cxx_buffer->score_map.data(),
score_len * sizeof(float));
}
return true;
}
// mInitialized boolean: Z
jboolean j_seg_initialized =
env->GetBooleanField(j_seg_result_obj, j_seg_initialized_id_cc);
if (j_seg_initialized == JNI_FALSE) {
return false;
}
jbyteArray j_seg_label_map_byte_arr = reinterpret_cast<jbyteArray>(
env->GetObjectField(j_seg_result_obj, j_seg_label_map_id_cc));
jlongArray j_seg_shape_long_arr = reinterpret_cast<jlongArray>(

View File

@@ -49,7 +49,7 @@ Java_com_baidu_paddle_fastdeploy_vision_segmentation_PaddleSegModel_bindNative(
jboolean j_is_vertical_screen = env->GetBooleanField(
thiz, j_is_vertical_screen_id);
bool c_is_vertical_screen = static_cast<jboolean>(j_is_vertical_screen);
c_model_ptr->is_vertical_screen = c_is_vertical_screen;
c_model_ptr->GetPreprocessor().SetIsVerticalScreen(c_is_vertical_screen);
env->DeleteLocalRef(j_ppseg_clazz);
vision::EnableFlyCV();

View File

@@ -12,6 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
#include <jni.h> // NOLINT
#include "fastdeploy_jni/perf_jni.h" // NOLINT
#include "fastdeploy_jni/bitmap_jni.h" // NOLINT
#include "fastdeploy_jni/convert_jni.h" // NOLINT
#include "fastdeploy_jni/vision/results_jni.h" // NOLINT
@@ -19,16 +20,21 @@
namespace fni = fastdeploy::jni;
namespace vision = fastdeploy::vision;
#ifdef __cplusplus
extern "C" {
#endif
namespace fastdeploy {
namespace jni {
/// VisClassification
JNIEXPORT jboolean JNICALL
Java_com_baidu_paddle_fastdeploy_vision_Visualize_visClassificationNative(
JNIEnv *env, jclass clazz, jobject argb8888_bitmap,
/// Some visualize helpers.
jboolean VisClassificationFromJava(
JNIEnv *env, jobject argb8888_bitmap,
jobject result, jfloat score_threshold, jfloat font_size,
jobjectArray labels) {
const jclass j_cls_result_clazz = env->FindClass(
"com/baidu/paddle/fastdeploy/vision/ClassifyResult");
if (!env->IsInstanceOf(result, j_cls_result_clazz)) {
env->DeleteLocalRef(j_cls_result_clazz);
return JNI_FALSE;
}
env->DeleteLocalRef(j_cls_result_clazz);
vision::ClassifyResult c_result;
if (!fni::AllocateCxxResultFromJava(
env, result, reinterpret_cast<void *>(&c_result),
@@ -56,19 +62,23 @@ Java_com_baidu_paddle_fastdeploy_vision_Visualize_visClassificationNative(
return JNI_TRUE;
}
/// VisDetection
JNIEXPORT jboolean JNICALL
Java_com_baidu_paddle_fastdeploy_vision_Visualize_visDetectionNative(
JNIEnv *env, jclass clazz, jobject argb8888_bitmap,
jboolean VisDetectionFromJava(
JNIEnv *env, jobject argb8888_bitmap,
jobject result, jfloat score_threshold, jint line_size,
jfloat font_size, jobjectArray labels) {
const jclass j_det_result_clazz = env->FindClass(
"com/baidu/paddle/fastdeploy/vision/DetectionResult");
if (!env->IsInstanceOf(result, j_det_result_clazz)) {
env->DeleteLocalRef(j_det_result_clazz);
return JNI_FALSE;
}
env->DeleteLocalRef(j_det_result_clazz);
vision::DetectionResult c_result;
if (!fni::AllocateCxxResultFromJava(
env, result, reinterpret_cast<void *>(&c_result),
vision::ResultType::DETECTION)) {
return JNI_FALSE;
}
// Get labels from Java [n]
auto c_labels = fni::ConvertTo<std::vector<std::string>>(env, labels);
@@ -90,11 +100,15 @@ Java_com_baidu_paddle_fastdeploy_vision_Visualize_visDetectionNative(
return JNI_TRUE;
}
/// VisOcr
JNIEXPORT jboolean JNICALL
Java_com_baidu_paddle_fastdeploy_vision_Visualize_visOcrNative(
JNIEnv *env, jclass clazz, jobject argb8888_bitmap,
jobject result) {
jboolean VisOcrFromJava(
JNIEnv *env, jobject argb8888_bitmap, jobject result) {
const jclass j_ocr_result_clazz = env->FindClass(
"com/baidu/paddle/fastdeploy/vision/OCRResult");
if (!env->IsInstanceOf(result, j_ocr_result_clazz)) {
env->DeleteLocalRef(j_ocr_result_clazz);
return JNI_FALSE;
}
env->DeleteLocalRef(j_ocr_result_clazz);
vision::OCRResult c_result;
if (!fni::AllocateCxxResultFromJava(
env, result, reinterpret_cast<void *>(&c_result),
@@ -113,17 +127,22 @@ Java_com_baidu_paddle_fastdeploy_vision_Visualize_visOcrNative(
return JNI_TRUE;
}
JNIEXPORT jboolean JNICALL
Java_com_baidu_paddle_fastdeploy_vision_Visualize_visSegmentationNative(
JNIEnv *env, jclass clazz, jobject argb8888_bitmap,
jobject result, jfloat weight) {
jboolean VisSegmentationFromJava(
JNIEnv *env, jobject argb8888_bitmap, jobject result, jfloat weight) {
const jclass j_seg_result_clazz = env->FindClass(
"com/baidu/paddle/fastdeploy/vision/SegmentationResult");
if (!env->IsInstanceOf(result, j_seg_result_clazz)) {
env->DeleteLocalRef(j_seg_result_clazz);
return JNI_FALSE;
}
env->DeleteLocalRef(j_seg_result_clazz);
// Allocate from Java result, may cost some times.
vision::SegmentationResult c_result;
if (!fni::AllocateCxxResultFromJava(
env, result, reinterpret_cast<void *>(&c_result),
vision::ResultType::SEGMENTATION)) {
return JNI_FALSE;
}
cv::Mat c_bgr;
if (!fni::ARGB888Bitmap2BGR(env, argb8888_bitmap, &c_bgr)) {
return JNI_FALSE;
@@ -135,17 +154,66 @@ Java_com_baidu_paddle_fastdeploy_vision_Visualize_visSegmentationNative(
return JNI_TRUE;
}
JNIEXPORT jboolean JNICALL
Java_com_baidu_paddle_fastdeploy_vision_Visualize_visFaceDetectionNative(
JNIEnv *env, jclass clazz, jobject argb8888_bitmap,
jboolean VisSegmentationFromCxxBuffer(
JNIEnv *env, jobject argb8888_bitmap, jobject result, jfloat weight) {
const jclass j_seg_result_clazz = env->FindClass(
"com/baidu/paddle/fastdeploy/vision/SegmentationResult");
if (!env->IsInstanceOf(result, j_seg_result_clazz)) {
env->DeleteLocalRef(j_seg_result_clazz);
return JNI_FALSE;
}
const jfieldID j_enable_cxx_buffer_id = env->GetFieldID(
j_seg_result_clazz, "mEnableCxxBuffer", "Z");
const jfieldID j_cxx_buffer_id = env->GetFieldID(
j_seg_result_clazz, "mCxxBuffer", "J");
const jfieldID j_seg_initialized_id = env->GetFieldID(
j_seg_result_clazz, "mInitialized", "Z");
jboolean j_enable_cxx_buffer =
env->GetBooleanField(result, j_enable_cxx_buffer_id);
jboolean j_seg_initialized =
env->GetBooleanField(result, j_seg_initialized_id);
env->DeleteLocalRef(j_seg_result_clazz);
if (j_seg_initialized == JNI_FALSE) {
return JNI_FALSE;
}
// Use CxxBuffer directly without any copy.
if (j_enable_cxx_buffer == JNI_TRUE) {
jlong j_cxx_buffer = env->GetLongField(result, j_cxx_buffer_id);
if (j_cxx_buffer == 0) {
return JNI_FALSE;
}
// Allocate from cxx context to cxx result
auto c_cxx_buffer = reinterpret_cast<vision::SegmentationResult *>(j_cxx_buffer);
cv::Mat c_bgr;
if (!fni::ARGB888Bitmap2BGR(env, argb8888_bitmap, &c_bgr)) {
return JNI_FALSE;
}
auto c_vis_im = vision::VisSegmentation(c_bgr, *c_cxx_buffer, weight);
if (!fni::BGR2ARGB888Bitmap(env, argb8888_bitmap, c_vis_im)) {
return JNI_FALSE;
}
return JNI_TRUE;
}
return JNI_FALSE;
}
jboolean VisFaceDetectionFromJava(
JNIEnv *env, jobject argb8888_bitmap,
jobject result, jint line_size, jfloat font_size) {
const jclass j_face_det_result_clazz = env->FindClass(
"com/baidu/paddle/fastdeploy/vision/FaceDetectionResult");
if (!env->IsInstanceOf(result, j_face_det_result_clazz)) {
env->DeleteLocalRef(j_face_det_result_clazz);
return JNI_FALSE;
}
env->DeleteLocalRef(j_face_det_result_clazz);
vision::FaceDetectionResult c_result;
if (!fni::AllocateCxxResultFromJava(
env, result, reinterpret_cast<void *>(&c_result),
vision::ResultType::FACE_DETECTION)) {
return JNI_FALSE;
}
cv::Mat c_bgr;
if (!fni::ARGB888Bitmap2BGR(env, argb8888_bitmap, &c_bgr)) {
return JNI_FALSE;
@@ -157,6 +225,64 @@ Java_com_baidu_paddle_fastdeploy_vision_Visualize_visFaceDetectionNative(
return JNI_TRUE;
}
} // jni
} // fastdeploy
#ifdef __cplusplus
extern "C" {
#endif
/// VisClassification
JNIEXPORT jboolean JNICALL
Java_com_baidu_paddle_fastdeploy_vision_Visualize_visClassificationNative(
JNIEnv *env, jclass clazz, jobject argb8888_bitmap,
jobject result, jfloat score_threshold, jfloat font_size,
jobjectArray labels) {
return fni::VisClassificationFromJava(env, argb8888_bitmap, result,
score_threshold, font_size, labels);
}
/// VisDetection
JNIEXPORT jboolean JNICALL
Java_com_baidu_paddle_fastdeploy_vision_Visualize_visDetectionNative(
JNIEnv *env, jclass clazz, jobject argb8888_bitmap,
jobject result, jfloat score_threshold, jint line_size,
jfloat font_size, jobjectArray labels) {
return fni::VisDetectionFromJava(env, argb8888_bitmap, result, score_threshold,
line_size, font_size, labels);
}
/// VisOcr
JNIEXPORT jboolean JNICALL
Java_com_baidu_paddle_fastdeploy_vision_Visualize_visOcrNative(
JNIEnv *env, jclass clazz, jobject argb8888_bitmap,
jobject result) {
return fni::VisOcrFromJava(env, argb8888_bitmap, result);
}
/// VisSegmentation
JNIEXPORT jboolean JNICALL
Java_com_baidu_paddle_fastdeploy_vision_Visualize_visSegmentationNative(
JNIEnv *env, jclass clazz, jobject argb8888_bitmap,
jobject result, jfloat weight) {
// First, try visualize segmentation result via CxxBuffer.
if (fni::VisSegmentationFromCxxBuffer(
env, argb8888_bitmap, result, weight)) {
return JNI_TRUE;
}
// Then, try visualize segmentation from Java result(may cost some times).
return fni::VisSegmentationFromJava(env, argb8888_bitmap, result, weight);
}
/// VisFaceDetection
JNIEXPORT jboolean JNICALL
Java_com_baidu_paddle_fastdeploy_vision_Visualize_visFaceDetectionNative(
JNIEnv *env, jclass clazz, jobject argb8888_bitmap,
jobject result, jint line_size, jfloat font_size) {
return fni::VisFaceDetectionFromJava(env, argb8888_bitmap, result,
line_size, font_size);
}
#ifdef __cplusplus
}
#endif