C# OpenCvSharp DNN FreeYOLO 人脸检测
���录
效果
模型信息
项目
代码
下载
C# OpenCvSharp DNN FreeYOLO 人脸检测
效果
模型信息
Inputs
-------------------------
name:input
tensor:Float[1, 3, 192, 320]
---------------------------------------------------------------
Outputs
-------------------------
name:output
tensor:Float[1, 1260, 6]
---------------------------------------------------------------
项目
代码
using OpenCvSharp; using OpenCvSharp.Dnn; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Windows.Forms; namespace OpenCvSharp_DNN_Demo { public partial class frmMain : Form { public frmMain() { InitializeComponent(); } string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png"; string image_path = ""; DateTime dt1 = DateTime.Now; DateTime dt2 = DateTime.Now; float confThreshold; float nmsThreshold; int num_stride = 3; float[] strides = new float[3] { 8.0f, 16.0f, 32.0f }; string modelpath; int inpHeight; int inpWidth; List class_names; int num_class; Net opencv_net; Mat BN_image; Mat image; Mat result_image; private void button1_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = fileFilter; if (ofd.ShowDialog() != DialogResult.OK) return; pictureBox1.Image = null; pictureBox2.Image = null; textBox1.Text = ""; image_path = ofd.FileName; pictureBox1.Image = new Bitmap(image_path); image = new Mat(image_path); } private void Form1_Load(object sender, EventArgs e) { confThreshold = 0.8f; nmsThreshold = 0.5f; modelpath = "model/yolo_free_huge_widerface_192x320.onnx"; inpHeight = 192; inpWidth = 320; opencv_net = CvDnn.ReadNetFromOnnx(modelpath); class_names = new List(); class_names.Add("face"); num_class = 1; image_path = "test_img/1.jpg"; pictureBox1.Image = new Bitmap(image_path); } private unsafe void button2_Click(object sender, EventArgs e) { if (image_path == "") { return; } textBox1.Text = "检测中,请稍等……"; pictureBox2.Image = null; Application.DoEvents(); image = new Mat(image_path); float ratio = Math.Min(1.0f * inpHeight / image.Rows, 1.0f * inpWidth / image.Cols); int neww = (int)(image.Cols * ratio); int newh = (int)(image.Rows * ratio); Mat dstimg = new Mat(); Cv2.Resize(image, dstimg, new OpenCvSharp.Size(neww, newh)); Cv2.CopyMakeBorder(dstimg, dstimg, 0, inpHeight - newh, 0, inpWidth - neww, BorderTypes.Constant); BN_image = CvDnn.BlobFromImage(dstimg); //配置图片输入数据 opencv_net.SetInput(BN_image); //模型推理,读取推理结果 Mat[] outs = new Mat[1] { new Mat() }; string[] outBlobNames = opencv_net.GetUnconnectedOutLayersNames().ToArray(); dt1 = DateTime.Now; opencv_net.Forward(outs, outBlobNames); dt2 = DateTime.Now; int num_proposal = outs[0].Size(1); int nout = outs[0].Size(2); float* pdata = (float*)outs[0].Data; List confidences = new List(); List boxes = new List(); List classIds = new List(); for (int n = 0; n max_class_socre) { max_class_socre = pdata[k + 5]; max_ind = k; } } max_class_socre = max_class_socre* box_score; max_class_socre = (float)Math.Sqrt(max_class_socre); if (max_class_socre > confThreshold) { float cx = (0.5f + j + pdata[0]) * strides[n]; //cx float cy = (0.5f + i + pdata[1]) * strides[n]; //cy float w = (float)(Math.Exp(pdata[2]) * strides[n]); //w float h = (float)(Math.Exp(pdata[3]) * strides[n]); //h float xmin = (float)((cx - 0.5 * w) / ratio); float ymin = (float)((cy - 0.5 * h) / ratio); float xmax = (float)((cx + 0.5 * w) / ratio); float ymax = (float)((cy + 0.5 * h) / ratio); int left = (int)((cx - 0.5 * w) / ratio); int top = (int)((cy - 0.5 * h) / ratio); int width = (int)(w / ratio); int height = (int)(h / ratio); confidences.Add(max_class_socre); boxes.Add(new Rect(left, top, width, height)); classIds.Add(max_ind); } pdata += nout; } } } int[] indices; CvDnn.NMSBoxes(boxes, confidences, confThreshold, nmsThreshold, out indices); result_image = image.Clone(); for (int ii = 0; ii下载
可运行程序exe下载
源码下载
The End