ncnn/examples/yolov4.cpp, yolov4->opt.use_vulkan_compute = true, 检测出现错误。
static int init_yolov4(ncnn::Net* yolov4, int* target_size) { /* --> Set the params you need for the ncnn inference <-- */ yolov4->opt.num_threads = 4; //You need to compile with libgomp for multi thread support yolov4->opt.use_vulkan_compute = true; //You need to compile with libvulkan for gpu support yolov4->opt.use_winograd_convolution = true; yolov4->opt.use_sgemm_convolution = true; yolov4->opt.use_fp16_packed = true; yolov4->opt.use_fp16_storage = true; yolov4->opt.use_fp16_arithmetic = true; yolov4->opt.use_packing_layout = true; yolov4->opt.use_shader_pack8 = false; yolov4->opt.use_image_storage = false; /* --> End of setting params <-- */ int ret = 0; // original pretrained model from https://GitHub.com/AlexeyAB/darknet // the ncnn model https://drive.google.com/drive/folders/1YzILvh0SKQPS_lrb33dmGNq7aVTKPWS0?usp=sharing // the ncnn model https://GitHub.com/nihui/ncnn-assets/tree/master/models#ifdef YOLOV4_TINY const char* yolov4_param = "yolov4-tiny-opt.param"; const char* yolov4_model = "yolov4-tiny-opt.bin"; *target_size = 416;#else const char* yolov4_param = "yolov4-opt.param"; const char* yolov4_model = "yolov4-opt.bin"; *target_size = 608;#endif ret = yolov4->load_param(yolov4_param); if (ret != 0) { return ret; } ret = yolov4->load_model(yolov4_model); if (ret != 0) { return ret; } return 0; } static int detect_yolov4(const cv::Mat& bgr, std::vector<Object>& objects, int target_size, ncnn::Net* yolov4) { int img_w = bgr.cols; int img_h = bgr.rows; cv::Mat gray; cv::cvtColor(bgr, gray, cv::COLOR_BGR2GRAY); cv::Mat resized; cv::resize(gray, resized, cv::Size(target_size, target_size), 0, 0, cv::INTER_LINEAR); cv::Mat input; cv::Mat output; ncnn::Mat in; ncnn::Mat out; in.allocate(resized.data, resized.cols, resized.rows, 3, 1); out.allocate(1, 1, 1, 1, 1); int ret = 0; ret = yolov4->forward({in, out}); if (ret != 0) { return ret; } int num = out.num; for (int i = 0; i < num; i++) { float* data = out[i].data; int label = data[0]; float prob = data[1]; cv::Rect_<float> rect = cv::Rect_<float>(data[2], data[3], data[4], data[5]); objects.push_back(Object{ rect, label, prob }); } return 0; }
内容来源: Tencent/ncnn