C#加载deeplab分割模型

训练和导出模型请参考

https://github.com/bubbliiiing/deeplabv3-plus-pytorch

使用OpenCVSharp

using System;
using OpenCvSharp;
using OpenCvSharp.Dnn;
using System.Collections.Generic;
namespace Opencvsharpdeploy
{
    class Program
    {
        static void Main(string[] args)
        {
            Mat image = Cv2.ImRead("demo.jpg");
            Net net = CvDnn.ReadNet("deeplab.onnx");
            Mat resize_image = new Mat();
            Cv2.Resize(image, resize_image, new OpenCvSharp.Size(512, 512), 0, 0, InterpolationFlags.Linear);
            Mat blob = CvDnn.BlobFromImage(resize_image, 1.0 / 255.0, new OpenCvSharp.Size(512, 512), new Scalar(0, 0, 0), true, false);
            net.SetInput(blob);
            Mat probs;
            probs = net.Forward();
            int batch = probs.Size(0);
            int cls = probs.Size(1);
            int width = probs.Size(2);
            int height = probs.Size(3);
            List<Mat> masks = new List<Mat>();
            for (int b = 0; b < batch; b++)
            {
                for (int c = 0; c < cls; c++)
                {
                    Mat mask = Mat.Zeros(new Size(height, width), MatType.CV_8UC1);
                    for (int h = 0; h < height; h++)
                    {
                        for (int w = 0; w < width; w++)
                        {
                            float value = probs.At<float>(b, c, h, w);
                            if (value > 0.9)
                            {
                                mask.At<int>(h, w) = 255;
                            }
                            else
                            {
                                mask.At<int>(h, w) = 0;
                            }
                        }
                    } 
                    masks.Add(mask);
                }
            }
            Mat masked_img = new Mat();
            Mat rgb_mask = Mat.Zeros(new Size(image.Rows, image.Cols), MatType.CV_8UC3);
            Console.WriteLine(masks.Count);
            for (int i = 0; i < masks.Count; i++)
            {
                Random rd = new Random();
                Cv2.Resize(masks[i], masks[i], new OpenCvSharp.Size(image.Rows, image.Cols));
                if (i == 0)
                {
                    Cv2.Add(rgb_mask, new Scalar(0, 0, 0), rgb_mask, masks[i]);

                }
                else
                {
                    Cv2.Add(rgb_mask, new Scalar(rd.Next(0, 255), rd.Next(0, 255), rd.Next(0, 255)), rgb_mask, masks[i]);
                }
            }
            Cv2.AddWeighted(image, 0.5, rgb_mask.Clone(), 0.5, 0, masked_img);
            Cv2.NamedWindow("Mask.jpg", WindowFlags.Normal);
            Cv2.ImShow("Mask.jpg", masked_img);
            Cv2.WaitKey(0);
        }
    }
}

使用Microsoft.ML.OnnxRuntime

using System;
using System.Collections.Generic;
using System.Linq;
using OpenCvSharp;
using Microsoft.ML.OnnxRuntime;
using Microsoft.ML.OnnxRuntime.Tensors;
namespace Onnxruntimedeploy
{
    class Program
    {
        static void Main(string[] args)
        {

            string model_path = "deeplab.onnx";
            string image_path = "demo.jpg";
            Mat masked_img = new Mat();
            List<NamedOnnxValue> input_ontainer;
            SessionOptions options;
            InferenceSession onnx_session;
            Tensor<float> input_tensor;
            IDisposableReadOnlyCollection<DisposableNamedOnnxValue> result_infer;
            DisposableNamedOnnxValue[] results_onnxvalue;
            options = new SessionOptions();
            options.LogSeverityLevel = OrtLoggingLevel.ORT_LOGGING_LEVEL_INFO;
            options.AppendExecutionProvider_CPU(0);
            onnx_session = new InferenceSession(model_path, options);
            input_ontainer = new List<NamedOnnxValue>();
            Mat image = Cv2.ImRead(image_path);
            Mat resize_image = new Mat();
            float[] result_array = new float[1 * 3 * 512 * 512];
            Cv2.Resize(image, resize_image, new OpenCvSharp.Size(512, 512));
            input_tensor = new DenseTensor<float>(new[] { 1, 3, 512, 512 });
            for (int y = 0; y < resize_image.Height; y++)
            {
                for (int x = 0; x < resize_image.Width; x++)
                {
                    input_tensor[0, 0, y, x] = resize_image.At<Vec3b>(y, x)[0] / 255f;
                    input_tensor[0, 1, y, x] = resize_image.At<Vec3b>(y, x)[1] / 255f;
                    input_tensor[0, 2, y, x] = resize_image.At<Vec3b>(y, x)[2] / 255f;
                }
            }
            input_ontainer.Add(NamedOnnxValue.CreateFromTensor("images", input_tensor));
            result_infer = onnx_session.Run(input_ontainer);
            results_onnxvalue = result_infer.ToArray();
            List<Mat> masks = new List<Mat>();
            var pred_value = results_onnxvalue[0].AsEnumerable<float>().ToArray();
            var pred_dim = results_onnxvalue[0].AsTensor<float>().Dimensions.ToArray();
            for (int b = 0; b < pred_dim[0]; b++)
            {
                for (int c = 0; c < pred_dim[1]; c++)
                {
                    Mat mask = new Mat(pred_dim[2], pred_dim[3], MatType.CV_8UC1);
                    for (int h = 0; h < pred_dim[2]; h++)
                    {
                        for (int w = 0; w < pred_dim[3]; w++)
                        {
                            int idx = (b * pred_dim[1] * pred_dim[2] * pred_dim[3]) +
                                (c * pred_dim[2] * pred_dim[3]) + (h * pred_dim[3]) + w;
                            float value = pred_value[idx];
                            if (pred_value[idx] > 0.9)
                            {
                                mask.At<int>(h, w) = 255;
                            }
                            else
                            {
                                mask.At<int>(h, w) = 0;
                            }
                        }
                    }
                    masks.Add(mask);
                }
            }
            Mat rgb_mask = Mat.Zeros(new Size(image.Rows, image.Cols), MatType.CV_8UC3);
            for (int i = 0; i < masks.Count; i++)
            {
                Random rd = new Random();
                Cv2.Resize(masks[i], masks[i], new OpenCvSharp.Size(image.Rows, image.Cols));
                if (i == 0)
                {
                    Cv2.Add(rgb_mask, new Scalar(0, 0, 0), rgb_mask, masks[i]);

                }
                else
                {
                    Cv2.Add(rgb_mask, new Scalar(rd.Next(0, 255), rd.Next(0, 255), rd.Next(0, 255)), rgb_mask, masks[i]);
                }
            }
            Cv2.AddWeighted(image, 0.5, rgb_mask.Clone(), 0.5, 0, masked_img);
            Cv2.NamedWindow("Mask.jpg", WindowFlags.Normal);
            Cv2.ImShow("Mask.jpg", masked_img);
            Cv2.WaitKey(0);
        }
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在使用OpenTK加载STL模型时,首先需要确保OpenTK库已经正确引入到项目中。然后需要使用OpenTK提供的相关类来处理STL模型加载和显示。 第一步是创建一个OpenGL视窗,使用OpenTK的GameWindow类即可实现。在GameWindow的构造函数中,可以设置窗口的大小、标题等属性。 接下来,需要读取STL文件的二进制数据,并解析出模型的顶点坐标、法向量等信息。OpenTK提供了GL.Begin和GL.End等方法来组织绘制操作,我们可以使用GL.Begin传入绘制模式(如GL.Triangles)来指定如何绘制STL模型。 然后,需要将解析得到的顶点坐标等数据传入OpenGL的缓冲区中,可以使用OpenTK的GL.BufferData方法实现。同时,还需要设置顶点和法向量等参数的指针,使用OpenTK的GL.VertexPointer等方法来完成。 在绘制循环中,可以使用OpenTK提供的GL.DrawArrays方法来执行绘制命令,传入的参数为绘制模式和顶点的数量。 最后,在窗口的主循环中调用OpenTK的GameWindow.Run方法,即可实现程序的事件处理和渲染循环。 总结起来,通过OpenTK库提供的OpenGL功能,可以实现对STL模型加载和显示。主要的步骤包括创建OpenGL视窗、读取STL文件数据、设置顶点和法向量等参数的指针、绘制STL模型等。 ### 回答2: 在OpenTK中加载STL模型,可以通过以下步骤实现。 首先,你需要在你的项目中引入OpenTK库。可以通过NuGet包管理器添加OpenTK库。 接下来,你需要创建一个OpenGL窗口或控件来显示你的模型。可以使用OpenTK的类来创建一个窗口,如GameWindow或NativeWindow。 然后,你需要加载STL模型文件。你可以使用OpenTK的类来读取STL文件,如STLDocument类。你可以使用它的Load方法来加载STL文件。 一旦你加载了STL模型,你需要将其转换为OpenGL可以处理的数据。OpenTK提供了一些方法来帮助你进行这些转换,如MeshGeometry3D类。你可以将STL文件中的顶点、法线和面数据转换为OpenGL可以使用的顶点、法线和索引缓冲区。 最后,你可以使用OpenGL的绘制功能来渲染这个模型。你可以使用OpenTK的类来设置OpenGL的状态,如VBO、VAO和着色器程序。然后,你可以使用OpenGL的DrawElements方法来绘制模型的面。 通过上述步骤,你可以成功加载并显示STL模型。你可以根据需要进一步操作这个模型,例如进行旋转、缩放、移动等。希望对你有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值