AIDiagnosisPerImageModel.cs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using AI.Common;
  5. using AI.DiagSystem;
  6. using Newtonsoft.Json;
  7. using Newtonsoft.Json.Linq;
  8. using WingInterfaceLibrary.Enum;
  9. namespace WingAIDiagnosisService.Manage
  10. {
  11. public class AIDiagnosisPerImageModel
  12. {
  13. public AIDiagnosisPerImageModel() { }
  14. public AIDiagnosisPerImageModel(int index, AIDiagResultPerImg diagResult)
  15. {
  16. Index = index;
  17. PriorityScore = diagResult.PriorityScore;
  18. DiagResultsForEachOrgan = diagResult?.DiagResultsForEachOrgan.Select(o => new AIDiagnosisResultPerOrgan(o))?.ToList() ?? new List<AIDiagnosisResultPerOrgan>();
  19. }
  20. public int Index { get; set; }
  21. public float PriorityScore { get; set; }
  22. public List<AIDiagnosisResultPerOrgan> DiagResultsForEachOrgan { get; set; } = new List<AIDiagnosisResultPerOrgan>();
  23. }
  24. public class AIDiagnosisResultPerOrgan
  25. {
  26. public AIDiagnosisResultPerOrgan() { }
  27. public AIDiagnosisResultPerOrgan(AIDiagResultPerOrgan perOrgan)
  28. {
  29. var organ = DiagnosisOrganEnum.Null;
  30. var organName = Enum.GetName(typeof(DiagnosisOrganEnum), (int)perOrgan.Organ);
  31. if (!string.IsNullOrWhiteSpace(organName))
  32. {
  33. organ = (DiagnosisOrganEnum)perOrgan.Organ;
  34. }
  35. Organ = organ;
  36. OrganBoundBox = new AIDiagnosisRect(perOrgan.OrganBoundBox);
  37. var organContours = new List<AIDiagnosisPoint2D>();
  38. if (perOrgan.OrganContours != null && perOrgan.OrganContours.Length > 0)
  39. {
  40. var coutours = perOrgan.OrganContours[0];
  41. if (coutours != null && coutours.Length > 0)
  42. {
  43. foreach (var coutour in coutours)
  44. {
  45. organContours.Add(new AIDiagnosisPoint2D(coutour));
  46. }
  47. }
  48. }
  49. OrganContours = organContours;
  50. OrganDescriptions = perOrgan.OrganDescriptions.Select(d => new AIDiagnosisDescription(d))?.ToList() ?? new List<AIDiagnosisDescription>();
  51. DetectedObjects = perOrgan.DetectedObjects?.Select(d => new AIDetectedObject(d))?.ToList() ?? new List<AIDetectedObject>();
  52. }
  53. public DiagnosisOrganEnum Organ { get; set; }
  54. public AIDiagnosisRect OrganBoundBox { get; set; }
  55. public List<AIDiagnosisPoint2D> OrganContours { get; set; }
  56. public List<AIDiagnosisDescription> OrganDescriptions { get; set; }
  57. public List<AIDetectedObject> DetectedObjects { get; set; }
  58. }
  59. public class AIDiagnosisRect
  60. {
  61. public AIDiagnosisRect() { }
  62. public AIDiagnosisRect(Rect rect)
  63. {
  64. Right = rect.Right;
  65. Bottom = rect.Bottom;
  66. Left = rect.Left;
  67. Top = rect.Top;
  68. Width = rect.Width;
  69. Height = rect.Height;
  70. }
  71. public int Right { get; }
  72. public int Bottom { get; }
  73. public int Left { get; set; }
  74. public int Top { get; set; }
  75. public int Width { get; set; }
  76. public int Height { get; set; }
  77. }
  78. public class AIDiagnosisPoint2D
  79. {
  80. public AIDiagnosisPoint2D() { }
  81. public AIDiagnosisPoint2D(Point2D point)
  82. {
  83. X = point.X;
  84. Y = point.Y;
  85. }
  86. public int X { get; set; }
  87. public int Y { get; set; }
  88. }
  89. public class AIDetectedObject
  90. {
  91. public AIDetectedObject() { }
  92. public AIDetectedObject(DetectedObject detectedObject)
  93. {
  94. Label = detectedObject.Label;
  95. Confidence = detectedObject.Confidence;
  96. if (!detectedObject.BoundingBox.IsEmpty())
  97. {
  98. BoundingBox = new AIDiagnosisRect(detectedObject.BoundingBox);
  99. }
  100. var contours = new List<AIDiagnosisPoint2D>();
  101. if (detectedObject.Contours != null && detectedObject.Contours.Length > 0)
  102. {
  103. var coutours = detectedObject.Contours[0];
  104. if (coutours != null && coutours.Length > 0)
  105. {
  106. foreach (var coutour in coutours)
  107. {
  108. contours.Add(new AIDiagnosisPoint2D(coutour));
  109. }
  110. }
  111. }
  112. Contours = contours;
  113. Descriptions = detectedObject.Descriptions?.Select(d => new AIDiagnosisDescription(d))?.ToList() ?? new List<AIDiagnosisDescription>();
  114. }
  115. public int Label { get; set; }
  116. public float Confidence { get; set; }
  117. public AIDiagnosisRect BoundingBox { get; set; }
  118. public List<AIDiagnosisPoint2D> Contours { get; set; }
  119. public List<AIDiagnosisDescription> Descriptions { get; set; }
  120. }
  121. public class AIDiagnosisDescription
  122. {
  123. public AIDiagnosisDescription() { }
  124. public AIDiagnosisDescription(IDescription description)
  125. {
  126. Type = (DiagnosisDescription)description.Type;
  127. if (description is DescriptionLesionSize lesionSize)
  128. {
  129. var lesionSizeInfo = lesionSize.Value;
  130. if (lesionSizeInfo != null)
  131. {
  132. var lz = new AIDiagnosisLesionSize
  133. {
  134. HorizontalLengthInPixel = lesionSizeInfo.HorizontalLengthInPixel,
  135. VerticalLengthInPixel = lesionSizeInfo.VerticalLengthInPixel,
  136. };
  137. if (lesionSizeInfo.HorizontalPoint1 != null)
  138. {
  139. lz.HorizontalPoint1 = new AIDiagnosisPoint2D { X = lesionSizeInfo.HorizontalPoint1.X, Y = lesionSizeInfo.HorizontalPoint1.Y };
  140. }
  141. if (lesionSizeInfo.HorizontalPoint2 != null)
  142. {
  143. lz.HorizontalPoint2 = new AIDiagnosisPoint2D { X = lesionSizeInfo.HorizontalPoint2.X, Y = lesionSizeInfo.HorizontalPoint2.Y };
  144. }
  145. if (lesionSizeInfo.VerticalPoint1 != null)
  146. {
  147. lz.VerticalPoint1 = new AIDiagnosisPoint2D { X = lesionSizeInfo.VerticalPoint1.X, Y = lesionSizeInfo.VerticalPoint1.Y };
  148. }
  149. if (lesionSizeInfo.VerticalPoint2 != null)
  150. {
  151. lz.VerticalPoint2 = new AIDiagnosisPoint2D { X = lesionSizeInfo.VerticalPoint2.X, Y = lesionSizeInfo.VerticalPoint2.Y };
  152. }
  153. Value = Newtonsoft.Json.JsonConvert.SerializeObject(lz);
  154. }
  155. }
  156. else if (description is DescriptionShape shape)
  157. {
  158. Value = shape.Value.ToString();
  159. }
  160. else if (description is DescriptionOrientation orientation)
  161. {
  162. Value = orientation.Value.ToString();
  163. }
  164. else if (description is DescriptionEchoPattern echoPattern)
  165. {
  166. Value = echoPattern.Value.ToString();
  167. }
  168. else if (description is DescriptionLesionBoundary lesionBoundary)
  169. {
  170. Value = lesionBoundary.Value.ToString();
  171. }
  172. else if (description is DescriptionMargin margin)
  173. {
  174. Value = margin.Value.ToString();
  175. }
  176. else if (description is DescriptionCalcifications calcifications)
  177. {
  178. Value = calcifications.Value.ToString();
  179. }
  180. }
  181. public DiagnosisDescription Type { get; set; }
  182. public string Value { get; set; }
  183. }
  184. public class AIDiagnosisLesionSize
  185. {
  186. public AIDiagnosisLesionSize() { }
  187. public AIDiagnosisPoint2D HorizontalPoint1 { get; set; }
  188. public AIDiagnosisPoint2D HorizontalPoint2 { get; set; }
  189. public int HorizontalLengthInPixel { get; set; }
  190. public AIDiagnosisPoint2D VerticalPoint1 { get; set; }
  191. public AIDiagnosisPoint2D VerticalPoint2 { get; set; }
  192. public int VerticalLengthInPixel { get; set; }
  193. }
  194. }