美文网首页
NCNN window10 VS2019 cmake 环境搭建

NCNN window10 VS2019 cmake 环境搭建

作者: dillqq | 来源:发表于2023-05-15 20:58 被阅读0次

    NCNN,protobuf编译

    首先需要根据官方编译protobuf和NCNN 关于如何编译NCNN和 protobuf 的方式我是参考这个的。
    https://blog.csdn.net/qq_36890370/article/details/104966786
    本文主要的内容是如何使用cmake去配置NCNN环境,在编译这块不过多叙述。

    文件放置

    我们需要将NCNN和protobuf编译生成文件中的install目录下的bin,cmake,include,lib文件和并起来。如下图:


    install位置

    然后我们创建cmake工程。

    cmake配置

    同时需要注意配置opencv和ncnn的环境变量,这样cmake也可以直接搜索到cmake的第三方配置文件。

    # CMakeList.txt: CMakeProject1 的 CMake 项目,在此处包括源代码并定义
    # 项目特定的逻辑。
    #
    cmake_minimum_required (VERSION 3.8)
    project (CMakeProject1)
    
    #OPENCV
    set(OpenCV_DIR  "D:/openCV/opencv/build/x64/vc15/lib")  #如果配置了opencv环境变量也不用加
    find_package(OpenCV REQUIRED)
    #添加头文件
    include_directories(${OpenCV_INCLUDE_DIRS})
    
    #NCNN
    set(ncnn_DIR "D:/NCNN/ncnnDepen/lib/cmake/ncnn")  
    find_package(ncnn REQUIRED)
    
    
    # 将源代码添加到此项目的可执行文件。
    add_executable (CMakeProject1 "CMakeProject1.cpp" "CMakeProject1.h")
    
    #链接库文件
    target_link_libraries(CMakeProject1 ${OpenCV_LIBS})
    target_link_libraries(CMakeProject1 ncnn)
    
    # TODO: 如有需要,请添加测试并安装目标。
    
    

    模型验证

    使用squeezenet验证NCNN环境是否配置上了,之所以使用squeezenet主要原因是因为NCNN官方github里面提供了权重也就是bin和params,在sample文件夹里,所以懒死我算了。具体代码如下,也可以直接copy NCNN包中sample下的squeezenet.cpp一样的。

    // CMakeProject1.cpp: 定义应用程序的入口点。
    //
    
    #include "CMakeProject1.h"
    
    #include "net.h"
    
    #include <algorithm>
    #if defined(USE_NCNN_SIMPLEOCV)
    #include "simpleocv.h"
    #else
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #endif
    #include <stdio.h>
    #include <vector>
    
    using namespace std;
    using namespace cv;
    
    static int detect_squeezenet(const cv::Mat& bgr, std::vector<float>& cls_scores)
    {
        //创建模型
        ncnn::Net squeezenet;
        squeezenet.opt.use_vulkan_compute = true;
        //读取权重网络结构
        if (squeezenet.load_param("D:/NCNN/ncnn-master/examples/squeezenet_v1.1.param"))
            exit(-1);
        if (squeezenet.load_model("D:/NCNN/ncnn-master/examples/squeezenet_v1.1.bin"))
            exit(-1);
        //将opencv转换为ncnn输入格式 大小为(227,227)
        ncnn::Mat in = ncnn::Mat::from_pixels_resize(bgr.data, ncnn::Mat::PIXEL_BGR, bgr.cols, bgr.rows, 227, 227);
    
        const float mean_vals[3] = { 104.f, 117.f, 123.f };
        //对图像进行均值方差的操作  mean_vals表示为减去的均值  norm_vals表示为方差
        in.substract_mean_normalize(mean_vals, 0);
        //抽取模型
        ncnn::Extractor ex = squeezenet.create_extractor();
        //输入 这个根据use netron 查看入口,和出口
        ex.input("data", in);
        ncnn::Mat out;
        ex.extract("prob", out);
    
        cls_scores.resize(out.w);
    
        for (int j = 0; j < out.w; j++)
        {
            cls_scores[j] = out[j];
        }
    
        return 0;
    }
    
    static int print_topk(const std::vector<float>& cls_scores, int topk)
    {
        // partial sort topk with index
        int size = cls_scores.size();
        std::vector<std::pair<float, int> > vec;
        vec.resize(size);
        for (int i = 0; i < size; i++)
        {
            vec[i] = std::make_pair(cls_scores[i], i);
        }
    
        std::partial_sort(vec.begin(), vec.begin() + topk, vec.end(),
            std::greater<std::pair<float, int> >());
    
        // print topk and score
        for (int i = 0; i < topk; i++)
        {
            float score = vec[i].first;
            int index = vec[i].second;
            fprintf(stderr, "%d = %f\n", index, score);
        }
    
        return 0;
    }
    
    
    int main()
    {
        //读取图片
        const char* imagepath = "C:/Users/zheng/Pictures/lion.png";
        Mat m = imread(imagepath, 1);
        if (m.empty())
        {
            fprintf(stderr, "cv::imread %s failed\n", imagepath);
            return -1;
        }
        //设置置信度
        std::vector<float> cls_scores;
    
        detect_squeezenet(m, cls_scores);
        print_topk(cls_scores, 3);
    
        return 0;
    }
    

    模型执行成功就行了。

    结果图

    相关文章

      网友评论

          本文标题:NCNN window10 VS2019 cmake 环境搭建

          本文链接:https://www.haomeiwen.com/subject/sthvsdtx.html