diff --git a/Distance/Models/DistanceLimits.cs b/Distance/Models/DistanceLimits.cs index 3b88ebf..15ed434 100644 --- a/Distance/Models/DistanceLimits.cs +++ b/Distance/Models/DistanceLimits.cs @@ -5,10 +5,8 @@ namespace View_by_Distance.Distance.Models; public class DistanceLimits : IDistanceLimits { - private int _Area; private int _Days; private int _Distance; - private int _Confidence; public double FaceAreaPermyriad { init; get; } public double RangeDaysDeltaTolerance { init; get; } @@ -50,8 +48,6 @@ public class DistanceLimits : IDistanceLimits string result; List<(int Value, string Name)> results = new() { - new(_Area, nameof(_Area)), - new(_Confidence, nameof(_Confidence)), new(_Days, nameof(_Days)), new(_Distance, nameof(_Distance)) }; @@ -59,12 +55,10 @@ public class DistanceLimits : IDistanceLimits return result; } - void IDistanceLimits.AddCounts(int area, int days, int distance, int confidence) + void IDistanceLimits.AddCounts(int days, int distance) { - _Area += area; _Days += days; _Distance += distance; - _Confidence += confidence; } } \ No newline at end of file diff --git a/Distance/Models/_E_Distance.cs b/Distance/Models/_E_Distance.cs index c0d6a6d..293bc1a 100644 --- a/Distance/Models/_E_Distance.cs +++ b/Distance/Models/_E_Distance.cs @@ -400,7 +400,7 @@ public partial class E_Distance { List results = new(); SortingContainer sortingContainer; - int area = 0, days = 0, distance = 0, confidence = 0; + int days = 0, distance = 0; Sorting[] collection = Shared.Models.Stateless.Methods.ISorting.Sort(sortingCollection); foreach (Sorting sorting in collection) { @@ -418,22 +418,12 @@ public partial class E_Distance distance += 1; continue; } - if (face.Mapping.MappingFromLocation.ConfidencePercent < distanceLimits.FaceConfidencePercent) - { - confidence += 1; - continue; - } - if (face.Mapping.MappingFromLocation.AreaPermyriad < distanceLimits.FaceAreaPermyriad) - { - area += 1; - continue; - } sortingContainer = new(face.Mapping, sorting); results.Add(sortingContainer); if (results.Count >= distanceLimits.SortingMaximumPerFaceShouldBeHigh) break; } - distanceLimits.AddCounts(area, days, distance, confidence); + distanceLimits.AddCounts(days, distance); return results; } @@ -483,13 +473,17 @@ public partial class E_Distance return faceDistanceEncodings; } - public static FaceDistanceContainer[] FilteredFaceDistanceContainers(Map.Models.MapLogic mapLogic, FaceDistanceContainer[] faceDistanceContainers) + public static FaceDistanceContainer[] FilteredFaceDistanceContainers(Map.Models.MapLogic mapLogic, FaceDistanceContainer[] faceDistanceContainers, DistanceLimits distanceLimits) { List results = new(); foreach (FaceDistanceContainer faceDistanceContainer in faceDistanceContainers) { if (faceDistanceContainer.FaceDistance is null || faceDistanceContainer.Face.Mapping?.MappingFromLocation is null) throw new NotSupportedException(); + if (faceDistanceContainer.Face.Mapping.MappingFromLocation.ConfidencePercent < distanceLimits.FaceConfidencePercent) + continue; + if (faceDistanceContainer.Face.Mapping.MappingFromLocation.AreaPermyriad < distanceLimits.FaceAreaPermyriad) + continue; if (faceDistanceContainer.Face.Mapping.MappingFromFilter.IsFocusModel is not null && !faceDistanceContainer.Face.Mapping.MappingFromFilter.IsFocusModel.Value) continue; if (faceDistanceContainer.Face.Mapping.MappingFromFilter.IsFocusRelativePath is not null && !faceDistanceContainer.Face.Mapping.MappingFromFilter.IsFocusRelativePath.Value) diff --git a/Instance/DlibDotNet.cs b/Instance/DlibDotNet.cs index a887d56..bd48bdb 100644 --- a/Instance/DlibDotNet.cs +++ b/Instance/DlibDotNet.cs @@ -724,47 +724,56 @@ public partial class DlibDotNet return items; } - private void SaveFaceDistances(long ticks, MapLogic mapLogic, Mapping[] mappingCollection, string dFacesContentDirectory, string d2FacePartsContentDirectory, Dictionary> idToNormalizedRectangleToMapping, List faceDistanceEncodings, FaceDistanceContainer[] filteredFaceDistanceContainers) + private void SaveFaceDistances(long ticks, MapLogic mapLogic, Mapping[] mappingCollection, string dFacesContentDirectory, string d2FacePartsContentDirectory, Dictionary> idToNormalizedRectangleToMapping, List faceDistanceEncodings, FaceDistanceContainer[] faceDistanceContainers) { + if (_Log is null) + throw new NullReferenceException(nameof(_Log)); DistanceLimits distanceLimits; int? useFiltersCounter = null; SortingContainer[] sortingContainers; + FaceDistanceContainer[] filteredFaceDistanceContainers; distanceLimits = new(_Configuration.FaceAreaPermyriad, _Configuration.FaceConfidencePercent, _Configuration.FaceDistancePermyriad, _Configuration.RangeDaysDeltaTolerance, _Configuration.RangeDistanceTolerance, _Configuration.RangeFaceAreaTolerance, _Configuration.RangeFaceConfidence, _Configuration.SortingMaximumPerFaceShouldBeHigh); - sortingContainers = E_Distance.SetFaceMappingSortingCollectionThenGetSortingContainers(_AppSettings.MaxDegreeOfParallelism, _MapConfiguration, ticks, mapLogic, distanceLimits, faceDistanceEncodings, filteredFaceDistanceContainers); - if (!sortingContainers.Any()) + filteredFaceDistanceContainers = E_Distance.FilteredFaceDistanceContainers(mapLogic, faceDistanceContainers, distanceLimits); + if (!filteredFaceDistanceContainers.Any()) + _Log.Information("All images have been filtered!"); + else { - for (useFiltersCounter = 1; useFiltersCounter < _Configuration.UseFilterTries; useFiltersCounter++) + sortingContainers = E_Distance.SetFaceMappingSortingCollectionThenGetSortingContainers(_AppSettings.MaxDegreeOfParallelism, _MapConfiguration, ticks, mapLogic, distanceLimits, faceDistanceEncodings, filteredFaceDistanceContainers); + if (!sortingContainers.Any()) { - distanceLimits = new(_Configuration.FaceAreaPermyriad, _Configuration.FaceConfidencePercent, _Configuration.FaceDistancePermyriad, _Configuration.RangeDaysDeltaTolerance, _Configuration.RangeDistanceTolerance, _Configuration.RangeFaceAreaTolerance, _Configuration.RangeFaceConfidence, _Configuration.SortingMaximumPerFaceShouldBeHigh, useFiltersCounter); - sortingContainers = E_Distance.SetFaceMappingSortingCollectionThenGetSortingContainers(_AppSettings.MaxDegreeOfParallelism, _MapConfiguration, ticks, mapLogic, distanceLimits, faceDistanceEncodings, filteredFaceDistanceContainers); - if (sortingContainers.Any()) - break; + for (useFiltersCounter = 1; useFiltersCounter < _Configuration.UseFilterTries; useFiltersCounter++) + { + distanceLimits = new(_Configuration.FaceAreaPermyriad, _Configuration.FaceConfidencePercent, _Configuration.FaceDistancePermyriad, _Configuration.RangeDaysDeltaTolerance, _Configuration.RangeDistanceTolerance, _Configuration.RangeFaceAreaTolerance, _Configuration.RangeFaceConfidence, _Configuration.SortingMaximumPerFaceShouldBeHigh, useFiltersCounter); + filteredFaceDistanceContainers = E_Distance.FilteredFaceDistanceContainers(mapLogic, faceDistanceContainers, distanceLimits); + if (filteredFaceDistanceContainers.Any()) + _Log.Information("All images have been filtered!"); + else + { + sortingContainers = E_Distance.SetFaceMappingSortingCollectionThenGetSortingContainers(_AppSettings.MaxDegreeOfParallelism, _MapConfiguration, ticks, mapLogic, distanceLimits, faceDistanceEncodings, filteredFaceDistanceContainers); + if (sortingContainers.Any()) + break; + } + } + } + E_Distance.SaveFaceDistances(_Configuration.PropertyConfiguration, sortingContainers); + if (filteredFaceDistanceContainers.Length > 0) + { + int updated = mapLogic.UpdateFromSortingContainers(distanceLimits, sortingContainers); + List saveContainers = mapLogic.GetSaveContainers(dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, idToNormalizedRectangleToMapping, useFiltersCounter, sortingContainers.Any()); + mapLogic.SaveContainers(filteredFaceDistanceContainers.Length, updated, saveContainers); } - } - E_Distance.SaveFaceDistances(_Configuration.PropertyConfiguration, sortingContainers); - if (filteredFaceDistanceContainers.Length > 0) - { - int updated = mapLogic.UpdateFromSortingContainers(distanceLimits, sortingContainers); - List saveContainers = mapLogic.GetSaveContainers(dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, idToNormalizedRectangleToMapping, useFiltersCounter, sortingContainers.Any()); - mapLogic.SaveContainers(filteredFaceDistanceContainers.Length, updated, saveContainers); } } private void SaveFaceDistances(long ticks, MapLogic mapLogic, List distinctFilteredFaces, Mapping[] mappingCollection, string dFacesContentDirectory, string d2FacePartsContentDirectory, string dFacesCollectionDirectory, Dictionary> idToNormalizedRectangleToMapping) { - if (_Log is null) - throw new NullReferenceException(nameof(_Log)); E_Distance.SetFaceDistances(_AppSettings.MaxDegreeOfParallelism, ticks, distinctFilteredFaces); FaceDistanceContainer[] faceDistanceContainers = E_Distance.GetFaceDistanceContainers(distinctFilteredFaces); Dictionary> missingIdThenNormalizedRectangleToPersonContainers = mapLogic.GetMissing(idToNormalizedRectangleToMapping); List missingFaceDistanceContainers = _Distance.GetMissingFaceDistanceContainer(_AppSettings.MaxDegreeOfParallelism, ticks, dFacesCollectionDirectory, missingIdThenNormalizedRectangleToPersonContainers); List faceDistanceEncodings = E_Distance.GetFaceDistanceEncodings(faceDistanceContainers, missingFaceDistanceContainers); - FaceDistanceContainer[] filteredFaceDistanceContainers = E_Distance.FilteredFaceDistanceContainers(mapLogic, faceDistanceContainers); - int totalNotMappedAfterFiltered = filteredFaceDistanceContainers.Length; - if (totalNotMappedAfterFiltered == 0) - _Log.Information("All images have been filtered!"); - else - SaveFaceDistances(ticks, mapLogic, mappingCollection, dFacesContentDirectory, d2FacePartsContentDirectory, idToNormalizedRectangleToMapping, faceDistanceEncodings, filteredFaceDistanceContainers); + if (faceDistanceContainers.Any()) + SaveFaceDistances(ticks, mapLogic, mappingCollection, dFacesContentDirectory, d2FacePartsContentDirectory, idToNormalizedRectangleToMapping, faceDistanceEncodings, faceDistanceContainers); } private void MapLogic(string argZero, long ticks, Container[] containers, string a2PeopleSingletonDirectory, string dResultsFullGroupDirectory, string d2ResultsFullGroupDirectory, string fPhotoPrismContentDirectory, MapLogic mapLogic, string outputResolution, Dictionary> personKeyToIds, List distinctFilteredFaces, Mapping[] mappingCollection, int totalNotMapped) diff --git a/Shared/Models/Methods/IDistanceLimits.cs b/Shared/Models/Methods/IDistanceLimits.cs index 400cd85..14247d0 100644 --- a/Shared/Models/Methods/IDistanceLimits.cs +++ b/Shared/Models/Methods/IDistanceLimits.cs @@ -11,6 +11,6 @@ public interface IDistanceLimits public bool RangeDaysDeltaTargetLessThenUpper { init; get; } string GetCounts(); - void AddCounts(int area, int days, int distance, int confidence); + void AddCounts(int days, int distance); } \ No newline at end of file