카테고리 없음

Segmentation학습 > Onnx > C# - (4) C# inference

카멜레온개발자 2022. 9. 29. 18:59

1. Console 프로젝트를 만든다

2. Nuget 프로젝트에서 OnnxRuntime을 다운받는다

3. OpencvSharp관련 프로젝트도 다운 받는다

4. https://github.com/singetta/OnnxSample/tree/main/OnnxSample/Yolov5 경로의 3개의 cs파일을 다운 받아 프로젝트에 포함시킨다

5. 프로젝트 빌드 속성을 다음과 같이 수정

6. YoloDetector.cs 파일의 생성자 부분을 다음과 같이 바꾼다

public YoloDetector(string model_path)
        {
#region 추가
            OrtCUDAProviderOptions ortCUDAProviderOptions = new OrtCUDAProviderOptions();
            var providerOptionsDict = new Dictionary<string, string>();
            providerOptionsDict["cudnn_conv_use_max_workspace"] = "1";
            ortCUDAProviderOptions.UpdateOptions(providerOptionsDict);

            var option = SessionOptions.MakeSessionOptionWithCudaProvider(ortCUDAProviderOptions);
            option.LogSeverityLevel = OrtLoggingLevel.ORT_LOGGING_LEVEL_VERBOSE;
#endregion

            #region 주석처리
            /*
            var option = new SessionOptions();
            option.GraphOptimizationLevel = GraphOptimizationLevel.ORT_ENABLE_ALL;
            option.ExecutionMode = ExecutionMode.ORT_SEQUENTIAL;            
            */
            #endregion
            sess = new InferenceSession(model_path, option);

            imageFloat = new Mat();
            debugImage = new Mat();
            MinConfidence = 0.2f;
            NmsThresh = 0.4f;
        }

7. Inference 프로그램은 다음과 같다(Program.cs)

using OnnxSample.Yolov5;
using OpenCvSharp;
using System;

namespace OnnxSegmInference
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var dataSizeY = 384;
            var dataSizeX = 480;

            var detector = new YoloDetector("segmbin_best_mode.onnx")
            {
                imgSize = new Size(dataSizeX, dataSizeY),
                MinConfidence = 0.5f
            };

            using (var image = Cv2.ImRead("0001TP_008550.png"))
            {
                var inspImage = image.Resize(new Size(dataSizeX, dataSizeY));
                DateTime dtBeg = DateTime.Now;
                var result = detector.objectSegmentation(inspImage);


                Cv2.NamedWindow("SOURCE", WindowFlags.Normal);
                Cv2.ImShow("SOURCE", inspImage);

                for (int i=0; i<result.Count; i++)
                {
                    using (var dispImage1 = new Mat(new Size(dataSizeX, dataSizeY), MatType.CV_8UC3))
                    {
                        Cv2.CvtColor(result[0], dispImage1, ColorConversionCodes.GRAY2BGR);

                        Cv2.NamedWindow("RESULT" + (i+1).ToString(), WindowFlags.Normal);
                        Cv2.ImShow("RESULT" + (i + 1).ToString(), dispImage1);
                    }
                }
                Cv2.WaitKey();
            }
        }
    }
}

8. onnx파일과 데이터 이미지 파일을 같은 폴더에 두고 실행을 하면 다음의 결과를 볼 수 있다