https://periar.tistory.com/236?category=477687
일단 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();
}
}
}
'SoftWare > OpenCV' 카테고리의 다른 글
Windows10 에서 Darknet YoloV3 학습하기 - 본론 (1) | 2021.09.13 |
---|---|
Windows10 에서 Darknet YoloV3 학습하기 - 서론 (1) | 2021.09.13 |
Google Colab 에서 Yolov3 학습하기 (0) | 2021.09.10 |
opencv image 접근 방법 및 성능 그리고 병렬처리 (0) | 2015.03.16 |
Android JNI OpenCV 성능 (0) | 2015.02.11 |
댓글