본문 바로가기
SoftWare/OpenCV

yolov3 학습된 파일을 C# 에서 사용하기

by 학수씨 2021. 9. 11.

https://periar.tistory.com/236?category=477687 

 

Google Colab 에서 Yolov3 학습하기

우선 유투브에서 어떤 분께서 동영상으로 강의를 올리신 부분에 대하여 블로그에 정리하여 올립니다. https://www.youtube.com/watch?v=51fZ2FTau7E&list=PLJlV2dBmsof_6J9EWx-CyvpBz7cyWPwhP&index=1 출처 우선..

periar.tistory.com

 

일단 WinForm 이든 Console 이든 C# 프로젝트를 하나 만들고

NuGet 패키지 관리에 들어간다.

 

OpenCvSharp4 를 설치해주자..

x64로 해주자.. 그래야 좀더 성능이 잘 나온다.

 

그런다음 출력폴더 bin 폴더에 model 폴더를 하나 만들어주고

해당 model 폴더에 학습된 파일들을 아래와 같이 넣어주자.

나같읜경우 다른파일들이 많은데. 걍 귀차나서 다 넣어준거임.

 

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using OpenCvSharp;

namespace Project
{
    class Program
    {
        /*
        * 딥러닝 yolov3 학습파일 만들기
        * https://www.youtube.com/watch?v=51fZ2FTau7E&t=1403s
        */
        static void Main(string[] args)
        {
            System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
            sw.Start();

            const string cfgFile = "./model2/yolov3_testing.cfg"; //cfg 파일 위치
            const string darknetModel = "./model2/yolov3_training_final.weights"; //weights 파일 위치
            string[] classNames = File.ReadAllLines("./model2/obj.names"); // names => class 파일 위치


            List<string> labels = new List<string>();
            List<float> scores = new List<float>();
            List<Rect> bboxes = new List<Rect>();

            //Mat image = new Mat("umbrella.jpg");
            Mat image = new Mat("1.jpg");


            OpenCvSharp.Dnn.Net net = OpenCvSharp.Dnn.Net.ReadNetFromDarknet(cfgFile, darknetModel);
            Mat inputBlob = OpenCvSharp.Dnn.CvDnn.BlobFromImage(image, 1 / 255f, new Size(416, 416), crop: false);

            net.SetInput(inputBlob);
            var outBlobNames = net.GetUnconnectedOutLayersNames();
            var outputBlobs = outBlobNames.Select(toMat => new Mat()).ToArray();

            net.Forward(outputBlobs, outBlobNames);
            foreach (Mat prob in outputBlobs)
            {
                for (int p = 0; p < prob.Rows; p++)
                {
                    float confidence = prob.At<float>(p, 4);
                    if (confidence > 0.9)
                    {
                        Cv2.MinMaxLoc(prob.Row(p).ColRange(5, prob.Cols), out _, out _, out _, out Point classNumber);

                        int classes = classNumber.X;
                        float probability = prob.At<float>(p, classes + 5);

                        if (probability > 0.9)
                        {
                            float centerX = prob.At<float>(p, 0) * image.Width;
                            float centerY = prob.At<float>(p, 1) * image.Height;
                            float width = prob.At<float>(p, 2) * image.Width;
                            float height = prob.At<float>(p, 3) * image.Height;

                            labels.Add(classNames[classes] + " " + probability);
                            scores.Add(probability);
                            bboxes.Add(new Rect((int)centerX - (int)width / 2, (int)centerY - (int)height / 2, (int)width, (int)height));
                        }
                    }
                }
            }

            OpenCvSharp.Dnn.CvDnn.NMSBoxes(bboxes, scores, 0.9f, 0.5f, out int[] indices);

            foreach (int i in indices)
            {
                Cv2.Rectangle(image, bboxes[i], Scalar.Red, 1);
                Cv2.PutText(image, labels[i], bboxes[i].Location, HersheyFonts.HersheyComplex, 1.0, Scalar.Red);
            }

            sw.Stop();
            Console.WriteLine("END TIME :: " + sw.ElapsedMilliseconds.ToString() + " msec");
            Console.WriteLine("END TIME :: " + sw.Elapsed.ToString());

            image.SaveImage("dest.jpg");

            Cv2.ImShow("image", image);
            Cv2.WaitKey();
            Cv2.DestroyAllWindows();
        }
    }
}

 

 

 

댓글