diff --git a/Distance/Models/MapLogicSupport.cs b/Distance/Models/MapLogicSupport.cs index 98f9c03..f14ea05 100644 --- a/Distance/Models/MapLogicSupport.cs +++ b/Distance/Models/MapLogicSupport.cs @@ -10,18 +10,23 @@ namespace View_by_Distance.Distance.Models; public class MapLogicSupport : Shared.Models.Methods.IMapLogicSupport { + private int _Area; + private int _Days; + private int _Distance; + private int _Confidence; + + private readonly int _FaceConfidencePercent; private readonly int _FaceDistancePermyriad; - private readonly int _SortingDaysDeltaTolerance; - private readonly double _FaceDistanceMinimumConfidence; - private readonly int _FaceDistanceAreaPermilleTolerance; + private readonly int[] _RangeDaysDeltaTolerance; + private readonly int[] _RangeFaceAreaPermilleTolerance; private readonly int _SortingMaximumPerFaceShouldBeHigh; - public MapLogicSupport(int faceDistanceAreaPermilleTolerance, double faceDistanceMinimumConfidence, int faceDistancePermyriad, int sortingDaysDeltaTolerance, int sortingMaximumPerFaceShouldBeHigh) + public MapLogicSupport(int faceConfidencePercent, int faceDistancePermyriad, int[] rangeDaysDeltaTolerance, int[] rangeFaceAreaPermilleTolerance, int sortingMaximumPerFaceShouldBeHigh) { + _FaceConfidencePercent = faceConfidencePercent; _FaceDistancePermyriad = faceDistancePermyriad; - _SortingDaysDeltaTolerance = sortingDaysDeltaTolerance; - _FaceDistanceMinimumConfidence = faceDistanceMinimumConfidence; - _FaceDistanceAreaPermilleTolerance = faceDistanceAreaPermilleTolerance; + _RangeDaysDeltaTolerance = rangeDaysDeltaTolerance; + _RangeFaceAreaPermilleTolerance = rangeFaceAreaPermilleTolerance; _SortingMaximumPerFaceShouldBeHigh = sortingMaximumPerFaceShouldBeHigh; } @@ -46,10 +51,10 @@ public class MapLogicSupport : Shared.Models.Methods.IMapLogicSupport double b; double c; double d; + double faceAreaPermille; + double faceConfidencePercent; double faceDistancePermyriad; - double sortingDaysDeltaTolerance; - double faceDistanceMinimumConfidence; - double faceDistanceAreaPermilleTolerance; + double rangeDaysDeltaTolerance; if (useFiltersCounter is null) { a = 1f; @@ -87,52 +92,70 @@ public class MapLogicSupport : Shared.Models.Methods.IMapLogicSupport } if (useFiltersCounter is null) { - sortingDaysDeltaTolerance = _SortingDaysDeltaTolerance; + rangeDaysDeltaTolerance = _RangeDaysDeltaTolerance[1]; faceDistancePermyriad = _FaceDistancePermyriad; - faceDistanceMinimumConfidence = _FaceDistanceMinimumConfidence; - faceDistanceAreaPermilleTolerance = _FaceDistanceAreaPermilleTolerance; + faceConfidencePercent = _FaceConfidencePercent; + faceAreaPermille = _RangeFaceAreaPermilleTolerance[1]; } else if (useFiltersCounter.Value is 1 or 5 or 9 or 13) { - sortingDaysDeltaTolerance = _SortingDaysDeltaTolerance * a; + rangeDaysDeltaTolerance = _RangeDaysDeltaTolerance[1] * a; faceDistancePermyriad = _FaceDistancePermyriad * c; - faceDistanceMinimumConfidence = _FaceDistanceMinimumConfidence * d; - faceDistanceAreaPermilleTolerance = _FaceDistanceAreaPermilleTolerance * d; + faceConfidencePercent = _FaceConfidencePercent * d; + faceAreaPermille = _RangeFaceAreaPermilleTolerance[1] * d; } else if (useFiltersCounter.Value is 2 or 6 or 10 or 14) { - sortingDaysDeltaTolerance = _SortingDaysDeltaTolerance * c; + rangeDaysDeltaTolerance = _RangeDaysDeltaTolerance[1] * c; faceDistancePermyriad = _FaceDistancePermyriad * a; - faceDistanceMinimumConfidence = _FaceDistanceMinimumConfidence * d; - faceDistanceAreaPermilleTolerance = _FaceDistanceAreaPermilleTolerance * d; + faceConfidencePercent = _FaceConfidencePercent * d; + faceAreaPermille = _RangeFaceAreaPermilleTolerance[1] * d; } else if (useFiltersCounter.Value is 3 or 7 or 11 or 15) { - sortingDaysDeltaTolerance = _SortingDaysDeltaTolerance * c; + rangeDaysDeltaTolerance = _RangeDaysDeltaTolerance[1] * c; faceDistancePermyriad = _FaceDistancePermyriad * c; - faceDistanceMinimumConfidence = _FaceDistanceMinimumConfidence * b; - faceDistanceAreaPermilleTolerance = _FaceDistanceAreaPermilleTolerance * d; + faceConfidencePercent = _FaceConfidencePercent * b; + faceAreaPermille = _RangeFaceAreaPermilleTolerance[1] * d; } else if (useFiltersCounter.Value is 4 or 8 or 12 or 16) { - sortingDaysDeltaTolerance = _SortingDaysDeltaTolerance * c; + rangeDaysDeltaTolerance = _RangeDaysDeltaTolerance[1] * c; faceDistancePermyriad = _FaceDistancePermyriad * c; - faceDistanceMinimumConfidence = _FaceDistanceMinimumConfidence * d; - faceDistanceAreaPermilleTolerance = _FaceDistanceAreaPermilleTolerance * b; + faceConfidencePercent = _FaceConfidencePercent * d; + faceAreaPermille = _RangeFaceAreaPermilleTolerance[1] * b; } else { - sortingDaysDeltaTolerance = int.MaxValue; + rangeDaysDeltaTolerance = int.MaxValue; faceDistancePermyriad = int.MaxValue; - faceDistanceAreaPermilleTolerance = 0; - faceDistanceMinimumConfidence = 0; + faceAreaPermille = 0; + faceConfidencePercent = 0; } foreach (Sorting sorting in collection) { if (face.Mapping is null || faceDistanceEncoding.NormalizedPixelPercentage is null) throw new NotSupportedException(); - if (sorting.DaysDelta > sortingDaysDeltaTolerance || sorting.DistancePermyriad > faceDistancePermyriad || face.Mapping.MappingFromLocation.Confidence < faceDistanceMinimumConfidence || face.Mapping.MappingFromLocation.AreaPermille < faceDistanceAreaPermilleTolerance) + if (sorting.DaysDelta > rangeDaysDeltaTolerance) + { + _Days += 1; continue; + } + if (sorting.DistancePermyriad > faceDistancePermyriad) + { + _Distance += 1; + continue; + } + if (face.Mapping.MappingFromLocation.ConfidencePercent < faceConfidencePercent) + { + _Confidence += 1; + continue; + } + if (face.Mapping.MappingFromLocation.AreaPermille < faceAreaPermille) + { + _Area += 1; + continue; + } sortingContainer = new(face.Mapping, sorting); results.Add(sortingContainer); if (results.Count >= _SortingMaximumPerFaceShouldBeHigh) @@ -163,7 +186,7 @@ public class MapLogicSupport : Shared.Models.Methods.IMapLogicSupport throw new NotSupportedException(); if (face.FaceDistance?.Encoding is not FaceRecognitionDotNet.FaceEncoding faceEncoding) continue; - faceDistance = new(face.Mapping.MappingFromLocation.Confidence, faceEncoding, face.Mapping.MappingFromItem.Id, face.Mapping.MappingFromItem.IsWrongYear, face.Mapping.MappingFromItem.MinimumDateTime, face.Mapping.MappingFromLocation.NormalizedPixelPercentage); + faceDistance = new(face.Mapping.MappingFromLocation.ConfidencePercent, faceEncoding, face.Mapping.MappingFromItem.Id, face.Mapping.MappingFromItem.IsWrongYear, face.Mapping.MappingFromItem.MinimumDateTime, face.Mapping.MappingFromLocation.NormalizedPixelPercentage); faceDistanceContainer = new(face, faceDistance); collection.Add(faceDistanceContainer); } @@ -244,7 +267,7 @@ public class MapLogicSupport : Shared.Models.Methods.IMapLogicSupport return; progressBar.Tick(); faceEncoding = FaceRecognition.LoadFaceEncoding(face.FaceEncoding.RawEncoding); - FaceDistance faceDistance = new(face.Mapping.MappingFromLocation.Confidence, faceEncoding, face.Mapping.MappingFromItem.Id, face.Mapping.MappingFromItem.IsWrongYear, face.Mapping.MappingFromItem.MinimumDateTime, face.Mapping.MappingFromLocation.NormalizedPixelPercentage); + FaceDistance faceDistance = new(face.Mapping.MappingFromLocation.ConfidencePercent, faceEncoding, face.Mapping.MappingFromItem.Id, face.Mapping.MappingFromItem.IsWrongYear, face.Mapping.MappingFromItem.MinimumDateTime, face.Mapping.MappingFromLocation.NormalizedPixelPercentage); lock (face) face.SetFaceDistance(faceDistance); }); @@ -317,4 +340,18 @@ public class MapLogicSupport : Shared.Models.Methods.IMapLogicSupport return results; } + string Shared.Models.Methods.IMapLogicSupport.GetCounts() + { + 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)) + }; + result = string.Join(' ', from l in results orderby l.Value descending select $"{l.Name}_{l.Value};"); + return result; + } + } \ No newline at end of file diff --git a/Distance/Models/_E_Distance.cs b/Distance/Models/_E_Distance.cs index 61ee21a..3db9ae9 100644 --- a/Distance/Models/_E_Distance.cs +++ b/Distance/Models/_E_Distance.cs @@ -12,15 +12,17 @@ public partial class E_Distance private readonly List _Debug; private readonly List _Renamed; private readonly Serilog.ILogger? _Log; + private readonly int _FaceConfidencePercent; private readonly bool _DistanceRenameToMatch; - private readonly double _FaceDistanceTolerance; + private readonly double[] _RangeFaceConfidence; private readonly bool _DistanceMoveUnableToMatch; private readonly List _AllMappedFaceFiles; + private readonly double[] _RangeDistanceTolerance; private readonly int _DistancePixelDistanceTolerance; private readonly List _AllMappedFaceFileNames; private readonly List _DuplicateMappedFaceFiles; - public E_Distance(bool distanceMoveUnableToMatch, int distancePixelDistanceTolerance, bool distanceRenameToMatch, double faceDistanceTolerance) + public E_Distance(bool distanceMoveUnableToMatch, int distancePixelDistanceTolerance, bool distanceRenameToMatch, int faceConfidencePercent, double[] rangeDistanceTolerance, double[] rangeFaceConfidence) { _Debug = new(); _Moved = new(); @@ -28,9 +30,11 @@ public partial class E_Distance _AllMappedFaceFiles = new(); _AllMappedFaceFileNames = new(); _DuplicateMappedFaceFiles = new(); + _RangeFaceConfidence = rangeFaceConfidence; _Log = Serilog.Log.ForContext(); _DistanceRenameToMatch = distanceRenameToMatch; - _FaceDistanceTolerance = faceDistanceTolerance; + _FaceConfidencePercent = faceConfidencePercent; + _RangeDistanceTolerance = rangeDistanceTolerance; _DistanceMoveUnableToMatch = distanceMoveUnableToMatch; _DistancePixelDistanceTolerance = distancePixelDistanceTolerance; } @@ -67,7 +71,7 @@ public partial class E_Distance } else { - checkDirectoryName = Path.Combine(checkDirectoryName, $"({directoryTicks}{_FaceDistanceTolerance.ToString()[1..]})"); + checkDirectoryName = Path.Combine(checkDirectoryName, $"({directoryTicks}_{string.Join('-', _RangeDistanceTolerance)})"); for (int i = directoryNames.Count - 1 - 1; i > -1; i--) checkDirectoryName = Path.Combine(checkDirectoryName, directoryNames[i]); if (!Directory.Exists(checkDirectoryName)) @@ -133,9 +137,10 @@ public partial class E_Distance return result; } - private static FaceDistanceContainer[] GetFaceDistanceContainers(MappingFromItem mappingFromItem, Face[] filteredFaces) + private FaceDistanceContainer[] GetFaceDistanceContainers(MappingFromItem mappingFromItem, Face[] filteredFaces) { FaceDistanceContainer[] results; + int confidencePercent; FaceDistance faceDistance; int normalizedPixelPercentage; FaceDistanceContainer faceDistanceContainer; @@ -144,13 +149,14 @@ public partial class E_Distance { if (face.FaceEncoding is null || face.Location is null || face.OutputResolution is null) throw new NotSupportedException(); + confidencePercent = Shared.Models.Stateless.Methods.ILocation.GetConfidencePercent(_FaceConfidencePercent, _RangeFaceConfidence, face.Location.Confidence); normalizedPixelPercentage = Shared.Models.Stateless.Methods.ILocation.GetNormalizedPixelPercentage(face.Location, Shared.Models.Stateless.ILocation.Digits, Shared.Models.Stateless.ILocation.Factor, face.OutputResolution); if (face.FaceDistance?.Encoding is not null && face.FaceDistance.Encoding is FaceRecognitionDotNet.FaceEncoding faceEncoding) - faceDistance = new(face.Location.Confidence, faceEncoding, mappingFromItem.Id, mappingFromItem.IsWrongYear, mappingFromItem.MinimumDateTime, normalizedPixelPercentage); + faceDistance = new(confidencePercent, faceEncoding, mappingFromItem.Id, mappingFromItem.IsWrongYear, mappingFromItem.MinimumDateTime, normalizedPixelPercentage); else { faceEncoding = FaceRecognition.LoadFaceEncoding(face.FaceEncoding.RawEncoding); - faceDistance = new(face.Location.Confidence, faceEncoding, mappingFromItem.Id, mappingFromItem.IsWrongYear, mappingFromItem.MinimumDateTime, normalizedPixelPercentage); + faceDistance = new(confidencePercent, faceEncoding, mappingFromItem.Id, mappingFromItem.IsWrongYear, mappingFromItem.MinimumDateTime, normalizedPixelPercentage); lock (filteredFaces) face.SetFaceDistance(faceDistance); } @@ -173,7 +179,7 @@ public partial class E_Distance return faceDistanceEncodings; } - private static List<(Face Face, double? Length)> GetValues(MappingFromItem mappingFromItem, Face[] filteredFaces, string json) + private List<(Face Face, double? Length)> GetValues(MappingFromItem mappingFromItem, Face[] filteredFaces, string json) { List<(Face Face, double? Length)> results = new(); Face face; diff --git a/Drag-Drop/Models/Binder/Configuration.cs b/Drag-Drop/Models/Binder/Configuration.cs index 66c44f0..594f779 100644 --- a/Drag-Drop/Models/Binder/Configuration.cs +++ b/Drag-Drop/Models/Binder/Configuration.cs @@ -23,7 +23,6 @@ public class Configuration [Display(Name = "Load Or Create Then Save Distance Results"), Required] public string[] LoadOrCreateThenSaveDistanceResultsForOutputResolutions { get; set; } [Display(Name = "Load Or Create Then Save Image Faces Results"), Required] public string[] LoadOrCreateThenSaveImageFacesResultsForOutputResolutions { get; set; } [Display(Name = "Load Or Create Then Save Index"), Required] public bool? LoadOrCreateThenSaveIndex { get; set; } - [Display(Name = "Location Confidence Factor"), Required] public int? LocationConfidenceFactor { get; set; } [Display(Name = "Mapped Max Index"), Required] public int? MappedMaxIndex { get; set; } [Display(Name = "Mixed Year Relative Paths"), Required] public string[] MixedYearRelativePaths { get; set; } [Display(Name = "Model Directory"), Required] public string ModelDirectory { get; set; } @@ -88,8 +87,6 @@ public class Configuration configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions = Array.Empty(); if (configuration.LoadOrCreateThenSaveIndex is null) throw new NullReferenceException(nameof(configuration.LoadOrCreateThenSaveIndex)); - if (configuration.LocationConfidenceFactor is null) - throw new NullReferenceException(nameof(configuration.LocationConfidenceFactor)); if (configuration.MixedYearRelativePaths is null) throw new NullReferenceException(nameof(configuration.MixedYearRelativePaths)); if (configuration.NumberOfJitters is null) @@ -148,7 +145,6 @@ public class Configuration configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions, configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions, configuration.LoadOrCreateThenSaveIndex.Value, - configuration.LocationConfidenceFactor.Value, configuration.MappedMaxIndex, configuration.MixedYearRelativePaths, configuration.ModelDirectory, diff --git a/Drag-Drop/Models/Configuration.cs b/Drag-Drop/Models/Configuration.cs index 6ca08b2..a9ff9f3 100644 --- a/Drag-Drop/Models/Configuration.cs +++ b/Drag-Drop/Models/Configuration.cs @@ -22,7 +22,6 @@ public class Configuration public string[] LoadOrCreateThenSaveDistanceResultsForOutputResolutions { init; get; } public string[] LoadOrCreateThenSaveImageFacesResultsForOutputResolutions { init; get; } public bool LoadOrCreateThenSaveIndex { init; get; } - public int LocationConfidenceFactor { init; get; } public int? MappedMaxIndex { init; get; } public string[] MixedYearRelativePaths { init; get; } public string ModelDirectory { init; get; } @@ -66,7 +65,6 @@ public class Configuration string[] loadOrCreateThenSaveDistanceResultsForOutputResolutions, string[] loadOrCreateThenSaveImageFacesResultsForOutputResolutions, bool loadOrCreateThenSaveIndex, - int locationConfidenceFactor, int? mappedMaxIndex, string[] mixedYearRelativePaths, string modelDirectory, @@ -109,7 +107,6 @@ public class Configuration LoadOrCreateThenSaveDistanceResultsForOutputResolutions = loadOrCreateThenSaveDistanceResultsForOutputResolutions; LoadOrCreateThenSaveImageFacesResultsForOutputResolutions = loadOrCreateThenSaveImageFacesResultsForOutputResolutions; LoadOrCreateThenSaveIndex = loadOrCreateThenSaveIndex; - LocationConfidenceFactor = locationConfidenceFactor; MappedMaxIndex = mappedMaxIndex; MixedYearRelativePaths = mixedYearRelativePaths; ModelDirectory = modelDirectory; diff --git a/Face/Models/_D_Face.cs b/Face/Models/_D_Face.cs index a614b69..c7d92ec 100644 --- a/Face/Models/_D_Face.cs +++ b/Face/Models/_D_Face.cs @@ -33,9 +33,9 @@ public class D_Face private readonly int _NumberOfJitters; private readonly Serilog.ILogger? _Log; private readonly bool _OverrideForFaceImages; - private readonly bool _RetryImagesWithoutAFace; private readonly Configuration _Configuration; private readonly int _NumberOfTimesToUpsample; + private readonly bool _RetryImagesWithoutAFace; private readonly ImageCodecInfo _ImageCodecInfo; private readonly ModelParameter _ModelParameter; private readonly PredictorModel _PredictorModel; @@ -45,7 +45,6 @@ public class D_Face private readonly int _FaceDistanceHiddenImageFactor; private readonly EncoderParameters _EncoderParameters; private readonly ImageCodecInfo _HiddenImageCodecInfo; - private readonly int _FaceDistanceAreaPermilleTolerance; private readonly bool _ForceFaceLastWriteTimeToCreationTime; private readonly EncoderParameters _HiddenEncoderParameters; private readonly JsonSerializerOptions _WriteIndentedAndWhenWritingNull; @@ -55,7 +54,6 @@ public class D_Face bool checkDFaceAndUpWriteDates, Configuration configuration, EncoderParameters encoderParameters, - int faceDistanceAreaPermilleTolerance, int faceDistanceHiddenImageFactor, string filenameExtension, bool forceFaceLastWriteTimeToCreationTime, @@ -88,7 +86,6 @@ public class D_Face _NumberOfTimesToUpsample = numberOfTimesToUpsample; _CheckDFaceAndUpWriteDates = checkDFaceAndUpWriteDates; _PropertiesChangedForFaces = propertiesChangedForFaces; - _FaceDistanceAreaPermilleTolerance = faceDistanceAreaPermilleTolerance; _FaceDistanceHiddenImageFactor = faceDistanceHiddenImageFactor; _ForceFaceLastWriteTimeToCreationTime = forceFaceLastWriteTimeToCreationTime; (Model model, PredictorModel predictorModel, ModelParameter modelParameter) = GetModel(modelDirectory, modelName, predictorModelName); diff --git a/Instance/DlibDotNet.cs b/Instance/DlibDotNet.cs index bc4a5cf..1d96396 100644 --- a/Instance/DlibDotNet.cs +++ b/Instance/DlibDotNet.cs @@ -80,7 +80,6 @@ public partial class DlibDotNet configuration.CheckDFaceAndUpWriteDates, configuration.PropertyConfiguration, encoderParameters, - configuration.FaceDistanceAreaPermilleTolerance, configuration.FaceDistanceHiddenImageFactor, filenameExtension, configuration.ForceFaceLastWriteTimeToCreationTime, @@ -103,7 +102,7 @@ public partial class DlibDotNet } _Metadata = new(configuration.ForceMetadataLastWriteTimeToCreationTime, configuration.PropertiesChangedForMetadata); _MapConfiguration = Get(configuration, _Faces.FileNameExtension, _Faces.HiddenFileNameExtension, _FaceParts.FileNameExtension); - _Distance = new(configuration.DistanceMoveUnableToMatch, configuration.DistancePixelDistanceTolerance, configuration.DistanceRenameToMatch, configuration.FaceDistanceTolerance); + _Distance = new(configuration.DistanceMoveUnableToMatch, configuration.DistancePixelDistanceTolerance, configuration.DistanceRenameToMatch, _Configuration.FaceConfidencePercent, configuration.RangeDistanceTolerance, configuration.RangeFaceConfidence); if (_FirstRun || !_ArgZeroIsConfigurationRootDirectory) personContainers = Array.Empty(); else @@ -217,8 +216,6 @@ public partial class DlibDotNet throw new Exception($"One or more {nameof(configuration.SaveShortcutsForOutputResolutions)} are not in the ValidResolutions list!"); if ((from l in configuration.SaveFaceLandmarkForOutputResolutions where !configuration.ValidResolutions.Contains(l) select false).Any()) throw new Exception($"One or more {nameof(configuration.SaveFaceLandmarkForOutputResolutions)} are not in the ValidResolutions list!"); - if (configuration.DistanceFactor + configuration.LocationConfidenceFactor != 10) - throw new NullReferenceException(nameof(configuration.DistanceFactor)); if (string.IsNullOrEmpty(configuration.ModelName)) throw new NullReferenceException(nameof(configuration.ModelName)); if (string.IsNullOrEmpty(configuration.OutputExtension)) @@ -266,12 +263,13 @@ public partial class DlibDotNet private static Map.Models.Configuration Get(Models.Configuration configuration, string facesFileNameExtension, string facesHiddenFileNameExtension, string facePartsFileNameExtension) { Map.Models.Configuration result = new( + configuration.FaceConfidencePercent, configuration.FaceDistancePermyriad, - configuration.FaceDistanceTolerance, configuration.MappingDefaultName, configuration.PersonBirthdayFirstYear, configuration.PersonBirthdayFormat, - configuration.SortingDaysDeltaTolerance, + configuration.RangeDaysDeltaTolerance, + configuration.RangeDistanceTolerance, configuration.SortingMaximumPerKey, configuration.SortingMinimumToUseSigma, facesFileNameExtension, @@ -782,9 +780,10 @@ public partial class DlibDotNet List items = new(); Shared.Models.Face[] faces; Mapping mapping; - int areaPermille; + int faceAreaPermille; bool? isWrongYear; Item[] filteredItems; + int confidencePercent; DateTime minimumDateTime; int normalizedPixelPercentage; string deterministicHashCodeKey; @@ -820,10 +819,11 @@ public partial class DlibDotNet break; if (face.FaceEncoding is null || face.Location is null || face.OutputResolution is null) continue; - areaPermille = Shared.Models.Stateless.Methods.IMapping.GetAreaPermille(face.Location, face.OutputResolution); + confidencePercent = Shared.Models.Stateless.Methods.ILocation.GetConfidencePercent(_Configuration.FaceConfidencePercent, _Configuration.RangeFaceConfidence, face.Location.Confidence); + faceAreaPermille = Shared.Models.Stateless.Methods.IMapping.GetAreaPermille(_Configuration.FaceAreaPermille, face.Location, face.OutputResolution); normalizedPixelPercentage = Shared.Models.Stateless.Methods.ILocation.GetNormalizedPixelPercentage(face.Location, Shared.Models.Stateless.ILocation.Digits, Shared.Models.Stateless.ILocation.Factor, face.OutputResolution); deterministicHashCodeKey = Shared.Models.Stateless.Methods.IMapping.GetDeterministicHashCodeKey(item.Property.Id.Value, face.Location, Shared.Models.Stateless.ILocation.Digits, Shared.Models.Stateless.ILocation.Factor, face.OutputResolution); - mappingFromLocation = new(areaPermille, face.Location.Confidence, deterministicHashCodeKey, normalizedPixelPercentage); + mappingFromLocation = new(faceAreaPermille, confidencePercent, deterministicHashCodeKey, normalizedPixelPercentage); mapping = new(mappingFromItem, mappingFromLocation); face.SetMapping(mapping); collection.Add(face); @@ -842,10 +842,10 @@ public partial class DlibDotNet (List filteredItems, Shared.Models.Face[] distinctFilteredFaces) = SetMappingThenGetDistinctFilteredFacesWithMapping(argZero, containers); Mapping[] mappingCollection = MapLogicSupport.GetSelectedMappingCollection(distinctFilteredFaces); MapLogicSupport mapLogicSupport = new( - _Configuration.FaceDistanceAreaPermilleTolerance, - _Configuration.FaceDistanceMinimumConfidence, + _Configuration.FaceConfidencePercent, _Configuration.FaceDistancePermyriad, - _Configuration.SortingDaysDeltaTolerance, + _Configuration.RangeDaysDeltaTolerance, + _Configuration.RangeFaceAreaPermilleTolerance, _Configuration.SortingMaximumPerFaceShouldBeHigh); MapLogic mapLogic = new( _AppSettings.MaxDegreeOfParallelism, @@ -859,13 +859,11 @@ public partial class DlibDotNet mapLogicSupport); Dictionary> idToNormalizedPixelPercentageToMapping = MapLogicSupport.GetIdToNormalizedPixelPercentageToFace(mappingCollection); mapLogic.CopyManualFiles(dFacesContentDirectory, idToNormalizedPixelPercentageToMapping); - if (!_Configuration.SaveFaceDistancesForOutputResolutions.Contains(outputResolution)) - mapLogic.CopyNotMappedFaces(_Configuration.FaceDistanceAreaPermilleTolerance, dFacesContentDirectory, idToNormalizedPixelPercentageToMapping); + if (_Configuration.SaveNotMappedForOutputResolutions.Contains(outputResolution)) + mapLogic.CopyNotMappedFaces(_Configuration.RangeFaceAreaPermilleTolerance, dFacesContentDirectory, idToNormalizedPixelPercentageToMapping); (Dictionary personKeyToCount, int totalNotMapped) = mapLogic.AddToMapping(mappingCollection); if (_Configuration.SaveMappedForOutputResolutions.Contains(outputResolution)) mapLogic.SaveMapped(dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, idToNormalizedPixelPercentageToMapping, personKeyToCount, totalNotMapped); - if (_Configuration.SaveNotMappedForOutputResolutions.Contains(outputResolution)) - mapLogic.SaveNotMappedTicks(); if (_Configuration.SaveShortcutsForOutputResolutions.Contains(outputResolution)) mapLogic.SaveShortcuts(a2PeopleSingletonDirectory, personContainers, filteredItems, mappingCollection, personKeyToCount); if (_Configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions.Contains(outputResolution)) @@ -887,6 +885,8 @@ public partial class DlibDotNet if (totalNotMapped > 0) mapLogic.UpdateFromSortingContainersThenSaveContainers(dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, idToNormalizedPixelPercentageToMapping, useFiltersCounter, sortingContainers, totalNotMapped); } + if (_Configuration.SaveNotMappedForOutputResolutions.Contains(outputResolution)) + mapLogic.SaveNotMappedTicks(); } private static Container? AreAllSameEndsWith(string argZero, Container[] containers) diff --git a/Instance/Models/Binder/Configuration.cs b/Instance/Models/Binder/Configuration.cs index 452be7f..727649b 100644 --- a/Instance/Models/Binder/Configuration.cs +++ b/Instance/Models/Binder/Configuration.cs @@ -17,11 +17,10 @@ public class Configuration [Display(Name = "Distance Move Unable to Match by 1 Tick"), Required] public bool? DistanceMoveUnableToMatch { get; set; } [Display(Name = "Distance Pixel Distance Tolerance"), Required] public int? DistancePixelDistanceTolerance { get; set; } [Display(Name = "Distance Rename to Match"), Required] public bool? DistanceRenameToMatch { get; set; } - [Display(Name = "Face Area Permille Tolerance"), Required] public int? FaceDistanceAreaPermilleTolerance { get; set; } + [Display(Name = "Face Area Permille"), Required] public int? FaceAreaPermille { get; set; } [Display(Name = "Face Distance Hidden Image Factor"), Required] public int? FaceDistanceHiddenImageFactor { get; set; } - [Display(Name = "Location Minimum Confidence"), Required] public double? FaceDistanceMinimumConfidence { get; set; } + [Display(Name = "Face Confidence Percent"), Required] public int? FaceConfidencePercent { get; set; } [Display(Name = "Face Distance Permyriad"), Required] public int? FaceDistancePermyriad { get; set; } - [Display(Name = "Face Distance Tolerance"), Required] public double? FaceDistanceTolerance { get; set; } [Display(Name = "Force Face Last Write Time to Creation Time"), Required] public bool? ForceFaceLastWriteTimeToCreationTime { get; set; } [Display(Name = "Force Metadata Last Write Time to Creation Time"), Required] public bool? ForceMetadataLastWriteTimeToCreationTime { get; set; } [Display(Name = "Force Resize Last Write Time to Creation Time"), Required] public bool? ForceResizeLastWriteTimeToCreationTime { get; set; } @@ -31,7 +30,6 @@ public class Configuration [Display(Name = "Load Or Create Then Save Distance Results"), Required] public string[] LoadOrCreateThenSaveDistanceResultsForOutputResolutions { get; set; } [Display(Name = "Load Or Create Then Save Image Faces Results"), Required] public string[] LoadOrCreateThenSaveImageFacesResultsForOutputResolutions { get; set; } [Display(Name = "Load Or Create Then Save Index"), Required] public bool? LoadOrCreateThenSaveIndex { get; set; } - [Display(Name = "Location Confidence Factor"), Required] public int? LocationConfidenceFactor { get; set; } [Display(Name = "Location Digits"), Required] public int? LocationDigits { get; set; } [Display(Name = "Location Factor"), Required] public int? LocationFactor { get; set; } [Display(Name = "Mapped Max Index"), Required] public int? MappedMaxIndex { get; set; } @@ -59,18 +57,21 @@ public class Configuration [Display(Name = "Properties Changed For Metadata"), Required] public bool? PropertiesChangedForMetadata { get; set; } [Display(Name = "Properties Changed For Resize"), Required] public bool? PropertiesChangedForResize { get; set; } [Display(Name = "Property Configuration"), Required] public Property.Models.Configuration PropertyConfiguration { get; set; } + [Display(Name = "Sorting Days Delta Tolerance"), Required] public int[] RangeDaysDeltaTolerance { get; set; } + [Display(Name = "Face Area Permille Tolerance"), Required] public int[] RangeFaceAreaPermilleTolerance { get; set; } + [Display(Name = "Location Minimum Confidence"), Required] public double[] RangeFaceConfidence { get; set; } + [Display(Name = "Face Distance Tolerance"), Required] public double[] RangeDistanceTolerance { get; set; } [Display(Name = "Retry Images Without a Face"), Required] public bool? RetryImagesWithoutAFace { get; set; } [Display(Name = "Reverse"), Required] public bool? Reverse { get; set; } + [Display(Name = "Save Face Distances"), Required] public string[] SaveFaceDistancesForOutputResolutions { get; set; } [Display(Name = "Save Face Landmark For Output Resolutions"), Required] public string[] SaveFaceLandmarkForOutputResolutions { get; set; } [Display(Name = "Save Full Year Of Random Files"), Required] public bool? SaveFullYearOfRandomFiles { get; set; } - [Display(Name = "Save Face Distances"), Required] public string[] SaveFaceDistancesForOutputResolutions { get; set; } [Display(Name = "Save Mapped"), Required] public string[] SaveMappedForOutputResolutions { get; set; } [Display(Name = "Save Not Mapped"), Required] public string[] SaveNotMappedForOutputResolutions { get; set; } [Display(Name = "Save Resized Images by Person Key Formatted"), Required] public string[] SaveResizedImagesByPersonKeyFormattedForOutputResolutions { get; set; } [Display(Name = "Save Resized Subfiles"), Required] public bool? SaveResizedSubfiles { get; set; } [Display(Name = "Save Shortcuts"), Required] public string[] SaveShortcutsForOutputResolutions { get; set; } [Display(Name = "Skip Search"), Required] public bool? SkipSearch { get; set; } - [Display(Name = "Sorting Days Delta Tolerance"), Required] public int? SortingDaysDeltaTolerance { get; set; } [Display(Name = "SortingMaximumPerFaceShould be High"), Required] public int? SortingMaximumPerFaceShouldBeHigh { get; set; } [Display(Name = "Sorting Maximum Per Key"), Required] public int? SortingMaximumPerKey { get; set; } [Display(Name = "Sorting Minimum to use Sigma"), Required] public int? SortingMinimumToUseSigma { get; set; } @@ -102,16 +103,14 @@ public class Configuration throw new NullReferenceException(nameof(configuration.DistancePixelDistanceTolerance)); if (configuration.DistanceRenameToMatch is null) throw new NullReferenceException(nameof(configuration.DistanceRenameToMatch)); - if (configuration.FaceDistanceAreaPermilleTolerance is null) - throw new NullReferenceException(nameof(configuration.FaceDistanceAreaPermilleTolerance)); + if (configuration.FaceAreaPermille is null) + throw new NullReferenceException(nameof(configuration.FaceAreaPermille)); if (configuration.FaceDistanceHiddenImageFactor is null) throw new NullReferenceException(nameof(configuration.FaceDistanceHiddenImageFactor)); - if (configuration.FaceDistanceMinimumConfidence is null) - throw new NullReferenceException(nameof(configuration.FaceDistanceMinimumConfidence)); + if (configuration.FaceConfidencePercent is null) + throw new NullReferenceException(nameof(configuration.FaceConfidencePercent)); if (configuration.FaceDistancePermyriad is null) throw new NullReferenceException(nameof(configuration.FaceDistancePermyriad)); - if (configuration.FaceDistanceTolerance is null) - throw new NullReferenceException(nameof(configuration.FaceDistanceTolerance)); if (configuration.ForceFaceLastWriteTimeToCreationTime is null) throw new NullReferenceException(nameof(configuration.ForceFaceLastWriteTimeToCreationTime)); if (configuration.ForceMetadataLastWriteTimeToCreationTime is null) @@ -128,8 +127,6 @@ public class Configuration configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions = Array.Empty(); if (configuration.LoadOrCreateThenSaveIndex is null) throw new NullReferenceException(nameof(configuration.LoadOrCreateThenSaveIndex)); - if (configuration.LocationConfidenceFactor is null) - throw new NullReferenceException(nameof(configuration.LocationConfidenceFactor)); if (configuration.LocationDigits is null) throw new NullReferenceException(nameof(configuration.LocationDigits)); if (configuration.LocationFactor is null) @@ -172,20 +169,28 @@ public class Configuration throw new NullReferenceException(nameof(configuration.PropertiesChangedForMetadata)); if (configuration.PropertiesChangedForResize is null) throw new NullReferenceException(nameof(configuration.PropertiesChangedForResize)); + if (configuration.RangeDaysDeltaTolerance is null || configuration.RangeDaysDeltaTolerance.Length != 3) + throw new NullReferenceException(nameof(configuration.RangeDaysDeltaTolerance)); + if (configuration.RangeFaceAreaPermilleTolerance is null || configuration.RangeFaceAreaPermilleTolerance.Length != 3) + throw new NullReferenceException(nameof(configuration.RangeFaceAreaPermilleTolerance)); + if (configuration.RangeFaceConfidence is null || configuration.RangeFaceConfidence.Length != 3) + throw new NullReferenceException(nameof(configuration.RangeFaceConfidence)); + if (configuration.RangeDistanceTolerance is null || configuration.RangeDistanceTolerance.Length != 3) + throw new NullReferenceException(nameof(configuration.RangeDistanceTolerance)); if (configuration.RetryImagesWithoutAFace is null) throw new NullReferenceException(nameof(configuration.RetryImagesWithoutAFace)); if (configuration.Reverse is null) throw new NullReferenceException(nameof(configuration.Reverse)); - if (configuration.SaveFaceLandmarkForOutputResolutions is null) - configuration.SaveFaceLandmarkForOutputResolutions = Array.Empty(); if (configuration.SaveFaceDistancesForOutputResolutions is null) configuration.SaveFaceDistancesForOutputResolutions = Array.Empty(); + if (configuration.SaveFaceLandmarkForOutputResolutions is null) + configuration.SaveFaceLandmarkForOutputResolutions = Array.Empty(); + if (configuration.SaveFullYearOfRandomFiles is null) + throw new NullReferenceException(nameof(configuration.SaveFullYearOfRandomFiles)); if (configuration.SaveMappedForOutputResolutions is null) configuration.SaveMappedForOutputResolutions = Array.Empty(); if (configuration.SaveNotMappedForOutputResolutions is null) configuration.SaveNotMappedForOutputResolutions = Array.Empty(); - if (configuration.SaveFullYearOfRandomFiles is null) - throw new NullReferenceException(nameof(configuration.SaveFullYearOfRandomFiles)); if (configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions is null) configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions = Array.Empty(); if (configuration.SaveResizedSubfiles is null) @@ -196,8 +201,6 @@ public class Configuration configuration.SaveShortcutsForOutputResolutions = Array.Empty(); if (configuration.SkipSearch is null) throw new NullReferenceException(nameof(configuration.SkipSearch)); - if (configuration.SortingDaysDeltaTolerance is null) - throw new NullReferenceException(nameof(configuration.SortingDaysDeltaTolerance)); if (configuration.SortingMaximumPerFaceShouldBeHigh is null) throw new NullReferenceException(nameof(configuration.SortingMaximumPerFaceShouldBeHigh)); if (configuration.SortingMaximumPerKey is null) @@ -208,7 +211,7 @@ public class Configuration throw new NullReferenceException(nameof(configuration.TestDistanceResults)); if (configuration.ValidResolutions is null) throw new NullReferenceException(nameof(configuration.ValidResolutions)); - _ = DateTime.Now.AddDays(-configuration.SortingDaysDeltaTolerance.Value); + _ = DateTime.Now.AddDays(-configuration.RangeDaysDeltaTolerance[1]); result = new(configuration.PropertyConfiguration, configuration.CheckDFaceAndUpWriteDates.Value, configuration.CheckJsonForDistanceResults.Value, @@ -217,11 +220,10 @@ public class Configuration configuration.DistanceMoveUnableToMatch.Value, configuration.DistancePixelDistanceTolerance.Value, configuration.DistanceRenameToMatch.Value, - configuration.FaceDistanceAreaPermilleTolerance.Value, + configuration.FaceAreaPermille.Value, configuration.FaceDistanceHiddenImageFactor.Value, - configuration.FaceDistanceMinimumConfidence.Value, + configuration.FaceConfidencePercent.Value, configuration.FaceDistancePermyriad.Value, - configuration.FaceDistanceTolerance.Value, configuration.ForceFaceLastWriteTimeToCreationTime.Value, configuration.ForceMetadataLastWriteTimeToCreationTime.Value, configuration.ForceResizeLastWriteTimeToCreationTime.Value, @@ -231,7 +233,6 @@ public class Configuration configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions, configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions, configuration.LoadOrCreateThenSaveIndex.Value, - configuration.LocationConfidenceFactor.Value, configuration.LocationDigits.Value, configuration.LocationFactor.Value, configuration.MappedMaxIndex, @@ -258,18 +259,21 @@ public class Configuration configuration.PropertiesChangedForIndex.Value, configuration.PropertiesChangedForMetadata.Value, configuration.PropertiesChangedForResize.Value, + configuration.RangeDaysDeltaTolerance, + configuration.RangeFaceAreaPermilleTolerance, + configuration.RangeFaceConfidence, + configuration.RangeDistanceTolerance, configuration.RetryImagesWithoutAFace.Value, configuration.Reverse.Value, + configuration.SaveFaceDistancesForOutputResolutions, configuration.SaveFaceLandmarkForOutputResolutions, configuration.SaveFullYearOfRandomFiles.Value, - configuration.SaveFaceDistancesForOutputResolutions, configuration.SaveMappedForOutputResolutions, configuration.SaveNotMappedForOutputResolutions, configuration.SaveResizedImagesByPersonKeyFormattedForOutputResolutions, configuration.SaveResizedSubfiles.Value, configuration.SaveShortcutsForOutputResolutions, configuration.SkipSearch.Value, - configuration.SortingDaysDeltaTolerance.Value, configuration.SortingMaximumPerFaceShouldBeHigh.Value, configuration.SortingMaximumPerKey.Value, configuration.SortingMinimumToUseSigma.Value, diff --git a/Instance/Models/Configuration.cs b/Instance/Models/Configuration.cs index ee51835..bb3cf3e 100644 --- a/Instance/Models/Configuration.cs +++ b/Instance/Models/Configuration.cs @@ -16,11 +16,10 @@ public class Configuration public bool DistanceMoveUnableToMatch { init; get; } public int DistancePixelDistanceTolerance { init; get; } public bool DistanceRenameToMatch { init; get; } - public int FaceDistanceAreaPermilleTolerance { init; get; } + public int FaceAreaPermille { init; get; } public int FaceDistanceHiddenImageFactor { init; get; } - public double FaceDistanceMinimumConfidence { init; get; } + public int FaceConfidencePercent { init; get; } public int FaceDistancePermyriad { init; get; } - public double FaceDistanceTolerance { init; get; } public bool ForceFaceLastWriteTimeToCreationTime { init; get; } public bool ForceMetadataLastWriteTimeToCreationTime { init; get; } public bool ForceResizeLastWriteTimeToCreationTime { init; get; } @@ -30,7 +29,6 @@ public class Configuration public string[] LoadOrCreateThenSaveDistanceResultsForOutputResolutions { init; get; } public string[] LoadOrCreateThenSaveImageFacesResultsForOutputResolutions { init; get; } public bool LoadOrCreateThenSaveIndex { init; get; } - public int LocationConfidenceFactor { init; get; } public int LocationDigits { init; get; } public int LocationFactor { init; get; } public int? MappedMaxIndex { init; get; } @@ -57,18 +55,21 @@ public class Configuration public bool PropertiesChangedForIndex { init; get; } public bool PropertiesChangedForMetadata { init; get; } public bool PropertiesChangedForResize { init; get; } + public int[] RangeDaysDeltaTolerance { init; get; } + public int[] RangeFaceAreaPermilleTolerance { init; get; } + public double[] RangeFaceConfidence { init; get; } + public double[] RangeDistanceTolerance { init; get; } public bool RetryImagesWithoutAFace { init; get; } public bool Reverse { init; get; } + public string[] SaveFaceDistancesForOutputResolutions { init; get; } public string[] SaveFaceLandmarkForOutputResolutions { init; get; } public bool SaveFullYearOfRandomFiles { init; get; } - public string[] SaveFaceDistancesForOutputResolutions { init; get; } public string[] SaveMappedForOutputResolutions { init; get; } public string[] SaveNotMappedForOutputResolutions { init; get; } public string[] SaveResizedImagesByPersonKeyFormattedForOutputResolutions { init; get; } public bool SaveResizedSubfiles { init; get; } public string[] SaveShortcutsForOutputResolutions { init; get; } public bool SkipSearch { init; get; } - public int SortingDaysDeltaTolerance { init; get; } public int SortingMaximumPerFaceShouldBeHigh { init; get; } public int SortingMaximumPerKey { init; get; } public int SortingMinimumToUseSigma { init; get; } @@ -84,11 +85,10 @@ public class Configuration bool distanceMoveUnableToMatch, int distancePixelDistanceTolerance, bool distanceRenameToMatch, - int faceDistanceAreaPermilleTolerance, + int faceAreaPermille, int faceDistanceHiddenImageFactor, - double faceDistanceMinimumConfidence, + int faceConfidencePercent, int faceDistancePermyriad, - double faceDistanceTolerance, bool forceFaceLastWriteTimeToCreationTime, bool forceMetadataLastWriteTimeToCreationTime, bool forceResizeLastWriteTimeToCreationTime, @@ -98,7 +98,6 @@ public class Configuration string[] loadOrCreateThenSaveDistanceResultsForOutputResolutions, string[] loadOrCreateThenSaveImageFacesResultsForOutputResolutions, bool loadOrCreateThenSaveIndex, - int locationConfidenceFactor, int locationDigits, int locationFactor, int? mappedMaxIndex, @@ -125,18 +124,21 @@ public class Configuration bool propertiesChangedForIndex, bool propertiesChangedForMetadata, bool propertiesChangedForResize, + int[] rangeDaysDeltaTolerance, + int[] rangeFaceAreaPermilleTolerance, + double[] rangeFaceConfidence, + double[] rangeDistanceTolerance, bool retryImagesWithoutAFace, bool reverse, + string[] saveFaceDistancesForOutputResolutions, string[] saveFaceLandmarkForOutputResolutions, bool saveFullYearOfRandomFiles, - string[] saveFaceDistancesForOutputResolutions, string[] saveMappedForOutputResolutions, string[] saveNotMappedForOutputResolutions, string[] saveResizedImagesByPersonKeyFormattedForOutputResolutions, bool saveResizedSubfiles, string[] saveShortcutsForOutputResolutions, bool skipSearch, - int sortingDaysDeltaTolerance, int sortingMaximumPerFaceShouldBeHigh, int sortingMaximumPerKey, int sortingSigma, @@ -151,11 +153,10 @@ public class Configuration DistanceMoveUnableToMatch = distanceMoveUnableToMatch; DistancePixelDistanceTolerance = distancePixelDistanceTolerance; DistanceRenameToMatch = distanceRenameToMatch; - FaceDistanceAreaPermilleTolerance = faceDistanceAreaPermilleTolerance; + FaceAreaPermille = faceAreaPermille; FaceDistanceHiddenImageFactor = faceDistanceHiddenImageFactor; - FaceDistanceMinimumConfidence = faceDistanceMinimumConfidence; + FaceConfidencePercent = faceConfidencePercent; FaceDistancePermyriad = faceDistancePermyriad; - FaceDistanceTolerance = faceDistanceTolerance; ForceFaceLastWriteTimeToCreationTime = forceFaceLastWriteTimeToCreationTime; ForceMetadataLastWriteTimeToCreationTime = forceMetadataLastWriteTimeToCreationTime; ForceResizeLastWriteTimeToCreationTime = forceResizeLastWriteTimeToCreationTime; @@ -165,7 +166,6 @@ public class Configuration LoadOrCreateThenSaveDistanceResultsForOutputResolutions = loadOrCreateThenSaveDistanceResultsForOutputResolutions; LoadOrCreateThenSaveImageFacesResultsForOutputResolutions = loadOrCreateThenSaveImageFacesResultsForOutputResolutions; LoadOrCreateThenSaveIndex = loadOrCreateThenSaveIndex; - LocationConfidenceFactor = locationConfidenceFactor; LocationDigits = locationDigits; LocationFactor = locationFactor; MappedMaxIndex = mappedMaxIndex; @@ -192,18 +192,21 @@ public class Configuration PropertiesChangedForIndex = propertiesChangedForIndex; PropertiesChangedForMetadata = propertiesChangedForMetadata; PropertiesChangedForResize = propertiesChangedForResize; + RangeDaysDeltaTolerance = rangeDaysDeltaTolerance; + RangeFaceAreaPermilleTolerance = rangeFaceAreaPermilleTolerance; + RangeFaceConfidence = rangeFaceConfidence; + RangeDistanceTolerance = rangeDistanceTolerance; RetryImagesWithoutAFace = retryImagesWithoutAFace; Reverse = reverse; + SaveFaceDistancesForOutputResolutions = saveFaceDistancesForOutputResolutions; SaveFaceLandmarkForOutputResolutions = saveFaceLandmarkForOutputResolutions; SaveFullYearOfRandomFiles = saveFullYearOfRandomFiles; - SaveFaceDistancesForOutputResolutions = saveFaceDistancesForOutputResolutions; SaveMappedForOutputResolutions = saveMappedForOutputResolutions; SaveNotMappedForOutputResolutions = saveNotMappedForOutputResolutions; SaveResizedImagesByPersonKeyFormattedForOutputResolutions = saveResizedImagesByPersonKeyFormattedForOutputResolutions; SaveResizedSubfiles = saveResizedSubfiles; SaveShortcutsForOutputResolutions = saveShortcutsForOutputResolutions; SkipSearch = skipSearch; - SortingDaysDeltaTolerance = sortingDaysDeltaTolerance; SortingMaximumPerFaceShouldBeHigh = sortingMaximumPerFaceShouldBeHigh; SortingMaximumPerKey = sortingMaximumPerKey; SortingMinimumToUseSigma = sortingSigma; diff --git a/Instance/appsettings.Development.json b/Instance/appsettings.Development.json index 9e14a1c..6d17f52 100644 --- a/Instance/appsettings.Development.json +++ b/Instance/appsettings.Development.json @@ -58,18 +58,16 @@ "DistanceMoveUnableToMatch": false, "DistancePixelDistanceTolerance": 1, "DistanceRenameToMatch": false, - "FaceDistanceAreaPermilleTolerance": 7, + "FaceAreaPermille": 1000, "FaceDistanceHiddenImageFactor": 2, - "FaceDistanceMinimumConfidence": 0.8, + "FaceConfidencePercent": 100, "FaceDistancePermyriad": 10000, - "FaceDistanceTolerance": 0.25, "FileNameDirectorySeparator": ".Z.", "ForceFaceLastWriteTimeToCreationTime": false, "ForceMetadataLastWriteTimeToCreationTime": false, "ForcePropertyLastWriteTimeToCreationTime": false, "ForceResizeLastWriteTimeToCreationTime": false, "LoadOrCreateThenSaveIndex": false, - "LocationConfidenceFactor": 2, "LocationDigits": 9, "LocationFactor": 10000, "MappedMaxIndex": 1034720, @@ -111,8 +109,7 @@ "SaveFullYearOfRandomFiles": true, "SaveResizedSubFiles": true, "SkipSearch": false, - "SortingDaysDeltaTolerance": 700, - "SortingMaximumPerFaceShouldBeHigh": 1000, + "SortingMaximumPerFaceShouldBeHigh": 3000, "SortingMaximumPerKey": 7, "SortingMinimumToUseSigma": 10, "TestDistanceResults": true, @@ -137,6 +134,26 @@ "7680 x 4320" ], "PropertyContentCollectionFiles": [], + "RangeDaysDeltaTolerance": [ + 0, + 700, + 123456 + ], + "RangeDistanceTolerance": [ + 0, + 0.4, + 0.6 + ], + "RangeFaceAreaPermilleTolerance": [ + 0, + 10, + 1000 + ], + "RangeFaceConfidence": [ + 0.8, + 0.2, + 100 + ], "SaveFaceLandmarkForOutputResolutions": [ "176 x 176", "256 x 256" diff --git a/Instance/appsettings.Staging.json b/Instance/appsettings.Staging.json index 7533ade..2762729 100644 --- a/Instance/appsettings.Staging.json +++ b/Instance/appsettings.Staging.json @@ -58,18 +58,16 @@ "DistanceMoveUnableToMatch": false, "DistancePixelDistanceTolerance": 1, "DistanceRenameToMatch": false, - "FaceDistanceAreaPermilleTolerance": 250, + "FaceAreaPermille": 1000, "FaceDistanceHiddenImageFactor": 2, - "FaceDistanceMinimumConfidence": 0.8, + "FaceConfidencePercent": 100, "FaceDistancePermyriad": 10000, - "FaceDistanceTolerance": 0.25, "FileNameDirectorySeparator": ".Z.", "ForceFaceLastWriteTimeToCreationTime": false, "ForceMetadataLastWriteTimeToCreationTime": false, "ForcePropertyLastWriteTimeToCreationTime": false, "ForceResizeLastWriteTimeToCreationTime": false, "LoadOrCreateThenSaveIndex": false, - "LocationConfidenceFactor": 2, "LocationDigits": 9, "LocationFactor": 10000, "MappedMaxIndex": 1034720, @@ -109,8 +107,7 @@ "SaveFullYearOfRandomFiles": true, "SaveResizedSubFiles": true, "SkipSearch": false, - "SortingDaysDeltaTolerance": 700, - "SortingMaximumPerFaceShouldBeHigh": 1000, + "SortingMaximumPerFaceShouldBeHigh": 3000, "SortingMaximumPerKey": 7, "SortingMinimumToUseSigma": 10, "TestDistanceResults": true, @@ -127,11 +124,31 @@ "1920 x 1080" ], "PropertyContentCollectionFiles": [], + "RangeDaysDeltaTolerance": [ + 0, + 700, + 123456 + ], + "RangeDistanceTolerance": [ + 0, + 0.4, + 0.6 + ], + "RangeFaceAreaPermilleTolerance": [ + 0, + 10, + 1000 + ], + "RangeFaceConfidence": [ + 0.8, + 0.2, + 100 + ], + "SaveFaceDistancesForOutputResolutions": [], "SaveFaceLandmarkForOutputResolutions": [ "176 x 176", "256 x 256" ], - "SaveFaceDistancesForOutputResolutions": [], "SaveMappedForOutputResolutions": [], "SaveNotMappedForOutputResolutions": [], "SaveResizedImagesByPersonKeyFormattedForOutputResolutions": [ diff --git a/Instance/appsettings.json b/Instance/appsettings.json index d479260..64b2d95 100644 --- a/Instance/appsettings.json +++ b/Instance/appsettings.json @@ -58,18 +58,16 @@ "DistanceMoveUnableToMatch": false, "DistancePixelDistanceTolerance": 1, "DistanceRenameToMatch": false, - "FaceDistanceAreaPermilleTolerance": 250, + "FaceAreaPermille": 1000, "FaceDistanceHiddenImageFactor": 2, - "FaceDistanceMinimumConfidence": 0.8, + "FaceConfidencePercent": 100, "FaceDistancePermyriad": 10000, - "FaceDistanceTolerance": 0.25, "FileNameDirectorySeparator": ".Z.", "ForceFaceLastWriteTimeToCreationTime": false, "ForceMetadataLastWriteTimeToCreationTime": false, "ForcePropertyLastWriteTimeToCreationTime": false, "ForceResizeLastWriteTimeToCreationTime": false, "LoadOrCreateThenSaveIndex": false, - "LocationConfidenceFactor": 2, "LocationDigits": 9, "LocationFactor": 10000, "MappedMaxIndex": 1034720, @@ -109,8 +107,7 @@ "SaveFullYearOfRandomFiles": true, "SaveResizedSubFiles": true, "SkipSearch": false, - "SortingDaysDeltaTolerance": 700, - "SortingMaximumPerFaceShouldBeHigh": 1000, + "SortingMaximumPerFaceShouldBeHigh": 3000, "SortingMaximumPerKey": 7, "SortingMinimumToUseSigma": 10, "TestDistanceResults": true, @@ -136,11 +133,31 @@ "1920 x 1080" ], "PropertyContentCollectionFiles": [], + "RangeDaysDeltaTolerance": [ + 0, + 700, + 123456 + ], + "RangeDistanceTolerance": [ + 0, + 0.4, + 0.6 + ], + "RangeFaceAreaPermilleTolerance": [ + 0, + 10, + 1000 + ], + "RangeFaceConfidence": [ + 0.8, + 0.2, + 100 + ], + "SaveFaceDistancesForOutputResolutions": [], "SaveFaceLandmarkForOutputResolutions": [ "176 x 176", "256 x 256" ], - "SaveFaceDistancesForOutputResolutions": [], "SaveMappedForOutputResolutions": [], "SaveNotMappedForOutputResolutions": [], "SaveResizedImagesByPersonKeyFormattedForOutputResolutions": [ diff --git a/Map/Models/Configuration.cs b/Map/Models/Configuration.cs index 117a2c1..fdf9c71 100644 --- a/Map/Models/Configuration.cs +++ b/Map/Models/Configuration.cs @@ -6,25 +6,27 @@ namespace View_by_Distance.Map.Models; public class Configuration { + public int FaceConfidencePercent { init; get; } public int FaceDistancePermyriad { init; get; } - public double FaceDistanceTolerance { init; get; } + public string FacePartsFileNameExtension { init; get; } + public string FacesFileNameExtension { init; get; } + public string FacesHiddenFileNameExtension { init; get; } public string MappingDefaultName { init; get; } public int PersonBirthdayFirstYear { init; get; } public string PersonBirthdayFormat { init; get; } - public int SortingDaysDeltaTolerance { init; get; } + public int RangeDaysDeltaTolerance { init; get; } + public double RangeDistanceTolerance { init; get; } public int SortingMaximumPerKey { init; get; } public int SortingMinimumToUseSigma { init; get; } - public string FacesFileNameExtension { init; get; } - public string FacePartsFileNameExtension { init; get; } - public string FacesHiddenFileNameExtension { init; get; } [JsonConstructor] - public Configuration(int faceDistancePermyriad, - double faceDistanceTolerance, + public Configuration(int faceConfidencePercent, + int faceDistancePermyriad, string mappingDefaultName, int personBirthdayFirstYear, string personBirthdayFormat, - int sortingDaysDeltaTolerance, + int[] rangeDaysDeltaTolerance, + double[] rangeDistanceTolerance, int sortingMaximumPerKey, int sortingMinimumToUseSigma, string facesFileNameExtension, @@ -34,12 +36,13 @@ public class Configuration MappingDefaultName = mappingDefaultName; PersonBirthdayFormat = personBirthdayFormat; SortingMaximumPerKey = sortingMaximumPerKey; + FaceConfidencePercent = faceConfidencePercent; FaceDistancePermyriad = faceDistancePermyriad; - FaceDistanceTolerance = faceDistanceTolerance; FacesFileNameExtension = facesFileNameExtension; PersonBirthdayFirstYear = personBirthdayFirstYear; + RangeDistanceTolerance = rangeDistanceTolerance[1]; SortingMinimumToUseSigma = sortingMinimumToUseSigma; - SortingDaysDeltaTolerance = sortingDaysDeltaTolerance; + RangeDaysDeltaTolerance = rangeDaysDeltaTolerance[1]; FacePartsFileNameExtension = facePartsFileNameExtension; FacesHiddenFileNameExtension = facesHiddenFileNameExtension; } diff --git a/Map/Models/MapLogic.cs b/Map/Models/MapLogic.cs index b61f222..37cd70e 100644 --- a/Map/Models/MapLogic.cs +++ b/Map/Models/MapLogic.cs @@ -25,12 +25,14 @@ public class MapLogic private readonly int _MaxDegreeOfParallelism; private readonly Configuration? _Configuration; private readonly string _EDistanceContentTicksDirectory; + private readonly Shared.Models.Methods.IMapLogicSupport? _MapLogicSupport; private readonly Shared.Models.Properties.IPropertyConfiguration _PropertyConfiguration; - public MapLogic(int maxDegreeOfParallelism, Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration? configuration, long ticks, PersonContainer[] personContainers, string a2PeopleSingletonDirectory, string eDistanceContentDirectory, Mapping[] mappingCollection, Shared.Models.Methods.IMapLogicSupport? faceDistance) + public MapLogic(int maxDegreeOfParallelism, Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration? configuration, long ticks, PersonContainer[] personContainers, string a2PeopleSingletonDirectory, string eDistanceContentDirectory, Mapping[] mappingCollection, Shared.Models.Methods.IMapLogicSupport? mapLogicSupport) { _Ticks = ticks; _Configuration = configuration; + _MapLogicSupport = mapLogicSupport; _Log = Serilog.Log.ForContext(); _PropertyConfiguration = propertyConfiguration; _MaxDegreeOfParallelism = maxDegreeOfParallelism; @@ -59,7 +61,7 @@ public class MapLogic _ = Directory.CreateDirectory(eDistanceContentDirectory); if (!Directory.Exists(eDistanceContentTicksDirectory)) _ = Directory.CreateDirectory(eDistanceContentTicksDirectory); - if (configuration is not null && faceDistance is not null) + if (configuration is not null && mapLogicSupport is not null) { List personContainerCollection = new(personContainers); Stateless.MapLogic.Set(propertyConfiguration, @@ -69,7 +71,7 @@ public class MapLogic a2PeopleSingletonDirectory, eDistanceContentDirectory, mappingCollection, - faceDistance, + mapLogicSupport, personKeyToPersonContainer, personKeyToRanges, notMappedPersonContainers, @@ -193,6 +195,8 @@ public class MapLogic if (File.Exists(checkFile)) continue; File.Copy(sourceFile, checkFile); + if (saveContainer.MakeAllHidden) + File.SetAttributes(checkFile, FileAttributes.Hidden); if (saveContainer.HiddenFaceFileHolder is not null && saveContainer.HiddenFaceFileHolder.Exists) { sourceFile = saveContainer.HiddenFaceFileHolder.FullName; @@ -206,16 +210,23 @@ public class MapLogic if (File.Exists(checkFile)) continue; File.Copy(sourceFile, checkFile); + if (saveContainer.MakeAllHidden) + File.SetAttributes(checkFile, FileAttributes.Hidden); } - foreach (SaveContainer saveContainer in saveContainers) + if (updated is null) { - if (string.IsNullOrEmpty(saveContainer.Directory) || string.IsNullOrEmpty(saveContainer.CheckFile) || saveContainer.ResizedFileHolder is null || !saveContainer.ResizedFileHolder.Exists) - continue; - checkFile = saveContainer.CheckFile; - sourceFile = saveContainer.ResizedFileHolder.FullName; - if (File.Exists(checkFile)) - continue; - File.Copy(sourceFile, checkFile); + foreach (SaveContainer saveContainer in saveContainers) + { + if (string.IsNullOrEmpty(saveContainer.Directory) || string.IsNullOrEmpty(saveContainer.CheckFile) || saveContainer.ResizedFileHolder is null || !saveContainer.ResizedFileHolder.Exists) + continue; + checkFile = saveContainer.CheckFile; + sourceFile = saveContainer.ResizedFileHolder.FullName; + if (File.Exists(checkFile)) + continue; + File.Copy(sourceFile, checkFile); + if (saveContainer.MakeAllHidden) + File.SetAttributes(checkFile, FileAttributes.Hidden); + } } foreach (SaveContainer saveContainer in saveContainers) { @@ -226,6 +237,8 @@ public class MapLogic windowsShortcut = new() { Path = saveContainer.ResizedFileHolder.FullName }; windowsShortcut.Save(saveContainer.ShortcutFile); windowsShortcut.Dispose(); + if (saveContainer.MakeAllHidden) + File.SetAttributes(saveContainer.ShortcutFile, FileAttributes.Hidden); } catch (Exception) { } @@ -413,8 +426,13 @@ public class MapLogic public void UpdateFromSortingContainersThenSaveContainers(string dFacesContentDirectory, string d2FacePartsContentDirectory, Mapping[] mappingCollection, Dictionary> idToNormalizedPixelPercentageToMapping, int? useFiltersCounter, SortingContainer[] sortingContainers, int totalNotMapped) { - int updated = UpdateFromSortingContainers(sortingContainers); + if (_MapLogicSupport is not null) + { + string counts = _MapLogicSupport.GetCounts(); + _ = Directory.CreateDirectory(Path.Combine(_EDistanceContentTicksDirectory, counts)); + } Dictionary personKeyToCount = new(); + int updated = UpdateFromSortingContainers(sortingContainers); List saveContainers = GetSaveContainers(dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, idToNormalizedPixelPercentageToMapping, personKeyToCount, useFiltersCounter, saveMapped: false); SaveContainers(totalNotMapped, updated, saveContainers); } @@ -507,7 +525,7 @@ public class MapLogic else personKeysRangesCollection = GetPersonKeysRangesCollection(normalizedPixelPercentageToPersonContainers[faceDistanceLength.NormalizedPixelPercentage.Value]); } - sorting = ISorting.Get(_Configuration.FaceDistancePermyriad, _Configuration.FaceDistanceTolerance, faceDistanceEncoding, faceDistanceLength, personKeysRangesCollection); + sorting = ISorting.Get(_Configuration.FaceDistancePermyriad, _Configuration.RangeDistanceTolerance, faceDistanceEncoding, faceDistanceLength, personKeysRangesCollection); if (sorting.DistancePermyriad == 0) continue; if (sorting.Id == faceDistanceEncoding.Id) @@ -968,7 +986,7 @@ public class MapLogic } } - private List<(string, FileHolder, string)> GetCollection(int faceDistanceAreaPermilleTolerance, string dFacesContentDirectory, Dictionary> idToNormalizedPixelPercentageToMapping) + private List<(string, FileHolder, string)> GetCollection(string dFacesContentDirectory, Dictionary> idToNormalizedPixelPercentageToMapping) { if (_Configuration is null) throw new NullReferenceException(nameof(_Configuration)); @@ -988,8 +1006,6 @@ public class MapLogic foreach (KeyValuePair normalizedPixelPercentageAndMapping in keyValuePair.Value) { mapping = normalizedPixelPercentageAndMapping.Value; - if (mapping.MappingFromLocation.AreaPermille < faceDistanceAreaPermilleTolerance) - continue; if (normalizedPixelPercentageToPersonContainers is not null && normalizedPixelPercentageToPersonContainers.ContainsKey(mapping.MappingFromLocation.NormalizedPixelPercentage)) continue; _ = _SkipCollection.TryGetValue(keyValuePair.Key, out normalizedPixelPercentages); @@ -1008,11 +1024,11 @@ public class MapLogic return results; } - public void CopyNotMappedFaces(int faceDistanceAreaPermilleTolerance, string dFacesContentDirectory, Dictionary> idToNormalizedPixelPercentageToMapping) + public void CopyNotMappedFaces(int[] rangeFaceAreaPermilleTolerance, string dFacesContentDirectory, Dictionary> idToNormalizedPixelPercentageToMapping) { if (_Configuration is null) throw new NullReferenceException(nameof(_Configuration)); - List<(string Directory, FileHolder FaceFileHolder, string CheckFile)> collection = GetCollection(faceDistanceAreaPermilleTolerance, dFacesContentDirectory, idToNormalizedPixelPercentageToMapping); + List<(string Directory, FileHolder FaceFileHolder, string CheckFile)> collection = GetCollection(dFacesContentDirectory, idToNormalizedPixelPercentageToMapping); string[] directories = (from l in collection select l.Directory).Distinct().ToArray(); foreach (string directory in directories) { diff --git a/Map/Models/Stateless/MapLogic.cs b/Map/Models/Stateless/MapLogic.cs index 6f45490..a894007 100644 --- a/Map/Models/Stateless/MapLogic.cs +++ b/Map/Models/Stateless/MapLogic.cs @@ -451,7 +451,7 @@ internal abstract class MapLogic if (keyValuePair.Value.Count < configuration.SortingMinimumToUseSigma) { maximum = keyValuePair.Value.Max(); - personKeyToRanges.Add(keyValuePair.Key, new(new DateTime(minimum).AddDays(-configuration.SortingDaysDeltaTolerance).Ticks, minimum, maximum, new DateTime(maximum).AddDays(configuration.SortingDaysDeltaTolerance).Ticks)); + personKeyToRanges.Add(keyValuePair.Key, new(new DateTime(minimum).AddDays(-configuration.RangeDaysDeltaTolerance).Ticks, minimum, maximum, new DateTime(maximum).AddDays(configuration.RangeDaysDeltaTolerance).Ticks)); } else { @@ -570,7 +570,7 @@ internal abstract class MapLogic } } - internal static void Set(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration? configuration, long ticks, List personContainers, string? a2PeopleContentDirectory, string eDistanceContentDirectory, Mapping[] mappingCollection, Shared.Models.Methods.IMapLogicSupport faceDistance, Dictionary personKeyToPersonContainer, Dictionary personKeyToRanges, List notMappedPersonContainers, Dictionary> skipCollection, Dictionary> idThenNormalizedPixelPercentageToPersonContainers) + internal static void Set(Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration? configuration, long ticks, List personContainers, string? a2PeopleContentDirectory, string eDistanceContentDirectory, Mapping[] mappingCollection, Shared.Models.Methods.IMapLogicSupport mapLogicSupport, Dictionary personKeyToPersonContainer, Dictionary personKeyToRanges, List notMappedPersonContainers, Dictionary> skipCollection, Dictionary> idThenNormalizedPixelPercentageToPersonContainers) { if (configuration is null) throw new NullReferenceException(nameof(configuration)); @@ -616,7 +616,7 @@ internal abstract class MapLogic notMappedPersonContainers.AddRange(GetNotMappedPersonContainers(configuration, personContainers, personKeyCollection)); AppendToSkipCollection(skipCollection, idThenNormalizedPixelPercentageToPersonContainers, incorrectIdThenNormalizedPixelPercentageToPersonContainers); if (possiblyNewPersonDisplayDirectoryNamesAndPersonContainer.Any()) - faceDistance.SavePossiblyNewPersonContainers(propertyConfiguration, configuration.PersonBirthdayFormat, configuration.FacesFileNameExtension, a2PeopleContentDirectory, personKeyToPersonContainer, possiblyNewPersonDisplayDirectoryNamesAndPersonContainer); + mapLogicSupport.SavePossiblyNewPersonContainers(propertyConfiguration, configuration.PersonBirthdayFormat, configuration.FacesFileNameExtension, a2PeopleContentDirectory, personKeyToPersonContainer, possiblyNewPersonDisplayDirectoryNamesAndPersonContainer); } private static string GetMappingSegmentB(long ticks, PersonBirthday personBirthday, int? approximateYears, long minimumDateTimeTicks, bool? isWrongYear) @@ -660,12 +660,8 @@ internal abstract class MapLogic internal static SaveContainer GetDebugSaveContainer(string directory, SortingContainer sortingContainer, Mapping mapping) { SaveContainer result; - string checkFile = string.Empty; - FileHolder? faceFileHolder = null; - FileHolder? facePartsFileHolder = null; - FileHolder? hiddenFaceFileHolder = null; string shortcutFile = Path.Combine(directory, $"{sortingContainer.Mapping.MappingFromLocation.DeterministicHashCodeKey}{sortingContainer.Mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}.debug.lnk"); - result = new(checkFile, directory, faceFileHolder, hiddenFaceFileHolder, facePartsFileHolder, mapping.MappingFromItem.ResizedFileHolder, shortcutFile); + result = new(directory, mapping.MappingFromItem.ResizedFileHolder, shortcutFile); return result; } diff --git a/Shared/Models/FaceDistance.cs b/Shared/Models/FaceDistance.cs index ffd063f..d267996 100644 --- a/Shared/Models/FaceDistance.cs +++ b/Shared/Models/FaceDistance.cs @@ -6,7 +6,7 @@ namespace View_by_Distance.Shared.Models; public record class FaceDistance : Properties.IFaceDistance { - public double? Confidence { init; get; } + public int? ConfidencePercent { init; get; } public object? Encoding { init; get; } public int Id { init; get; } public bool? IsWrongYear { init; get; } @@ -15,9 +15,9 @@ public record class FaceDistance : Properties.IFaceDistance public int? NormalizedPixelPercentage { init; get; } [JsonConstructor] - public FaceDistance(double? confidence, object? encoding, int id, bool? isWrongYear, double? length, DateTime? minimumDateTime, int? normalizedPixelPercentage) + public FaceDistance(int? confidencePercent, object? encoding, int id, bool? isWrongYear, double? length, DateTime? minimumDateTime, int? normalizedPixelPercentage) { - Confidence = confidence; + ConfidencePercent = confidencePercent; Encoding = encoding; Id = id; IsWrongYear = isWrongYear; @@ -26,12 +26,12 @@ public record class FaceDistance : Properties.IFaceDistance NormalizedPixelPercentage = normalizedPixelPercentage; } - public FaceDistance(double? confidence, object? encoding, int id, bool? isWrongYear, DateTime? minimumDateTime, int? normalizedPixelPercentage) : - this(confidence, encoding, id, isWrongYear, null, minimumDateTime, normalizedPixelPercentage) + public FaceDistance(int? confidencePercent, object? encoding, int id, bool? isWrongYear, DateTime? minimumDateTime, int? normalizedPixelPercentage) : + this(confidencePercent, encoding, id, isWrongYear, null, minimumDateTime, normalizedPixelPercentage) { } public FaceDistance(FaceDistance faceDistance, double length) : - this(faceDistance.Confidence, null, faceDistance.Id, faceDistance.IsWrongYear, length, faceDistance.MinimumDateTime, faceDistance.NormalizedPixelPercentage) + this(faceDistance.ConfidencePercent, null, faceDistance.Id, faceDistance.IsWrongYear, length, faceDistance.MinimumDateTime, faceDistance.NormalizedPixelPercentage) { } public FaceDistance(object encoding) => Encoding = encoding; diff --git a/Shared/Models/Mapping.cs b/Shared/Models/Mapping.cs index d8f420d..c2226bf 100644 --- a/Shared/Models/Mapping.cs +++ b/Shared/Models/Mapping.cs @@ -35,16 +35,16 @@ public class MappingFromItem : Properties.IMappingFromItem public class MappingFromLocation : Properties.IMappingFromLocation { - public double AreaPermille { init; get; } - public double Confidence { init; get; } + public int AreaPermille { init; get; } + public int ConfidencePercent { init; get; } public string DeterministicHashCodeKey { init; get; } public int NormalizedPixelPercentage { init; get; } [JsonConstructor] - public MappingFromLocation(int areaPermille, double confidence, string deterministicHashCodeKey, int normalizedPixelPercentage) + public MappingFromLocation(int areaPermille, int confidencePercent, string deterministicHashCodeKey, int normalizedPixelPercentage) { AreaPermille = areaPermille; - Confidence = confidence; + ConfidencePercent = confidencePercent; DeterministicHashCodeKey = deterministicHashCodeKey; NormalizedPixelPercentage = normalizedPixelPercentage; } diff --git a/Shared/Models/Methods/IMapLogicSupport.cs b/Shared/Models/Methods/IMapLogicSupport.cs index aea0f54..d4b4519 100644 --- a/Shared/Models/Methods/IMapLogicSupport.cs +++ b/Shared/Models/Methods/IMapLogicSupport.cs @@ -3,6 +3,7 @@ namespace View_by_Distance.Shared.Models.Methods; public interface IMapLogicSupport { + string GetCounts(); void SavePossiblyNewPersonContainers(Properties.IPropertyConfiguration propertyConfiguration, string personBirthdayFormat, string facesFileNameExtension, string? a2PeopleContentDirectory, Dictionary personKeyToPersonContainer, List<(string[], PersonContainer)> possiblyNewPersonDisplayDirectoryNamesAndPersonContainer); } \ No newline at end of file diff --git a/Shared/Models/Properties/IFaceDistance.cs b/Shared/Models/Properties/IFaceDistance.cs index a3cded5..0e8f6fd 100644 --- a/Shared/Models/Properties/IFaceDistance.cs +++ b/Shared/Models/Properties/IFaceDistance.cs @@ -3,7 +3,7 @@ namespace View_by_Distance.Shared.Models.Properties; public interface IFaceDistance { - public double? Confidence { init; get; } + public int? ConfidencePercent { init; get; } public object? Encoding { init; get; } public int Id { init; get; } public bool? IsWrongYear { init; get; } diff --git a/Shared/Models/Properties/IMapping.cs b/Shared/Models/Properties/IMapping.cs index 4a79ffb..a317e65 100644 --- a/Shared/Models/Properties/IMapping.cs +++ b/Shared/Models/Properties/IMapping.cs @@ -15,8 +15,8 @@ public interface IMappingFromItem public interface IMappingFromLocation { - public double AreaPermille { init; get; } - public double Confidence { init; get; } + public int AreaPermille { init; get; } + public int ConfidencePercent { init; get; } public string DeterministicHashCodeKey { init; get; } public int NormalizedPixelPercentage { init; get; } diff --git a/Shared/Models/SaveContainer.cs b/Shared/Models/SaveContainer.cs index 699ec4d..f4eb0d8 100644 --- a/Shared/Models/SaveContainer.cs +++ b/Shared/Models/SaveContainer.cs @@ -11,31 +11,41 @@ public class SaveContainer public FileHolder? FaceFileHolder { init; get; } public FileHolder? HiddenFaceFileHolder { init; get; } public FileHolder? FacePartsFileHolder { init; get; } + public bool MakeAllHidden { init; get; } public FileHolder? ResizedFileHolder { init; get; } public string ShortcutFile { init; get; } [JsonConstructor] - public SaveContainer(string checkFile, string directory, FileHolder? faceFileHolder, FileHolder? hiddenFaceFileHolder, FileHolder? facePartsFileHolder, FileHolder? resizedFileHolder, string shortcutFile) + public SaveContainer(string checkFile, string directory, FileHolder? faceFileHolder, FileHolder? hiddenFaceFileHolder, FileHolder? facePartsFileHolder, bool makeAllHidden, FileHolder? resizedFileHolder, string shortcutFile) { CheckFile = checkFile; Directory = directory; FaceFileHolder = faceFileHolder; HiddenFaceFileHolder = hiddenFaceFileHolder; FacePartsFileHolder = facePartsFileHolder; + MakeAllHidden = makeAllHidden; ResizedFileHolder = resizedFileHolder; ShortcutFile = shortcutFile; } public SaveContainer(string directory) : - this(string.Empty, directory, null, null, null, null, string.Empty) + this(string.Empty, directory, null, null, null, false, null, string.Empty) + { } + + public SaveContainer(string directory, FileHolder? resizedFileHolder, string shortcutFile) : + this(string.Empty, directory, null, null, null, true, resizedFileHolder, shortcutFile) { } public SaveContainer(string checkFile, string directory, FileHolder faceFileHolder) : - this(checkFile, directory, faceFileHolder, null, null, null, string.Empty) + this(checkFile, directory, faceFileHolder, null, null, false, null, string.Empty) { } public SaveContainer(FileHolder resizedFileHolder, string checkFile, string directory) : - this(checkFile, directory, null, null, null, resizedFileHolder, string.Empty) + this(checkFile, directory, null, null, null, false, resizedFileHolder, string.Empty) + { } + + public SaveContainer(string checkFile, string directory, FileHolder? faceFileHolder, FileHolder? hiddenFaceFileHolder, FileHolder? facePartsFileHolder, FileHolder? resizedFileHolder, string shortcutFile) : + this(checkFile, directory, faceFileHolder, hiddenFaceFileHolder, facePartsFileHolder, false, resizedFileHolder, shortcutFile) { } public override string ToString() diff --git a/Shared/Models/Stateless/Methods/ILocation.cs b/Shared/Models/Stateless/Methods/ILocation.cs index 52ac8e3..5736cb0 100644 --- a/Shared/Models/Stateless/Methods/ILocation.cs +++ b/Shared/Models/Stateless/Methods/ILocation.cs @@ -8,6 +8,11 @@ public interface ILocation static string GetLeftPadded(int locationDigits, string value) => Location.GetLeftPadded(locationDigits, value); + int TestStatic_GetConfidencePercent(int faceConfidencePercent, double[] rangeFaceConfidence, double confidence) => + GetConfidencePercent(faceConfidencePercent, rangeFaceConfidence, confidence); + static int GetConfidencePercent(int faceConfidencePercent, double[] rangeFaceConfidence, double confidence) => + Location.GetConfidencePercent(faceConfidencePercent, rangeFaceConfidence, confidence); + string TestStatic_GetLeftPadded(int locationDigits, int value) => GetLeftPadded(locationDigits, value); static string GetLeftPadded(int locationDigits, int value) => diff --git a/Shared/Models/Stateless/Methods/IMapping.cs b/Shared/Models/Stateless/Methods/IMapping.cs index e3c92af..57fa8df 100644 --- a/Shared/Models/Stateless/Methods/IMapping.cs +++ b/Shared/Models/Stateless/Methods/IMapping.cs @@ -8,20 +8,20 @@ public interface IMapping static (string?, string?, string?, bool?) GetSegments(string facesFileNameExtension, string fileName) => Mapping.GetSegments(facesFileNameExtension, fileName); - int TestStatic_GetAreaPermille(int height, Models.Location location, int width) - => GetAreaPermille(height, location, width); - static int GetAreaPermille(int height, Models.Location location, int width) - => Mapping.GetAreaPermille(location.Bottom, height, location.Left, location.Right, location.Top, width); + int TestStatic_GetAreaPermille(int faceAreaPermille, int height, Models.Location location, int width) + => GetAreaPermille(faceAreaPermille, height, location, width); + static int GetAreaPermille(int faceAreaPermille, int height, Models.Location location, int width) + => Mapping.GetAreaPermille(faceAreaPermille, location.Bottom, height, location.Left, location.Right, location.Top, width); - int TestStatic_GetAreaPermille(int bottom, int height, int left, int right, int top, int width) - => GetAreaPermille(bottom, height, left, right, top, width); - static int GetAreaPermille(int bottom, int height, int left, int right, int top, int width) - => Mapping.GetAreaPermille(bottom, height, left, right, top, width); + int TestStatic_GetAreaPermille(int faceAreaPermille, int bottom, int height, int left, int right, int top, int width) + => GetAreaPermille(faceAreaPermille, bottom, height, left, right, top, width); + static int GetAreaPermille(int faceAreaPermille, int bottom, int height, int left, int right, int top, int width) + => Mapping.GetAreaPermille(faceAreaPermille, bottom, height, left, right, top, width); - int TestStatic_GetAreaPermille(Models.Location location, OutputResolution outputResolution) - => GetAreaPermille(location, outputResolution); - static int GetAreaPermille(Models.Location location, OutputResolution outputResolution) - => Mapping.GetAreaPermille(location.Bottom, outputResolution.Height, location.Left, location.Right, location.Top, outputResolution.Width); + int TestStatic_GetAreaPermille(int faceAreaPermille, Models.Location location, OutputResolution outputResolution) + => GetAreaPermille(faceAreaPermille, location, outputResolution); + static int GetAreaPermille(int faceAreaPermille, Models.Location location, OutputResolution outputResolution) + => Mapping.GetAreaPermille(faceAreaPermille, location.Bottom, outputResolution.Height, location.Left, location.Right, location.Top, outputResolution.Width); string TestStatic_GetDeterministicHashCodeKey(int id, Models.Location location, int locationDigits, int locationFactor, OutputResolution outputResolution) => GetDeterministicHashCodeKey(id, location, locationDigits, locationFactor, outputResolution); diff --git a/Shared/Models/Stateless/Methods/ISorting.cs b/Shared/Models/Stateless/Methods/ISorting.cs index df7b2b7..d03d101 100644 --- a/Shared/Models/Stateless/Methods/ISorting.cs +++ b/Shared/Models/Stateless/Methods/ISorting.cs @@ -8,9 +8,9 @@ public interface ISorting static Models.Sorting[] Sort(List collection) => (from l in collection orderby l.WithinRange, l.DistancePermyriad, l.DaysDelta select l).ToArray(); - Models.Sorting TestStatic_Get(int faceDistancePermyriad, double faceDistanceTolerance, Models.FaceDistance faceDistanceEncoding, Models.FaceDistance faceDistanceLength, List<(long lcl, long minimum, long maximum, long ucl)> personKeysRangesCollection) => - Get(faceDistancePermyriad, faceDistanceTolerance, faceDistanceEncoding, faceDistanceLength, personKeysRangesCollection); - static Models.Sorting Get(int faceDistancePermyriad, double faceDistanceTolerance, Models.FaceDistance faceDistanceEncoding, Models.FaceDistance faceDistanceLength, List<(long lcl, long minimum, long maximum, long ucl)> personKeysRangesCollection) => - Sorting.Get(faceDistancePermyriad, faceDistanceTolerance, faceDistanceEncoding, faceDistanceLength, personKeysRangesCollection); + Models.Sorting TestStatic_Get(int faceDistancePermyriad, double rangeDistanceTolerance, Models.FaceDistance faceDistanceEncoding, Models.FaceDistance faceDistanceLength, List<(long lcl, long minimum, long maximum, long ucl)> personKeysRangesCollection) => + Get(faceDistancePermyriad, rangeDistanceTolerance, faceDistanceEncoding, faceDistanceLength, personKeysRangesCollection); + static Models.Sorting Get(int faceDistancePermyriad, double rangeDistanceTolerance, Models.FaceDistance faceDistanceEncoding, Models.FaceDistance faceDistanceLength, List<(long lcl, long minimum, long maximum, long ucl)> personKeysRangesCollection) => + Sorting.Get(faceDistancePermyriad, rangeDistanceTolerance, faceDistanceEncoding, faceDistanceLength, personKeysRangesCollection); } \ No newline at end of file diff --git a/Shared/Models/Stateless/Methods/Location.cs b/Shared/Models/Stateless/Methods/Location.cs index 8f2d824..3445c0a 100644 --- a/Shared/Models/Stateless/Methods/Location.cs +++ b/Shared/Models/Stateless/Methods/Location.cs @@ -111,4 +111,9 @@ internal abstract class Location return new(x, y); } + internal static int GetConfidencePercent(int faceConfidencePercent, double[] rangeFaceConfidence, double confidence) + { + int result = (int)(confidence / rangeFaceConfidence[1] * faceConfidencePercent); + return result; + } } \ No newline at end of file diff --git a/Shared/Models/Stateless/Methods/Mapping.cs b/Shared/Models/Stateless/Methods/Mapping.cs index 09caf81..9e91f35 100644 --- a/Shared/Models/Stateless/Methods/Mapping.cs +++ b/Shared/Models/Stateless/Methods/Mapping.cs @@ -74,12 +74,12 @@ internal abstract class Mapping return new(id, normalizedPixelPercentage, mappingCollection); } - internal static int GetAreaPermille(int bottom, int height, int left, int right, int top, int width) + internal static int GetAreaPermille(int faceAreaPermille, int bottom, int height, int left, int right, int top, int width) { int result; double area = width * height; double locationArea = (right - left) * (bottom - top); - result = (int)Math.Round(locationArea / area * 1000, 0); + result = (int)Math.Round(locationArea / area * faceAreaPermille, 0); return result; } diff --git a/Shared/Models/Stateless/Methods/Sorting.cs b/Shared/Models/Stateless/Methods/Sorting.cs index 2d34169..432ba2a 100644 --- a/Shared/Models/Stateless/Methods/Sorting.cs +++ b/Shared/Models/Stateless/Methods/Sorting.cs @@ -3,7 +3,7 @@ namespace View_by_Distance.Shared.Models.Stateless.Methods; internal abstract class Sorting { - internal static Models.Sorting Get(int faceDistancePermyriad, double faceDistanceTolerance, Models.FaceDistance faceDistanceEncoding, Models.FaceDistance faceDistanceLength, List<(long lcl, long minimum, long maximum, long ucl)> personKeysRangesCollection) + internal static Models.Sorting Get(int faceDistancePermyriad, double rangeDistanceTolerance, Models.FaceDistance faceDistanceEncoding, Models.FaceDistance faceDistanceLength, List<(long lcl, long minimum, long maximum, long ucl)> personKeysRangesCollection) { Models.Sorting result; if (faceDistanceLength.Length is null) @@ -17,7 +17,7 @@ internal abstract class Sorting TimeSpan timeSpan = new(faceDistanceLength.MinimumDateTime.Value.Ticks - ticks); bool older = timeSpan.TotalMilliseconds < 0; int daysDelta = (int)Math.Round(Math.Abs(timeSpan.TotalDays), 0); - int distancePermyriad = (int)(faceDistanceLength.Length.Value / faceDistanceTolerance * faceDistancePermyriad); + int distancePermyriad = (int)(faceDistanceLength.Length.Value / rangeDistanceTolerance * faceDistancePermyriad); if (!personKeysRangesCollection.Any()) withinRanges.Add(0); else diff --git a/Tests/Models/Binder/Configuration.cs b/Tests/Models/Binder/Configuration.cs index d563589..c9627e5 100644 --- a/Tests/Models/Binder/Configuration.cs +++ b/Tests/Models/Binder/Configuration.cs @@ -23,7 +23,6 @@ public class Configuration [Display(Name = "Load Or Create Then Save Distance Results"), Required] public string[] LoadOrCreateThenSaveDistanceResultsForOutputResolutions { get; set; } [Display(Name = "Load Or Create Then Save Image Faces Results"), Required] public string[] LoadOrCreateThenSaveImageFacesResultsForOutputResolutions { get; set; } [Display(Name = "Load Or Create Then Save Index"), Required] public bool? LoadOrCreateThenSaveIndex { get; set; } - [Display(Name = "Location Confidence Factor"), Required] public int? LocationConfidenceFactor { get; set; } [Display(Name = "Mapped Max Index"), Required] public int? MappedMaxIndex { get; set; } [Display(Name = "Mixed Year Relative Paths"), Required] public string[] MixedYearRelativePaths { get; set; } [Display(Name = "Model Directory"), Required] public string ModelDirectory { get; set; } @@ -88,8 +87,6 @@ public class Configuration configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions = Array.Empty(); if (configuration.LoadOrCreateThenSaveIndex is null) throw new NullReferenceException(nameof(configuration.LoadOrCreateThenSaveIndex)); - if (configuration.LocationConfidenceFactor is null) - throw new NullReferenceException(nameof(configuration.LocationConfidenceFactor)); if (configuration.MixedYearRelativePaths is null) throw new NullReferenceException(nameof(configuration.MixedYearRelativePaths)); if (configuration.NumberOfJitters is null) @@ -148,7 +145,6 @@ public class Configuration configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions, configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions, configuration.LoadOrCreateThenSaveIndex.Value, - configuration.LocationConfidenceFactor.Value, configuration.MappedMaxIndex, configuration.MixedYearRelativePaths, configuration.ModelDirectory, diff --git a/Tests/Models/Configuration.cs b/Tests/Models/Configuration.cs index e6679ce..99166f7 100644 --- a/Tests/Models/Configuration.cs +++ b/Tests/Models/Configuration.cs @@ -22,7 +22,6 @@ public class Configuration public string[] LoadOrCreateThenSaveDistanceResultsForOutputResolutions { init; get; } public string[] LoadOrCreateThenSaveImageFacesResultsForOutputResolutions { init; get; } public bool LoadOrCreateThenSaveIndex { init; get; } - public int LocationConfidenceFactor { init; get; } public int? MappedMaxIndex { init; get; } public string[] MixedYearRelativePaths { init; get; } public string ModelDirectory { init; get; } @@ -66,7 +65,6 @@ public class Configuration string[] loadOrCreateThenSaveDistanceResultsForOutputResolutions, string[] loadOrCreateThenSaveImageFacesResultsForOutputResolutions, bool loadOrCreateThenSaveIndex, - int locationConfidenceFactor, int? mappedMaxIndex, string[] mixedYearRelativePaths, string modelDirectory, @@ -109,7 +107,6 @@ public class Configuration LoadOrCreateThenSaveDistanceResultsForOutputResolutions = loadOrCreateThenSaveDistanceResultsForOutputResolutions; LoadOrCreateThenSaveImageFacesResultsForOutputResolutions = loadOrCreateThenSaveImageFacesResultsForOutputResolutions; LoadOrCreateThenSaveIndex = loadOrCreateThenSaveIndex; - LocationConfidenceFactor = locationConfidenceFactor; MappedMaxIndex = mappedMaxIndex; MixedYearRelativePaths = mixedYearRelativePaths; ModelDirectory = modelDirectory; diff --git a/Tests/UnitTestCalculations.cs b/Tests/UnitTestCalculations.cs index 5bca29a..5a6adbc 100644 --- a/Tests/UnitTestCalculations.cs +++ b/Tests/UnitTestCalculations.cs @@ -206,6 +206,7 @@ public class UnitTestCalculations [TestMethod] public void TestAreaPermille() { + int faceAreaPermille=1000; Location location; double confidence = 0.1D; int areaPermille, left, top, right, bottom, width, height; @@ -215,7 +216,7 @@ public class UnitTestCalculations bottom = 100; width = 100; height = 100; - areaPermille = IMapping.GetAreaPermille(bottom, height, left, right, top, width); + areaPermille = IMapping.GetAreaPermille(faceAreaPermille, bottom, height, left, right, top, width); Assert.IsTrue(areaPermille == 1000); left = 0; right = 50; @@ -224,7 +225,7 @@ public class UnitTestCalculations width = 100; height = 100; location = new(bottom, confidence, height, left, Shared.Models.Stateless.ILocation.Digits, Shared.Models.Stateless.ILocation.Factor, right, top, width, 1); - areaPermille = IMapping.GetAreaPermille(height, location, width); + areaPermille = IMapping.GetAreaPermille(faceAreaPermille, height, location, width); Assert.IsTrue(areaPermille == 250); left = 0; right = 25; @@ -234,7 +235,7 @@ public class UnitTestCalculations height = 100; location = new(bottom, confidence, height, left, Shared.Models.Stateless.ILocation.Digits, Shared.Models.Stateless.ILocation.Factor, right, top, width, 1); OutputResolution outputResolution = new(height, 0, width); - areaPermille = IMapping.GetAreaPermille(location, outputResolution); + areaPermille = IMapping.GetAreaPermille(faceAreaPermille, location, outputResolution); Assert.IsTrue(areaPermille == 62); } @@ -541,4 +542,29 @@ public class UnitTestCalculations Assert.IsNotNull(lines); } + [TestMethod] + public void TestGetConfidencePercent() + { + int faceConfidencePercent = 100; + double minimum, target, maximum, value, check; + minimum = 0.8f; + target = 0.8f; + maximum = int.MaxValue; + value = 0f; + check = ILocation.GetConfidencePercent(faceConfidencePercent, new double[] { minimum, target, maximum }, value); + Assert.IsTrue(check == 0); + target = 0.8f; + value = 0.4f; + check = ILocation.GetConfidencePercent(faceConfidencePercent, new double[] { minimum, target, maximum }, value); + Assert.IsTrue(check == 50); + target = 0.8f; + value = 0.8f; + check = ILocation.GetConfidencePercent(faceConfidencePercent, new double[] { minimum, target, maximum }, value); + Assert.IsTrue(check == 100); + target = 0.8f; + value = 1.6f; + check = ILocation.GetConfidencePercent(faceConfidencePercent, new double[] { minimum, target, maximum }, value); + Assert.IsTrue(check == 200); + } + } \ No newline at end of file diff --git a/TestsWithFaceRecognitionDotNet/Models/Binder/Configuration.cs b/TestsWithFaceRecognitionDotNet/Models/Binder/Configuration.cs index 66e3267..ee8a8b6 100644 --- a/TestsWithFaceRecognitionDotNet/Models/Binder/Configuration.cs +++ b/TestsWithFaceRecognitionDotNet/Models/Binder/Configuration.cs @@ -17,11 +17,9 @@ public class Configuration [Display(Name = "Distance Move Unable to Match by 1 Tick"), Required] public bool? DistanceMoveUnableToMatch { get; set; } [Display(Name = "Distance Pixel Distance Tolerance"), Required] public int? DistancePixelDistanceTolerance { get; set; } [Display(Name = "Distance Rename to Match"), Required] public bool? DistanceRenameToMatch { get; set; } - [Display(Name = "Face Area Permille Tolerance"), Required] public int? FaceDistanceAreaPermilleTolerance { get; set; } [Display(Name = "Face Distance Hidden Image Factor"), Required] public int? FaceDistanceHiddenImageFactor { get; set; } - [Display(Name = "Location Minimum Confidence"), Required] public double? FaceDistanceMinimumConfidence { get; set; } + [Display(Name = "Face Confidence Percent"), Required] public int? FaceConfidencePercent { get; set; } [Display(Name = "Face Distance Permyriad"), Required] public int? FaceDistancePermyriad { get; set; } - [Display(Name = "Face Distance Tolerance"), Required] public double? FaceDistanceTolerance { get; set; } [Display(Name = "Force Face Last Write Time to Creation Time"), Required] public bool? ForceFaceLastWriteTimeToCreationTime { get; set; } [Display(Name = "Force Metadata Last Write Time to Creation Time"), Required] public bool? ForceMetadataLastWriteTimeToCreationTime { get; set; } [Display(Name = "Force Resize Last Write Time to Creation Time"), Required] public bool? ForceResizeLastWriteTimeToCreationTime { get; set; } @@ -31,7 +29,6 @@ public class Configuration [Display(Name = "Load Or Create Then Save Distance Results"), Required] public string[] LoadOrCreateThenSaveDistanceResultsForOutputResolutions { get; set; } [Display(Name = "Load Or Create Then Save Image Faces Results"), Required] public string[] LoadOrCreateThenSaveImageFacesResultsForOutputResolutions { get; set; } [Display(Name = "Load Or Create Then Save Index"), Required] public bool? LoadOrCreateThenSaveIndex { get; set; } - [Display(Name = "Location Confidence Factor"), Required] public int? LocationConfidenceFactor { get; set; } [Display(Name = "Location Digits"), Required] public int? LocationDigits { get; set; } [Display(Name = "Location Factor"), Required] public int? LocationFactor { get; set; } [Display(Name = "Mapped Max Index"), Required] public int? MappedMaxIndex { get; set; } @@ -59,6 +56,10 @@ public class Configuration [Display(Name = "Properties Changed For Metadata"), Required] public bool? PropertiesChangedForMetadata { get; set; } [Display(Name = "Properties Changed For Resize"), Required] public bool? PropertiesChangedForResize { get; set; } [Display(Name = "Property Configuration"), Required] public Property.Models.Configuration PropertyConfiguration { get; set; } + [Display(Name = "Sorting Days Delta Tolerance"), Required] public int[] RangeDaysDeltaTolerance { get; set; } + [Display(Name = "Face Area Permille Tolerance"), Required] public int[] RangeFaceAreaPermilleTolerance { get; set; } + [Display(Name = "Location Minimum Confidence"), Required] public double[] RangeFaceConfidence { get; set; } + [Display(Name = "Face Distance Tolerance"), Required] public double[] RangeDistanceTolerance { get; set; } [Display(Name = "Retry Images Without a Face"), Required] public bool? RetryImagesWithoutAFace { get; set; } [Display(Name = "Reverse"), Required] public bool? Reverse { get; set; } [Display(Name = "Save Face Landmark For Output Resolutions"), Required] public string[] SaveFaceLandmarkForOutputResolutions { get; set; } @@ -67,7 +68,6 @@ public class Configuration [Display(Name = "Save Resized Subfiles"), Required] public bool? SaveResizedSubfiles { get; set; } [Display(Name = "Save Shortcuts"), Required] public string[] SaveShortcutsForOutputResolutions { get; set; } [Display(Name = "Skip Search"), Required] public bool? SkipSearch { get; set; } - [Display(Name = "Sorting Days Delta Tolerance"), Required] public int? SortingDaysDeltaTolerance { get; set; } [Display(Name = "SortingMaximumPerFaceShould be High"), Required] public int? SortingMaximumPerFaceShouldBeHigh { get; set; } [Display(Name = "Sorting Maximum Per Key"), Required] public int? SortingMaximumPerKey { get; set; } [Display(Name = "Sorting Minimum to use Sigma"), Required] public int? SortingMinimumToUseSigma { get; set; } @@ -99,16 +99,12 @@ public class Configuration throw new NullReferenceException(nameof(configuration.DistancePixelDistanceTolerance)); if (configuration.DistanceRenameToMatch is null) throw new NullReferenceException(nameof(configuration.DistanceRenameToMatch)); - if (configuration.FaceDistanceAreaPermilleTolerance is null) - throw new NullReferenceException(nameof(configuration.FaceDistanceAreaPermilleTolerance)); if (configuration.FaceDistanceHiddenImageFactor is null) throw new NullReferenceException(nameof(configuration.FaceDistanceHiddenImageFactor)); - if (configuration.FaceDistanceMinimumConfidence is null) - throw new NullReferenceException(nameof(configuration.FaceDistanceMinimumConfidence)); + if (configuration.FaceConfidencePercent is null) + throw new NullReferenceException(nameof(configuration.FaceConfidencePercent)); if (configuration.FaceDistancePermyriad is null) throw new NullReferenceException(nameof(configuration.FaceDistancePermyriad)); - if (configuration.FaceDistanceTolerance is null) - throw new NullReferenceException(nameof(configuration.FaceDistanceTolerance)); if (configuration.ForceFaceLastWriteTimeToCreationTime is null) throw new NullReferenceException(nameof(configuration.ForceFaceLastWriteTimeToCreationTime)); if (configuration.ForceMetadataLastWriteTimeToCreationTime is null) @@ -125,8 +121,6 @@ public class Configuration configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions = Array.Empty(); if (configuration.LoadOrCreateThenSaveIndex is null) throw new NullReferenceException(nameof(configuration.LoadOrCreateThenSaveIndex)); - if (configuration.LocationConfidenceFactor is null) - throw new NullReferenceException(nameof(configuration.LocationConfidenceFactor)); if (configuration.LocationDigits is null) throw new NullReferenceException(nameof(configuration.LocationDigits)); if (configuration.LocationFactor is null) @@ -169,6 +163,14 @@ public class Configuration throw new NullReferenceException(nameof(configuration.PropertiesChangedForMetadata)); if (configuration.PropertiesChangedForResize is null) throw new NullReferenceException(nameof(configuration.PropertiesChangedForResize)); + if (configuration.RangeDaysDeltaTolerance is null || configuration.RangeDaysDeltaTolerance.Length != 3) + throw new NullReferenceException(nameof(configuration.RangeDaysDeltaTolerance)); + if (configuration.RangeFaceAreaPermilleTolerance is null || configuration.RangeFaceAreaPermilleTolerance.Length != 3) + throw new NullReferenceException(nameof(configuration.RangeFaceAreaPermilleTolerance)); + if (configuration.RangeFaceConfidence is null || configuration.RangeFaceConfidence.Length != 3) + throw new NullReferenceException(nameof(configuration.RangeFaceConfidence)); + if (configuration.RangeDistanceTolerance is null || configuration.RangeDistanceTolerance.Length != 3) + throw new NullReferenceException(nameof(configuration.RangeDistanceTolerance)); if (configuration.RetryImagesWithoutAFace is null) throw new NullReferenceException(nameof(configuration.RetryImagesWithoutAFace)); if (configuration.Reverse is null) @@ -185,8 +187,6 @@ public class Configuration configuration.SaveShortcutsForOutputResolutions = Array.Empty(); if (configuration.SkipSearch is null) throw new NullReferenceException(nameof(configuration.SkipSearch)); - if (configuration.SortingDaysDeltaTolerance is null) - throw new NullReferenceException(nameof(configuration.SortingDaysDeltaTolerance)); if (configuration.SortingMaximumPerFaceShouldBeHigh is null) throw new NullReferenceException(nameof(configuration.SortingMaximumPerFaceShouldBeHigh)); if (configuration.SortingMaximumPerKey is null) @@ -197,7 +197,7 @@ public class Configuration throw new NullReferenceException(nameof(configuration.TestDistanceResults)); if (configuration.ValidResolutions is null) throw new NullReferenceException(nameof(configuration.ValidResolutions)); - _ = DateTime.Now.AddDays(-configuration.SortingDaysDeltaTolerance.Value); + _ = DateTime.Now.AddDays(-configuration.RangeDaysDeltaTolerance[1]); result = new(configuration.PropertyConfiguration, configuration.CheckDFaceAndUpWriteDates.Value, configuration.CheckJsonForDistanceResults.Value, @@ -206,11 +206,9 @@ public class Configuration configuration.DistanceMoveUnableToMatch.Value, configuration.DistancePixelDistanceTolerance.Value, configuration.DistanceRenameToMatch.Value, - configuration.FaceDistanceAreaPermilleTolerance.Value, configuration.FaceDistanceHiddenImageFactor.Value, - configuration.FaceDistanceMinimumConfidence.Value, + configuration.FaceConfidencePercent.Value, configuration.FaceDistancePermyriad.Value, - configuration.FaceDistanceTolerance.Value, configuration.ForceFaceLastWriteTimeToCreationTime.Value, configuration.ForceMetadataLastWriteTimeToCreationTime.Value, configuration.ForceResizeLastWriteTimeToCreationTime.Value, @@ -220,7 +218,6 @@ public class Configuration configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions, configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions, configuration.LoadOrCreateThenSaveIndex.Value, - configuration.LocationConfidenceFactor.Value, configuration.LocationDigits.Value, configuration.LocationFactor.Value, configuration.MappedMaxIndex, @@ -247,6 +244,10 @@ public class Configuration configuration.PropertiesChangedForIndex.Value, configuration.PropertiesChangedForMetadata.Value, configuration.PropertiesChangedForResize.Value, + configuration.RangeDaysDeltaTolerance, + configuration.RangeFaceAreaPermilleTolerance, + configuration.RangeFaceConfidence, + configuration.RangeDistanceTolerance, configuration.RetryImagesWithoutAFace.Value, configuration.Reverse.Value, configuration.SaveFaceLandmarkForOutputResolutions, @@ -255,7 +256,6 @@ public class Configuration configuration.SaveResizedSubfiles.Value, configuration.SaveShortcutsForOutputResolutions, configuration.SkipSearch.Value, - configuration.SortingDaysDeltaTolerance.Value, configuration.SortingMaximumPerFaceShouldBeHigh.Value, configuration.SortingMaximumPerKey.Value, configuration.SortingMinimumToUseSigma.Value, diff --git a/TestsWithFaceRecognitionDotNet/Models/Configuration.cs b/TestsWithFaceRecognitionDotNet/Models/Configuration.cs index 6c90ebe..50ab873 100644 --- a/TestsWithFaceRecognitionDotNet/Models/Configuration.cs +++ b/TestsWithFaceRecognitionDotNet/Models/Configuration.cs @@ -16,11 +16,9 @@ public class Configuration public bool DistanceMoveUnableToMatch { init; get; } public int DistancePixelDistanceTolerance { init; get; } public bool DistanceRenameToMatch { init; get; } - public int FaceDistanceAreaPermilleTolerance { init; get; } public int FaceDistanceHiddenImageFactor { init; get; } - public double FaceDistanceMinimumConfidence { init; get; } + public int FaceConfidencePercent { init; get; } public int FaceDistancePermyriad { init; get; } - public double FaceDistanceTolerance { init; get; } public bool ForceFaceLastWriteTimeToCreationTime { init; get; } public bool ForceMetadataLastWriteTimeToCreationTime { init; get; } public bool ForceResizeLastWriteTimeToCreationTime { init; get; } @@ -30,7 +28,6 @@ public class Configuration public string[] LoadOrCreateThenSaveDistanceResultsForOutputResolutions { init; get; } public string[] LoadOrCreateThenSaveImageFacesResultsForOutputResolutions { init; get; } public bool LoadOrCreateThenSaveIndex { init; get; } - public int LocationConfidenceFactor { init; get; } public int LocationDigits { init; get; } public int LocationFactor { init; get; } public int? MappedMaxIndex { init; get; } @@ -57,6 +54,10 @@ public class Configuration public bool PropertiesChangedForIndex { init; get; } public bool PropertiesChangedForMetadata { init; get; } public bool PropertiesChangedForResize { init; get; } + public int[] RangeDaysDeltaTolerance { init; get; } + public int[] RangeFaceAreaPermilleTolerance { init; get; } + public double[] RangeFaceConfidence { init; get; } + public double[] RangeDistanceTolerance { init; get; } public bool RetryImagesWithoutAFace { init; get; } public bool Reverse { init; get; } public string[] SaveFaceLandmarkForOutputResolutions { init; get; } @@ -65,7 +66,6 @@ public class Configuration public bool SaveResizedSubfiles { init; get; } public string[] SaveShortcutsForOutputResolutions { init; get; } public bool SkipSearch { init; get; } - public int SortingDaysDeltaTolerance { init; get; } public int SortingMaximumPerFaceShouldBeHigh { init; get; } public int SortingMaximumPerKey { init; get; } public int SortingMinimumToUseSigma { init; get; } @@ -81,11 +81,9 @@ public class Configuration bool distanceMoveUnableToMatch, int distancePixelDistanceTolerance, bool distanceRenameToMatch, - int faceDistanceAreaPermilleTolerance, int faceDistanceHiddenImageFactor, - double faceDistanceMinimumConfidence, + int faceConfidencePercent, int faceDistancePermyriad, - double faceDistanceTolerance, bool forceFaceLastWriteTimeToCreationTime, bool forceMetadataLastWriteTimeToCreationTime, bool forceResizeLastWriteTimeToCreationTime, @@ -95,7 +93,6 @@ public class Configuration string[] loadOrCreateThenSaveDistanceResultsForOutputResolutions, string[] loadOrCreateThenSaveImageFacesResultsForOutputResolutions, bool loadOrCreateThenSaveIndex, - int locationConfidenceFactor, int locationDigits, int locationFactor, int? mappedMaxIndex, @@ -122,6 +119,10 @@ public class Configuration bool propertiesChangedForIndex, bool propertiesChangedForMetadata, bool propertiesChangedForResize, + int[] rangeDaysDeltaTolerance, + int[] rangeFaceAreaPermilleTolerance, + double[] rangeFaceConfidence, + double[] rangeDistanceTolerance, bool retryImagesWithoutAFace, bool reverse, string[] saveFaceLandmarkForOutputResolutions, @@ -130,7 +131,6 @@ public class Configuration bool saveResizedSubfiles, string[] saveShortcutsForOutputResolutions, bool skipSearch, - int sortingDaysDeltaTolerance, int sortingMaximumPerFaceShouldBeHigh, int sortingMaximumPerKey, int sortingSigma, @@ -145,11 +145,9 @@ public class Configuration DistanceMoveUnableToMatch = distanceMoveUnableToMatch; DistancePixelDistanceTolerance = distancePixelDistanceTolerance; DistanceRenameToMatch = distanceRenameToMatch; - FaceDistanceAreaPermilleTolerance = faceDistanceAreaPermilleTolerance; FaceDistanceHiddenImageFactor = faceDistanceHiddenImageFactor; - FaceDistanceMinimumConfidence = faceDistanceMinimumConfidence; + FaceConfidencePercent = faceConfidencePercent; FaceDistancePermyriad = faceDistancePermyriad; - FaceDistanceTolerance = faceDistanceTolerance; ForceFaceLastWriteTimeToCreationTime = forceFaceLastWriteTimeToCreationTime; ForceMetadataLastWriteTimeToCreationTime = forceMetadataLastWriteTimeToCreationTime; ForceResizeLastWriteTimeToCreationTime = forceResizeLastWriteTimeToCreationTime; @@ -159,7 +157,6 @@ public class Configuration LoadOrCreateThenSaveDistanceResultsForOutputResolutions = loadOrCreateThenSaveDistanceResultsForOutputResolutions; LoadOrCreateThenSaveImageFacesResultsForOutputResolutions = loadOrCreateThenSaveImageFacesResultsForOutputResolutions; LoadOrCreateThenSaveIndex = loadOrCreateThenSaveIndex; - LocationConfidenceFactor = locationConfidenceFactor; LocationDigits = locationDigits; LocationFactor = locationFactor; MappedMaxIndex = mappedMaxIndex; @@ -186,6 +183,10 @@ public class Configuration PropertiesChangedForIndex = propertiesChangedForIndex; PropertiesChangedForMetadata = propertiesChangedForMetadata; PropertiesChangedForResize = propertiesChangedForResize; + RangeDaysDeltaTolerance = rangeDaysDeltaTolerance; + RangeFaceAreaPermilleTolerance = rangeFaceAreaPermilleTolerance; + RangeFaceConfidence = rangeFaceConfidence; + RangeDistanceTolerance = rangeDistanceTolerance; RetryImagesWithoutAFace = retryImagesWithoutAFace; Reverse = reverse; SaveFaceLandmarkForOutputResolutions = saveFaceLandmarkForOutputResolutions; @@ -194,7 +195,6 @@ public class Configuration SaveResizedSubfiles = saveResizedSubfiles; SaveShortcutsForOutputResolutions = saveShortcutsForOutputResolutions; SkipSearch = skipSearch; - SortingDaysDeltaTolerance = sortingDaysDeltaTolerance; SortingMaximumPerFaceShouldBeHigh = sortingMaximumPerFaceShouldBeHigh; SortingMaximumPerKey = sortingMaximumPerKey; SortingMinimumToUseSigma = sortingSigma; diff --git a/TestsWithFaceRecognitionDotNet/UnitTestFace.cs b/TestsWithFaceRecognitionDotNet/UnitTestFace.cs index f90cbb7..0130d7d 100644 --- a/TestsWithFaceRecognitionDotNet/UnitTestFace.cs +++ b/TestsWithFaceRecognitionDotNet/UnitTestFace.cs @@ -141,7 +141,7 @@ public class UnitTestFace const int ToleranceAfterFactor = 600; Assert.IsTrue(DistanceDigits == 3); Assert.IsTrue(DistanceFactor == 1000); - Assert.IsTrue(_Configuration.FaceDistanceTolerance == 0.6d); + Assert.IsTrue(_Configuration.RangeDistanceTolerance[1] == 0.6d); Assert.IsTrue(ToleranceAfterFactor == 600); double valueA = 0.00001d; int checkA = (int)(Math.Round(valueA, _Configuration.LocationDigits) * _Configuration.LocationFactor); @@ -150,7 +150,7 @@ public class UnitTestFace int checkB = (int)(Math.Round(valueB, _Configuration.LocationDigits) * _Configuration.LocationFactor); Assert.IsTrue(checkB == 100); Assert.IsTrue(checkB > checkA); - int checkC = (int)(_Configuration.FaceDistanceTolerance * DistanceFactor); + int checkC = (int)(_Configuration.RangeDistanceTolerance[1] * DistanceFactor); Assert.IsTrue(checkC == ToleranceAfterFactor); }