由于原来配置过2017年10月份的ncnn,现在项目需要重新在VS2013上配置目前最新的版本。

各种功能不再阐述,可以参考官网介绍,这里直接切入正题,ncnn-20180129版本官网下载地址:https://github.com/Tencent/ncnn/releases


1、下载好后,在VS新建一个工程,把“src”整个目录拷贝到工程根目录下。然后全部把“src”的源文件全部包含进来,另外由于是在windows上用,把包含进来的文件-->"layer"-->"arm"全部“从项目中排出”,见下图:

                              

2、把“platform.h.in”改名为“platform.h”,并且在里面修改为如下内容保存:

                

3、头文件包含,打开项目的属性,把2个头文件路径包含进来,记得分别在Debug和Release下。


4、不知道什么原因,20180129这个版本没有"layer_declaration.h"、“layer_registry.h”头文件,这个时候可以下载2017年10月份官网的ncnn,在src源目录里面找到这2个头文件包含进来,再尝试编译

5、可以尝试编译一下,如果出现error C3861: '_InterLockedCompareExchang‘,则需要包含系统xlocale头文件,在“benchmark.cpp”

       

6、新建一个main函数测试一下,当然记得配置好自己opencv的版本和准备好自己的模型。可以下载烂大街的Alexnet做测试。我这里是用自己训练出来的模型,转换成.param和.bin文件然后看提取的特征数据。

// 20180129版本的
// Tencent is pleased to support the open source community by making ncnn available.
//
// Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved.
//
// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
// in compliance with the License. You may obtain a copy of the License at
//
// https://opensource.org/licenses/BSD-3-Clause
//
// Unless required by applicable law or agreed to in writing, software distributed
// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.

#include <stdio.h>
#include <algorithm>
#include <vector>
#include<functional> // 排序函数需要的
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include<opencv2/opencv.hpp>
#include<iostream>
#include <fstream>
#include "src/net.h"
//#include "ltcnnprotonew.mem.h" // 导致编辑器堆空间不足

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(int argc, char** argv)
{
	bool isValidiate = 1;
	ncnn::Net net;
	if (isValidiate)
	{
		// 适合快速复现
		/*net.load_param("squeezenet_v1.1.param");
		net.load_model("squeezenet_v1.1.bin");*/
		net.load_param("F:/ncnn/smoke20180206/smoke_new_float.param");//"F:/ncnn/caffe2ncnn-windows/ltcnnprotonew.param"
		//"F:/ncnn/smoke20180206/smoke_new_float.param"
		net.load_model("F:/ncnn/smoke20180206/smoke_new_float.bin"); 
	}
	else
	{
		// 适合 APP 分发模型资源,模型名字改下即可
		net.load_param("ltcnnprotonew.param.bin");
		net.load_model("ltcnnprotonew.bin");
	}

	//
	std::ifstream fid("F:\\Matlab_Files\\facerecognizition\\samePairPath_ourdata.txt");
	std::ifstream fid2("F:\\Matlab_Files\\facerecognizition\\diffPairPath_ourdata.txt");
	std::string stringLine, pairFirst, pairSecond;
	std::vector<std::pair<std::string, std::string> > samepair, diffpair;
	while (getline(fid, stringLine))
	{
		char a[255], b[255];
		sscanf(stringLine.c_str(), "%s%s", a, b);
		pairFirst = a;
		pairSecond = b;
		samepair.push_back(std::pair<std::string, std::string>(pairFirst, pairSecond));
	}
	fid.close();
	while (getline(fid2, stringLine))
	{
		char a[255], b[255];
		sscanf(stringLine.c_str(), "%s%s", a, b);
		pairFirst = a;
		pairSecond = b;
		diffpair.push_back(std::pair<std::string, std::string>(pairFirst, pairSecond));
	}
	fid2.close();

	int nums_same = 0;
	std::vector<float> cls_scores1, cls_scores2;
	cv::Mat imgGray1, imgGray2;
	for (size_t i = 0; i < diffpair.size(); i++)
	{
		imgGray1 = cv::imread("C:/caffe/caffe-master/examples/smoke_train_large/20000000030_61_at61_2018-01-17_00_37_35_342.png", 0);//diffpair[i].first
		//"C:/caffe/caffe-master/examples/smoke_train_large/20000000030_61_at61_2018-01-17_00_37_35_342.png"
		imgGray2 = cv::imread("C:/caffe/caffe-master/examples/smoke_train_large/20000000030_61_at61_2018-01-17_00_37_35_342.png", 0);//diffpair[i].second

		ncnn::Mat in1 = ncnn::Mat::from_pixels_resize(imgGray1.data, ncnn::Mat::PIXEL_GRAY, imgGray1.cols, imgGray1.rows, 112, 112);
		ncnn::Mat in2 = ncnn::Mat::from_pixels_resize(imgGray2.data, ncnn::Mat::PIXEL_GRAY, imgGray2.cols, imgGray2.rows, 128, 128);

		const float mean_vals[3] = { 0.f, 0.f, 0.f };
		const float normal = 1. / 255.0f;
		in1.substract_mean_normalize(mean_vals, &normal);
		in2.substract_mean_normalize(mean_vals, &normal);

		ncnn::Mat out1, out2;
		ncnn::Extractor ex1 = net.create_extractor();
		ex1.set_light_mode(true);
		ex1.input("data", in1);
		double time1 = cv::getTickCount();
		ex1.extract("fc1", out1);// 原来是“prob”
		printf("Time:(ms) %f\n", (cv::getTickCount() - time1) / cv::getTickFrequency() * 1000);

		ncnn::Extractor ex2 = net.create_extractor();
		ex2.set_light_mode(true);
		ex2.input("data", in2);
		ex2.extract("fc1", out2);

		ncnn::Mat out_flatterned1 = out1.reshape(out1.w * out1.h * out1.c);
		ncnn::Mat out_flatterned2 = out2.reshape(out2.w * out2.h * out2.c);
		cls_scores1.resize(out_flatterned1.w);
		for (int j = 0; j<out_flatterned1.w; j++)
		{
			cls_scores1[j] = out_flatterned1[j];
		}
		cls_scores2.resize(out_flatterned2.w);
		for (int j = 0; j<out1.c; j++)
		{
			cls_scores2[j] = out_flatterned2[j];
		}

		cv::Mat pnew1 = cv::Mat(1, 256, CV_32FC1);
		for (size_t idm = 0; idm < 256; idm++)
		{
			pnew1.at<float>(0, idm) = std::max(cls_scores1[idm], cls_scores1[idm + 256]);
		}
		cv::Mat prob1 = pnew1.clone();
		cv::Mat pnew2 = cv::Mat(1, 256, CV_32FC1);
		for (size_t idm = 0; idm < 256; idm++)
		{
			pnew2.at<float>(0, idm) = std::max(cls_scores2[idm], cls_scores2[idm + 256]);
		}
		cv::Mat prob2 = pnew2.clone();

		float dist = prob1.dot(prob2) / sqrt(prob1.dot(prob1)*prob2.dot(prob2));

		cv::Mat tmp = cv::Mat::zeros(imgGray1.rows, 2 * imgGray1.cols, CV_8U);
		imgGray1.copyTo(tmp(cv::Rect(0, 0, imgGray1.cols, imgGray1.rows)));
		imgGray2.copyTo(tmp(cv::Rect(imgGray2.cols, 0, imgGray2.cols, imgGray2.rows)));
		cv::putText(tmp, std::to_string(dist), cv::Point(50, 40), 1, 1.5, cv::Scalar::all(255), 1);
		cv::putText(tmp, "diff" , cv::Point(70, 80), 1, 1.5, cv::Scalar::all(255), 1);
		imwrite("outputdata/" + std::to_string(dist) + "_diff_" + std::to_string(nums_same++)  + ".jpg", tmp);

		cv::imshow("tmp", tmp);
		int key = cv::waitKey(20);
		if (key == 27)
		{
			break;
		}
		if (key == ' ')
		{
			cv::waitKey();
		}
	}
	
	return 0;
}



上面是我的自己训练的深度模型示例结果,成功调试跑通~



Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐