diff --git a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/detection/DetectionMainActivity.java b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/detection/DetectionMainActivity.java index 8eef10f5c..ec5988f68 100644 --- a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/detection/DetectionMainActivity.java +++ b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/detection/DetectionMainActivity.java @@ -209,9 +209,6 @@ public class DetectionMainActivity extends Activity implements View.OnClickListe @Override public boolean onTextureChanged(Bitmap ARGB8888ImageBitmap) { - Log.d(TAG, "onTextureChanged: bitmap height: " - + ARGB8888ImageBitmap.getHeight() + " width: " - + ARGB8888ImageBitmap.getWidth()); String savedImagePath = ""; synchronized (this) { savedImagePath = Utils.getDCIMDirectory() + File.separator + "result.jpg"; @@ -224,10 +221,12 @@ public class DetectionMainActivity extends Activity implements View.OnClickListe shutterBitmap = ARGB8888ImageBitmap; originShutterBitmap = ARGB8888ImageBitmap; } + boolean modified = false; DetectionResult result = predictor.predict( ARGB8888ImageBitmap, true, DetectionSettingsActivity.scoreThreshold); modified = result.initialized(); + if (!savedImagePath.isEmpty()) { synchronized (this) { DetectionMainActivity.this.savedImagePath = "result.jpg"; diff --git a/java/android/fastdeploy/src/main/cpp/fastdeploy_jni/vision/results_jni.cc b/java/android/fastdeploy/src/main/cpp/fastdeploy_jni/vision/results_jni.cc index 9ba3dc494..7118489f4 100644 --- a/java/android/fastdeploy/src/main/cpp/fastdeploy_jni/vision/results_jni.cc +++ b/java/android/fastdeploy/src/main/cpp/fastdeploy_jni/vision/results_jni.cc @@ -30,6 +30,7 @@ bool AllocateJavaClassifyResultFromCxx( // (1) mScores float[] shape (n): [F // (2) mLabelIds int[] shape (n): [I // (3) mInitialized boolean: Z + // Docs: docs/api/vision_results/classification_result.md if (cxx_result == nullptr) { return false; } @@ -85,6 +86,7 @@ bool AllocateJavaDetectionResultFromCxx( // (2) mScores float[] shape (n): [F // (3) mLabelIds int[] shape (n): [I // (4) mInitialized boolean: Z + // Docs: docs/api/vision_results/detection_result.md if (cxx_result == nullptr) { return false; } @@ -138,7 +140,7 @@ bool AllocateJavaDetectionResultFromCxx( env->SetObjectField(j_det_result_obj, j_det_label_ids_id, j_det_label_ids_int_arr); env->SetBooleanField(j_det_result_obj, j_det_initialized_id, JNI_TRUE); - // Release non static local Refs + // Release local Refs env->DeleteLocalRef(j_det_boxes_float_arr); env->DeleteLocalRef(j_det_scores_float_arr); env->DeleteLocalRef(j_det_label_ids_int_arr); @@ -158,6 +160,7 @@ bool AllocateJavaOCRResultFromCxx( // (4) mClsScores float[] shape (n): [F // (5) mClsLabels int[] shape (n): [I // (6) mInitialized boolean: Z + // Docs: docs/api/vision_results/ocr_result.md if (cxx_result == nullptr) { return false; } @@ -212,30 +215,35 @@ bool AllocateJavaOCRResultFromCxx( jfloatArray j_ocr_rec_scores_float_arr = env->NewFloatArray(len); env->SetFloatArrayRegion(j_ocr_rec_scores_float_arr, 0, len, rec_scores.data()); - // mClsScores float[] shape (n): [F - const auto &cls_scores = c_result_ptr->cls_scores; - jfloatArray j_ocr_cls_scores_float_arr = env->NewFloatArray(len); - env->SetFloatArrayRegion(j_ocr_cls_scores_float_arr, 0, len, cls_scores.data()); + const int cls_len = static_cast(c_result_ptr->cls_scores.size()); + if (cls_len > 0) { + // mClsScores float[] shape (n): [F + const auto &cls_scores = c_result_ptr->cls_scores; + jfloatArray j_ocr_cls_scores_float_arr = env->NewFloatArray(cls_len); + env->SetFloatArrayRegion(j_ocr_cls_scores_float_arr, 0, cls_len, cls_scores.data()); - // mClsLabels int[] shape (n): [I - const auto &cls_labels = c_result_ptr->cls_labels; - jintArray j_ocr_cls_labels_int_arr = env->NewIntArray(len); - env->SetIntArrayRegion(j_ocr_cls_labels_int_arr, 0, len, cls_labels.data()); + // mClsLabels int[] shape (n): [I + const auto &cls_labels = c_result_ptr->cls_labels; + jintArray j_ocr_cls_labels_int_arr = env->NewIntArray(cls_len); + env->SetIntArrayRegion(j_ocr_cls_labels_int_arr, 0, cls_len, cls_labels.data()); + + env->SetObjectField(j_ocr_result_obj, j_ocr_cls_scores_id, j_ocr_cls_scores_float_arr); + env->SetObjectField(j_ocr_result_obj, j_ocr_cls_labels_id, j_ocr_cls_labels_int_arr); + + env->DeleteLocalRef(j_ocr_cls_scores_float_arr); + env->DeleteLocalRef(j_ocr_cls_labels_int_arr); + } // Set object fields env->SetObjectField(j_ocr_result_obj, j_ocr_boxes_id, j_ocr_boxes_int_arr); env->SetObjectField(j_ocr_result_obj, j_ocr_text_id, j_ocr_text_arr); env->SetObjectField(j_ocr_result_obj, j_ocr_rec_scores_id, j_ocr_rec_scores_float_arr); - env->SetObjectField(j_ocr_result_obj, j_ocr_cls_scores_id, j_ocr_cls_scores_float_arr); - env->SetObjectField(j_ocr_result_obj, j_ocr_cls_labels_id, j_ocr_cls_labels_int_arr); env->SetBooleanField(j_ocr_result_obj, j_ocr_initialized_id, JNI_TRUE); - // Release non static local Refs + // Release local Refs env->DeleteLocalRef(j_ocr_boxes_int_arr); env->DeleteLocalRef(j_ocr_text_arr); env->DeleteLocalRef(j_ocr_rec_scores_float_arr); - env->DeleteLocalRef(j_ocr_cls_scores_float_arr); - env->DeleteLocalRef(j_ocr_cls_labels_int_arr); env->DeleteLocalRef(j_ocr_result_clazz); env->DeleteLocalRef(j_ocr_int_arr_clazz); env->DeleteLocalRef(j_ocr_str_clazz); @@ -253,6 +261,7 @@ bool AllocateJavaSegmentationResultFromCxx( // (3) mContainScoreMap boolean: Z // (4) mScoreMap float[] shape (n): [F // (5) mInitialized boolean: Z + // Docs: docs/api/vision_results/segmentation_result.md if (cxx_result == nullptr) { return false; } @@ -314,7 +323,7 @@ bool AllocateJavaSegmentationResultFromCxx( env->SetObjectField(j_seg_result_obj, j_seg_shape_id, j_seg_shape_long_arr); env->SetBooleanField(j_seg_result_obj, j_seg_initialized_id, JNI_TRUE); - // Release non static local Refs + // Release local Refs env->DeleteLocalRef(j_seg_label_map_int_arr); env->DeleteLocalRef(j_seg_shape_long_arr); env->DeleteLocalRef(j_seg_result_clazz); @@ -332,6 +341,7 @@ bool AllocateJavaFaceDetectionResultFromCxx( // (3) mLandmarks float[][] shape (n,2): [[F // (4) mLandmarksPerFace int: I // (5) mInitialized boolean: Z + // Docs: docs/api/vision_results/face_detection_result.md if (cxx_result == nullptr) { return false; } @@ -521,6 +531,7 @@ bool AllocateClassifyResultFromJava( // (1) mScores float[] shape (n): [F // (2) mLabelIds int[] shape (n): [I // (3) mInitialized boolean: Z + // Docs: docs/api/vision_results/classification_result.md if (cxx_result == nullptr || j_cls_result_obj == nullptr) { return false; } @@ -573,6 +584,7 @@ bool AllocateClassifyResultFromJava( std::memcpy(c_result_ptr->label_ids.data(), j_cls_label_ids_ptr, len * sizeof(int)); env->ReleaseIntArrayElements(j_cls_label_ids_int_arr, j_cls_label_ids_ptr, 0); + // Release local Refs env->DeleteLocalRef(j_cls_result_clazz_cc); return true; @@ -587,6 +599,7 @@ bool AllocateDetectionResultFromJava( // (2) mScores float[] shape (n): [F // (3) mLabelIds int[] shape (n): [I // (4) mInitialized boolean: Z + // Docs: docs/api/vision_results/detection_result.md if (cxx_result == nullptr || j_det_result_obj == nullptr) { return false; } @@ -662,6 +675,7 @@ bool AllocateDetectionResultFromJava( std::memcpy(c_result_ptr->label_ids.data(), j_det_label_ids_ptr, len * sizeof(int)); env->ReleaseIntArrayElements(j_det_label_ids_int_arr, j_det_label_ids_ptr, 0); + // Release local Refs env->DeleteLocalRef(j_det_result_clazz_cc); return true; @@ -677,6 +691,7 @@ bool AllocateOCRResultFromJava( // (4) mClsScores float[] shape (n): [F // (5) mClsLabels int[] shape (n): [I // (6) mInitialized boolean: Z + // Docs: docs/api/vision_results/ocr_result.md if (cxx_result == nullptr || j_ocr_result_obj == nullptr) { return false; } @@ -721,9 +736,12 @@ bool AllocateOCRResultFromJava( const int len = env->GetArrayLength(j_ocr_boxes_arr); if ((len == 0) || (len != env->GetArrayLength(j_ocr_text_arr)) || - (len != env->GetArrayLength(j_ocr_rec_scores_float_arr)) || - (len != env->GetArrayLength(j_ocr_cls_scores_float_arr)) || - (len != env->GetArrayLength(j_ocr_cls_labels_int_arr))) { + (len != env->GetArrayLength(j_ocr_rec_scores_float_arr))){ + return false; + } + + const int cls_len = env->GetArrayLength(j_ocr_cls_scores_float_arr); + if (cls_len != env->GetArrayLength(j_ocr_cls_labels_int_arr)) { return false; } @@ -731,8 +749,11 @@ bool AllocateOCRResultFromJava( c_result_ptr->Clear(); c_result_ptr->boxes.resize(len); c_result_ptr->rec_scores.resize(len); - c_result_ptr->cls_scores.resize(len); - c_result_ptr->cls_labels.resize(len); + + if (cls_len > 0) { + c_result_ptr->cls_scores.resize(cls_len); + c_result_ptr->cls_labels.resize(cls_len); + } // mBoxes int[][] shape (n,8): [[I bool c_check_validation = true; @@ -765,18 +786,21 @@ bool AllocateOCRResultFromJava( std::memcpy(c_result_ptr->rec_scores.data(), j_ocr_rec_scores_ptr, len * sizeof(float)); env->ReleaseFloatArrayElements(j_ocr_rec_scores_float_arr, j_ocr_rec_scores_ptr, 0); - // mClsScores float[] shape (n): [F - jfloat *j_ocr_cls_scores_ptr = - env->GetFloatArrayElements(j_ocr_cls_scores_float_arr, nullptr); - std::memcpy(c_result_ptr->rec_scores.data(), j_ocr_cls_scores_ptr, len * sizeof(float)); - env->ReleaseFloatArrayElements(j_ocr_cls_scores_float_arr, j_ocr_cls_scores_ptr, 0); + if (cls_len > 0) { + // mClsScores float[] shape (n): [F + jfloat *j_ocr_cls_scores_ptr = + env->GetFloatArrayElements(j_ocr_cls_scores_float_arr, nullptr); + std::memcpy(c_result_ptr->cls_scores.data(), j_ocr_cls_scores_ptr, cls_len * sizeof(float)); + env->ReleaseFloatArrayElements(j_ocr_cls_scores_float_arr, j_ocr_cls_scores_ptr, 0); - // mClsLabels int[] shape (n): [I - jint *j_ocr_cls_labels_ptr = - env->GetIntArrayElements(j_ocr_cls_labels_int_arr, nullptr); - std::memcpy(c_result_ptr->cls_labels.data(), j_ocr_cls_labels_ptr, len * sizeof(int)); - env->ReleaseIntArrayElements(j_ocr_cls_labels_int_arr, j_ocr_cls_labels_ptr,0); + // mClsLabels int[] shape (n): [I + jint *j_ocr_cls_labels_ptr = + env->GetIntArrayElements(j_ocr_cls_labels_int_arr, nullptr); + std::memcpy(c_result_ptr->cls_labels.data(), j_ocr_cls_labels_ptr, cls_len * sizeof(int)); + env->ReleaseIntArrayElements(j_ocr_cls_labels_int_arr, j_ocr_cls_labels_ptr,0); + } + // Release local Refs env->DeleteLocalRef(j_ocr_result_clazz_cc); return true; @@ -791,6 +815,7 @@ bool AllocateSegmentationResultFromJava( // (3) mContainScoreMap boolean: Z // (4) mScoreMap float[] shape (n): [F // (5) mInitialized boolean: Z + // Docs: docs/api/vision_results/segmentation_result.md if (cxx_result == nullptr || j_seg_result_obj == nullptr) { return false; } @@ -864,6 +889,7 @@ bool AllocateSegmentationResultFromJava( env->ReleaseFloatArrayElements(j_seg_score_map_float_arr, j_seg_score_map_float_ptr, 0); } + // Release local Refs env->DeleteLocalRef(j_seg_result_clazz_cc); return true; @@ -878,6 +904,7 @@ bool AllocateFaceDetectionResultFromJava( // (3) mLandmarks float[][] shape (n,2): [[F // (4) mLandmarksPerFace int: I // (5) mInitialized boolean: Z + // Docs: docs/api/vision_results/face_detection_result.md if (cxx_result == nullptr || j_face_det_result_obj == nullptr) { return false; } @@ -973,12 +1000,12 @@ bool AllocateFaceDetectionResultFromJava( return false; } + // Release local Refs env->DeleteLocalRef(j_face_det_result_clazz_cc); return true; } - bool AllocateCxxResultFromJava( JNIEnv *env, jobject j_result_obj, void *cxx_result, vision::ResultType type) {