BreastDiagnosis.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using WingInterfaceLibrary.Enum;
  4. namespace WingAIDiagnosisService.Manage
  5. {
  6. public class BreastDiagnosis : BaseDiagnosis
  7. {
  8. public BreastDiagnosis(List<DiagnosisPerImageModel> recordResult, DiagnosisOrganEnum organ) : base(recordResult, organ)
  9. {
  10. }
  11. #region Private
  12. private AIDetectedObject IsValidDetectedObjectInfo(AIDetectedObject detectedObjectInfo)
  13. {
  14. if (detectedObjectInfo.Label == 0)
  15. {
  16. return detectedObjectInfo;
  17. }
  18. if (detectedObjectInfo.Descriptions == null || !detectedObjectInfo.Descriptions.Any())
  19. {
  20. return null;
  21. }
  22. var lesionSizeDescription = detectedObjectInfo.Descriptions.FirstOrDefault(d => d.Type == DiagnosisDescription.LesionSize && !string.IsNullOrWhiteSpace(d.Value));
  23. if (lesionSizeDescription == null)
  24. {
  25. return null;
  26. }
  27. var lessionSizeInfo = Newtonsoft.Json.JsonConvert.DeserializeObject<AIDiagnosisLesionSize>(lesionSizeDescription.Value);
  28. if (lessionSizeInfo.VerticalLengthInPixel == 0 || lessionSizeInfo.HorizontalLengthInPixel == 0)
  29. {
  30. return null;
  31. }
  32. return detectedObjectInfo;
  33. }
  34. private bool CheckIsBreast(List<DiagnosisPerImageModel> result)
  35. {
  36. var breastCount = result.Where(a => a.PriorityScore > 0).Count();
  37. var totalCount = result.Count;
  38. var breastRate = breastCount * 1.0 / totalCount * 1.0;
  39. return breastRate > 1 / 3.0;
  40. }
  41. private bool ExistAIData(IEnumerable<AIDiagnosisResultPerOrgan> organDiagResults, AILabelEnum label)
  42. {
  43. if (organDiagResults == null)
  44. return false;
  45. foreach (var record in organDiagResults)
  46. {
  47. if (record.DetectedObjects == null)
  48. continue;
  49. if (record.Organ != DiagnosisOrganEnum.Breast)
  50. continue;
  51. if (label == AILabelEnum.BIRads1)
  52. {
  53. if (record.DetectedObjects.Any(a => a.Label == (int)label))
  54. return true;
  55. }
  56. else
  57. {
  58. if (record.DetectedObjects.Any(a => a.Label == (int)label) && record.DetectedObjects.All(d => IsValidDetectedObjectInfo(d) != null))
  59. return true;
  60. }
  61. }
  62. return false;
  63. }
  64. #endregion
  65. public override AIDiagnosisResultPerOrgan CheckResultValid(AIDiagnosisResultPerOrgan message)
  66. {
  67. if (message.Organ != DiagnosisOrganEnum.Breast)
  68. {
  69. return null;
  70. }
  71. var result = message;
  72. var validDetectedObjects = new List<AIDetectedObject>();
  73. foreach (var obj in message.DetectedObjects)
  74. {
  75. var obj_new = IsValidDetectedObjectInfo(obj);
  76. if (obj_new != null)
  77. {
  78. validDetectedObjects.Add(obj_new);
  79. }
  80. }
  81. if (validDetectedObjects.Any())
  82. {
  83. result.DetectedObjects = validDetectedObjects.ToList();
  84. return result;
  85. }
  86. return null;
  87. }
  88. public override DiagnosisConclusion GetAIStatus()
  89. {
  90. var status = DiagnosisConclusion.Unrecognized;
  91. bool existMalignant = false;
  92. bool existBenign = false;
  93. if (RecordDiagnosisResult != null && RecordDiagnosisResult.Any())
  94. {
  95. if (!CheckIsBreast(RecordDiagnosisResult))
  96. return status;
  97. foreach (var diagResult in RecordDiagnosisResult)
  98. {
  99. if (existMalignant && existBenign)
  100. break;
  101. if (diagResult.DiagResultsForEachOrgan != null && diagResult.PriorityScore > 0)
  102. {
  103. foreach (var organ in diagResult.DiagResultsForEachOrgan)
  104. {
  105. if (organ.DetectedObjects != null)
  106. {
  107. if (!existMalignant)
  108. {
  109. if (organ.DetectedObjects.Any(a => a.Label >= 4))
  110. {
  111. existMalignant = true;
  112. }
  113. }
  114. if (!existBenign)
  115. {
  116. if (organ.DetectedObjects.Any(a => a.Label >= 1 && a.Label < 4))
  117. {
  118. existBenign = true;
  119. }
  120. }
  121. }
  122. }
  123. if (existMalignant)
  124. {
  125. status = existBenign ? DiagnosisConclusion.BenignAndMalignant : DiagnosisConclusion.Malignant;
  126. }
  127. else
  128. {
  129. status = existBenign ? DiagnosisConclusion.Benign : DiagnosisConclusion.NoObviousLesion;
  130. }
  131. }
  132. }
  133. }
  134. return status;
  135. }
  136. /// <summary>
  137. /// 是否恶性病灶
  138. /// </summary>
  139. /// <param name="label"></param>
  140. /// <returns></returns>
  141. protected override bool IsMalignant(AIDetectedObject detectedObject)
  142. {
  143. return detectedObject.Label > (int)AILabelEnum.BIRads3;
  144. }
  145. public override List<DiagnosisPerImageModel> GetReportResults()
  146. {
  147. if (!RecordDiagnosisResult.Any())
  148. {
  149. return RecordDiagnosisResult;
  150. }
  151. var reportResults = new List<DiagnosisPerImageModel>();
  152. for (var i = 1; i <= (int)AILabelEnum.BIRads5; i++)
  153. {
  154. var label = (AILabelEnum)i;
  155. var data = RecordDiagnosisResult.FirstOrDefault(a => ExistAIData(a.DiagResultsForEachOrgan, label));
  156. if (data != null)
  157. {
  158. if (!reportResults.Any(a => a.RemedicalCode == data.RemedicalCode && a.Index == data.Index))
  159. {
  160. reportResults.Add(data);
  161. }
  162. }
  163. }
  164. if (!reportResults.Any())
  165. {
  166. //未见异常
  167. var label = AILabelEnum.BIRads1;
  168. var data = RecordDiagnosisResult.FirstOrDefault(a => ExistAIData(a.DiagResultsForEachOrgan, label));
  169. if (data != null)
  170. {
  171. if (!reportResults.Any(a => a.RemedicalCode == data.RemedicalCode && a.Index == data.Index))
  172. {
  173. reportResults.Add(data);
  174. }
  175. }
  176. }
  177. RecordDiagnosisResult = reportResults;
  178. InitialAIImage();
  179. return RecordDiagnosisResult;
  180. }
  181. }
  182. }