From 6c17c260e892d28b7cc12ad77fa33dba14065b43 Mon Sep 17 00:00:00 2001 From: sladro Date: Thu, 8 Jan 2026 15:55:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=BA=E8=84=B8=E8=AF=86?= =?UTF-8?q?=E5=88=AB=E9=97=AE=E9=A2=98,=E6=B5=8B=E8=AF=95=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E9=97=AE=E9=A2=98=EF=BC=8C=E6=B7=BB=E5=8A=A0=E4=BA=86?= =?UTF-8?q?=E8=B0=83=E8=AF=95,=E6=B5=8B=E8=AF=95landlandmarks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 003.jpg | Bin 0 -> 40261 bytes plugins/ai_face_det/ai_face_det_node.cpp | 53 +++++++++++++++++++ plugins/ai_face_recog/ai_face_recog_node.cpp | 12 +++++ 3 files changed, 65 insertions(+) create mode 100644 003.jpg diff --git a/003.jpg b/003.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8936ff9fb63fd52675ca79138c2b82e633bda436 GIT binary patch literal 40261 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 #include +// For test image loading (implementation in ai_face_recog_node.cpp) +#include "../../third_party/rknpu2/examples/3rdparty/stb/stb_image.h" + #include "ai_scheduler.h" #include "face/face_result.h" #include "node.h" @@ -475,6 +478,56 @@ public: const int max_faces = cfg ? cfg->max_faces : 0; LogInfo("[ai_face_det] start id=" + id_ + " conf=" + std::to_string(conf) + " nms=" + std::to_string(nms) + " max_faces=" + std::to_string(max_faces)); + + // ========== TEST: Load 003.jpg and run detection ========== +#if defined(RK3588_ENABLE_RKNN) + { + const char* test_img_path = "./003.jpg"; + int img_w = 0, img_h = 0, img_c = 0; + unsigned char* img_data = stbi_load(test_img_path, &img_w, &img_h, &img_c, 3); + if (img_data && img_w > 0 && img_h > 0) { + std::cerr << "[TEST] Loaded " << test_img_path << " (" << img_w << "x" << img_h << ")\n"; + + // Create a fake frame + auto frame = std::make_shared(); + frame->width = img_w; + frame->height = img_h; + frame->format = PixelFormat::RGB; + frame->data = img_data; + frame->data_size = static_cast(img_w) * static_cast(img_h) * 3; + frame->stride = img_w * 3; + + // Run detection + Run(frame); + + // Print results + if (frame->face_det && !frame->face_det->faces.empty()) { + std::cerr << "[TEST] Detected " << frame->face_det->faces.size() << " face(s)\n"; + for (size_t fi = 0; fi < frame->face_det->faces.size(); ++fi) { + const auto& face = frame->face_det->faces[fi]; + std::cerr << "[TEST] Face " << fi << " bbox: [" + << face.bbox.x << "," << face.bbox.y << "," + << face.bbox.w << "," << face.bbox.h << "] score=" << face.score << "\n"; + if (face.has_landmarks) { + std::cerr << "[TEST] Board landmarks: "; + for (int li = 0; li < 5; ++li) { + std::cerr << "[" << face.landmarks[li].x << "," << face.landmarks[li].y << "] "; + } + std::cerr << "\n"; + } + } + } else { + std::cerr << "[TEST] No faces detected\n"; + } + + stbi_image_free(img_data); + } else { + std::cerr << "[TEST] Skip: " << test_img_path << " not found\n"; + } + } +#endif + // ========== END TEST ========== + return true; } diff --git a/plugins/ai_face_recog/ai_face_recog_node.cpp b/plugins/ai_face_recog/ai_face_recog_node.cpp index b3f125c..6454b25 100644 --- a/plugins/ai_face_recog/ai_face_recog_node.cpp +++ b/plugins/ai_face_recog/ai_face_recog_node.cpp @@ -16,6 +16,7 @@ // For test image loading #define STB_IMAGE_IMPLEMENTATION #define STBI_ONLY_PNG +#define STBI_ONLY_JPEG #define STBI_NO_FAILURE_STRINGS #include "../../third_party/rknpu2/examples/3rdparty/stb/stb_image.h" @@ -894,6 +895,17 @@ private: for (int i = 0; i < limit; ++i) { const FaceDetItem& face = frame->face_det->faces[static_cast(i)]; + // DEBUG: 打印检测到的 landmarks (只打印一次) + static bool landmarks_printed = false; + if (face.has_landmarks && !landmarks_printed) { + std::cerr << "[DEBUG] Board landmarks: "; + for (int li = 0; li < 5; ++li) { + std::cerr << "[" << face.landmarks[li].x << "," << face.landmarks[li].y << "] "; + } + std::cerr << "\n"; + landmarks_printed = true; + } + face_buf_.resize(static_cast(model_w_) * static_cast(model_h_) * 3); if (cfg->align && face.has_landmarks && model_w_ == 112 && model_h_ == 112) { const std::array dst = {