当前位置:   article > 正文

C# OpenVINO Yolov8-OBB 旋转目标检测

C# OpenVINO Yolov8-OBB 旋转目标检测

目录

效果

模型

项目

代码

下载 


C# OpenVINO Yolov8-OBB 旋转目标检测

效果

模型

Model Properties
-------------------------
date:2024-02-26T08:38:44.171849
description:Ultralytics YOLOv8s-obb model trained on runs/DOTAv1.0-ms.yaml
author:Ultralytics
task:obb
license:AGPL-3.0 https://ultralytics.com/license
version:8.1.18
stride:32
batch:1
imgsz:[640, 640]
names:{0: 'plane', 1: 'ship', 2: 'storage tank', 3: 'baseball diamond', 4: 'tennis court', 5: 'basketball court', 6: 'ground track field', 7: 'harbor', 8: 'bridge', 9: 'large vehicle', 10: 'small vehicle', 11: 'helicopter', 12: 'roundabout', 13: 'soccer ball field', 14: 'swimming pool'}
---------------------------------------------------------------

Inputs
-------------------------
name:images
tensor:Float[1, 3, 640, 640]
---------------------------------------------------------------

Outputs
-------------------------
name:output0
tensor:Float[1, 20, 8400]
---------------------------------------------------------------

项目

代码

  1. using OpenCvSharp;
  2. using OpenCvSharp.Dnn;
  3. using Sdcb.OpenVINO;
  4. using Sdcb.OpenVINO.Natives;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Diagnostics;
  8. using System.Drawing;
  9. using System.IO;
  10. using System.Text;
  11. using System.Windows.Forms;
  12. namespace OpenVINO_Det
  13. {
  14. public partial class Form1 : Form
  15. {
  16. public Form1()
  17. {
  18. InitializeComponent();
  19. }
  20. string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
  21. string image_path = "";
  22. string classer_path;
  23. string model_path;
  24. Mat image;
  25. Mat result_image;
  26. string[] class_lables;
  27. StringBuilder sb = new StringBuilder();
  28. private void button1_Click(object sender, EventArgs e)
  29. {
  30. OpenFileDialog ofd = new OpenFileDialog();
  31. ofd.Filter = fileFilter;
  32. if (ofd.ShowDialog() != DialogResult.OK) return;
  33. pictureBox1.Image = null;
  34. image_path = ofd.FileName;
  35. pictureBox1.Image = new Bitmap(image_path);
  36. textBox1.Text = "";
  37. pictureBox2.Image = null;
  38. }
  39. unsafe private void button2_Click(object sender, EventArgs e)
  40. {
  41. if (pictureBox1.Image == null)
  42. {
  43. return;
  44. }
  45. pictureBox2.Image = null;
  46. textBox1.Text = "";
  47. sb.Clear();
  48. Application.DoEvents();
  49. Model rawModel = OVCore.Shared.ReadModel(model_path);
  50. PrePostProcessor pp = rawModel.CreatePrePostProcessor();
  51. PreProcessInputInfo inputInfo = pp.Inputs.Primary;
  52. inputInfo.TensorInfo.Layout = Sdcb.OpenVINO.Layout.NHWC;
  53. inputInfo.ModelInfo.Layout = Sdcb.OpenVINO.Layout.NCHW;
  54. Model m = pp.BuildModel();
  55. CompiledModel cm = OVCore.Shared.CompileModel(m, "CPU");
  56. InferRequest ir = cm.CreateInferRequest();
  57. Stopwatch stopwatch = new Stopwatch();
  58. //图片缩放
  59. image = new Mat(image_path);
  60. int max_image_length = image.Cols > image.Rows ? image.Cols : image.Rows;
  61. Mat max_image = Mat.Zeros(new OpenCvSharp.Size(max_image_length, max_image_length), MatType.CV_8UC3);
  62. Rect roi = new Rect(0, 0, image.Cols, image.Rows);
  63. image.CopyTo(new Mat(max_image, roi));
  64. float factor = (float)(max_image_length / 640.0);
  65. // 将图片转为RGB通道
  66. Mat image_rgb = new Mat();
  67. Cv2.CvtColor(max_image, image_rgb, ColorConversionCodes.BGR2RGB);
  68. Mat resize_image = new Mat();
  69. Cv2.Resize(image_rgb, resize_image, new OpenCvSharp.Size(640, 640));
  70. Mat f32 = new Mat();
  71. resize_image.ConvertTo(f32, MatType.CV_32FC3, 1.0 / 255);
  72. using (Tensor input = Tensor.FromRaw(
  73. new ReadOnlySpan<byte>((void*)f32.Data, (int)((long)f32.DataEnd - (long)f32.DataStart)),
  74. new Shape(1, f32.Rows, f32.Cols, 3),
  75. ov_element_type_e.F32))
  76. {
  77. ir.Inputs.Primary = input;
  78. }
  79. double preprocessTime = stopwatch.Elapsed.TotalMilliseconds;
  80. stopwatch.Restart();
  81. ir.Run();
  82. double inferTime = stopwatch.Elapsed.TotalMilliseconds;
  83. stopwatch.Restart();
  84. using (Tensor output = ir.Outputs.Primary)
  85. {
  86. ReadOnlySpan<float> data = output.GetData<float>();
  87. Mat result_data = new Mat(20, 8400, MatType.CV_32F, data.ToArray());
  88. result_data = result_data.T();
  89. List<Rect2d> position_boxes = new List<Rect2d>();
  90. List<int> class_ids = new List<int>();
  91. List<float> confidences = new List<float>();
  92. List<float> rotations = new List<float>();
  93. // Preprocessing output results
  94. for (int i = 0; i < result_data.Rows; i++)
  95. {
  96. Mat classes_scores = new Mat(result_data, new Rect(4, i, 15, 1));
  97. OpenCvSharp.Point max_classId_point, min_classId_point;
  98. double max_score, min_score;
  99. // Obtain the maximum value and its position in a set of data
  100. Cv2.MinMaxLoc(classes_scores, out min_score, out max_score,
  101. out min_classId_point, out max_classId_point);
  102. // Confidence level between 0 ~ 1
  103. // Obtain identification box information
  104. if (max_score > 0.25)
  105. {
  106. float cx = result_data.At<float>(i, 0);
  107. float cy = result_data.At<float>(i, 1);
  108. float ow = result_data.At<float>(i, 2);
  109. float oh = result_data.At<float>(i, 3);
  110. double x = (cx - 0.5 * ow) * factor;
  111. double y = (cy - 0.5 * oh) * factor;
  112. double width = ow * factor;
  113. double height = oh * factor;
  114. Rect2d box = new Rect2d();
  115. box.X = x;
  116. box.Y = y;
  117. box.Width = width;
  118. box.Height = height;
  119. position_boxes.Add(box);
  120. class_ids.Add(max_classId_point.X);
  121. confidences.Add((float)max_score);
  122. rotations.Add(result_data.At<float>(i, 19));
  123. }
  124. }
  125. // NMS
  126. int[] indexes = new int[position_boxes.Count];
  127. CvDnn.NMSBoxes(position_boxes, confidences, 0.25f, 0.7f, out indexes);
  128. List<RotatedRect> rotated_rects = new List<RotatedRect>();
  129. for (int i = 0; i < indexes.Length; i++)
  130. {
  131. int index = indexes[i];
  132. float w = (float)position_boxes[index].Width;
  133. float h = (float)position_boxes[index].Height;
  134. float x = (float)position_boxes[index].X + w / 2;
  135. float y = (float)position_boxes[index].Y + h / 2;
  136. float r = rotations[index];
  137. float w_ = w > h ? w : h;
  138. float h_ = w > h ? h : w;
  139. r = (float)((w > h ? r : (float)(r + Math.PI / 2)) % Math.PI);
  140. RotatedRect rotate = new RotatedRect(new Point2f(x, y), new Size2f(w_, h_), (float)(r * 180.0 / Math.PI));
  141. rotated_rects.Add(rotate);
  142. }
  143. double postprocessTime = stopwatch.Elapsed.TotalMilliseconds;
  144. stopwatch.Stop();
  145. double totalTime = preprocessTime + inferTime + postprocessTime;
  146. result_image = image.Clone();
  147. for (int i = 0; i < indexes.Length; i++)
  148. {
  149. int index = indexes[i];
  150. Point2f[] points = rotated_rects[i].Points();
  151. for (int j = 0; j < 4; j++)
  152. {
  153. Cv2.Line(result_image, (OpenCvSharp.Point)points[j], (OpenCvSharp.Point)points[(j + 1) % 4], new Scalar(0, 255, 0), 2);
  154. }
  155. Cv2.PutText(result_image, class_lables[class_ids[index]] + "-" + confidences[index].ToString("0.00"),
  156. (OpenCvSharp.Point)points[0], HersheyFonts.HersheySimplex, 0.8, new Scalar(0, 0, 255), 2);
  157. }
  158. sb.AppendLine($"Preprocess: {preprocessTime:F2}ms");
  159. sb.AppendLine($"Infer: {inferTime:F2}ms");
  160. sb.AppendLine($"Postprocess: {postprocessTime:F2}ms");
  161. sb.AppendLine($"Total: {totalTime:F2}ms");
  162. pictureBox2.Image = new Bitmap(result_image.ToMemoryStream());
  163. textBox1.Text = sb.ToString();
  164. }
  165. }
  166. private void Form1_Load(object sender, EventArgs e)
  167. {
  168. model_path = "yolov8s-obb.onnx";
  169. classer_path = "lable.txt";
  170. List<string> str = new List<string>();
  171. StreamReader sr = new StreamReader(classer_path);
  172. string line;
  173. while ((line = sr.ReadLine()) != null)
  174. {
  175. str.Add(line);
  176. }
  177. class_lables = str.ToArray();
  178. image_path = "2.png";
  179. pictureBox1.Image = new Bitmap(image_path);
  180. }
  181. }
  182. }

下载 

源码下载

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/214984
推荐阅读
相关标签
  

闽ICP备14008679号