diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index 499f140..e3057d7 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -353,8 +353,9 @@ } int -Yolo::load(AAssetManager *mgr, const char *model_type, int _target_size, const float *_mean_values, - const float *_norm_values, bool use_classify, bool use_segmentation, bool use_detect, +Yolo::load(AAssetManager *mgr, const char *model_type, int _target_size, + const float *_mean_values, const float *_norm_values, const float *_scale_values, + bool use_classify, bool use_segmentation, bool use_detect, bool use_gpu) { if (use_classify) { yolo_c.clear(); @@ -425,10 +426,14 @@ mean_values[0] = _mean_values[0]; mean_values[1] = _mean_values[1]; mean_values[2] = _mean_values[2]; + norm_values[0] = _norm_values[0]; norm_values[1] = _norm_values[1]; norm_values[2] = _norm_values[2]; + scale_values[0] = _scale_values[0]; + scale_values[1] = _scale_values[1]; + scale_values[2] = _scale_values[2]; return 0; } @@ -455,7 +460,6 @@ //把opencv Mat转为 ncnn Mat ncnn::Mat in = ncnn::Mat::from_pixels(rgb.data, ncnn::Mat::PIXEL_RGB, width, height); - std::vector cls_scores; { in.substract_mean_normalize(mean_values, scale_values); ncnn::Extractor ex = yolo_c.create_extractor(); @@ -523,7 +527,7 @@ javaVM->AttachCurrentThread(&env, nullptr); jclass callback_clazz = env->GetObjectClass(j_callback); jmethodID j_method_id = env->GetMethodID( - callback_clazz, "onSegmentation", "(Ljava/util/ArrayList;Ljava/util/ArrayList;)V" + callback_clazz, "onSegmentation", "(Ljava/util/ArrayList;Ljava/util/ArrayList;[F)V" ); //获取ArrayList类 @@ -533,6 +537,7 @@ //初始化ArrayList对象 jobject segment_array_obj = env->NewObject(list_clazz, arraylist_init); jobject detect_array_obj = env->NewObject(list_clazz, arraylist_init); + jfloatArray classify_result_array = env->NewFloatArray(3); //分割 { @@ -693,8 +698,28 @@ } } + //分类 + { + in.substract_mean_normalize(mean_values, scale_values); + ncnn::Extractor ex = yolo_c.create_extractor(); + ex.input("images", in); + + ncnn::Mat out; + ex.extract("output", out); + + int output_size = out.w; + float float_buffer[output_size]; + for (int j = 0; j < out.w; j++) { + float_buffer[j] = out[j]; + } + + env->SetFloatArrayRegion(classify_result_array, 0, output_size, float_buffer); + } + //分割和检测结果统一回调 - env->CallVoidMethod(j_callback, j_method_id, segment_array_obj, detect_array_obj); + env->CallVoidMethod( + j_callback, j_method_id, segment_array_obj, detect_array_obj, classify_result_array + ); /** * Mat数据。 diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index 499f140..e3057d7 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -353,8 +353,9 @@ } int -Yolo::load(AAssetManager *mgr, const char *model_type, int _target_size, const float *_mean_values, - const float *_norm_values, bool use_classify, bool use_segmentation, bool use_detect, +Yolo::load(AAssetManager *mgr, const char *model_type, int _target_size, + const float *_mean_values, const float *_norm_values, const float *_scale_values, + bool use_classify, bool use_segmentation, bool use_detect, bool use_gpu) { if (use_classify) { yolo_c.clear(); @@ -425,10 +426,14 @@ mean_values[0] = _mean_values[0]; mean_values[1] = _mean_values[1]; mean_values[2] = _mean_values[2]; + norm_values[0] = _norm_values[0]; norm_values[1] = _norm_values[1]; norm_values[2] = _norm_values[2]; + scale_values[0] = _scale_values[0]; + scale_values[1] = _scale_values[1]; + scale_values[2] = _scale_values[2]; return 0; } @@ -455,7 +460,6 @@ //把opencv Mat转为 ncnn Mat ncnn::Mat in = ncnn::Mat::from_pixels(rgb.data, ncnn::Mat::PIXEL_RGB, width, height); - std::vector cls_scores; { in.substract_mean_normalize(mean_values, scale_values); ncnn::Extractor ex = yolo_c.create_extractor(); @@ -523,7 +527,7 @@ javaVM->AttachCurrentThread(&env, nullptr); jclass callback_clazz = env->GetObjectClass(j_callback); jmethodID j_method_id = env->GetMethodID( - callback_clazz, "onSegmentation", "(Ljava/util/ArrayList;Ljava/util/ArrayList;)V" + callback_clazz, "onSegmentation", "(Ljava/util/ArrayList;Ljava/util/ArrayList;[F)V" ); //获取ArrayList类 @@ -533,6 +537,7 @@ //初始化ArrayList对象 jobject segment_array_obj = env->NewObject(list_clazz, arraylist_init); jobject detect_array_obj = env->NewObject(list_clazz, arraylist_init); + jfloatArray classify_result_array = env->NewFloatArray(3); //分割 { @@ -693,8 +698,28 @@ } } + //分类 + { + in.substract_mean_normalize(mean_values, scale_values); + ncnn::Extractor ex = yolo_c.create_extractor(); + ex.input("images", in); + + ncnn::Mat out; + ex.extract("output", out); + + int output_size = out.w; + float float_buffer[output_size]; + for (int j = 0; j < out.w; j++) { + float_buffer[j] = out[j]; + } + + env->SetFloatArrayRegion(classify_result_array, 0, output_size, float_buffer); + } + //分割和检测结果统一回调 - env->CallVoidMethod(j_callback, j_method_id, segment_array_obj, detect_array_obj); + env->CallVoidMethod( + j_callback, j_method_id, segment_array_obj, detect_array_obj, classify_result_array + ); /** * Mat数据。 diff --git a/app/src/main/cpp/yolo.h b/app/src/main/cpp/yolo.h index 44a4e09..12e4b1b 100644 --- a/app/src/main/cpp/yolo.h +++ b/app/src/main/cpp/yolo.h @@ -50,6 +50,7 @@ int target_size, const float *mean_values, const float *norm_values, + const float *scale_values, bool use_classify, bool use_segmentation, bool use_detect, @@ -89,6 +90,7 @@ int target_size; float mean_values[3]; float norm_values[3]; + float scale_values[3]; ncnn::UnlockedPoolAllocator blob_pool_allocator; ncnn::PoolAllocator workspace_pool_allocator; diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index 499f140..e3057d7 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -353,8 +353,9 @@ } int -Yolo::load(AAssetManager *mgr, const char *model_type, int _target_size, const float *_mean_values, - const float *_norm_values, bool use_classify, bool use_segmentation, bool use_detect, +Yolo::load(AAssetManager *mgr, const char *model_type, int _target_size, + const float *_mean_values, const float *_norm_values, const float *_scale_values, + bool use_classify, bool use_segmentation, bool use_detect, bool use_gpu) { if (use_classify) { yolo_c.clear(); @@ -425,10 +426,14 @@ mean_values[0] = _mean_values[0]; mean_values[1] = _mean_values[1]; mean_values[2] = _mean_values[2]; + norm_values[0] = _norm_values[0]; norm_values[1] = _norm_values[1]; norm_values[2] = _norm_values[2]; + scale_values[0] = _scale_values[0]; + scale_values[1] = _scale_values[1]; + scale_values[2] = _scale_values[2]; return 0; } @@ -455,7 +460,6 @@ //把opencv Mat转为 ncnn Mat ncnn::Mat in = ncnn::Mat::from_pixels(rgb.data, ncnn::Mat::PIXEL_RGB, width, height); - std::vector cls_scores; { in.substract_mean_normalize(mean_values, scale_values); ncnn::Extractor ex = yolo_c.create_extractor(); @@ -523,7 +527,7 @@ javaVM->AttachCurrentThread(&env, nullptr); jclass callback_clazz = env->GetObjectClass(j_callback); jmethodID j_method_id = env->GetMethodID( - callback_clazz, "onSegmentation", "(Ljava/util/ArrayList;Ljava/util/ArrayList;)V" + callback_clazz, "onSegmentation", "(Ljava/util/ArrayList;Ljava/util/ArrayList;[F)V" ); //获取ArrayList类 @@ -533,6 +537,7 @@ //初始化ArrayList对象 jobject segment_array_obj = env->NewObject(list_clazz, arraylist_init); jobject detect_array_obj = env->NewObject(list_clazz, arraylist_init); + jfloatArray classify_result_array = env->NewFloatArray(3); //分割 { @@ -693,8 +698,28 @@ } } + //分类 + { + in.substract_mean_normalize(mean_values, scale_values); + ncnn::Extractor ex = yolo_c.create_extractor(); + ex.input("images", in); + + ncnn::Mat out; + ex.extract("output", out); + + int output_size = out.w; + float float_buffer[output_size]; + for (int j = 0; j < out.w; j++) { + float_buffer[j] = out[j]; + } + + env->SetFloatArrayRegion(classify_result_array, 0, output_size, float_buffer); + } + //分割和检测结果统一回调 - env->CallVoidMethod(j_callback, j_method_id, segment_array_obj, detect_array_obj); + env->CallVoidMethod( + j_callback, j_method_id, segment_array_obj, detect_array_obj, classify_result_array + ); /** * Mat数据。 diff --git a/app/src/main/cpp/yolo.h b/app/src/main/cpp/yolo.h index 44a4e09..12e4b1b 100644 --- a/app/src/main/cpp/yolo.h +++ b/app/src/main/cpp/yolo.h @@ -50,6 +50,7 @@ int target_size, const float *mean_values, const float *norm_values, + const float *scale_values, bool use_classify, bool use_segmentation, bool use_detect, @@ -89,6 +90,7 @@ int target_size; float mean_values[3]; float norm_values[3]; + float scale_values[3]; ncnn::UnlockedPoolAllocator blob_pool_allocator; ncnn::PoolAllocator workspace_pool_allocator; diff --git a/app/src/main/cpp/yolov8ncnn.cpp b/app/src/main/cpp/yolov8ncnn.cpp index d6f202e..1dce4d0 100644 --- a/app/src/main/cpp/yolov8ncnn.cpp +++ b/app/src/main/cpp/yolov8ncnn.cpp @@ -104,6 +104,7 @@ {1 / 255.f, 1 / 255.f, 1 / 255.f}, {1 / 255.f, 1 / 255.f, 1 / 255.f} }; +const float scale_values[3] = {0.017f, 0.017f, 0.017f}; extern "C" { JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { @@ -173,6 +174,7 @@ target_size, mean_values[(int) model_id], norm_values[(int) model_id], + scale_values, use_classify, use_segmentation, use_detect, @@ -215,11 +217,25 @@ target_size, mean_values[*id], norm_values[*id], + scale_values, false, true, false, use_gpu ); + } else if (*id == 1) { + yolo_ptr->load( + mgr, + model_type, + target_size, + mean_values[*id], + norm_values[*id], + scale_values, + false, + false, + true, + use_gpu + ); } else { yolo_ptr->load( mgr, @@ -227,9 +243,10 @@ target_size, mean_values[*id], norm_values[*id], - false, - false, + scale_values, true, + false, + false, use_gpu ); } diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index 499f140..e3057d7 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -353,8 +353,9 @@ } int -Yolo::load(AAssetManager *mgr, const char *model_type, int _target_size, const float *_mean_values, - const float *_norm_values, bool use_classify, bool use_segmentation, bool use_detect, +Yolo::load(AAssetManager *mgr, const char *model_type, int _target_size, + const float *_mean_values, const float *_norm_values, const float *_scale_values, + bool use_classify, bool use_segmentation, bool use_detect, bool use_gpu) { if (use_classify) { yolo_c.clear(); @@ -425,10 +426,14 @@ mean_values[0] = _mean_values[0]; mean_values[1] = _mean_values[1]; mean_values[2] = _mean_values[2]; + norm_values[0] = _norm_values[0]; norm_values[1] = _norm_values[1]; norm_values[2] = _norm_values[2]; + scale_values[0] = _scale_values[0]; + scale_values[1] = _scale_values[1]; + scale_values[2] = _scale_values[2]; return 0; } @@ -455,7 +460,6 @@ //把opencv Mat转为 ncnn Mat ncnn::Mat in = ncnn::Mat::from_pixels(rgb.data, ncnn::Mat::PIXEL_RGB, width, height); - std::vector cls_scores; { in.substract_mean_normalize(mean_values, scale_values); ncnn::Extractor ex = yolo_c.create_extractor(); @@ -523,7 +527,7 @@ javaVM->AttachCurrentThread(&env, nullptr); jclass callback_clazz = env->GetObjectClass(j_callback); jmethodID j_method_id = env->GetMethodID( - callback_clazz, "onSegmentation", "(Ljava/util/ArrayList;Ljava/util/ArrayList;)V" + callback_clazz, "onSegmentation", "(Ljava/util/ArrayList;Ljava/util/ArrayList;[F)V" ); //获取ArrayList类 @@ -533,6 +537,7 @@ //初始化ArrayList对象 jobject segment_array_obj = env->NewObject(list_clazz, arraylist_init); jobject detect_array_obj = env->NewObject(list_clazz, arraylist_init); + jfloatArray classify_result_array = env->NewFloatArray(3); //分割 { @@ -693,8 +698,28 @@ } } + //分类 + { + in.substract_mean_normalize(mean_values, scale_values); + ncnn::Extractor ex = yolo_c.create_extractor(); + ex.input("images", in); + + ncnn::Mat out; + ex.extract("output", out); + + int output_size = out.w; + float float_buffer[output_size]; + for (int j = 0; j < out.w; j++) { + float_buffer[j] = out[j]; + } + + env->SetFloatArrayRegion(classify_result_array, 0, output_size, float_buffer); + } + //分割和检测结果统一回调 - env->CallVoidMethod(j_callback, j_method_id, segment_array_obj, detect_array_obj); + env->CallVoidMethod( + j_callback, j_method_id, segment_array_obj, detect_array_obj, classify_result_array + ); /** * Mat数据。 diff --git a/app/src/main/cpp/yolo.h b/app/src/main/cpp/yolo.h index 44a4e09..12e4b1b 100644 --- a/app/src/main/cpp/yolo.h +++ b/app/src/main/cpp/yolo.h @@ -50,6 +50,7 @@ int target_size, const float *mean_values, const float *norm_values, + const float *scale_values, bool use_classify, bool use_segmentation, bool use_detect, @@ -89,6 +90,7 @@ int target_size; float mean_values[3]; float norm_values[3]; + float scale_values[3]; ncnn::UnlockedPoolAllocator blob_pool_allocator; ncnn::PoolAllocator workspace_pool_allocator; diff --git a/app/src/main/cpp/yolov8ncnn.cpp b/app/src/main/cpp/yolov8ncnn.cpp index d6f202e..1dce4d0 100644 --- a/app/src/main/cpp/yolov8ncnn.cpp +++ b/app/src/main/cpp/yolov8ncnn.cpp @@ -104,6 +104,7 @@ {1 / 255.f, 1 / 255.f, 1 / 255.f}, {1 / 255.f, 1 / 255.f, 1 / 255.f} }; +const float scale_values[3] = {0.017f, 0.017f, 0.017f}; extern "C" { JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { @@ -173,6 +174,7 @@ target_size, mean_values[(int) model_id], norm_values[(int) model_id], + scale_values, use_classify, use_segmentation, use_detect, @@ -215,11 +217,25 @@ target_size, mean_values[*id], norm_values[*id], + scale_values, false, true, false, use_gpu ); + } else if (*id == 1) { + yolo_ptr->load( + mgr, + model_type, + target_size, + mean_values[*id], + norm_values[*id], + scale_values, + false, + false, + true, + use_gpu + ); } else { yolo_ptr->load( mgr, @@ -227,9 +243,10 @@ target_size, mean_values[*id], norm_values[*id], - false, - false, + scale_values, true, + false, + false, use_gpu ); } diff --git a/app/src/main/java/com/casic/br/app/external/INativeCallback.kt b/app/src/main/java/com/casic/br/app/external/INativeCallback.kt index ad03d84..fef55fb 100644 --- a/app/src/main/java/com/casic/br/app/external/INativeCallback.kt +++ b/app/src/main/java/com/casic/br/app/external/INativeCallback.kt @@ -10,7 +10,9 @@ * 分割 */ fun onSegmentation( - segmentationOutput: ArrayList, detectOutput: ArrayList + segmentationOutput: ArrayList, + detectOutput: ArrayList, + classifyOutput: FloatArray ) /** diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index 499f140..e3057d7 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -353,8 +353,9 @@ } int -Yolo::load(AAssetManager *mgr, const char *model_type, int _target_size, const float *_mean_values, - const float *_norm_values, bool use_classify, bool use_segmentation, bool use_detect, +Yolo::load(AAssetManager *mgr, const char *model_type, int _target_size, + const float *_mean_values, const float *_norm_values, const float *_scale_values, + bool use_classify, bool use_segmentation, bool use_detect, bool use_gpu) { if (use_classify) { yolo_c.clear(); @@ -425,10 +426,14 @@ mean_values[0] = _mean_values[0]; mean_values[1] = _mean_values[1]; mean_values[2] = _mean_values[2]; + norm_values[0] = _norm_values[0]; norm_values[1] = _norm_values[1]; norm_values[2] = _norm_values[2]; + scale_values[0] = _scale_values[0]; + scale_values[1] = _scale_values[1]; + scale_values[2] = _scale_values[2]; return 0; } @@ -455,7 +460,6 @@ //把opencv Mat转为 ncnn Mat ncnn::Mat in = ncnn::Mat::from_pixels(rgb.data, ncnn::Mat::PIXEL_RGB, width, height); - std::vector cls_scores; { in.substract_mean_normalize(mean_values, scale_values); ncnn::Extractor ex = yolo_c.create_extractor(); @@ -523,7 +527,7 @@ javaVM->AttachCurrentThread(&env, nullptr); jclass callback_clazz = env->GetObjectClass(j_callback); jmethodID j_method_id = env->GetMethodID( - callback_clazz, "onSegmentation", "(Ljava/util/ArrayList;Ljava/util/ArrayList;)V" + callback_clazz, "onSegmentation", "(Ljava/util/ArrayList;Ljava/util/ArrayList;[F)V" ); //获取ArrayList类 @@ -533,6 +537,7 @@ //初始化ArrayList对象 jobject segment_array_obj = env->NewObject(list_clazz, arraylist_init); jobject detect_array_obj = env->NewObject(list_clazz, arraylist_init); + jfloatArray classify_result_array = env->NewFloatArray(3); //分割 { @@ -693,8 +698,28 @@ } } + //分类 + { + in.substract_mean_normalize(mean_values, scale_values); + ncnn::Extractor ex = yolo_c.create_extractor(); + ex.input("images", in); + + ncnn::Mat out; + ex.extract("output", out); + + int output_size = out.w; + float float_buffer[output_size]; + for (int j = 0; j < out.w; j++) { + float_buffer[j] = out[j]; + } + + env->SetFloatArrayRegion(classify_result_array, 0, output_size, float_buffer); + } + //分割和检测结果统一回调 - env->CallVoidMethod(j_callback, j_method_id, segment_array_obj, detect_array_obj); + env->CallVoidMethod( + j_callback, j_method_id, segment_array_obj, detect_array_obj, classify_result_array + ); /** * Mat数据。 diff --git a/app/src/main/cpp/yolo.h b/app/src/main/cpp/yolo.h index 44a4e09..12e4b1b 100644 --- a/app/src/main/cpp/yolo.h +++ b/app/src/main/cpp/yolo.h @@ -50,6 +50,7 @@ int target_size, const float *mean_values, const float *norm_values, + const float *scale_values, bool use_classify, bool use_segmentation, bool use_detect, @@ -89,6 +90,7 @@ int target_size; float mean_values[3]; float norm_values[3]; + float scale_values[3]; ncnn::UnlockedPoolAllocator blob_pool_allocator; ncnn::PoolAllocator workspace_pool_allocator; diff --git a/app/src/main/cpp/yolov8ncnn.cpp b/app/src/main/cpp/yolov8ncnn.cpp index d6f202e..1dce4d0 100644 --- a/app/src/main/cpp/yolov8ncnn.cpp +++ b/app/src/main/cpp/yolov8ncnn.cpp @@ -104,6 +104,7 @@ {1 / 255.f, 1 / 255.f, 1 / 255.f}, {1 / 255.f, 1 / 255.f, 1 / 255.f} }; +const float scale_values[3] = {0.017f, 0.017f, 0.017f}; extern "C" { JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { @@ -173,6 +174,7 @@ target_size, mean_values[(int) model_id], norm_values[(int) model_id], + scale_values, use_classify, use_segmentation, use_detect, @@ -215,11 +217,25 @@ target_size, mean_values[*id], norm_values[*id], + scale_values, false, true, false, use_gpu ); + } else if (*id == 1) { + yolo_ptr->load( + mgr, + model_type, + target_size, + mean_values[*id], + norm_values[*id], + scale_values, + false, + false, + true, + use_gpu + ); } else { yolo_ptr->load( mgr, @@ -227,9 +243,10 @@ target_size, mean_values[*id], norm_values[*id], - false, - false, + scale_values, true, + false, + false, use_gpu ); } diff --git a/app/src/main/java/com/casic/br/app/external/INativeCallback.kt b/app/src/main/java/com/casic/br/app/external/INativeCallback.kt index ad03d84..fef55fb 100644 --- a/app/src/main/java/com/casic/br/app/external/INativeCallback.kt +++ b/app/src/main/java/com/casic/br/app/external/INativeCallback.kt @@ -10,7 +10,9 @@ * 分割 */ fun onSegmentation( - segmentationOutput: ArrayList, detectOutput: ArrayList + segmentationOutput: ArrayList, + detectOutput: ArrayList, + classifyOutput: FloatArray ) /** diff --git a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt index 3272030..2f435dc 100644 --- a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt @@ -33,6 +33,8 @@ ) } + val CLASSIFY_ARRAY = arrayOf("电线整洁", "电线杂乱", "餐馆厨房") + val TARGET_NAMES_ARRAY = arrayListOf( "三脚架", "三通", "标准软管", "人", "作业信息公示牌", "切断阀", "危险告知牌", "压力表", "压力表", "防护服", "可燃气体报警控制器", "呼气器", "喉箍", "气体检测报警仪", @@ -40,7 +42,7 @@ "安全绳", "对讲设备", "水枪", "工服", "开关", "燃气探测器", "接头", "施工路牌", "气体检测报警仪", "水带", "水带", "流量计", "消火栓箱", "灭火器", "灶台", "灶具", "照明设备", "熄火保护", "燃气管道", "燃气计量器具", "电线裸露", - "电路图", "警戒线", "调压器", "调长器", "贴纸", "跨电线", "路锥", + "电路图", "警戒线", "调压器", "调长器", "标识", "跨电线", "路锥", "过滤器", "配电箱内部", "配电箱外部", "长柄阀门", "闪光灯亮", "闪光灯灭", "阀门", "非标准软管", "送风设备", "送风设备" ) diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index 499f140..e3057d7 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -353,8 +353,9 @@ } int -Yolo::load(AAssetManager *mgr, const char *model_type, int _target_size, const float *_mean_values, - const float *_norm_values, bool use_classify, bool use_segmentation, bool use_detect, +Yolo::load(AAssetManager *mgr, const char *model_type, int _target_size, + const float *_mean_values, const float *_norm_values, const float *_scale_values, + bool use_classify, bool use_segmentation, bool use_detect, bool use_gpu) { if (use_classify) { yolo_c.clear(); @@ -425,10 +426,14 @@ mean_values[0] = _mean_values[0]; mean_values[1] = _mean_values[1]; mean_values[2] = _mean_values[2]; + norm_values[0] = _norm_values[0]; norm_values[1] = _norm_values[1]; norm_values[2] = _norm_values[2]; + scale_values[0] = _scale_values[0]; + scale_values[1] = _scale_values[1]; + scale_values[2] = _scale_values[2]; return 0; } @@ -455,7 +460,6 @@ //把opencv Mat转为 ncnn Mat ncnn::Mat in = ncnn::Mat::from_pixels(rgb.data, ncnn::Mat::PIXEL_RGB, width, height); - std::vector cls_scores; { in.substract_mean_normalize(mean_values, scale_values); ncnn::Extractor ex = yolo_c.create_extractor(); @@ -523,7 +527,7 @@ javaVM->AttachCurrentThread(&env, nullptr); jclass callback_clazz = env->GetObjectClass(j_callback); jmethodID j_method_id = env->GetMethodID( - callback_clazz, "onSegmentation", "(Ljava/util/ArrayList;Ljava/util/ArrayList;)V" + callback_clazz, "onSegmentation", "(Ljava/util/ArrayList;Ljava/util/ArrayList;[F)V" ); //获取ArrayList类 @@ -533,6 +537,7 @@ //初始化ArrayList对象 jobject segment_array_obj = env->NewObject(list_clazz, arraylist_init); jobject detect_array_obj = env->NewObject(list_clazz, arraylist_init); + jfloatArray classify_result_array = env->NewFloatArray(3); //分割 { @@ -693,8 +698,28 @@ } } + //分类 + { + in.substract_mean_normalize(mean_values, scale_values); + ncnn::Extractor ex = yolo_c.create_extractor(); + ex.input("images", in); + + ncnn::Mat out; + ex.extract("output", out); + + int output_size = out.w; + float float_buffer[output_size]; + for (int j = 0; j < out.w; j++) { + float_buffer[j] = out[j]; + } + + env->SetFloatArrayRegion(classify_result_array, 0, output_size, float_buffer); + } + //分割和检测结果统一回调 - env->CallVoidMethod(j_callback, j_method_id, segment_array_obj, detect_array_obj); + env->CallVoidMethod( + j_callback, j_method_id, segment_array_obj, detect_array_obj, classify_result_array + ); /** * Mat数据。 diff --git a/app/src/main/cpp/yolo.h b/app/src/main/cpp/yolo.h index 44a4e09..12e4b1b 100644 --- a/app/src/main/cpp/yolo.h +++ b/app/src/main/cpp/yolo.h @@ -50,6 +50,7 @@ int target_size, const float *mean_values, const float *norm_values, + const float *scale_values, bool use_classify, bool use_segmentation, bool use_detect, @@ -89,6 +90,7 @@ int target_size; float mean_values[3]; float norm_values[3]; + float scale_values[3]; ncnn::UnlockedPoolAllocator blob_pool_allocator; ncnn::PoolAllocator workspace_pool_allocator; diff --git a/app/src/main/cpp/yolov8ncnn.cpp b/app/src/main/cpp/yolov8ncnn.cpp index d6f202e..1dce4d0 100644 --- a/app/src/main/cpp/yolov8ncnn.cpp +++ b/app/src/main/cpp/yolov8ncnn.cpp @@ -104,6 +104,7 @@ {1 / 255.f, 1 / 255.f, 1 / 255.f}, {1 / 255.f, 1 / 255.f, 1 / 255.f} }; +const float scale_values[3] = {0.017f, 0.017f, 0.017f}; extern "C" { JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { @@ -173,6 +174,7 @@ target_size, mean_values[(int) model_id], norm_values[(int) model_id], + scale_values, use_classify, use_segmentation, use_detect, @@ -215,11 +217,25 @@ target_size, mean_values[*id], norm_values[*id], + scale_values, false, true, false, use_gpu ); + } else if (*id == 1) { + yolo_ptr->load( + mgr, + model_type, + target_size, + mean_values[*id], + norm_values[*id], + scale_values, + false, + false, + true, + use_gpu + ); } else { yolo_ptr->load( mgr, @@ -227,9 +243,10 @@ target_size, mean_values[*id], norm_values[*id], - false, - false, + scale_values, true, + false, + false, use_gpu ); } diff --git a/app/src/main/java/com/casic/br/app/external/INativeCallback.kt b/app/src/main/java/com/casic/br/app/external/INativeCallback.kt index ad03d84..fef55fb 100644 --- a/app/src/main/java/com/casic/br/app/external/INativeCallback.kt +++ b/app/src/main/java/com/casic/br/app/external/INativeCallback.kt @@ -10,7 +10,9 @@ * 分割 */ fun onSegmentation( - segmentationOutput: ArrayList, detectOutput: ArrayList + segmentationOutput: ArrayList, + detectOutput: ArrayList, + classifyOutput: FloatArray ) /** diff --git a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt index 3272030..2f435dc 100644 --- a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt @@ -33,6 +33,8 @@ ) } + val CLASSIFY_ARRAY = arrayOf("电线整洁", "电线杂乱", "餐馆厨房") + val TARGET_NAMES_ARRAY = arrayListOf( "三脚架", "三通", "标准软管", "人", "作业信息公示牌", "切断阀", "危险告知牌", "压力表", "压力表", "防护服", "可燃气体报警控制器", "呼气器", "喉箍", "气体检测报警仪", @@ -40,7 +42,7 @@ "安全绳", "对讲设备", "水枪", "工服", "开关", "燃气探测器", "接头", "施工路牌", "气体检测报警仪", "水带", "水带", "流量计", "消火栓箱", "灭火器", "灶台", "灶具", "照明设备", "熄火保护", "燃气管道", "燃气计量器具", "电线裸露", - "电路图", "警戒线", "调压器", "调长器", "贴纸", "跨电线", "路锥", + "电路图", "警戒线", "调压器", "调长器", "标识", "跨电线", "路锥", "过滤器", "配电箱内部", "配电箱外部", "长柄阀门", "闪光灯亮", "闪光灯灭", "阀门", "非标准软管", "送风设备", "送风设备" ) diff --git a/app/src/main/java/com/casic/br/app/utils/YoloTargetDetectHelper.kt b/app/src/main/java/com/casic/br/app/utils/YoloTargetDetectHelper.kt index fe56d38..d8ca471 100644 --- a/app/src/main/java/com/casic/br/app/utils/YoloTargetDetectHelper.kt +++ b/app/src/main/java/com/casic/br/app/utils/YoloTargetDetectHelper.kt @@ -15,7 +15,8 @@ fun siftHiddenTrouble( targetTypeSet: HashSet, segmentationResults: MutableList, - detectResults: MutableList + detectResults: MutableList, + classifyOutput: FloatArray ) { //每次刷新画面帧都清除掉之前的筛选结果 hiddenTroubles.clear() @@ -151,14 +152,6 @@ hiddenTroubles.add(result) } - if (detectResults.isContains(41) && !targetTypeSet.contains(41)) { - //包含电线裸露 - val result = HiddenTroubleResult() - result.alarmCode = "DistributionBoxHasExposedWire" - result.warning = "配电箱内部电线裸露" - hiddenTroubles.add(result) - } - if (!detectResults.isContains(47) && !targetTypeSet.contains(47)) { //包含跨电线 val result = HiddenTroubleResult() @@ -166,6 +159,31 @@ result.warning = "配电箱箱体和箱盖未跨接" hiddenTroubles.add(result) } + + //分类模型结果,筛选电线杂乱。排序找出最大值的Index + //[0.18615723,0.6484375,0.16516113] + var maxIndex = 0 + for (i in classifyOutput.indices) { + if (classifyOutput[i] > classifyOutput[maxIndex]) { + maxIndex = i + } + } + + //"电线整洁", "电线杂乱", "餐馆厨房" + if (maxIndex == 1) { + val result = HiddenTroubleResult() + result.alarmCode = "DistributionBoxHasTangledWire" + result.warning = LocaleConstant.CLASSIFY_ARRAY[maxIndex] + hiddenTroubles.add(result) + } + } + + if (detectResults.isContains(41) && !targetTypeSet.contains(41)) { + //包含电线裸露 + val result = HiddenTroubleResult() + result.alarmCode = "DistributionBoxHasExposedWire" + result.warning = "配电箱内部电线裸露" + hiddenTroubles.add(result) } } diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index 499f140..e3057d7 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -353,8 +353,9 @@ } int -Yolo::load(AAssetManager *mgr, const char *model_type, int _target_size, const float *_mean_values, - const float *_norm_values, bool use_classify, bool use_segmentation, bool use_detect, +Yolo::load(AAssetManager *mgr, const char *model_type, int _target_size, + const float *_mean_values, const float *_norm_values, const float *_scale_values, + bool use_classify, bool use_segmentation, bool use_detect, bool use_gpu) { if (use_classify) { yolo_c.clear(); @@ -425,10 +426,14 @@ mean_values[0] = _mean_values[0]; mean_values[1] = _mean_values[1]; mean_values[2] = _mean_values[2]; + norm_values[0] = _norm_values[0]; norm_values[1] = _norm_values[1]; norm_values[2] = _norm_values[2]; + scale_values[0] = _scale_values[0]; + scale_values[1] = _scale_values[1]; + scale_values[2] = _scale_values[2]; return 0; } @@ -455,7 +460,6 @@ //把opencv Mat转为 ncnn Mat ncnn::Mat in = ncnn::Mat::from_pixels(rgb.data, ncnn::Mat::PIXEL_RGB, width, height); - std::vector cls_scores; { in.substract_mean_normalize(mean_values, scale_values); ncnn::Extractor ex = yolo_c.create_extractor(); @@ -523,7 +527,7 @@ javaVM->AttachCurrentThread(&env, nullptr); jclass callback_clazz = env->GetObjectClass(j_callback); jmethodID j_method_id = env->GetMethodID( - callback_clazz, "onSegmentation", "(Ljava/util/ArrayList;Ljava/util/ArrayList;)V" + callback_clazz, "onSegmentation", "(Ljava/util/ArrayList;Ljava/util/ArrayList;[F)V" ); //获取ArrayList类 @@ -533,6 +537,7 @@ //初始化ArrayList对象 jobject segment_array_obj = env->NewObject(list_clazz, arraylist_init); jobject detect_array_obj = env->NewObject(list_clazz, arraylist_init); + jfloatArray classify_result_array = env->NewFloatArray(3); //分割 { @@ -693,8 +698,28 @@ } } + //分类 + { + in.substract_mean_normalize(mean_values, scale_values); + ncnn::Extractor ex = yolo_c.create_extractor(); + ex.input("images", in); + + ncnn::Mat out; + ex.extract("output", out); + + int output_size = out.w; + float float_buffer[output_size]; + for (int j = 0; j < out.w; j++) { + float_buffer[j] = out[j]; + } + + env->SetFloatArrayRegion(classify_result_array, 0, output_size, float_buffer); + } + //分割和检测结果统一回调 - env->CallVoidMethod(j_callback, j_method_id, segment_array_obj, detect_array_obj); + env->CallVoidMethod( + j_callback, j_method_id, segment_array_obj, detect_array_obj, classify_result_array + ); /** * Mat数据。 diff --git a/app/src/main/cpp/yolo.h b/app/src/main/cpp/yolo.h index 44a4e09..12e4b1b 100644 --- a/app/src/main/cpp/yolo.h +++ b/app/src/main/cpp/yolo.h @@ -50,6 +50,7 @@ int target_size, const float *mean_values, const float *norm_values, + const float *scale_values, bool use_classify, bool use_segmentation, bool use_detect, @@ -89,6 +90,7 @@ int target_size; float mean_values[3]; float norm_values[3]; + float scale_values[3]; ncnn::UnlockedPoolAllocator blob_pool_allocator; ncnn::PoolAllocator workspace_pool_allocator; diff --git a/app/src/main/cpp/yolov8ncnn.cpp b/app/src/main/cpp/yolov8ncnn.cpp index d6f202e..1dce4d0 100644 --- a/app/src/main/cpp/yolov8ncnn.cpp +++ b/app/src/main/cpp/yolov8ncnn.cpp @@ -104,6 +104,7 @@ {1 / 255.f, 1 / 255.f, 1 / 255.f}, {1 / 255.f, 1 / 255.f, 1 / 255.f} }; +const float scale_values[3] = {0.017f, 0.017f, 0.017f}; extern "C" { JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { @@ -173,6 +174,7 @@ target_size, mean_values[(int) model_id], norm_values[(int) model_id], + scale_values, use_classify, use_segmentation, use_detect, @@ -215,11 +217,25 @@ target_size, mean_values[*id], norm_values[*id], + scale_values, false, true, false, use_gpu ); + } else if (*id == 1) { + yolo_ptr->load( + mgr, + model_type, + target_size, + mean_values[*id], + norm_values[*id], + scale_values, + false, + false, + true, + use_gpu + ); } else { yolo_ptr->load( mgr, @@ -227,9 +243,10 @@ target_size, mean_values[*id], norm_values[*id], - false, - false, + scale_values, true, + false, + false, use_gpu ); } diff --git a/app/src/main/java/com/casic/br/app/external/INativeCallback.kt b/app/src/main/java/com/casic/br/app/external/INativeCallback.kt index ad03d84..fef55fb 100644 --- a/app/src/main/java/com/casic/br/app/external/INativeCallback.kt +++ b/app/src/main/java/com/casic/br/app/external/INativeCallback.kt @@ -10,7 +10,9 @@ * 分割 */ fun onSegmentation( - segmentationOutput: ArrayList, detectOutput: ArrayList + segmentationOutput: ArrayList, + detectOutput: ArrayList, + classifyOutput: FloatArray ) /** diff --git a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt index 3272030..2f435dc 100644 --- a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt @@ -33,6 +33,8 @@ ) } + val CLASSIFY_ARRAY = arrayOf("电线整洁", "电线杂乱", "餐馆厨房") + val TARGET_NAMES_ARRAY = arrayListOf( "三脚架", "三通", "标准软管", "人", "作业信息公示牌", "切断阀", "危险告知牌", "压力表", "压力表", "防护服", "可燃气体报警控制器", "呼气器", "喉箍", "气体检测报警仪", @@ -40,7 +42,7 @@ "安全绳", "对讲设备", "水枪", "工服", "开关", "燃气探测器", "接头", "施工路牌", "气体检测报警仪", "水带", "水带", "流量计", "消火栓箱", "灭火器", "灶台", "灶具", "照明设备", "熄火保护", "燃气管道", "燃气计量器具", "电线裸露", - "电路图", "警戒线", "调压器", "调长器", "贴纸", "跨电线", "路锥", + "电路图", "警戒线", "调压器", "调长器", "标识", "跨电线", "路锥", "过滤器", "配电箱内部", "配电箱外部", "长柄阀门", "闪光灯亮", "闪光灯灭", "阀门", "非标准软管", "送风设备", "送风设备" ) diff --git a/app/src/main/java/com/casic/br/app/utils/YoloTargetDetectHelper.kt b/app/src/main/java/com/casic/br/app/utils/YoloTargetDetectHelper.kt index fe56d38..d8ca471 100644 --- a/app/src/main/java/com/casic/br/app/utils/YoloTargetDetectHelper.kt +++ b/app/src/main/java/com/casic/br/app/utils/YoloTargetDetectHelper.kt @@ -15,7 +15,8 @@ fun siftHiddenTrouble( targetTypeSet: HashSet, segmentationResults: MutableList, - detectResults: MutableList + detectResults: MutableList, + classifyOutput: FloatArray ) { //每次刷新画面帧都清除掉之前的筛选结果 hiddenTroubles.clear() @@ -151,14 +152,6 @@ hiddenTroubles.add(result) } - if (detectResults.isContains(41) && !targetTypeSet.contains(41)) { - //包含电线裸露 - val result = HiddenTroubleResult() - result.alarmCode = "DistributionBoxHasExposedWire" - result.warning = "配电箱内部电线裸露" - hiddenTroubles.add(result) - } - if (!detectResults.isContains(47) && !targetTypeSet.contains(47)) { //包含跨电线 val result = HiddenTroubleResult() @@ -166,6 +159,31 @@ result.warning = "配电箱箱体和箱盖未跨接" hiddenTroubles.add(result) } + + //分类模型结果,筛选电线杂乱。排序找出最大值的Index + //[0.18615723,0.6484375,0.16516113] + var maxIndex = 0 + for (i in classifyOutput.indices) { + if (classifyOutput[i] > classifyOutput[maxIndex]) { + maxIndex = i + } + } + + //"电线整洁", "电线杂乱", "餐馆厨房" + if (maxIndex == 1) { + val result = HiddenTroubleResult() + result.alarmCode = "DistributionBoxHasTangledWire" + result.warning = LocaleConstant.CLASSIFY_ARRAY[maxIndex] + hiddenTroubles.add(result) + } + } + + if (detectResults.isContains(41) && !targetTypeSet.contains(41)) { + //包含电线裸露 + val result = HiddenTroubleResult() + result.alarmCode = "DistributionBoxHasExposedWire" + result.warning = "配电箱内部电线裸露" + hiddenTroubles.add(result) } } diff --git a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt index 9222751..82638df 100644 --- a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt @@ -2,7 +2,6 @@ import android.os.Bundle import androidx.lifecycle.ViewModelProvider -import com.amap.api.maps.MapsInitializer import com.casic.br.app.R import com.casic.br.app.databinding.ActivityLoginBinding import com.casic.br.app.utils.AuthenticationHelper @@ -115,9 +114,7 @@ } override fun onPermissionsGranted(requestCode: Int, perms: MutableList) { - //先把定位隐私政策声明,后面会用到 - MapsInitializer.updatePrivacyShow(this, true, true) - MapsInitializer.updatePrivacyAgree(this, true) + } override fun onPermissionsDenied(requestCode: Int, perms: MutableList) { diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index 499f140..e3057d7 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -353,8 +353,9 @@ } int -Yolo::load(AAssetManager *mgr, const char *model_type, int _target_size, const float *_mean_values, - const float *_norm_values, bool use_classify, bool use_segmentation, bool use_detect, +Yolo::load(AAssetManager *mgr, const char *model_type, int _target_size, + const float *_mean_values, const float *_norm_values, const float *_scale_values, + bool use_classify, bool use_segmentation, bool use_detect, bool use_gpu) { if (use_classify) { yolo_c.clear(); @@ -425,10 +426,14 @@ mean_values[0] = _mean_values[0]; mean_values[1] = _mean_values[1]; mean_values[2] = _mean_values[2]; + norm_values[0] = _norm_values[0]; norm_values[1] = _norm_values[1]; norm_values[2] = _norm_values[2]; + scale_values[0] = _scale_values[0]; + scale_values[1] = _scale_values[1]; + scale_values[2] = _scale_values[2]; return 0; } @@ -455,7 +460,6 @@ //把opencv Mat转为 ncnn Mat ncnn::Mat in = ncnn::Mat::from_pixels(rgb.data, ncnn::Mat::PIXEL_RGB, width, height); - std::vector cls_scores; { in.substract_mean_normalize(mean_values, scale_values); ncnn::Extractor ex = yolo_c.create_extractor(); @@ -523,7 +527,7 @@ javaVM->AttachCurrentThread(&env, nullptr); jclass callback_clazz = env->GetObjectClass(j_callback); jmethodID j_method_id = env->GetMethodID( - callback_clazz, "onSegmentation", "(Ljava/util/ArrayList;Ljava/util/ArrayList;)V" + callback_clazz, "onSegmentation", "(Ljava/util/ArrayList;Ljava/util/ArrayList;[F)V" ); //获取ArrayList类 @@ -533,6 +537,7 @@ //初始化ArrayList对象 jobject segment_array_obj = env->NewObject(list_clazz, arraylist_init); jobject detect_array_obj = env->NewObject(list_clazz, arraylist_init); + jfloatArray classify_result_array = env->NewFloatArray(3); //分割 { @@ -693,8 +698,28 @@ } } + //分类 + { + in.substract_mean_normalize(mean_values, scale_values); + ncnn::Extractor ex = yolo_c.create_extractor(); + ex.input("images", in); + + ncnn::Mat out; + ex.extract("output", out); + + int output_size = out.w; + float float_buffer[output_size]; + for (int j = 0; j < out.w; j++) { + float_buffer[j] = out[j]; + } + + env->SetFloatArrayRegion(classify_result_array, 0, output_size, float_buffer); + } + //分割和检测结果统一回调 - env->CallVoidMethod(j_callback, j_method_id, segment_array_obj, detect_array_obj); + env->CallVoidMethod( + j_callback, j_method_id, segment_array_obj, detect_array_obj, classify_result_array + ); /** * Mat数据。 diff --git a/app/src/main/cpp/yolo.h b/app/src/main/cpp/yolo.h index 44a4e09..12e4b1b 100644 --- a/app/src/main/cpp/yolo.h +++ b/app/src/main/cpp/yolo.h @@ -50,6 +50,7 @@ int target_size, const float *mean_values, const float *norm_values, + const float *scale_values, bool use_classify, bool use_segmentation, bool use_detect, @@ -89,6 +90,7 @@ int target_size; float mean_values[3]; float norm_values[3]; + float scale_values[3]; ncnn::UnlockedPoolAllocator blob_pool_allocator; ncnn::PoolAllocator workspace_pool_allocator; diff --git a/app/src/main/cpp/yolov8ncnn.cpp b/app/src/main/cpp/yolov8ncnn.cpp index d6f202e..1dce4d0 100644 --- a/app/src/main/cpp/yolov8ncnn.cpp +++ b/app/src/main/cpp/yolov8ncnn.cpp @@ -104,6 +104,7 @@ {1 / 255.f, 1 / 255.f, 1 / 255.f}, {1 / 255.f, 1 / 255.f, 1 / 255.f} }; +const float scale_values[3] = {0.017f, 0.017f, 0.017f}; extern "C" { JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { @@ -173,6 +174,7 @@ target_size, mean_values[(int) model_id], norm_values[(int) model_id], + scale_values, use_classify, use_segmentation, use_detect, @@ -215,11 +217,25 @@ target_size, mean_values[*id], norm_values[*id], + scale_values, false, true, false, use_gpu ); + } else if (*id == 1) { + yolo_ptr->load( + mgr, + model_type, + target_size, + mean_values[*id], + norm_values[*id], + scale_values, + false, + false, + true, + use_gpu + ); } else { yolo_ptr->load( mgr, @@ -227,9 +243,10 @@ target_size, mean_values[*id], norm_values[*id], - false, - false, + scale_values, true, + false, + false, use_gpu ); } diff --git a/app/src/main/java/com/casic/br/app/external/INativeCallback.kt b/app/src/main/java/com/casic/br/app/external/INativeCallback.kt index ad03d84..fef55fb 100644 --- a/app/src/main/java/com/casic/br/app/external/INativeCallback.kt +++ b/app/src/main/java/com/casic/br/app/external/INativeCallback.kt @@ -10,7 +10,9 @@ * 分割 */ fun onSegmentation( - segmentationOutput: ArrayList, detectOutput: ArrayList + segmentationOutput: ArrayList, + detectOutput: ArrayList, + classifyOutput: FloatArray ) /** diff --git a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt index 3272030..2f435dc 100644 --- a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt @@ -33,6 +33,8 @@ ) } + val CLASSIFY_ARRAY = arrayOf("电线整洁", "电线杂乱", "餐馆厨房") + val TARGET_NAMES_ARRAY = arrayListOf( "三脚架", "三通", "标准软管", "人", "作业信息公示牌", "切断阀", "危险告知牌", "压力表", "压力表", "防护服", "可燃气体报警控制器", "呼气器", "喉箍", "气体检测报警仪", @@ -40,7 +42,7 @@ "安全绳", "对讲设备", "水枪", "工服", "开关", "燃气探测器", "接头", "施工路牌", "气体检测报警仪", "水带", "水带", "流量计", "消火栓箱", "灭火器", "灶台", "灶具", "照明设备", "熄火保护", "燃气管道", "燃气计量器具", "电线裸露", - "电路图", "警戒线", "调压器", "调长器", "贴纸", "跨电线", "路锥", + "电路图", "警戒线", "调压器", "调长器", "标识", "跨电线", "路锥", "过滤器", "配电箱内部", "配电箱外部", "长柄阀门", "闪光灯亮", "闪光灯灭", "阀门", "非标准软管", "送风设备", "送风设备" ) diff --git a/app/src/main/java/com/casic/br/app/utils/YoloTargetDetectHelper.kt b/app/src/main/java/com/casic/br/app/utils/YoloTargetDetectHelper.kt index fe56d38..d8ca471 100644 --- a/app/src/main/java/com/casic/br/app/utils/YoloTargetDetectHelper.kt +++ b/app/src/main/java/com/casic/br/app/utils/YoloTargetDetectHelper.kt @@ -15,7 +15,8 @@ fun siftHiddenTrouble( targetTypeSet: HashSet, segmentationResults: MutableList, - detectResults: MutableList + detectResults: MutableList, + classifyOutput: FloatArray ) { //每次刷新画面帧都清除掉之前的筛选结果 hiddenTroubles.clear() @@ -151,14 +152,6 @@ hiddenTroubles.add(result) } - if (detectResults.isContains(41) && !targetTypeSet.contains(41)) { - //包含电线裸露 - val result = HiddenTroubleResult() - result.alarmCode = "DistributionBoxHasExposedWire" - result.warning = "配电箱内部电线裸露" - hiddenTroubles.add(result) - } - if (!detectResults.isContains(47) && !targetTypeSet.contains(47)) { //包含跨电线 val result = HiddenTroubleResult() @@ -166,6 +159,31 @@ result.warning = "配电箱箱体和箱盖未跨接" hiddenTroubles.add(result) } + + //分类模型结果,筛选电线杂乱。排序找出最大值的Index + //[0.18615723,0.6484375,0.16516113] + var maxIndex = 0 + for (i in classifyOutput.indices) { + if (classifyOutput[i] > classifyOutput[maxIndex]) { + maxIndex = i + } + } + + //"电线整洁", "电线杂乱", "餐馆厨房" + if (maxIndex == 1) { + val result = HiddenTroubleResult() + result.alarmCode = "DistributionBoxHasTangledWire" + result.warning = LocaleConstant.CLASSIFY_ARRAY[maxIndex] + hiddenTroubles.add(result) + } + } + + if (detectResults.isContains(41) && !targetTypeSet.contains(41)) { + //包含电线裸露 + val result = HiddenTroubleResult() + result.alarmCode = "DistributionBoxHasExposedWire" + result.warning = "配电箱内部电线裸露" + hiddenTroubles.add(result) } } diff --git a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt index 9222751..82638df 100644 --- a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt @@ -2,7 +2,6 @@ import android.os.Bundle import androidx.lifecycle.ViewModelProvider -import com.amap.api.maps.MapsInitializer import com.casic.br.app.R import com.casic.br.app.databinding.ActivityLoginBinding import com.casic.br.app.utils.AuthenticationHelper @@ -115,9 +114,7 @@ } override fun onPermissionsGranted(requestCode: Int, perms: MutableList) { - //先把定位隐私政策声明,后面会用到 - MapsInitializer.updatePrivacyShow(this, true, true) - MapsInitializer.updatePrivacyAgree(this, true) + } override fun onPermissionsDenied(requestCode: Int, perms: MutableList) { diff --git a/app/src/main/java/com/casic/br/app/view/StartCheckByYoloActivity.kt b/app/src/main/java/com/casic/br/app/view/StartCheckByYoloActivity.kt index cd90fb1..77aa137 100644 --- a/app/src/main/java/com/casic/br/app/view/StartCheckByYoloActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/StartCheckByYoloActivity.kt @@ -267,7 +267,9 @@ } override fun onSegmentation( - segmentationOutput: ArrayList, detectOutput: ArrayList + segmentationOutput: ArrayList, + detectOutput: ArrayList, + classifyOutput: FloatArray ) { val segmentationResults = ArrayList() segmentationOutput.forEach { @@ -312,7 +314,9 @@ } } //实时筛选隐患结果 - detectHelper.siftHiddenTrouble(targetTypeSet, segmentationResults, detectResults) + detectHelper.siftHiddenTrouble( + targetTypeSet, segmentationResults, detectResults, classifyOutput + ) runOnUiThread { if (targetSet.size > 0) { binding.tipsTagView.visibility = View.VISIBLE @@ -364,7 +368,7 @@ yolov8ncnn.onPause() //调用多模型 - yolov8ncnn.loadMultiModel(assets, intArrayOf(0, 1), false) + yolov8ncnn.loadMultiModel(assets, intArrayOf(0, 1, 2), false) isDetectTarget = true }