| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #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> |
| |
|
| | 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("squeezenet_v1.1.param")) |
| | exit(-1); |
| | if (squeezenet.load_model("squeezenet_v1.1.bin")) |
| | exit(-1); |
| |
|
| | 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) |
| | { |
| | |
| | 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> >()); |
| |
|
| | |
| | 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(int argc, char** argv) |
| | { |
| | if (argc != 2) |
| | { |
| | fprintf(stderr, "Usage: %s [imagepath]\n", argv[0]); |
| | return -1; |
| | } |
| |
|
| | const char* imagepath = argv[1]; |
| |
|
| | cv::Mat m = cv::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; |
| | } |
| |
|