From 8133bc1cb688172fcc098904568cb7c4090c81c0 Mon Sep 17 00:00:00 2001 From: JSPark <48265129+pknujsp@users.noreply.github.com> Date: Sat, 3 Jun 2023 21:27:35 +0900 Subject: [PATCH] =?UTF-8?q?#91=20=EB=8B=A4=EC=8B=9C=20GPU=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- feature/camera/src/main/jni/ndkcamera.cpp | 10 ----- feature/camera/src/main/jni/yolo.cpp | 51 +++++++++++----------- feature/camera/src/main/jni/yolov8ncnn.cpp | 2 +- 3 files changed, 26 insertions(+), 37 deletions(-) diff --git a/feature/camera/src/main/jni/ndkcamera.cpp b/feature/camera/src/main/jni/ndkcamera.cpp index 80c3792d4..7f65732e9 100644 --- a/feature/camera/src/main/jni/ndkcamera.cpp +++ b/feature/camera/src/main/jni/ndkcamera.cpp @@ -408,12 +408,8 @@ void NdkCameraWindow::set_window(ANativeWindow *_win) { void NdkCameraWindow::on_image_render(cv::Mat &rgb) const { } -static std::chrono::system_clock::time_point start; -static std::chrono::system_clock::time_point end; void NdkCameraWindow::on_image(const unsigned char *nv21, int nv21_width, int nv21_height) const { - - start = std::chrono::system_clock::now(); // resolve orientation from camera_orientation and accelerometer_sensor { if (!sensor_event_queue) { @@ -568,12 +564,6 @@ void NdkCameraWindow::on_image(const unsigned char *nv21, int nv21_width, int nv cv::Mat rgb_render(render_h, render_w, CV_8UC3); ncnn::kanna_rotate_c3(rgb.data, roi_w, roi_h, rgb_render.data, render_w, render_h, render_rotate_type); - // 속도개선위해 일부 데이터 스킵 - - end = std::chrono::system_clock::now(); - if ((end - start).count() % 2 == 0)return; - - ANativeWindow_setBuffersGeometry(win, render_w, render_h, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM); ANativeWindow_Buffer buf; diff --git a/feature/camera/src/main/jni/yolo.cpp b/feature/camera/src/main/jni/yolo.cpp index eae0187cd..cba99e435 100644 --- a/feature/camera/src/main/jni/yolo.cpp +++ b/feature/camera/src/main/jni/yolo.cpp @@ -11,6 +11,9 @@ static const float prob_threshold = 0.45f; static const float nms_threshold = 0.45f; +static std::vector proposals; +static std::vector grid_strides; + static float fast_exp(float x) { union { uint32_t i; @@ -63,29 +66,29 @@ static void qsort_descent_inplace(std::vector &faceobjects, int left, in } } -static void qsort_descent_inplace(std::vector &faceobjects) { - if (faceobjects.empty()) +static void qsort_descent_inplace() { + if (proposals.empty()) return; - qsort_descent_inplace(faceobjects, 0, faceobjects.size() - 1); + qsort_descent_inplace(proposals, 0, proposals.size() - 1); } -static void nms_sorted_bboxes(const std::vector &faceobjects, std::vector &picked) { +static void nms_sorted_bboxes(std::vector &picked) { picked.clear(); - const int n = faceobjects.size(); + const int n = proposals.size(); std::vector areas(n); for (int i = 0; i < n; i++) { - areas[i] = faceobjects[i].rect.width * faceobjects[i].rect.height; + areas[i] = proposals[i].rect.width * proposals[i].rect.height; } for (int i = 0; i < n; i++) { - const Object &a = faceobjects[i]; + const Object &a = proposals[i]; int keep = 1; for (int j = 0; j < (int) picked.size(); j++) { - const Object &b = faceobjects[picked[j]]; + const Object &b = proposals[picked[j]]; // intersection over union float inter_area = intersection_area(a, b); @@ -103,7 +106,7 @@ static void nms_sorted_bboxes(const std::vector &faceobjects, std::vecto static const std::vector strides = {8, 16, 32}; static void -generate_grids_and_stride(const int target_w, const int target_h, std::vector &grid_strides) { +generate_grids_and_stride(const int target_w, const int target_h) { int num_grid_w = 0; int num_grid_h = 0; @@ -124,13 +127,11 @@ generate_grids_and_stride(const int target_w, const int target_h, std::vector grid_strides, const ncnn::Mat &pred, std::vector &objects) { - const int num_points = grid_strides.size(); +static void generate_proposals(const ncnn::Mat &pred) { const int num_class = 1; const int reg_max_1 = 16; - for (int i = 0; i < num_points; i++) { + for (int i = 0; i < grid_strides.size(); i++) { const float *scores = pred.row(i) + 4 * reg_max_1; // find label with max score @@ -194,7 +195,7 @@ generate_proposals(std::vector grid_strides, const ncnn::Mat &pre obj.label = label; obj.prob = box_prob; - objects.push_back(obj); + proposals.push_back(obj); } } } @@ -215,10 +216,10 @@ Yolo::load(AAssetManager *mgr, const char *modeltype, int _target_size, const fl ncnn::set_omp_num_threads(ncnn::get_cpu_count()); yolo.opt = ncnn::Option(); - yolo.opt.use_vulkan_compute = false; -#if NCNN_VULKAN +#if NCNN_VULKAN + yolo.opt.use_vulkan_compute = true; #endif yolo.opt.num_threads = ncnn::get_cpu_count(); @@ -239,6 +240,7 @@ Yolo::load(AAssetManager *mgr, const char *modeltype, int _target_size, const fl return 0; } + // sort objects by area struct { bool operator()(const Object &a, const Object &b) const { @@ -250,7 +252,6 @@ void Yolo::detect(const cv::Mat &rgb, std::vector &objects) { int width = rgb.cols; int height = rgb.rows; - // pad to multiple of 32 int w = width; int h = height; float scale = 1.f; @@ -278,26 +279,24 @@ void Yolo::detect(const cv::Mat &rgb, std::vector &objects) { ex.input("images", in_pad); - std::vector proposals; + proposals.clear(); ncnn::Mat out; ex.extract("output0", out); -// might have stride=64 - std::vector grid_strides; - generate_grids_and_stride(in_pad.w, in_pad.h, grid_strides); + // might have stride=64 + generate_grids_and_stride(in_pad.w, in_pad.h); - generate_proposals(grid_strides, out, proposals); + generate_proposals(out); // sort all proposals by score from highest to lowest - qsort_descent_inplace(proposals); + qsort_descent_inplace(); // apply nms with nms_threshold std::vector picked; - nms_sorted_bboxes(proposals, picked); + nms_sorted_bboxes(picked); int count = picked.size(); - objects.resize(count); for (int i = 0; i < count; i++) { objects[i] = proposals[picked[i]]; @@ -313,7 +312,7 @@ void Yolo::detect(const cv::Mat &rgb, std::vector &objects) { objects[i].rect.height = y1 - y0; } - std::sort(objects.begin(), objects.end(), objects_area_greater); + // std::sort(objects.begin(), objects.end(), objects_area_greater); } static const int color = 255; diff --git a/feature/camera/src/main/jni/yolov8ncnn.cpp b/feature/camera/src/main/jni/yolov8ncnn.cpp index 7c68ee733..6522ce25e 100644 --- a/feature/camera/src/main/jni/yolov8ncnn.cpp +++ b/feature/camera/src/main/jni/yolov8ncnn.cpp @@ -159,7 +159,7 @@ static std::vector objs; void MyNdkCamera::on_image_render(cv::Mat &rgb) const { { - ncnn::MutexLockGuard g(lock); + // ncnn::MutexLockGuard g(lock); if (g_yolo) { objs.clear();