通过以下网址下载CNTK-master,并解压
https://github.com/Microsoft/CNTK/tree/master
神经网络在keras+cntk(backend)框架下训练得到权重
使用如下命令得到训练的神经网络权重的最后一层用于在C#中调用来进行预测(需要import cntk)
cntk.combine(model.outputs).save(’/home/wxcnl/Downloads/cntk’)
创建一个C#控制台程序,在C#中安装以下nuget包
https://www.nuget.org/packages/CNTK.CPUOnly/
并右击该项目-添加-现有项
添加如下目录中的CNTKExtensions.cs
D:\CNTK-master\Examples\Evaluation\CNTKLibraryCSEvalCPUOnlyExamples
再添加以下目录中的CNTKImageProcessing.cs
D:\CNTK-master\Examples\Evaluation\ImageExtension
右击项目-属性-生成-目标平台改为x64
以下为测试样本代码
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using CNTK;
using CNTKExtension;
using CNTKImageProcessing;
namespace cntk_test
{
class Program
{
static void Main(string[] args)
{
EvaluationSingleImage();
Console.WriteLine("success");
Console.ReadLine();
}
public static string cntk_model_file = "D:\\SDI_0123cntkcntk";
private static string SampleImage = "D:\\SDI\\imgr\\0.bmp";
public static DeviceDescriptor device = CNTK.DeviceDescriptor.CPUDevice;
public static Function modelFunc = Function.Load(cntk_model_file, device);
public static void EvaluationSingleImage()
{
Console.WriteLine("\n===== Evaluate single image =====");
// Get input variable. The model has only one single input.
// The same way described above for output variable can be used here to get input variable by name.
Variable inputVar = modelFunc.Arguments.Single();
// Get shape data for the input variable
NDShape inputShape = inputVar.Shape;
int imageWidth = inputShape[1];
int imageHeight = inputShape[2];
Bitmap bmp = new Bitmap(Bitmap.FromFile(SampleImage));
var resized = bmp.Resize(imageWidth, imageHeight, true);
List<float> resizedCHW_temp = resized.ParallelExtractCHW();
//训练图片为灰度图,所以只取单通道数组,以该方式读取得到的数组为一个通道的所有像素
List<float> resizedCHW = resizedCHW_temp.Take(256 * 4800).ToList();
//单通道数组在输入模型时所有像素值需要除以255
for (int i = 0; i < 256 * 4800; i++)
{
resizedCHW[i] = resizedCHW[i]/(255.0f);
}
//CNTK C#网页上的example代码
var inputDataMap = new Dictionary<Variable, Value>();
var inputVal = Value.CreateBatch(inputShape, resizedCHW, device);
inputDataMap.Add(inputVar, inputVal);
Variable outputVar = modelFunc.Output;
var outputDataMap = new Dictionary<Variable, Value>();
outputDataMap.Add(outputVar, null);
modelFunc.Evaluate(inputDataMap, outputDataMap, device);
var outputVal = outputDataMap[outputVar];
var outputData = outputVal.GetDenseData<float>(outputVar);
//显示通过神经网络处理后的图片标注,本任务为切割任务,所以需要显示图片标注
byte[] outputimg = new byte[256 * 4800*3];
for (int i = 0; i < outputData[0].Count; i++)
{
outputimg[i] = (byte)(outputData[0][i]*255.0f);
}
int o = 0;
for (int i = 0; i < outputData[0].Count; i++)
{
outputimg[o++] = (byte)(outputData[0][i] * 255.0f);
outputimg[o++] = (byte)(outputData[0][i] * 255.0f);
outputimg[o++] = (byte)(outputData[0][i] * 255.0f);
}
Bitmap m_currBitmap2 = new Bitmap(256, 4800, PixelFormat.Format24bppRgb);
Rectangle m_rect2 = new Rectangle(0, 0, 256, 4800);
var m_bitmapData2 = m_currBitmap2.LockBits(m_rect2, ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);
IntPtr iptr2 = m_bitmapData2.Scan0;
System.Runtime.InteropServices.Marshal.Copy(outputimg, 0, iptr2, 256* 4800 * 3);
m_currBitmap2.UnlockBits(m_bitmapData2);
m_currBitmap2.Save("C:\\Users\\18367\\Desktop\\corner_test\\cntk_prediction.jpg");
}
}
}