有网站模板如何预览,泉州app开发,工会网站建设方案,简洁网站欣赏使用Tools for AI封装onnx模型并推理
进行这一步之前#xff0c;请确保已正确安装配置了Visual Studio 2017 和 Microsoft Visual Studio Tools for AI环境。
项目的代码也可以在这里找到#xff0c;下面的步骤是带着大家从头到尾做一遍。
界面设计
创建Windows窗体应用(…使用Tools for AI封装onnx模型并推理
进行这一步之前请确保已正确安装配置了Visual Studio 2017 和 Microsoft Visual Studio Tools for AI环境。
项目的代码也可以在这里找到下面的步骤是带着大家从头到尾做一遍。
界面设计
创建Windows窗体应用(.NET Framework)项目这里给项目起名ClassifyBear。
注意项目路径不要包含中文。
在解决方案资源管理器中找到Form1.cs双击打开界面设计器。从工具箱中向Form中依次拖入控件并调整最终效果如下图所示 左侧从上下到依次是 Label控件将内容改为“输入要识别的图片地址” TextBox控件可以将控件拉长一些方便输入URL Button控件将内容改为“识别” Lable控件将label的内容清空用来显示识别后的结果。因为label也没有边框所以在界面看不出来。可以将此控件的字体调大一些能更清楚的显示推理结果。
右侧的控件是一个PictureBox用来预览输入的图片同时我们也从这个控件中取出对应的图片数据传给我们的模型推理类库去推理。建议将控件属性的SizeMode更改为StretchImage并将控件长和宽设置为同样的值保持一个正方形的形状这样可以方便我们直观的了解模型的输入因为在前面查看模型信息的时候也看到了该模型的输入图片应是正方形。
封装模型推理类库
由于目前模型推理用到的库只支持x64所以这里需要将解决方案平台设置为x64。打开解决方案资源管理器在解决方案上点右键选择配置管理器。
在配置管理器对话框中点开活动解决方案平台下拉框选择新建 在新建解决方案平台对话框中输入新平台名x64点击确定即可 下面添加模型推理类库再次打开解决方案资源管理器在解决方案上点右键选择添加然后选择新建项目。
添加新项目对话框中将左侧目录树切换到AI Tools下的Inference右侧选择模型推理类库下方填入项目名称这里用Model作为名称。 确定以后会出现检查环境的进度条耐心等待一会就可以出现模型推理类库创建向导对话框。
点击模型路径后面的浏览按钮选择前面下载的BearModel.onnx模型文件。
注意这里会出现几处错误提示我们需要手动修复一下。首先会看到“发现不支持的张量的数据类型”提示可以直接点确定。
确定后如果弹出“正在创建项目…”的进度条一直不消失这里只需要在类名后面的输入框内点一下切换下焦点即可。 然后我们来手动配置一下模型的相关信息。类名输入框中填入模型推理类的名字这里用Bear。然后点击推理接口右侧的添加按钮在弹出的编辑接口对话框中随便起个方法名这里用Infer。输入节点的变量名和张量名填入data输出节点的变量名和张量名填入classLabel字母拼写要和之前查看模型时看到的拼写一模一样。然后一路确定再耐心等待一会就可以在解决方案资源管理器看到新建的模型推理类库了。 至此模型推理类库封装完成。
使用模型推理类库
首先添加对模型推理类库的引用切换到解决方案资源管理器在ClassifyBear项目的引用上点右键选择添加引用。 在弹出的引用管理器对话框中选择项目、解决方案右侧可以看到刚刚创建的模型推理类库勾选该项目点击确定即可。
在Form1.cs上点右键选择查看代码打开Form1.cs的代码编辑窗口。
添加两个成员变量
// 使用Netron查看模型得到模型的输入应为227*227大小的图片
private const int imageSize 227;
// 模型推理类
private Model.Bear model; 回到Form1的设计界面双击Form的标题栏会自动跳转到代码页面并添加了Form1_Load方法在其中初始化模型推理对象 private void Form1_Load(object sender, EventArgs e)
{// 初始化模型推理对象model new Model.Bear();
} 回到Form1的设计界面双击识别按钮会自动跳转到代码页面并添加了button1_Click方法在其中添加以下代码
首先每次点击识别按钮时都先将界面上显示的上一次的结果清除 // 识别之前先重置界面显示的内容
label1.Text string.Empty;
pictureBox1.Image null;
pictureBox1.Refresh(); 然后让图片控件加载图片 bool isSuccess false;
try
{pictureBox1.Load(textBox1.Text);isSuccess true;
}
catch (Exception ex)
{MessageBox.Show($读取图片时出现错误{ex.Message});throw;
} 如果加载成功将图片数据传给模型推理类库来推理。 if (isSuccess)
{// 图片加载成功后从图片控件中取出227*227的位图对象Bitmap bitmap new Bitmap(pictureBox1.Image, imageSize, imageSize);
float[] imageArray new float[imageSize * imageSize * 3];
// 按照先行后列的方式依次取出图片的每个像素值for (int y 0; y imageSize; y){for (int x 0; x imageSize; x){var color bitmap.GetPixel(x, y);
// 使用Netron查看模型的输入发现// 需要依次放置227 *227的蓝色分量、227*227的绿色分量、227*227的红色分量imageArray[y * imageSize x] color.B;imageArray[y * imageSize x 1* imageSize * imageSize] color.G;imageArray[y * imageSize x 2* imageSize * imageSize] color.R;}}
// 模型推理类库支持一次推理多张图片这里只使用一张图片var inputImages new Listfloat[]();inputImages.Add(imageArray);
// 推理结果的第一个First()是取第一张图片的结果// 之前定义的输出只有classLabel所以第二个First()就是分类的名字label1.Text model.Infer(inputImages).First().First();
} 注意这里的数据转换一定要按照前面查看的模型的信息来转换图片大小需要长宽都是227像素并且要依次放置所有的蓝色分量、所有的绿色分量、所有的红色分量如果顺序不正确不能达到最佳的推理结果。
测试
编译运行然后在网上找一张熊的图片把地址填到输入框内然后点击识别按钮就可以看到识别的结果了。注意这个URL应该是图片的URL而不是包含该图片的网页的URL。