123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- using System.Collections.Generic;
- using System.Linq;
- using WingInterfaceLibrary.Enum;
- namespace WingAIDiagnosisService.Manage
- {
- public class BreastDiagnosis : BaseDiagnosis
- {
- public BreastDiagnosis(List<DiagnosisPerImageModel> recordResult, DiagnosisOrganEnum organ) : base(recordResult, organ)
- {
- }
- #region Private
- private AIDetectedObject IsValidDetectedObjectInfo(AIDetectedObject detectedObjectInfo)
- {
- if (detectedObjectInfo.Label == 0)
- {
- return detectedObjectInfo;
- }
- if (detectedObjectInfo.Descriptions == null || !detectedObjectInfo.Descriptions.Any())
- {
- return null;
- }
- var lesionSizeDescription = detectedObjectInfo.Descriptions.FirstOrDefault(d => d.Type == DiagnosisDescription.LesionSize && !string.IsNullOrWhiteSpace(d.Value));
- if (lesionSizeDescription == null)
- {
- return null;
- }
- var lessionSizeInfo = Newtonsoft.Json.JsonConvert.DeserializeObject<AIDiagnosisLesionSize>(lesionSizeDescription.Value);
- if (lessionSizeInfo.VerticalLengthInPixel == 0 || lessionSizeInfo.HorizontalLengthInPixel == 0)
- {
- return null;
- }
- return detectedObjectInfo;
- }
- private bool CheckIsBreast(List<DiagnosisPerImageModel> result)
- {
- var breastCount = result.Where(a => a.PriorityScore > 0).Count();
- var totalCount = result.Count;
- var breastRate = breastCount * 1.0 / totalCount * 1.0;
- return breastRate > 1 / 3.0;
- }
- private bool ExistAIData(IEnumerable<AIDiagnosisResultPerOrgan> organDiagResults, AILabelEnum label)
- {
- if (organDiagResults == null)
- return false;
- foreach (var record in organDiagResults)
- {
- if (record.DetectedObjects == null)
- continue;
- if (record.Organ != DiagnosisOrganEnum.Breast)
- continue;
- if (label == AILabelEnum.BIRads1)
- {
- if (record.DetectedObjects.Any(a => a.Label == (int)label))
- return true;
- }
- else
- {
- if (record.DetectedObjects.Any(a => a.Label == (int)label) && record.DetectedObjects.All(d => IsValidDetectedObjectInfo(d) != null))
- return true;
- }
- }
- return false;
- }
- #endregion
- public override AIDiagnosisResultPerOrgan CheckResultValid(AIDiagnosisResultPerOrgan message)
- {
- if (message.Organ != DiagnosisOrganEnum.Breast)
- {
- return null;
- }
- var result = message;
- var validDetectedObjects = new List<AIDetectedObject>();
- foreach (var obj in message.DetectedObjects)
- {
- var obj_new = IsValidDetectedObjectInfo(obj);
- if (obj_new != null)
- {
- validDetectedObjects.Add(obj_new);
- }
- }
- if (validDetectedObjects.Any())
- {
- result.DetectedObjects = validDetectedObjects.ToList();
- return result;
- }
- return null;
- }
- public override DiagnosisConclusion GetAIStatus()
- {
- var status = DiagnosisConclusion.Unrecognized;
- bool existMalignant = false;
- bool existBenign = false;
- if (RecordDiagnosisResult != null && RecordDiagnosisResult.Any())
- {
- if (!CheckIsBreast(RecordDiagnosisResult))
- return status;
- foreach (var diagResult in RecordDiagnosisResult)
- {
- if (existMalignant && existBenign)
- break;
- if (diagResult.DiagResultsForEachOrgan != null && diagResult.PriorityScore > 0)
- {
- foreach (var organ in diagResult.DiagResultsForEachOrgan)
- {
- if (organ.DetectedObjects != null)
- {
- if (!existMalignant)
- {
- if (organ.DetectedObjects.Any(a => a.Label >= 4))
- {
- existMalignant = true;
- }
- }
- if (!existBenign)
- {
- if (organ.DetectedObjects.Any(a => a.Label >= 1 && a.Label < 4))
- {
- existBenign = true;
- }
- }
- }
- }
- if (existMalignant)
- {
- status = existBenign ? DiagnosisConclusion.BenignAndMalignant : DiagnosisConclusion.Malignant;
- }
- else
- {
- status = existBenign ? DiagnosisConclusion.Benign : DiagnosisConclusion.NoObviousLesion;
- }
- }
- }
- }
- return status;
- }
- /// <summary>
- /// 是否恶性病灶
- /// </summary>
- /// <param name="label"></param>
- /// <returns></returns>
- protected override bool IsMalignant(AIDetectedObject detectedObject)
- {
- return detectedObject.Label > (int)AILabelEnum.BIRads3;
- }
- public override List<DiagnosisPerImageModel> GetReportResults()
- {
- if (!RecordDiagnosisResult.Any())
- {
- return RecordDiagnosisResult;
- }
- var reportResults = new List<DiagnosisPerImageModel>();
- for (var i = 1; i <= (int)AILabelEnum.BIRads5; i++)
- {
- var label = (AILabelEnum)i;
- var data = RecordDiagnosisResult.FirstOrDefault(a => ExistAIData(a.DiagResultsForEachOrgan, label));
- if (data != null)
- {
- if (!reportResults.Any(a => a.RemedicalCode == data.RemedicalCode && a.Index == data.Index))
- {
- reportResults.Add(data);
- }
- }
- }
- if (!reportResults.Any())
- {
- //未见异常
- var label = AILabelEnum.BIRads1;
- var data = RecordDiagnosisResult.FirstOrDefault(a => ExistAIData(a.DiagResultsForEachOrgan, label));
- if (data != null)
- {
- if (!reportResults.Any(a => a.RemedicalCode == data.RemedicalCode && a.Index == data.Index))
- {
- reportResults.Add(data);
- }
- }
- }
- RecordDiagnosisResult = reportResults;
- InitialAIImage();
- return RecordDiagnosisResult;
- }
- }
- }
|