Code
#include <opencv2\opencv.hpp>
#include <map>
#include <vector>
#include <algorithm>
#include <functional>
#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <net.h>
static int detect_squeezenet(const cv::Mat& bgr, std::vector<float>& cls_scores)
{
ncnn::Net squeezenet; // 声明一个类,这里是一个模型,但是怎么知道模型的结构呢?
squeezenet.load_param("D:/profile/ncnn-20200226/examples/squeezenet_v1.1.param"); // 和darknet一样,读取一个配置文件来建立模型darknet中net, layer都是struct
squeezenet.load_model("D:/profile/ncnn-20200226/examples/squeezenet_v1.1.bin"); // 读入预训练模型的参数
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 };
in.substract_mean_normalize(mean_vals, 0);
ncnn::Extractor ex = squeezenet.create_extractor();
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; // 声明一个pair容器
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(), // 部分排序算法,只要topk的 // 返回一个当前vector容器中起始元素的迭代器
std::greater< std::pair<float, int> >()); // greator,降序排列,应该是使用第一个float
// 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()
{
std::string imagepath = "./demo_image/test.jpg";
cv::Mat m = cv::imread(imagepath, CV_LOAD_IMAGE_COLOR);
if (m.empty())
{
std::cout << "cv::imread " << imagepath << " failed\n" << std::endl;
return -1;
}
std::vector<float> cls_scores;
detect_squeezenet(m, cls_scores); // 加载模型,推理,将推理结果放入cls_scores
print_topk(cls_scores, 3); // 打印前三高的分数
getchar();
return 0;
}
知识点
- vector的使用
- partial_sort实现的部分排序,降序排序,提取top
- ncnn声明一个模型类,采用和darknet同样的方式,通过读取一个配置文件来初始化模型,load_model:载入预训练模型的参数