FocusModel
This commit is contained in:
parent
0f025b5e2e
commit
70c9ee5781
@ -10,37 +10,38 @@ public class DistanceLimits : IDistanceLimits
|
|||||||
private int _Distance;
|
private int _Distance;
|
||||||
private int _Confidence;
|
private int _Confidence;
|
||||||
|
|
||||||
public double FaceAreaPermille { init; get; }
|
public double FaceAreaPermyriad { init; get; }
|
||||||
public double RangeDaysDeltaTolerance { init; get; }
|
public double RangeDaysDeltaTolerance { init; get; }
|
||||||
public double FaceConfidencePercent { init; get; }
|
public double FaceConfidencePercent { init; get; }
|
||||||
public double FaceDistancePermyriad { init; get; }
|
public double FaceDistancePermyriad { init; get; }
|
||||||
public int SortingMaximumPerFaceShouldBeHigh { init; get; }
|
public int SortingMaximumPerFaceShouldBeHigh { init; get; }
|
||||||
public bool RangeDaysDeltaTargetLessThenUpper { init; get; }
|
public bool RangeDaysDeltaTargetLessThenUpper { init; get; }
|
||||||
|
|
||||||
public DistanceLimits(int faceConfidencePercent,
|
public DistanceLimits(int faceAreaPermyriad,
|
||||||
int faceDistancePermyriad,
|
int faceConfidencePercent,
|
||||||
int[] rangeDaysDeltaTolerance,
|
int faceDistancePermyriad,
|
||||||
double[] rangeDistanceTolerance,
|
int[] rangeDaysDeltaTolerance,
|
||||||
int[] rangeFaceAreaPermilleTolerance,
|
float[] rangeDistanceTolerance,
|
||||||
double[] rangeFaceConfidence,
|
float[] rangeFaceAreaPermyriadTolerance,
|
||||||
int sortingMaximumPerFaceShouldBeHigh,
|
float[] rangeFaceConfidence,
|
||||||
int? useFiltersCounter = null)
|
int sortingMaximumPerFaceShouldBeHigh,
|
||||||
|
int? useFiltersCounter = null)
|
||||||
{
|
{
|
||||||
SortingMaximumPerFaceShouldBeHigh = sortingMaximumPerFaceShouldBeHigh;
|
SortingMaximumPerFaceShouldBeHigh = sortingMaximumPerFaceShouldBeHigh;
|
||||||
RangeDaysDeltaTargetLessThenUpper = rangeDaysDeltaTolerance[1] > rangeDaysDeltaTolerance[2];
|
RangeDaysDeltaTargetLessThenUpper = rangeDaysDeltaTolerance[1] > rangeDaysDeltaTolerance[2];
|
||||||
if (useFiltersCounter is null)
|
if (useFiltersCounter is null)
|
||||||
{
|
{
|
||||||
FaceAreaPermille = rangeFaceAreaPermilleTolerance[1];
|
|
||||||
RangeDaysDeltaTolerance = rangeDaysDeltaTolerance[1];
|
RangeDaysDeltaTolerance = rangeDaysDeltaTolerance[1];
|
||||||
FaceConfidencePercent = faceConfidencePercent * rangeFaceConfidence[1];
|
FaceConfidencePercent = faceConfidencePercent * rangeFaceConfidence[1];
|
||||||
|
FaceAreaPermyriad = faceAreaPermyriad * rangeFaceAreaPermyriadTolerance[1];
|
||||||
FaceDistancePermyriad = faceDistancePermyriad * rangeDistanceTolerance[1];
|
FaceDistancePermyriad = faceDistancePermyriad * rangeDistanceTolerance[1];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
RangeDaysDeltaTolerance = ((rangeDaysDeltaTolerance[2] - rangeDaysDeltaTolerance[0]) * 0.01 * useFiltersCounter.Value) + rangeDaysDeltaTolerance[1];
|
RangeDaysDeltaTolerance = ((rangeDaysDeltaTolerance[2] - rangeDaysDeltaTolerance[0]) * 0.01 * useFiltersCounter.Value) + rangeDaysDeltaTolerance[1];
|
||||||
FaceConfidencePercent = faceConfidencePercent * ((rangeFaceConfidence[2] - rangeFaceConfidence[0]) * 0.01 * useFiltersCounter.Value) + rangeFaceConfidence[1];
|
FaceConfidencePercent = faceConfidencePercent * ((rangeFaceConfidence[2] - rangeFaceConfidence[0]) * 0.01 * useFiltersCounter.Value) + rangeFaceConfidence[1];
|
||||||
FaceAreaPermille = ((rangeFaceAreaPermilleTolerance[2] - rangeFaceAreaPermilleTolerance[0]) * 0.01 * useFiltersCounter.Value) + rangeFaceAreaPermilleTolerance[1];
|
|
||||||
FaceDistancePermyriad = faceDistancePermyriad * ((rangeDistanceTolerance[2] - rangeDistanceTolerance[0]) * 0.01 * useFiltersCounter.Value) + rangeDistanceTolerance[1];
|
FaceDistancePermyriad = faceDistancePermyriad * ((rangeDistanceTolerance[2] - rangeDistanceTolerance[0]) * 0.01 * useFiltersCounter.Value) + rangeDistanceTolerance[1];
|
||||||
|
FaceAreaPermyriad = faceAreaPermyriad * ((rangeFaceAreaPermyriadTolerance[2] - rangeFaceAreaPermyriadTolerance[0]) * 0.01 * useFiltersCounter.Value) + rangeFaceAreaPermyriadTolerance[1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,13 +15,13 @@ public partial class E_Distance
|
|||||||
private readonly Serilog.ILogger? _Log;
|
private readonly Serilog.ILogger? _Log;
|
||||||
private readonly int _FaceConfidencePercent;
|
private readonly int _FaceConfidencePercent;
|
||||||
private readonly bool _DistanceRenameToMatch;
|
private readonly bool _DistanceRenameToMatch;
|
||||||
private readonly double[] _RangeFaceConfidence;
|
private readonly float[] _RangeFaceConfidence;
|
||||||
private readonly bool _DistanceMoveUnableToMatch;
|
private readonly bool _DistanceMoveUnableToMatch;
|
||||||
private readonly List<string> _AllMappedFaceFiles;
|
private readonly List<string> _AllMappedFaceFiles;
|
||||||
private readonly List<string> _AllMappedFaceFileNames;
|
private readonly List<string> _AllMappedFaceFileNames;
|
||||||
private readonly List<string> _DuplicateMappedFaceFiles;
|
private readonly List<string> _DuplicateMappedFaceFiles;
|
||||||
|
|
||||||
public E_Distance(bool distanceMoveUnableToMatch, bool distanceRenameToMatch, int faceConfidencePercent, double[] rangeFaceConfidence)
|
public E_Distance(bool distanceMoveUnableToMatch, bool distanceRenameToMatch, int faceConfidencePercent, float[] rangeFaceConfidence)
|
||||||
{
|
{
|
||||||
_Debug = new();
|
_Debug = new();
|
||||||
_Moved = new();
|
_Moved = new();
|
||||||
@ -423,7 +423,7 @@ public partial class E_Distance
|
|||||||
confidence += 1;
|
confidence += 1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (face.Mapping.MappingFromLocation.AreaPermille < distanceLimits.FaceAreaPermille)
|
if (face.Mapping.MappingFromLocation.AreaPermyriad < distanceLimits.FaceAreaPermyriad)
|
||||||
{
|
{
|
||||||
area += 1;
|
area += 1;
|
||||||
continue;
|
continue;
|
||||||
@ -445,7 +445,7 @@ public partial class E_Distance
|
|||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static FaceDistanceContainer[] GetFaceDistanceContainers(Map.Models.MapLogic mapLogic, List<Face> distinctFilteredFaces)
|
public static FaceDistanceContainer[] GetFaceDistanceContainers(List<Face> distinctFilteredFaces)
|
||||||
{
|
{
|
||||||
FaceDistanceContainer[] results;
|
FaceDistanceContainer[] results;
|
||||||
FaceDistance faceDistance;
|
FaceDistance faceDistance;
|
||||||
@ -455,12 +455,8 @@ public partial class E_Distance
|
|||||||
{
|
{
|
||||||
if (face.Mapping?.MappingFromLocation is null)
|
if (face.Mapping?.MappingFromLocation is null)
|
||||||
throw new NotSupportedException();
|
throw new NotSupportedException();
|
||||||
if (face.Mapping.MappingFromItem.IsIgnoreRelativePath)
|
|
||||||
continue;
|
|
||||||
if (face.FaceDistance?.Encoding is not FaceRecognitionDotNet.FaceEncoding faceEncoding)
|
if (face.FaceDistance?.Encoding is not FaceRecognitionDotNet.FaceEncoding faceEncoding)
|
||||||
continue;
|
continue;
|
||||||
if (mapLogic.Used(face.FaceDistance))
|
|
||||||
continue;
|
|
||||||
faceDistance = new(face.Mapping.MappingFromLocation.ConfidencePercent, faceEncoding, face.Mapping.MappingFromItem.Id, face.Mapping.MappingFromItem.IsWrongYear, face.Mapping.MappingFromItem.MinimumDateTime, face.Mapping.MappingFromLocation.NormalizedRectangle);
|
faceDistance = new(face.Mapping.MappingFromLocation.ConfidencePercent, faceEncoding, face.Mapping.MappingFromItem.Id, face.Mapping.MappingFromItem.IsWrongYear, face.Mapping.MappingFromItem.MinimumDateTime, face.Mapping.MappingFromLocation.NormalizedRectangle);
|
||||||
faceDistanceContainer = new(face, faceDistance);
|
faceDistanceContainer = new(face, faceDistance);
|
||||||
collection.Add(faceDistanceContainer);
|
collection.Add(faceDistanceContainer);
|
||||||
@ -469,7 +465,7 @@ public partial class E_Distance
|
|||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<FaceDistance> GetFaceDistanceEncodings(FaceDistanceContainer[] faceDistanceContainers, List<FaceDistanceContainer> missingFaceDistanceContainers)
|
public static List<FaceDistance> GetFaceDistanceEncodings(FaceDistanceContainer[] faceDistanceContainers, List<FaceDistanceContainer> missingFaceDistanceContainers)
|
||||||
{
|
{
|
||||||
List<FaceDistance> faceDistanceEncodings = new();
|
List<FaceDistance> faceDistanceEncodings = new();
|
||||||
foreach (FaceDistanceContainer faceDistanceContainer in faceDistanceContainers)
|
foreach (FaceDistanceContainer faceDistanceContainer in faceDistanceContainers)
|
||||||
@ -487,22 +483,40 @@ public partial class E_Distance
|
|||||||
return faceDistanceEncodings;
|
return faceDistanceEncodings;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SortingContainer[] SetFaceMappingSortingCollectionThenGetSortingContainers(int maxDegreeOfParallelism, Map.Models.Configuration mapConfiguration, long ticks, Map.Models.MapLogic mapLogic, Shared.Models.Methods.IDistanceLimits distanceLimits, List<Face> distinctFilteredFaces, List<FaceDistanceContainer> missingFaceDistanceContainers)
|
public static FaceDistanceContainer[] FilteredFaceDistanceContainers(Map.Models.MapLogic mapLogic, FaceDistanceContainer[] faceDistanceContainers)
|
||||||
|
{
|
||||||
|
List<FaceDistanceContainer> results = new();
|
||||||
|
foreach (FaceDistanceContainer faceDistanceContainer in faceDistanceContainers)
|
||||||
|
{
|
||||||
|
if (faceDistanceContainer.FaceDistance is null || faceDistanceContainer.Face.Mapping?.MappingFromLocation is null)
|
||||||
|
throw new NotSupportedException();
|
||||||
|
if (faceDistanceContainer.Face.Mapping.MappingFromFilter.IsFocusModel is not null && !faceDistanceContainer.Face.Mapping.MappingFromFilter.IsFocusModel.Value)
|
||||||
|
continue;
|
||||||
|
if (faceDistanceContainer.Face.Mapping.MappingFromFilter.IsFocusRelativePath is not null && !faceDistanceContainer.Face.Mapping.MappingFromFilter.IsFocusRelativePath.Value)
|
||||||
|
continue;
|
||||||
|
if (faceDistanceContainer.Face.Mapping.MappingFromFilter.IsIgnoreRelativePath is not null && faceDistanceContainer.Face.Mapping.MappingFromFilter.IsIgnoreRelativePath.Value)
|
||||||
|
continue;
|
||||||
|
if (mapLogic.Used(faceDistanceContainer.FaceDistance))
|
||||||
|
continue;
|
||||||
|
results.Add(faceDistanceContainer);
|
||||||
|
}
|
||||||
|
return results.ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SortingContainer[] SetFaceMappingSortingCollectionThenGetSortingContainers(int maxDegreeOfParallelism, Map.Models.Configuration mapConfiguration, long ticks, Map.Models.MapLogic mapLogic, Shared.Models.Methods.IDistanceLimits distanceLimits, List<FaceDistance> faceDistanceEncodings, FaceDistanceContainer[] filteredFaceDistanceContainers)
|
||||||
{
|
{
|
||||||
SortingContainer[] results;
|
SortingContainer[] results;
|
||||||
List<SortingContainer> collection = new();
|
List<SortingContainer> collection = new();
|
||||||
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
|
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
|
||||||
ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = maxDegreeOfParallelism };
|
ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = maxDegreeOfParallelism };
|
||||||
FaceDistanceContainer[] faceDistanceContainers = GetFaceDistanceContainers(mapLogic, distinctFilteredFaces);
|
string message = $") {filteredFaceDistanceContainers.Length:000} Get Sorting Containers Then Set Face Mapping Sorting Collection - {totalSeconds} total second(s)";
|
||||||
List<FaceDistance> faceDistanceEncodings = GetFaceDistanceEncodings(faceDistanceContainers, missingFaceDistanceContainers);
|
|
||||||
string message = $") {faceDistanceContainers.Length:000} Get Sorting Containers Then Set Face Mapping Sorting Collection - {totalSeconds} total second(s)";
|
|
||||||
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
|
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
|
||||||
using ProgressBar progressBar = new(faceDistanceContainers.Length, message, options);
|
using ProgressBar progressBar = new(filteredFaceDistanceContainers.Length, message, options);
|
||||||
_ = Parallel.For(0, faceDistanceContainers.Length, parallelOptions, (i, state) =>
|
_ = Parallel.For(0, filteredFaceDistanceContainers.Length, parallelOptions, (i, state) =>
|
||||||
{
|
{
|
||||||
progressBar.Tick();
|
progressBar.Tick();
|
||||||
FaceDistance faceDistanceEncoding = faceDistanceContainers[i].FaceDistance;
|
FaceDistance faceDistanceEncoding = filteredFaceDistanceContainers[i].FaceDistance;
|
||||||
Face face = faceDistanceContainers[i].Face;
|
Face face = filteredFaceDistanceContainers[i].Face;
|
||||||
List<Sorting> sortingCollection = GetSortingCollection(mapLogic, faceDistanceEncodings, i, faceDistanceEncoding);
|
List<Sorting> sortingCollection = GetSortingCollection(mapLogic, faceDistanceEncodings, i, faceDistanceEncoding);
|
||||||
if (!sortingCollection.Any())
|
if (!sortingCollection.Any())
|
||||||
return;
|
return;
|
||||||
|
@ -154,7 +154,6 @@ public class DuplicateSearch
|
|||||||
DateTime[] containerDateTimes;
|
DateTime[] containerDateTimes;
|
||||||
MappingFromItem? mappingFromItem;
|
MappingFromItem? mappingFromItem;
|
||||||
List<MappingFromItem?>? collection;
|
List<MappingFromItem?>? collection;
|
||||||
const bool isIgnoreRelativePath = false;
|
|
||||||
const string duplicates = "-Duplicate(s)";
|
const string duplicates = "-Duplicate(s)";
|
||||||
if (containers.Any())
|
if (containers.Any())
|
||||||
{
|
{
|
||||||
@ -193,11 +192,11 @@ public class DuplicateSearch
|
|||||||
if (mappingFromItem is not null)
|
if (mappingFromItem is not null)
|
||||||
{
|
{
|
||||||
resizedFileHolder = new(mappingFromItem.ResizedFileHolder.FullName.Replace($"0{duplicates}", $"1{duplicates}"));
|
resizedFileHolder = new(mappingFromItem.ResizedFileHolder.FullName.Replace($"0{duplicates}", $"1{duplicates}"));
|
||||||
collection[0] = new(mappingFromItem.ContainerDateTimes, mappingFromItem.Id, mappingFromItem.ImageFileHolder, mappingFromItem.IsIgnoreRelativePath, mappingFromItem.IsWrongYear, mappingFromItem.MinimumDateTime, mappingFromItem.RelativePath, resizedFileHolder);
|
collection[0] = new(mappingFromItem.ContainerDateTimes, mappingFromItem.Id, mappingFromItem.ImageFileHolder, mappingFromItem.IsWrongYear, mappingFromItem.MinimumDateTime, mappingFromItem.RelativePath, resizedFileHolder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
resizedFileHolder = new(string.Concat(Path.Combine(destinationRoot, directory), item.RelativePath));
|
resizedFileHolder = new(string.Concat(Path.Combine(destinationRoot, directory), item.RelativePath));
|
||||||
mappingFromItem = Shared.Models.Stateless.Methods.IMappingFromItem.GetMappingFromItem(containerDateTimes, item, resizedFileHolder, isIgnoreRelativePath);
|
mappingFromItem = Shared.Models.Stateless.Methods.IMappingFromItem.GetMappingFromItem(containerDateTimes, item, resizedFileHolder);
|
||||||
collection.Add(mappingFromItem);
|
collection.Add(mappingFromItem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -326,8 +326,7 @@ public partial class DlibDotNet
|
|||||||
item.SetResizedFileHolder(_Resize.FileNameExtension, resizedFileHolder);
|
item.SetResizedFileHolder(_Resize.FileNameExtension, resizedFileHolder);
|
||||||
string facesDirectory = _Configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions.Contains(outputResolution) ? _Faces.GetFacesDirectory(dResultsFullGroupDirectory, item) : string.Empty;
|
string facesDirectory = _Configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions.Contains(outputResolution) ? _Faces.GetFacesDirectory(dResultsFullGroupDirectory, item) : string.Empty;
|
||||||
string facePartsDirectory = _Configuration.SaveFaceLandmarkForOutputResolutions.Contains(outputResolution) ? _FaceParts.GetFacePartsDirectory(_Configuration.PropertyConfiguration, dResultsFullGroupDirectory, item) : string.Empty;
|
string facePartsDirectory = _Configuration.SaveFaceLandmarkForOutputResolutions.Contains(outputResolution) ? _FaceParts.GetFacePartsDirectory(_Configuration.PropertyConfiguration, dResultsFullGroupDirectory, item) : string.Empty;
|
||||||
bool isIgnoreRelativePath = _Configuration.IgnoreRelativePaths.Any(l => container.SourceDirectory.Contains(l)) && Shared.Models.Stateless.Methods.IContainer.IsIgnoreRelativePath(_Configuration.PropertyConfiguration, _Configuration.IgnoreRelativePaths, container.SourceDirectory);
|
MappingFromItem mappingFromItem = Shared.Models.Stateless.Methods.IMappingFromItem.GetMappingFromItem(containerDateTimes, item, resizedFileHolder);
|
||||||
MappingFromItem mappingFromItem = Shared.Models.Stateless.Methods.IMappingFromItem.GetMappingFromItem(containerDateTimes, item, resizedFileHolder, isIgnoreRelativePath);
|
|
||||||
(int metadataGroups, metadataCollection) = metadata.GetMetadataCollection(subFileTuples, parseExceptions, mappingFromItem);
|
(int metadataGroups, metadataCollection) = metadata.GetMetadataCollection(subFileTuples, parseExceptions, mappingFromItem);
|
||||||
if (_AppSettings.MaxDegreeOfParallelism < 2)
|
if (_AppSettings.MaxDegreeOfParallelism < 2)
|
||||||
ticks = LogDelta(ticks, nameof(B_Metadata.GetMetadataCollection));
|
ticks = LogDelta(ticks, nameof(B_Metadata.GetMetadataCollection));
|
||||||
@ -590,19 +589,26 @@ public partial class DlibDotNet
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetMapping(Dictionary<string, List<MappingFromPhotoPrism>> fileNameToCollection, string argZero, Container[] containers)
|
private void SetMapping(string argZero, Container[] containers, Dictionary<string, List<MappingFromPhotoPrism>> fileNameToCollection, Dictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers)
|
||||||
{
|
{
|
||||||
|
string? model;
|
||||||
Mapping mapping;
|
Mapping mapping;
|
||||||
int faceAreaPermille;
|
bool? isFocusModel;
|
||||||
|
int faceAreaPermyriad;
|
||||||
Item[] filteredItems;
|
Item[] filteredItems;
|
||||||
int confidencePercent;
|
int confidencePercent;
|
||||||
int normalizedRectangle;
|
int normalizedRectangle;
|
||||||
bool isIgnoreRelativePath;
|
bool? isFocusRelativePath;
|
||||||
|
bool? isIgnoreRelativePath;
|
||||||
DateTime[] containerDateTimes;
|
DateTime[] containerDateTimes;
|
||||||
string deterministicHashCodeKey;
|
string deterministicHashCodeKey;
|
||||||
MappingFromItem mappingFromItem;
|
MappingFromItem mappingFromItem;
|
||||||
|
MappingFromFilter mappingFromFilter;
|
||||||
MappingFromLocation? mappingFromLocation;
|
MappingFromLocation? mappingFromLocation;
|
||||||
|
IReadOnlyList<MetadataExtractor.Directory> directories;
|
||||||
List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection;
|
List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection;
|
||||||
|
List<LocationContainer<MetadataExtractor.Directory>>? locationContainers;
|
||||||
|
string focusRelativePath = Path.GetFullPath(string.Concat(_Configuration.PropertyConfiguration.RootDirectory, _Configuration.FocusDirectory));
|
||||||
foreach (Container container in containers)
|
foreach (Container container in containers)
|
||||||
{
|
{
|
||||||
if (!container.Items.Any())
|
if (!container.Items.Any())
|
||||||
@ -613,12 +619,35 @@ public partial class DlibDotNet
|
|||||||
if (!filteredItems.Any())
|
if (!filteredItems.Any())
|
||||||
continue;
|
continue;
|
||||||
containerDateTimes = Shared.Models.Stateless.Methods.IContainer.GetContainerDateTimes(filteredItems);
|
containerDateTimes = Shared.Models.Stateless.Methods.IContainer.GetContainerDateTimes(filteredItems);
|
||||||
isIgnoreRelativePath = _Configuration.IgnoreRelativePaths.Any(l => container.SourceDirectory.Contains(l)) && Shared.Models.Stateless.Methods.IContainer.IsIgnoreRelativePath(_Configuration.PropertyConfiguration, _Configuration.IgnoreRelativePaths, container.SourceDirectory);
|
isFocusRelativePath = string.IsNullOrEmpty(_Configuration.FocusDirectory) ? null : container.SourceDirectory.StartsWith(focusRelativePath);
|
||||||
|
if (!_Configuration.IgnoreRelativePaths.Any())
|
||||||
|
isIgnoreRelativePath = null;
|
||||||
|
else
|
||||||
|
isIgnoreRelativePath = _Configuration.IgnoreRelativePaths.Any(l => container.SourceDirectory.Contains(l)) && Shared.Models.Stateless.Methods.IContainer.IsIgnoreRelativePath(_Configuration.PropertyConfiguration, _Configuration.IgnoreRelativePaths, container.SourceDirectory);
|
||||||
foreach (Item item in filteredItems)
|
foreach (Item item in filteredItems)
|
||||||
{
|
{
|
||||||
if (item.Property?.Id is null || item.ResizedFileHolder is null)
|
if (item.Property?.Id is null || item.ResizedFileHolder is null)
|
||||||
continue;
|
continue;
|
||||||
mappingFromItem = Shared.Models.Stateless.Methods.IMappingFromItem.GetMappingFromItem(containerDateTimes, item, isIgnoreRelativePath);
|
mappingFromItem = Shared.Models.Stateless.Methods.IMappingFromItem.GetMappingFromItem(containerDateTimes, item);
|
||||||
|
if (string.IsNullOrEmpty(_Configuration.FocusModel))
|
||||||
|
isFocusModel = null;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!idToLocationContainers.TryGetValue(mappingFromItem.Id, out locationContainers) || !locationContainers.Any())
|
||||||
|
isFocusModel = false;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
directories = locationContainers.First().Directories;
|
||||||
|
model = Metadata.Models.Stateless.Methods.IMetadata.GetModel(directories);
|
||||||
|
if (model is null)
|
||||||
|
directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(mappingFromItem.ResizedFileHolder.FullName);
|
||||||
|
model = Metadata.Models.Stateless.Methods.IMetadata.GetModel(directories);
|
||||||
|
isFocusModel = model is not null && model.Contains(_Configuration.FocusModel);
|
||||||
|
if (isFocusModel.Value)
|
||||||
|
isFocusModel = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mappingFromFilter = new(isFocusModel, isFocusRelativePath, isIgnoreRelativePath);
|
||||||
foreach (Shared.Models.Face face in item.Faces)
|
foreach (Shared.Models.Face face in item.Faces)
|
||||||
{
|
{
|
||||||
if (face.FaceEncoding is null || face.Location is null || face.OutputResolution is null)
|
if (face.FaceEncoding is null || face.Location is null || face.OutputResolution is null)
|
||||||
@ -626,14 +655,14 @@ public partial class DlibDotNet
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
confidencePercent = Shared.Models.Stateless.Methods.ILocation.GetConfidencePercent(_Configuration.FaceConfidencePercent, _Configuration.RangeFaceConfidence, face.Location.Confidence);
|
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);
|
faceAreaPermyriad = Shared.Models.Stateless.Methods.IMapping.GetAreaPermyriad(_Configuration.FaceAreaPermyriad, face.Location, face.OutputResolution);
|
||||||
normalizedRectangle = Shared.Models.Stateless.Methods.ILocation.GetNormalizedRectangle(face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution);
|
normalizedRectangle = Shared.Models.Stateless.Methods.ILocation.GetNormalizedRectangle(face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution);
|
||||||
deterministicHashCodeKey = Shared.Models.Stateless.Methods.IMapping.GetDeterministicHashCodeKey(item.Property.Id.Value, face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution);
|
deterministicHashCodeKey = Shared.Models.Stateless.Methods.IMapping.GetDeterministicHashCodeKey(item.Property.Id.Value, face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution);
|
||||||
mappingFromLocation = new(faceAreaPermille, confidencePercent, deterministicHashCodeKey, normalizedRectangle);
|
mappingFromLocation = new(faceAreaPermyriad, confidencePercent, deterministicHashCodeKey, normalizedRectangle);
|
||||||
}
|
}
|
||||||
if (!fileNameToCollection.TryGetValue(mappingFromItem.RelativePath[1..], out mappingFromPhotoPrismCollection))
|
if (!fileNameToCollection.TryGetValue(mappingFromItem.RelativePath[1..], out mappingFromPhotoPrismCollection))
|
||||||
mappingFromPhotoPrismCollection = null;
|
mappingFromPhotoPrismCollection = null;
|
||||||
mapping = new(mappingFromItem, mappingFromLocation, mappingFromPhotoPrismCollection);
|
mapping = new(mappingFromItem, mappingFromFilter, mappingFromLocation, mappingFromPhotoPrismCollection);
|
||||||
face.SetMapping(mapping);
|
face.SetMapping(mapping);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -695,10 +724,51 @@ public partial class DlibDotNet
|
|||||||
return items;
|
return items;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void MapLogic(string argZero, long ticks, Container[] containers, string a2PeopleSingletonDirectory, string dResultsFullGroupDirectory, string d2ResultsFullGroupDirectory, string fPhotoPrismContentDirectory, MapLogic mapLogic, string outputResolution, Dictionary<long, List<int>> personKeyToIds, List<Shared.Models.Face> distinctFilteredFaces, Mapping[] mappingCollection, int totalNotMapped)
|
private void SaveFaceDistances(long ticks, MapLogic mapLogic, Mapping[] mappingCollection, string dFacesContentDirectory, string d2FacePartsContentDirectory, Dictionary<int, Dictionary<int, Mapping>> idToNormalizedRectangleToMapping, List<FaceDistance> faceDistanceEncodings, FaceDistanceContainer[] filteredFaceDistanceContainers)
|
||||||
{
|
{
|
||||||
|
DistanceLimits distanceLimits;
|
||||||
int? useFiltersCounter = null;
|
int? useFiltersCounter = null;
|
||||||
SortingContainer[] sortingContainers;
|
SortingContainer[] sortingContainers;
|
||||||
|
distanceLimits = new(_Configuration.FaceAreaPermyriad, _Configuration.FaceConfidencePercent, _Configuration.FaceDistancePermyriad, _Configuration.RangeDaysDeltaTolerance, _Configuration.RangeDistanceTolerance, _Configuration.RangeFaceAreaTolerance, _Configuration.RangeFaceConfidence, _Configuration.SortingMaximumPerFaceShouldBeHigh);
|
||||||
|
sortingContainers = E_Distance.SetFaceMappingSortingCollectionThenGetSortingContainers(_AppSettings.MaxDegreeOfParallelism, _MapConfiguration, ticks, mapLogic, distanceLimits, faceDistanceEncodings, filteredFaceDistanceContainers);
|
||||||
|
if (!sortingContainers.Any())
|
||||||
|
{
|
||||||
|
for (useFiltersCounter = 1; useFiltersCounter < _Configuration.UseFilterTries; useFiltersCounter++)
|
||||||
|
{
|
||||||
|
distanceLimits = new(_Configuration.FaceAreaPermyriad, _Configuration.FaceConfidencePercent, _Configuration.FaceDistancePermyriad, _Configuration.RangeDaysDeltaTolerance, _Configuration.RangeDistanceTolerance, _Configuration.RangeFaceAreaTolerance, _Configuration.RangeFaceConfidence, _Configuration.SortingMaximumPerFaceShouldBeHigh, useFiltersCounter);
|
||||||
|
sortingContainers = E_Distance.SetFaceMappingSortingCollectionThenGetSortingContainers(_AppSettings.MaxDegreeOfParallelism, _MapConfiguration, ticks, mapLogic, distanceLimits, faceDistanceEncodings, filteredFaceDistanceContainers);
|
||||||
|
if (sortingContainers.Any())
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
E_Distance.SaveFaceDistances(_Configuration.PropertyConfiguration, sortingContainers);
|
||||||
|
if (filteredFaceDistanceContainers.Length > 0)
|
||||||
|
{
|
||||||
|
int updated = mapLogic.UpdateFromSortingContainers(distanceLimits, sortingContainers);
|
||||||
|
List<SaveContainer> saveContainers = mapLogic.GetSaveContainers(dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, idToNormalizedRectangleToMapping, useFiltersCounter, sortingContainers.Any());
|
||||||
|
mapLogic.SaveContainers(filteredFaceDistanceContainers.Length, updated, saveContainers);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SaveFaceDistances(long ticks, MapLogic mapLogic, List<Shared.Models.Face> distinctFilteredFaces, Mapping[] mappingCollection, string dFacesContentDirectory, string d2FacePartsContentDirectory, string dFacesCollectionDirectory, Dictionary<int, Dictionary<int, Mapping>> idToNormalizedRectangleToMapping)
|
||||||
|
{
|
||||||
|
if (_Log is null)
|
||||||
|
throw new NullReferenceException(nameof(_Log));
|
||||||
|
E_Distance.SetFaceDistances(_AppSettings.MaxDegreeOfParallelism, ticks, distinctFilteredFaces);
|
||||||
|
FaceDistanceContainer[] faceDistanceContainers = E_Distance.GetFaceDistanceContainers(distinctFilteredFaces);
|
||||||
|
Dictionary<int, Dictionary<int, PersonContainer[]>> missingIdThenNormalizedRectangleToPersonContainers = mapLogic.GetMissing(idToNormalizedRectangleToMapping);
|
||||||
|
List<FaceDistanceContainer> missingFaceDistanceContainers = _Distance.GetMissingFaceDistanceContainer(_AppSettings.MaxDegreeOfParallelism, ticks, dFacesCollectionDirectory, missingIdThenNormalizedRectangleToPersonContainers);
|
||||||
|
List<FaceDistance> faceDistanceEncodings = E_Distance.GetFaceDistanceEncodings(faceDistanceContainers, missingFaceDistanceContainers);
|
||||||
|
FaceDistanceContainer[] filteredFaceDistanceContainers = E_Distance.FilteredFaceDistanceContainers(mapLogic, faceDistanceContainers);
|
||||||
|
int totalNotMappedAfterFiltered = filteredFaceDistanceContainers.Length;
|
||||||
|
if (totalNotMappedAfterFiltered == 0)
|
||||||
|
_Log.Information("All images have been filtered!");
|
||||||
|
else
|
||||||
|
SaveFaceDistances(ticks, mapLogic, mappingCollection, dFacesContentDirectory, d2FacePartsContentDirectory, idToNormalizedRectangleToMapping, faceDistanceEncodings, filteredFaceDistanceContainers);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void MapLogic(string argZero, long ticks, Container[] containers, string a2PeopleSingletonDirectory, string dResultsFullGroupDirectory, string d2ResultsFullGroupDirectory, string fPhotoPrismContentDirectory, MapLogic mapLogic, string outputResolution, Dictionary<long, List<int>> personKeyToIds, List<Shared.Models.Face> distinctFilteredFaces, Mapping[] mappingCollection, int totalNotMapped)
|
||||||
|
{
|
||||||
string dFacesContentDirectory = Path.Combine(dResultsFullGroupDirectory, "()");
|
string dFacesContentDirectory = Path.Combine(dResultsFullGroupDirectory, "()");
|
||||||
string d2FacePartsContentDirectory = Path.Combine(d2ResultsFullGroupDirectory, "()");
|
string d2FacePartsContentDirectory = Path.Combine(d2ResultsFullGroupDirectory, "()");
|
||||||
string dFacesCollectionDirectory = Path.Combine(dResultsFullGroupDirectory, "[]", _Configuration.PropertyConfiguration.ResultAllInOne);
|
string dFacesCollectionDirectory = Path.Combine(dResultsFullGroupDirectory, "[]", _Configuration.PropertyConfiguration.ResultAllInOne);
|
||||||
@ -716,31 +786,7 @@ public partial class DlibDotNet
|
|||||||
if (_Configuration.SaveMappedForOutputResolutions.Contains(outputResolution))
|
if (_Configuration.SaveMappedForOutputResolutions.Contains(outputResolution))
|
||||||
mapLogic.SaveMapped(dFacesContentDirectory, d2FacePartsContentDirectory, personKeyToIds, mappingCollection, idToNormalizedRectangleToMapping, totalNotMapped);
|
mapLogic.SaveMapped(dFacesContentDirectory, d2FacePartsContentDirectory, personKeyToIds, mappingCollection, idToNormalizedRectangleToMapping, totalNotMapped);
|
||||||
if (_Configuration.SaveFaceDistancesForOutputResolutions.Contains(outputResolution))
|
if (_Configuration.SaveFaceDistancesForOutputResolutions.Contains(outputResolution))
|
||||||
{
|
SaveFaceDistances(ticks, mapLogic, distinctFilteredFaces, mappingCollection, dFacesContentDirectory, d2FacePartsContentDirectory, dFacesCollectionDirectory, idToNormalizedRectangleToMapping);
|
||||||
DistanceLimits distanceLimits;
|
|
||||||
E_Distance.SetFaceDistances(_AppSettings.MaxDegreeOfParallelism, ticks, distinctFilteredFaces);
|
|
||||||
Dictionary<int, Dictionary<int, PersonContainer[]>> missingIdThenNormalizedRectangleToPersonContainers = mapLogic.GetMissing(idToNormalizedRectangleToMapping);
|
|
||||||
List<FaceDistanceContainer> missingFaceDistanceContainers = _Distance.GetMissingFaceDistanceContainer(_AppSettings.MaxDegreeOfParallelism, ticks, dFacesCollectionDirectory, missingIdThenNormalizedRectangleToPersonContainers);
|
|
||||||
distanceLimits = new(_Configuration.FaceConfidencePercent, _Configuration.FaceDistancePermyriad, _Configuration.RangeDaysDeltaTolerance, _Configuration.RangeDistanceTolerance, _Configuration.RangeFaceAreaPermilleTolerance, _Configuration.RangeFaceConfidence, _Configuration.SortingMaximumPerFaceShouldBeHigh);
|
|
||||||
sortingContainers = E_Distance.SetFaceMappingSortingCollectionThenGetSortingContainers(_AppSettings.MaxDegreeOfParallelism, _MapConfiguration, ticks, mapLogic, distanceLimits, distinctFilteredFaces, missingFaceDistanceContainers);
|
|
||||||
if (!sortingContainers.Any())
|
|
||||||
{
|
|
||||||
for (useFiltersCounter = 1; useFiltersCounter < _Configuration.UseFilterTries; useFiltersCounter++)
|
|
||||||
{
|
|
||||||
distanceLimits = new(_Configuration.FaceConfidencePercent, _Configuration.FaceDistancePermyriad, _Configuration.RangeDaysDeltaTolerance, _Configuration.RangeDistanceTolerance, _Configuration.RangeFaceAreaPermilleTolerance, _Configuration.RangeFaceConfidence, _Configuration.SortingMaximumPerFaceShouldBeHigh, useFiltersCounter);
|
|
||||||
sortingContainers = E_Distance.SetFaceMappingSortingCollectionThenGetSortingContainers(_AppSettings.MaxDegreeOfParallelism, _MapConfiguration, ticks, mapLogic, distanceLimits, distinctFilteredFaces, missingFaceDistanceContainers);
|
|
||||||
if (sortingContainers.Any())
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
E_Distance.SaveFaceDistances(_Configuration.PropertyConfiguration, sortingContainers);
|
|
||||||
if (totalNotMapped > 0)
|
|
||||||
{
|
|
||||||
int updated = mapLogic.UpdateFromSortingContainers(distanceLimits, sortingContainers);
|
|
||||||
List<SaveContainer> saveContainers = mapLogic.GetSaveContainers(dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, idToNormalizedRectangleToMapping, useFiltersCounter, sortingContainers.Any());
|
|
||||||
mapLogic.SaveContainers(totalNotMapped, updated, saveContainers);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Container? AreAllSameEndsWith(string argZero, Container[] containers)
|
private static Container? AreAllSameEndsWith(string argZero, Container[] containers)
|
||||||
@ -1052,7 +1098,7 @@ public partial class DlibDotNet
|
|||||||
FullDoWork(argZero, propertyRoot, ticks, aResultsFullGroupDirectory, bResultsFullGroupDirectory, t, containers, propertyLogic, metadata, eDistanceContentDirectory, fileNameToCollection, idToLocationContainers);
|
FullDoWork(argZero, propertyRoot, ticks, aResultsFullGroupDirectory, bResultsFullGroupDirectory, t, containers, propertyLogic, metadata, eDistanceContentDirectory, fileNameToCollection, idToLocationContainers);
|
||||||
_Distance.Clear();
|
_Distance.Clear();
|
||||||
mapLogic ??= new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _MapConfiguration, ticks, _PersonContainers, a2PeopleSingletonDirectory, eDistanceContentDirectory);
|
mapLogic ??= new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _MapConfiguration, ticks, _PersonContainers, a2PeopleSingletonDirectory, eDistanceContentDirectory);
|
||||||
SetMapping(fileNameToCollection, argZero, containers);
|
SetMapping(argZero, containers, fileNameToCollection, idToLocationContainers);
|
||||||
if (!personKeyToIds.Any())
|
if (!personKeyToIds.Any())
|
||||||
personKeyToIds = mapLogic.GetPersonKeyToIds();
|
personKeyToIds = mapLogic.GetPersonKeyToIds();
|
||||||
(List<int> distinctFilteredIds, List<Shared.Models.Face> distinctFilteredFaces) = GetFilteredDistinct(argZero, containers);
|
(List<int> distinctFilteredIds, List<Shared.Models.Face> distinctFilteredFaces) = GetFilteredDistinct(argZero, containers);
|
||||||
|
@ -18,10 +18,12 @@ public class Configuration
|
|||||||
[Display(Name = "Distance Move Unable to Match by 1 Tick"), Required] public bool? DistanceMoveUnableToMatch { get; set; }
|
[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 Pixel Distance Tolerance"), Required] public int? DistancePixelDistanceTolerance { get; set; }
|
||||||
[Display(Name = "Distance Rename to Match"), Required] public bool? DistanceRenameToMatch { get; set; }
|
[Display(Name = "Distance Rename to Match"), Required] public bool? DistanceRenameToMatch { get; set; }
|
||||||
[Display(Name = "Face Area Permille"), Required] public int? FaceAreaPermille { get; set; }
|
[Display(Name = "Face Area Permille"), Required] public int? FaceAreaPermyriad { get; set; }
|
||||||
[Display(Name = "Face Distance Hidden Image Factor"), Required] public int? FaceDistanceHiddenImageFactor { get; set; }
|
[Display(Name = "Face Distance Hidden Image Factor"), Required] public int? FaceDistanceHiddenImageFactor { get; set; }
|
||||||
[Display(Name = "Face Confidence Percent"), Required] public int? FaceConfidencePercent { 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 Permyriad"), Required] public int? FaceDistancePermyriad { get; set; }
|
||||||
|
[Display(Name = "Focus Directory"), Required] public string FocusDirectory { get; set; }
|
||||||
|
[Display(Name = "Focus Model"), Required] public string FocusModel { get; set; }
|
||||||
[Display(Name = "Force Face Last Write Time to Creation Time"), Required] public bool? ForceFaceLastWriteTimeToCreationTime { 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 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; }
|
[Display(Name = "Force Resize Last Write Time to Creation Time"), Required] public bool? ForceResizeLastWriteTimeToCreationTime { get; set; }
|
||||||
@ -59,9 +61,9 @@ public class Configuration
|
|||||||
[Display(Name = "Properties Changed For Resize"), Required] public bool? PropertiesChangedForResize { 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 = "Property Configuration"), Required] public Property.Models.Configuration PropertyConfiguration { get; set; }
|
||||||
[Display(Name = "Sorting Days Delta Tolerance"), Required] public int[] RangeDaysDeltaTolerance { get; set; }
|
[Display(Name = "Sorting Days Delta Tolerance"), Required] public int[] RangeDaysDeltaTolerance { get; set; }
|
||||||
[Display(Name = "Face Distance Tolerance"), Required] public double[] RangeDistanceTolerance { get; set; }
|
[Display(Name = "Face Distance Tolerance"), Required] public float[] RangeDistanceTolerance { get; set; }
|
||||||
[Display(Name = "Face Area Permille Tolerance"), Required] public int[] RangeFaceAreaPermilleTolerance { get; set; }
|
[Display(Name = "Face Area Permille Tolerance"), Required] public float[] RangeFaceAreaTolerance { get; set; }
|
||||||
[Display(Name = "Location Minimum Confidence"), Required] public double[] RangeFaceConfidence { get; set; }
|
[Display(Name = "Location Minimum Confidence"), Required] public float[] RangeFaceConfidence { get; set; }
|
||||||
[Display(Name = "Reverse"), Required] public bool? Reverse { 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 Distances"), Required] public string[] SaveFaceDistancesForOutputResolutions { get; set; }
|
||||||
[Display(Name = "Save Face Landmark For Output Resolutions"), Required] public string[] SaveFaceLandmarkForOutputResolutions { get; set; }
|
[Display(Name = "Save Face Landmark For Output Resolutions"), Required] public string[] SaveFaceLandmarkForOutputResolutions { get; set; }
|
||||||
@ -110,14 +112,18 @@ public class Configuration
|
|||||||
throw new NullReferenceException(nameof(configuration.DistancePixelDistanceTolerance));
|
throw new NullReferenceException(nameof(configuration.DistancePixelDistanceTolerance));
|
||||||
if (configuration.DistanceRenameToMatch is null)
|
if (configuration.DistanceRenameToMatch is null)
|
||||||
throw new NullReferenceException(nameof(configuration.DistanceRenameToMatch));
|
throw new NullReferenceException(nameof(configuration.DistanceRenameToMatch));
|
||||||
if (configuration.FaceAreaPermille is null)
|
if (configuration.FaceAreaPermyriad is null)
|
||||||
throw new NullReferenceException(nameof(configuration.FaceAreaPermille));
|
throw new NullReferenceException(nameof(configuration.FaceAreaPermyriad));
|
||||||
if (configuration.FaceDistanceHiddenImageFactor is null)
|
if (configuration.FaceDistanceHiddenImageFactor is null)
|
||||||
throw new NullReferenceException(nameof(configuration.FaceDistanceHiddenImageFactor));
|
throw new NullReferenceException(nameof(configuration.FaceDistanceHiddenImageFactor));
|
||||||
if (configuration.FaceConfidencePercent is null)
|
if (configuration.FaceConfidencePercent is null)
|
||||||
throw new NullReferenceException(nameof(configuration.FaceConfidencePercent));
|
throw new NullReferenceException(nameof(configuration.FaceConfidencePercent));
|
||||||
if (configuration.FaceDistancePermyriad is null)
|
if (configuration.FaceDistancePermyriad is null)
|
||||||
throw new NullReferenceException(nameof(configuration.FaceDistancePermyriad));
|
throw new NullReferenceException(nameof(configuration.FaceDistancePermyriad));
|
||||||
|
if (configuration.FocusDirectory is null)
|
||||||
|
throw new NullReferenceException(nameof(configuration.FocusDirectory));
|
||||||
|
if (configuration.FocusModel is null)
|
||||||
|
throw new NullReferenceException(nameof(configuration.FocusModel));
|
||||||
if (configuration.ForceFaceLastWriteTimeToCreationTime is null)
|
if (configuration.ForceFaceLastWriteTimeToCreationTime is null)
|
||||||
throw new NullReferenceException(nameof(configuration.ForceFaceLastWriteTimeToCreationTime));
|
throw new NullReferenceException(nameof(configuration.ForceFaceLastWriteTimeToCreationTime));
|
||||||
if (configuration.ForceMetadataLastWriteTimeToCreationTime is null)
|
if (configuration.ForceMetadataLastWriteTimeToCreationTime is null)
|
||||||
@ -178,8 +184,8 @@ public class Configuration
|
|||||||
throw new NullReferenceException(nameof(configuration.PropertiesChangedForResize));
|
throw new NullReferenceException(nameof(configuration.PropertiesChangedForResize));
|
||||||
if (configuration.RangeDaysDeltaTolerance is null || configuration.RangeDaysDeltaTolerance.Length != 3)
|
if (configuration.RangeDaysDeltaTolerance is null || configuration.RangeDaysDeltaTolerance.Length != 3)
|
||||||
throw new NullReferenceException(nameof(configuration.RangeDaysDeltaTolerance));
|
throw new NullReferenceException(nameof(configuration.RangeDaysDeltaTolerance));
|
||||||
if (configuration.RangeFaceAreaPermilleTolerance is null || configuration.RangeFaceAreaPermilleTolerance.Length != 3)
|
if (configuration.RangeFaceAreaTolerance is null || configuration.RangeFaceAreaTolerance.Length != 3)
|
||||||
throw new NullReferenceException(nameof(configuration.RangeFaceAreaPermilleTolerance));
|
throw new NullReferenceException(nameof(configuration.RangeFaceAreaTolerance));
|
||||||
if (configuration.RangeFaceConfidence is null || configuration.RangeFaceConfidence.Length != 3)
|
if (configuration.RangeFaceConfidence is null || configuration.RangeFaceConfidence.Length != 3)
|
||||||
throw new NullReferenceException(nameof(configuration.RangeFaceConfidence));
|
throw new NullReferenceException(nameof(configuration.RangeFaceConfidence));
|
||||||
if (configuration.RangeDistanceTolerance is null || configuration.RangeDistanceTolerance.Length != 3)
|
if (configuration.RangeDistanceTolerance is null || configuration.RangeDistanceTolerance.Length != 3)
|
||||||
@ -224,10 +230,12 @@ public class Configuration
|
|||||||
configuration.DistanceMoveUnableToMatch.Value,
|
configuration.DistanceMoveUnableToMatch.Value,
|
||||||
configuration.DistancePixelDistanceTolerance.Value,
|
configuration.DistancePixelDistanceTolerance.Value,
|
||||||
configuration.DistanceRenameToMatch.Value,
|
configuration.DistanceRenameToMatch.Value,
|
||||||
configuration.FaceAreaPermille.Value,
|
configuration.FaceAreaPermyriad.Value,
|
||||||
configuration.FaceConfidencePercent.Value,
|
configuration.FaceConfidencePercent.Value,
|
||||||
configuration.FaceDistanceHiddenImageFactor.Value,
|
configuration.FaceDistanceHiddenImageFactor.Value,
|
||||||
configuration.FaceDistancePermyriad.Value,
|
configuration.FaceDistancePermyriad.Value,
|
||||||
|
configuration.FocusDirectory,
|
||||||
|
configuration.FocusModel,
|
||||||
configuration.ForceFaceLastWriteTimeToCreationTime.Value,
|
configuration.ForceFaceLastWriteTimeToCreationTime.Value,
|
||||||
configuration.ForceMetadataLastWriteTimeToCreationTime.Value,
|
configuration.ForceMetadataLastWriteTimeToCreationTime.Value,
|
||||||
configuration.ForceResizeLastWriteTimeToCreationTime.Value,
|
configuration.ForceResizeLastWriteTimeToCreationTime.Value,
|
||||||
@ -263,7 +271,7 @@ public class Configuration
|
|||||||
configuration.PropertiesChangedForResize.Value,
|
configuration.PropertiesChangedForResize.Value,
|
||||||
configuration.RangeDaysDeltaTolerance,
|
configuration.RangeDaysDeltaTolerance,
|
||||||
configuration.RangeDistanceTolerance,
|
configuration.RangeDistanceTolerance,
|
||||||
configuration.RangeFaceAreaPermilleTolerance,
|
configuration.RangeFaceAreaTolerance,
|
||||||
configuration.RangeFaceConfidence,
|
configuration.RangeFaceConfidence,
|
||||||
configuration.Reverse.Value,
|
configuration.Reverse.Value,
|
||||||
configuration.SaveFaceDistancesForOutputResolutions,
|
configuration.SaveFaceDistancesForOutputResolutions,
|
||||||
|
@ -17,10 +17,12 @@ public class Configuration
|
|||||||
public bool DistanceMoveUnableToMatch { init; get; }
|
public bool DistanceMoveUnableToMatch { init; get; }
|
||||||
public int DistancePixelDistanceTolerance { init; get; }
|
public int DistancePixelDistanceTolerance { init; get; }
|
||||||
public bool DistanceRenameToMatch { init; get; }
|
public bool DistanceRenameToMatch { init; get; }
|
||||||
public int FaceAreaPermille { init; get; }
|
public int FaceAreaPermyriad { init; get; }
|
||||||
public int FaceDistanceHiddenImageFactor { init; get; }
|
public int FaceDistanceHiddenImageFactor { init; get; }
|
||||||
public int FaceConfidencePercent { init; get; }
|
public int FaceConfidencePercent { init; get; }
|
||||||
public int FaceDistancePermyriad { init; get; }
|
public int FaceDistancePermyriad { init; get; }
|
||||||
|
public string FocusDirectory { init; get; }
|
||||||
|
public string FocusModel { init; get; }
|
||||||
public bool ForceFaceLastWriteTimeToCreationTime { init; get; }
|
public bool ForceFaceLastWriteTimeToCreationTime { init; get; }
|
||||||
public bool ForceMetadataLastWriteTimeToCreationTime { init; get; }
|
public bool ForceMetadataLastWriteTimeToCreationTime { init; get; }
|
||||||
public bool ForceResizeLastWriteTimeToCreationTime { init; get; }
|
public bool ForceResizeLastWriteTimeToCreationTime { init; get; }
|
||||||
@ -55,9 +57,9 @@ public class Configuration
|
|||||||
public bool PropertiesChangedForMetadata { init; get; }
|
public bool PropertiesChangedForMetadata { init; get; }
|
||||||
public bool PropertiesChangedForResize { init; get; }
|
public bool PropertiesChangedForResize { init; get; }
|
||||||
public int[] RangeDaysDeltaTolerance { init; get; }
|
public int[] RangeDaysDeltaTolerance { init; get; }
|
||||||
public double[] RangeDistanceTolerance { init; get; }
|
public float[] RangeDistanceTolerance { init; get; }
|
||||||
public int[] RangeFaceAreaPermilleTolerance { init; get; }
|
public float[] RangeFaceAreaTolerance { init; get; }
|
||||||
public double[] RangeFaceConfidence { init; get; }
|
public float[] RangeFaceConfidence { init; get; }
|
||||||
public bool Reverse { init; get; }
|
public bool Reverse { init; get; }
|
||||||
public string[] SaveFaceDistancesForOutputResolutions { init; get; }
|
public string[] SaveFaceDistancesForOutputResolutions { init; get; }
|
||||||
public string[] SaveFaceLandmarkForOutputResolutions { init; get; }
|
public string[] SaveFaceLandmarkForOutputResolutions { init; get; }
|
||||||
@ -87,10 +89,12 @@ public class Configuration
|
|||||||
bool distanceMoveUnableToMatch,
|
bool distanceMoveUnableToMatch,
|
||||||
int distancePixelDistanceTolerance,
|
int distancePixelDistanceTolerance,
|
||||||
bool distanceRenameToMatch,
|
bool distanceRenameToMatch,
|
||||||
int faceAreaPermille,
|
int faceAreaPermyriad,
|
||||||
int faceConfidencePercent,
|
int faceConfidencePercent,
|
||||||
int faceDistanceHiddenImageFactor,
|
int faceDistanceHiddenImageFactor,
|
||||||
int faceDistancePermyriad,
|
int faceDistancePermyriad,
|
||||||
|
string focusDirectory,
|
||||||
|
string focusModel,
|
||||||
bool forceFaceLastWriteTimeToCreationTime,
|
bool forceFaceLastWriteTimeToCreationTime,
|
||||||
bool forceMetadataLastWriteTimeToCreationTime,
|
bool forceMetadataLastWriteTimeToCreationTime,
|
||||||
bool forceResizeLastWriteTimeToCreationTime,
|
bool forceResizeLastWriteTimeToCreationTime,
|
||||||
@ -125,9 +129,9 @@ public class Configuration
|
|||||||
bool propertiesChangedForMetadata,
|
bool propertiesChangedForMetadata,
|
||||||
bool propertiesChangedForResize,
|
bool propertiesChangedForResize,
|
||||||
int[] rangeDaysDeltaTolerance,
|
int[] rangeDaysDeltaTolerance,
|
||||||
double[] rangeDistanceTolerance,
|
float[] rangeDistanceTolerance,
|
||||||
int[] rangeFaceAreaPermilleTolerance,
|
float[] rangeFaceAreaPermyriadTolerance,
|
||||||
double[] rangeFaceConfidence,
|
float[] rangeFaceConfidence,
|
||||||
bool reverse,
|
bool reverse,
|
||||||
string[] saveFaceDistancesForOutputResolutions,
|
string[] saveFaceDistancesForOutputResolutions,
|
||||||
string[] saveFaceLandmarkForOutputResolutions,
|
string[] saveFaceLandmarkForOutputResolutions,
|
||||||
@ -156,10 +160,12 @@ public class Configuration
|
|||||||
DistanceMoveUnableToMatch = distanceMoveUnableToMatch;
|
DistanceMoveUnableToMatch = distanceMoveUnableToMatch;
|
||||||
DistancePixelDistanceTolerance = distancePixelDistanceTolerance;
|
DistancePixelDistanceTolerance = distancePixelDistanceTolerance;
|
||||||
DistanceRenameToMatch = distanceRenameToMatch;
|
DistanceRenameToMatch = distanceRenameToMatch;
|
||||||
FaceAreaPermille = faceAreaPermille;
|
FaceAreaPermyriad = faceAreaPermyriad;
|
||||||
FaceDistanceHiddenImageFactor = faceDistanceHiddenImageFactor;
|
FaceDistanceHiddenImageFactor = faceDistanceHiddenImageFactor;
|
||||||
FaceConfidencePercent = faceConfidencePercent;
|
FaceConfidencePercent = faceConfidencePercent;
|
||||||
FaceDistancePermyriad = faceDistancePermyriad;
|
FaceDistancePermyriad = faceDistancePermyriad;
|
||||||
|
FocusDirectory = focusDirectory;
|
||||||
|
FocusModel = focusModel;
|
||||||
ForceFaceLastWriteTimeToCreationTime = forceFaceLastWriteTimeToCreationTime;
|
ForceFaceLastWriteTimeToCreationTime = forceFaceLastWriteTimeToCreationTime;
|
||||||
ForceMetadataLastWriteTimeToCreationTime = forceMetadataLastWriteTimeToCreationTime;
|
ForceMetadataLastWriteTimeToCreationTime = forceMetadataLastWriteTimeToCreationTime;
|
||||||
ForceResizeLastWriteTimeToCreationTime = forceResizeLastWriteTimeToCreationTime;
|
ForceResizeLastWriteTimeToCreationTime = forceResizeLastWriteTimeToCreationTime;
|
||||||
@ -194,7 +200,7 @@ public class Configuration
|
|||||||
PropertiesChangedForMetadata = propertiesChangedForMetadata;
|
PropertiesChangedForMetadata = propertiesChangedForMetadata;
|
||||||
PropertiesChangedForResize = propertiesChangedForResize;
|
PropertiesChangedForResize = propertiesChangedForResize;
|
||||||
RangeDaysDeltaTolerance = rangeDaysDeltaTolerance;
|
RangeDaysDeltaTolerance = rangeDaysDeltaTolerance;
|
||||||
RangeFaceAreaPermilleTolerance = rangeFaceAreaPermilleTolerance;
|
RangeFaceAreaTolerance = rangeFaceAreaPermyriadTolerance;
|
||||||
RangeFaceConfidence = rangeFaceConfidence;
|
RangeFaceConfidence = rangeFaceConfidence;
|
||||||
RangeDistanceTolerance = rangeDistanceTolerance;
|
RangeDistanceTolerance = rangeDistanceTolerance;
|
||||||
Reverse = reverse;
|
Reverse = reverse;
|
||||||
|
@ -77,7 +77,7 @@ internal class F_Random
|
|||||||
{
|
{
|
||||||
if (mapping.MappingFromItem.ImageFileHolder.DirectoryName is null)
|
if (mapping.MappingFromItem.ImageFileHolder.DirectoryName is null)
|
||||||
continue;
|
continue;
|
||||||
if (mapping.MappingFromItem.IsIgnoreRelativePath)
|
if (mapping.MappingFromFilter.IsIgnoreRelativePath is not null && mapping.MappingFromFilter.IsIgnoreRelativePath.Value)
|
||||||
continue;
|
continue;
|
||||||
relativePaths.Add(mapping.MappingFromItem.RelativePath);
|
relativePaths.Add(mapping.MappingFromItem.RelativePath);
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,10 @@
|
|||||||
"DistanceMoveUnableToMatch": true,
|
"DistanceMoveUnableToMatch": true,
|
||||||
"xFaceDistanceHiddenImageFactor": 2,
|
"xFaceDistanceHiddenImageFactor": 2,
|
||||||
"FaceDistanceHiddenImageFactor": 3,
|
"FaceDistanceHiddenImageFactor": 3,
|
||||||
|
"FocusDirectory": "",
|
||||||
|
"xFocusDirectory": "/Hawaii 2022",
|
||||||
|
"FocusModel": "",
|
||||||
|
"xxFocusModel": "NIKON D3400",
|
||||||
"PersonCharactersCopyCount": 0,
|
"PersonCharactersCopyCount": 0,
|
||||||
"xPersonCharactersCopyCount": 2,
|
"xPersonCharactersCopyCount": 2,
|
||||||
"xRootDirectory": "D:/Tmp/phares/Pictures",
|
"xRootDirectory": "D:/Tmp/phares/Pictures",
|
||||||
@ -39,22 +43,22 @@
|
|||||||
"PropertyContentCollectionFiles": [],
|
"PropertyContentCollectionFiles": [],
|
||||||
"RangeDaysDeltaTolerance": [
|
"RangeDaysDeltaTolerance": [
|
||||||
0,
|
0,
|
||||||
4000,
|
7000,
|
||||||
7300
|
7300
|
||||||
],
|
],
|
||||||
"RangeDistanceTolerance": [
|
"RangeDistanceTolerance": [
|
||||||
0,
|
0,
|
||||||
0.4,
|
0.65,
|
||||||
1.2
|
1.8
|
||||||
],
|
],
|
||||||
"RangeFaceAreaPermilleTolerance": [
|
"RangeFaceAreaTolerance": [
|
||||||
0,
|
0,
|
||||||
1,
|
0.0001,
|
||||||
1000
|
1
|
||||||
],
|
],
|
||||||
"RangeFaceConfidence": [
|
"RangeFaceConfidence": [
|
||||||
0,
|
0,
|
||||||
0.2,
|
0.8,
|
||||||
1.6
|
1.6
|
||||||
],
|
],
|
||||||
"SaveFaceDistancesForOutputResolutions": [
|
"SaveFaceDistancesForOutputResolutions": [
|
||||||
|
@ -59,7 +59,7 @@
|
|||||||
"DistanceMoveUnableToMatch": false,
|
"DistanceMoveUnableToMatch": false,
|
||||||
"DistancePixelDistanceTolerance": 1,
|
"DistancePixelDistanceTolerance": 1,
|
||||||
"DistanceRenameToMatch": false,
|
"DistanceRenameToMatch": false,
|
||||||
"FaceAreaPermille": 1000,
|
"FaceAreaPermyriad": 10000,
|
||||||
"FaceDistanceHiddenImageFactor": 2,
|
"FaceDistanceHiddenImageFactor": 2,
|
||||||
"FaceConfidencePercent": 100,
|
"FaceConfidencePercent": 100,
|
||||||
"FaceDistancePermyriad": 10000,
|
"FaceDistancePermyriad": 10000,
|
||||||
@ -68,6 +68,8 @@
|
|||||||
"ForceMetadataLastWriteTimeToCreationTime": false,
|
"ForceMetadataLastWriteTimeToCreationTime": false,
|
||||||
"ForcePropertyLastWriteTimeToCreationTime": false,
|
"ForcePropertyLastWriteTimeToCreationTime": false,
|
||||||
"ForceResizeLastWriteTimeToCreationTime": false,
|
"ForceResizeLastWriteTimeToCreationTime": false,
|
||||||
|
"FocusDirectory": "",
|
||||||
|
"FocusModel": "",
|
||||||
"LocationDigits": 9,
|
"LocationDigits": 9,
|
||||||
"LocationFactor": 10000,
|
"LocationFactor": 10000,
|
||||||
"MappingDefaultName": "John Doe~25",
|
"MappingDefaultName": "John Doe~25",
|
||||||
@ -138,10 +140,10 @@
|
|||||||
0.4,
|
0.4,
|
||||||
0.6
|
0.6
|
||||||
],
|
],
|
||||||
"RangeFaceAreaPermilleTolerance": [
|
"RangeFaceAreaTolerance": [
|
||||||
0,
|
0,
|
||||||
10,
|
0.001,
|
||||||
1000
|
1
|
||||||
],
|
],
|
||||||
"RangeFaceConfidence": [
|
"RangeFaceConfidence": [
|
||||||
0,
|
0,
|
||||||
|
@ -32,7 +32,7 @@ public class Configuration
|
|||||||
char[] personCharacters,
|
char[] personCharacters,
|
||||||
int personCharactersCopyCount,
|
int personCharactersCopyCount,
|
||||||
int[] rangeDaysDeltaTolerance,
|
int[] rangeDaysDeltaTolerance,
|
||||||
double[] rangeDistanceTolerance,
|
float[] rangeDistanceTolerance,
|
||||||
bool saveSortingWithoutPerson,
|
bool saveSortingWithoutPerson,
|
||||||
string[] skipNotSkipDirectories,
|
string[] skipNotSkipDirectories,
|
||||||
int sortingMaximumPerKey,
|
int sortingMaximumPerKey,
|
||||||
|
@ -1123,7 +1123,8 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
|
|||||||
directoryName = Path.GetFileName(mapping.MappingFromItem.ImageFileHolder.DirectoryName);
|
directoryName = Path.GetFileName(mapping.MappingFromItem.ImageFileHolder.DirectoryName);
|
||||||
if (!string.IsNullOrEmpty(model) && !string.IsNullOrEmpty(model.Trim()))
|
if (!string.IsNullOrEmpty(model) && !string.IsNullOrEmpty(model.Trim()))
|
||||||
{
|
{
|
||||||
model = Regex.Replace(model, @"[\\,\/,\:,\*,\?,\"",\<,\>,\|]", "_");
|
// Remove-Item -LiteralPath "\\?\D:\Tmp\a\EX-Z70 "
|
||||||
|
model = Regex.Replace(model.Trim(), @"[\\,\/,\:,\*,\?,\"",\<,\>,\|]", "_");
|
||||||
directory = Path.Combine($"{eDistanceContentDirectory}---", "Model Shortcuts", model, directoryName);
|
directory = Path.Combine($"{eDistanceContentDirectory}---", "Model Shortcuts", model, directoryName);
|
||||||
fileName = Path.Combine(directory, $"{mapping.MappingFromItem.ImageFileHolder.Name}.lnk");
|
fileName = Path.Combine(directory, $"{mapping.MappingFromItem.ImageFileHolder.Name}.lnk");
|
||||||
results.Add(new(mapping.MappingFromItem.ImageFileHolder.FullName, directory, mapping.MappingFromItem.MinimumDateTime, fileName, mapping.MappingFromLocation.DeterministicHashCodeKey, MakeAllHidden: false));
|
results.Add(new(mapping.MappingFromItem.ImageFileHolder.FullName, directory, mapping.MappingFromItem.MinimumDateTime, fileName, mapping.MappingFromLocation.DeterministicHashCodeKey, MakeAllHidden: false));
|
||||||
|
@ -10,18 +10,16 @@ public class MappingFromItem : Properties.IMappingFromItem
|
|||||||
public int Id { init; get; }
|
public int Id { init; get; }
|
||||||
public FileHolder ImageFileHolder { init; get; }
|
public FileHolder ImageFileHolder { init; get; }
|
||||||
public bool? IsWrongYear { init; get; }
|
public bool? IsWrongYear { init; get; }
|
||||||
public bool IsIgnoreRelativePath { init; get; }
|
|
||||||
public DateTime MinimumDateTime { init; get; }
|
public DateTime MinimumDateTime { init; get; }
|
||||||
public string RelativePath { init; get; }
|
public string RelativePath { init; get; }
|
||||||
public FileHolder ResizedFileHolder { init; get; }
|
public FileHolder ResizedFileHolder { init; get; }
|
||||||
|
|
||||||
[JsonConstructor]
|
[JsonConstructor]
|
||||||
public MappingFromItem(DateTime[] containerDateTimes, int id, FileHolder imageFileHolder, bool isIgnoreRelativePath, bool? isWrongYear, DateTime minimumDateTime, string relativePath, FileHolder resizedFileHolder)
|
public MappingFromItem(DateTime[] containerDateTimes, int id, FileHolder imageFileHolder, bool? isWrongYear, DateTime minimumDateTime, string relativePath, FileHolder resizedFileHolder)
|
||||||
{
|
{
|
||||||
ContainerDateTimes = containerDateTimes;
|
ContainerDateTimes = containerDateTimes;
|
||||||
Id = id;
|
Id = id;
|
||||||
ImageFileHolder = imageFileHolder;
|
ImageFileHolder = imageFileHolder;
|
||||||
IsIgnoreRelativePath = isIgnoreRelativePath;
|
|
||||||
IsWrongYear = isWrongYear;
|
IsWrongYear = isWrongYear;
|
||||||
MinimumDateTime = minimumDateTime;
|
MinimumDateTime = minimumDateTime;
|
||||||
RelativePath = relativePath;
|
RelativePath = relativePath;
|
||||||
@ -34,7 +32,7 @@ public class MappingFromItem : Properties.IMappingFromItem
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static MappingFromItem GetMappingFromItem(DateTime[] containerDateTimes, Item item, FileHolder? resizedFileHolder, bool isIgnoreRelativePath)
|
internal static MappingFromItem GetMappingFromItem(DateTime[] containerDateTimes, Item item, FileHolder? resizedFileHolder)
|
||||||
{
|
{
|
||||||
MappingFromItem result;
|
MappingFromItem result;
|
||||||
bool? isWrongYear;
|
bool? isWrongYear;
|
||||||
@ -45,7 +43,7 @@ public class MappingFromItem : Properties.IMappingFromItem
|
|||||||
throw new NotSupportedException();
|
throw new NotSupportedException();
|
||||||
minimumDateTime = Stateless.Methods.IProperty.GetMinimumDateTime(item.Property);
|
minimumDateTime = Stateless.Methods.IProperty.GetMinimumDateTime(item.Property);
|
||||||
(isWrongYear, _) = item.Property.IsWrongYear(item.ImageFileHolder, minimumDateTime);
|
(isWrongYear, _) = item.Property.IsWrongYear(item.ImageFileHolder, minimumDateTime);
|
||||||
result = new(containerDateTimes, item.Property.Id.Value, item.ImageFileHolder, isIgnoreRelativePath, isWrongYear, minimumDateTime, item.RelativePath, resizedFileHolder);
|
result = new(containerDateTimes, item.Property.Id.Value, item.ImageFileHolder, isWrongYear, minimumDateTime, item.RelativePath, resizedFileHolder);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -54,15 +52,15 @@ public class MappingFromItem : Properties.IMappingFromItem
|
|||||||
public class MappingFromLocation : Properties.IMappingFromLocation
|
public class MappingFromLocation : Properties.IMappingFromLocation
|
||||||
{
|
{
|
||||||
|
|
||||||
public int AreaPermille { init; get; }
|
public int AreaPermyriad { init; get; }
|
||||||
public int ConfidencePercent { init; get; }
|
public int ConfidencePercent { init; get; }
|
||||||
public string DeterministicHashCodeKey { init; get; }
|
public string DeterministicHashCodeKey { init; get; }
|
||||||
public int NormalizedRectangle { init; get; }
|
public int NormalizedRectangle { init; get; }
|
||||||
|
|
||||||
[JsonConstructor]
|
[JsonConstructor]
|
||||||
public MappingFromLocation(int areaPermille, int confidencePercent, string deterministicHashCodeKey, int normalizedRectangle)
|
public MappingFromLocation(int areaPermyriad, int confidencePercent, string deterministicHashCodeKey, int normalizedRectangle)
|
||||||
{
|
{
|
||||||
AreaPermille = areaPermille;
|
AreaPermyriad = areaPermyriad;
|
||||||
ConfidencePercent = confidencePercent;
|
ConfidencePercent = confidencePercent;
|
||||||
DeterministicHashCodeKey = deterministicHashCodeKey;
|
DeterministicHashCodeKey = deterministicHashCodeKey;
|
||||||
NormalizedRectangle = normalizedRectangle;
|
NormalizedRectangle = normalizedRectangle;
|
||||||
@ -76,6 +74,29 @@ public class MappingFromLocation : Properties.IMappingFromLocation
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class MappingFromFilter : Properties.IMappingFromFilter
|
||||||
|
{
|
||||||
|
|
||||||
|
public bool? IsFocusModel { init; get; }
|
||||||
|
public bool? IsFocusRelativePath { init; get; }
|
||||||
|
public bool? IsIgnoreRelativePath { init; get; }
|
||||||
|
|
||||||
|
[JsonConstructor]
|
||||||
|
public MappingFromFilter(bool? isFocusModel, bool? isFocusRelativePath, bool? isIgnoreRelativePath)
|
||||||
|
{
|
||||||
|
IsFocusModel = isFocusModel;
|
||||||
|
IsFocusRelativePath = isFocusRelativePath;
|
||||||
|
IsIgnoreRelativePath = isIgnoreRelativePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true });
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public class MappingFromPhotoPrism : Properties.IMappingFromPhotoPrism
|
public class MappingFromPhotoPrism : Properties.IMappingFromPhotoPrism
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -125,6 +146,7 @@ public class Mapping : Properties.IMapping
|
|||||||
protected SortingContainer? _SortingContainer;
|
protected SortingContainer? _SortingContainer;
|
||||||
public int? By => _By;
|
public int? By => _By;
|
||||||
public MappingFromItem MappingFromItem { init; get; }
|
public MappingFromItem MappingFromItem { init; get; }
|
||||||
|
public MappingFromFilter MappingFromFilter { init; get; }
|
||||||
public MappingFromLocation? MappingFromLocation { init; get; }
|
public MappingFromLocation? MappingFromLocation { init; get; }
|
||||||
public List<MappingFromPhotoPrism>? MappingFromPhotoPrismCollection { init; get; }
|
public List<MappingFromPhotoPrism>? MappingFromPhotoPrismCollection { init; get; }
|
||||||
public MappingFromPerson? MappingFromPerson => _MappingFromPerson;
|
public MappingFromPerson? MappingFromPerson => _MappingFromPerson;
|
||||||
@ -132,19 +154,20 @@ public class Mapping : Properties.IMapping
|
|||||||
public SortingContainer? SortingContainer => _SortingContainer;
|
public SortingContainer? SortingContainer => _SortingContainer;
|
||||||
|
|
||||||
[JsonConstructor]
|
[JsonConstructor]
|
||||||
public Mapping(int? by, MappingFromItem mappingFromItem, MappingFromLocation? mappingFromLocation, List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection, MappingFromPerson? mappingFromPerson, string? segmentC, SortingContainer? sortingContainer)
|
public Mapping(int? by, MappingFromItem mappingFromItem, MappingFromFilter mappingFromFilter, MappingFromLocation? mappingFromLocation, List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection, MappingFromPerson? mappingFromPerson, string? segmentC, SortingContainer? sortingContainer)
|
||||||
{
|
{
|
||||||
_By = by;
|
_By = by;
|
||||||
_SegmentC = segmentC;
|
_SegmentC = segmentC;
|
||||||
MappingFromItem = mappingFromItem;
|
MappingFromItem = mappingFromItem;
|
||||||
|
MappingFromFilter = mappingFromFilter;
|
||||||
MappingFromLocation = mappingFromLocation;
|
MappingFromLocation = mappingFromLocation;
|
||||||
MappingFromPhotoPrismCollection = mappingFromPhotoPrismCollection;
|
MappingFromPhotoPrismCollection = mappingFromPhotoPrismCollection;
|
||||||
_MappingFromPerson = mappingFromPerson;
|
_MappingFromPerson = mappingFromPerson;
|
||||||
_SortingContainer = sortingContainer;
|
_SortingContainer = sortingContainer;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Mapping(MappingFromItem mappingFromItem, MappingFromLocation? mappingFromLocation, List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection) :
|
public Mapping(MappingFromItem mappingFromItem, MappingFromFilter mappingFromFilter, MappingFromLocation? mappingFromLocation, List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection) :
|
||||||
this(null, mappingFromItem, mappingFromLocation, mappingFromPhotoPrismCollection, null, null, null)
|
this(null, mappingFromItem, mappingFromFilter, mappingFromLocation, mappingFromPhotoPrismCollection, null, null, null)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
|
@ -3,7 +3,7 @@ namespace View_by_Distance.Shared.Models.Methods;
|
|||||||
public interface IDistanceLimits
|
public interface IDistanceLimits
|
||||||
{
|
{
|
||||||
|
|
||||||
public double FaceAreaPermille { init; get; }
|
public double FaceAreaPermyriad { init; get; }
|
||||||
public double RangeDaysDeltaTolerance { init; get; }
|
public double RangeDaysDeltaTolerance { init; get; }
|
||||||
public double FaceConfidencePercent { init; get; }
|
public double FaceConfidencePercent { init; get; }
|
||||||
public double FaceDistancePermyriad { init; get; }
|
public double FaceDistancePermyriad { init; get; }
|
||||||
|
@ -6,7 +6,6 @@ public interface IMappingFromItem
|
|||||||
public DateTime[] ContainerDateTimes { init; get; }
|
public DateTime[] ContainerDateTimes { init; get; }
|
||||||
public int Id { init; get; }
|
public int Id { init; get; }
|
||||||
public FileHolder ImageFileHolder { init; get; }
|
public FileHolder ImageFileHolder { init; get; }
|
||||||
public bool IsIgnoreRelativePath { init; get; }
|
|
||||||
public bool? IsWrongYear { init; get; }
|
public bool? IsWrongYear { init; get; }
|
||||||
public DateTime MinimumDateTime { init; get; }
|
public DateTime MinimumDateTime { init; get; }
|
||||||
public string RelativePath { init; get; }
|
public string RelativePath { init; get; }
|
||||||
@ -14,10 +13,19 @@ public interface IMappingFromItem
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public interface IMappingFromFilter
|
||||||
|
{
|
||||||
|
|
||||||
|
public bool? IsFocusModel { init; get; }
|
||||||
|
public bool? IsFocusRelativePath { init; get; }
|
||||||
|
public bool? IsIgnoreRelativePath { init; get; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public interface IMappingFromLocation
|
public interface IMappingFromLocation
|
||||||
{
|
{
|
||||||
|
|
||||||
public int AreaPermille { init; get; }
|
public int AreaPermyriad { init; get; }
|
||||||
public int ConfidencePercent { init; get; }
|
public int ConfidencePercent { init; get; }
|
||||||
public string DeterministicHashCodeKey { init; get; }
|
public string DeterministicHashCodeKey { init; get; }
|
||||||
public int NormalizedRectangle { init; get; }
|
public int NormalizedRectangle { init; get; }
|
||||||
|
@ -50,9 +50,9 @@ public interface ILocation
|
|||||||
static string GetLeftPadded(int locationDigits, string value) =>
|
static string GetLeftPadded(int locationDigits, string value) =>
|
||||||
Location.GetLeftPadded(locationDigits, value);
|
Location.GetLeftPadded(locationDigits, value);
|
||||||
|
|
||||||
int TestStatic_GetConfidencePercent(int faceConfidencePercent, double[] rangeFaceConfidence, double confidence) =>
|
int TestStatic_GetConfidencePercent(int faceConfidencePercent, float[] rangeFaceConfidence, double confidence) =>
|
||||||
GetConfidencePercent(faceConfidencePercent, rangeFaceConfidence, confidence);
|
GetConfidencePercent(faceConfidencePercent, rangeFaceConfidence, confidence);
|
||||||
static int GetConfidencePercent(int faceConfidencePercent, double[] rangeFaceConfidence, double confidence) =>
|
static int GetConfidencePercent(int faceConfidencePercent, float[] rangeFaceConfidence, double confidence) =>
|
||||||
Location.GetConfidencePercent(faceConfidencePercent, rangeFaceConfidence, confidence);
|
Location.GetConfidencePercent(faceConfidencePercent, rangeFaceConfidence, confidence);
|
||||||
|
|
||||||
string TestStatic_GetLeftPadded(int locationDigits, int value) =>
|
string TestStatic_GetLeftPadded(int locationDigits, int value) =>
|
||||||
|
@ -8,20 +8,20 @@ public interface IMapping
|
|||||||
static (string?, string?, string?, bool?) GetSegments(string facesFileNameExtension, string fileName)
|
static (string?, string?, string?, bool?) GetSegments(string facesFileNameExtension, string fileName)
|
||||||
=> Mapping.GetSegments(facesFileNameExtension, fileName);
|
=> Mapping.GetSegments(facesFileNameExtension, fileName);
|
||||||
|
|
||||||
int TestStatic_GetAreaPermille(int faceAreaPermille, int height, Models.Location location, int width)
|
int TestStatic_GetAreaPermyriad(int faceAreaPermyriad, int height, Models.Location location, int width)
|
||||||
=> GetAreaPermille(faceAreaPermille, height, location, width);
|
=> GetAreaPermyriad(faceAreaPermyriad, height, location, width);
|
||||||
static int GetAreaPermille(int faceAreaPermille, int height, Models.Location location, int width)
|
static int GetAreaPermyriad(int faceAreaPermyriad, int height, Models.Location location, int width)
|
||||||
=> Mapping.GetAreaPermille(faceAreaPermille, location.Bottom, height, location.Left, location.Right, location.Top, width);
|
=> Mapping.GetAreaPermyriad(faceAreaPermyriad, location.Bottom, height, location.Left, location.Right, location.Top, width);
|
||||||
|
|
||||||
int TestStatic_GetAreaPermille(int faceAreaPermille, int bottom, int height, int left, int right, int top, int width)
|
int TestStatic_GetAreaPermyriad(int faceAreaPermyriad, int bottom, int height, int left, int right, int top, int width)
|
||||||
=> GetAreaPermille(faceAreaPermille, bottom, height, left, right, top, width);
|
=> GetAreaPermyriad(faceAreaPermyriad, bottom, height, left, right, top, width);
|
||||||
static int GetAreaPermille(int faceAreaPermille, int bottom, int height, int left, int right, int top, int width)
|
static int GetAreaPermyriad(int faceAreaPermyriad, int bottom, int height, int left, int right, int top, int width)
|
||||||
=> Mapping.GetAreaPermille(faceAreaPermille, bottom, height, left, right, top, width);
|
=> Mapping.GetAreaPermyriad(faceAreaPermyriad, bottom, height, left, right, top, width);
|
||||||
|
|
||||||
int TestStatic_GetAreaPermille(int faceAreaPermille, Models.Location location, Models.OutputResolution outputResolution)
|
int TestStatic_GetAreaPermyriad(int faceAreaPermyriad, Models.Location location, Models.OutputResolution outputResolution)
|
||||||
=> GetAreaPermille(faceAreaPermille, location, outputResolution);
|
=> GetAreaPermyriad(faceAreaPermyriad, location, outputResolution);
|
||||||
static int GetAreaPermille(int faceAreaPermille, Models.Location location, Models.OutputResolution outputResolution)
|
static int GetAreaPermyriad(int faceAreaPermyriad, Models.Location location, Models.OutputResolution outputResolution)
|
||||||
=> Mapping.GetAreaPermille(faceAreaPermille, location.Bottom, outputResolution.Height, location.Left, location.Right, location.Top, outputResolution.Width);
|
=> Mapping.GetAreaPermyriad(faceAreaPermyriad, location.Bottom, outputResolution.Height, location.Left, location.Right, location.Top, outputResolution.Width);
|
||||||
|
|
||||||
string TestStatic_GetDeterministicHashCodeKey(int id, Models.Location location, int locationDigits, Models.OutputResolution outputResolution)
|
string TestStatic_GetDeterministicHashCodeKey(int id, Models.Location location, int locationDigits, Models.OutputResolution outputResolution)
|
||||||
=> GetDeterministicHashCodeKey(id, location, locationDigits, outputResolution);
|
=> GetDeterministicHashCodeKey(id, location, locationDigits, outputResolution);
|
||||||
|
@ -3,19 +3,19 @@ namespace View_by_Distance.Shared.Models.Stateless.Methods;
|
|||||||
public interface IMappingFromItem
|
public interface IMappingFromItem
|
||||||
{ // ...
|
{ // ...
|
||||||
|
|
||||||
MappingFromItem TestStatic_GetMappingFromItem(DateTime[] containerDateTimes, Models.Item item, Models.FileHolder? resizedFileHolder, bool isIgnoreRelativePath)
|
MappingFromItem TestStatic_GetMappingFromItem(DateTime[] containerDateTimes, Models.Item item, Models.FileHolder? resizedFileHolder)
|
||||||
=> GetMappingFromItem(containerDateTimes, item, resizedFileHolder, isIgnoreRelativePath);
|
=> GetMappingFromItem(containerDateTimes, item, resizedFileHolder);
|
||||||
static MappingFromItem GetMappingFromItem(DateTime[] containerDateTimes, Models.Item item, Models.FileHolder? resizedFileHolder, bool isIgnoreRelativePath)
|
static MappingFromItem GetMappingFromItem(DateTime[] containerDateTimes, Models.Item item, Models.FileHolder? resizedFileHolder)
|
||||||
=> MappingFromItem.GetMappingFromItem(containerDateTimes, item, resizedFileHolder, isIgnoreRelativePath);
|
=> MappingFromItem.GetMappingFromItem(containerDateTimes, item, resizedFileHolder);
|
||||||
|
|
||||||
MappingFromItem TestStatic_GetMappingFromItem(DateTime[] containerDateTimes, Models.Item item, bool isIgnoreRelativePath)
|
MappingFromItem TestStatic_GetMappingFromItem(DateTime[] containerDateTimes, Models.Item item)
|
||||||
=> GetMappingFromItem(containerDateTimes, item, isIgnoreRelativePath);
|
=> GetMappingFromItem(containerDateTimes, item);
|
||||||
static MappingFromItem GetMappingFromItem(DateTime[] containerDateTimes, Models.Item item, bool isIgnoreRelativePath)
|
static MappingFromItem GetMappingFromItem(DateTime[] containerDateTimes, Models.Item item)
|
||||||
=> GetMappingFromItem(containerDateTimes, item, item.ResizedFileHolder, isIgnoreRelativePath);
|
=> GetMappingFromItem(containerDateTimes, item, item.ResizedFileHolder);
|
||||||
|
|
||||||
MappingFromItem TestStatic_GetMappingFromItem(Models.Item item, bool isIgnoreRelativePath)
|
MappingFromItem TestStatic_GetMappingFromItem(Models.Item item)
|
||||||
=> GetMappingFromItem(item, isIgnoreRelativePath);
|
=> GetMappingFromItem(item);
|
||||||
static MappingFromItem GetMappingFromItem(Models.Item item, bool isIgnoreRelativePath)
|
static MappingFromItem GetMappingFromItem(Models.Item item)
|
||||||
=> GetMappingFromItem(containerDateTimes: Array.Empty<DateTime>(), item, item.ResizedFileHolder, isIgnoreRelativePath);
|
=> GetMappingFromItem(containerDateTimes: Array.Empty<DateTime>(), item, item.ResizedFileHolder);
|
||||||
|
|
||||||
}
|
}
|
@ -132,7 +132,7 @@ internal abstract class Location
|
|||||||
return new(x, y);
|
return new(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static int GetConfidencePercent(int faceConfidencePercent, double[] rangeFaceConfidence, double confidence)
|
internal static int GetConfidencePercent(int faceConfidencePercent, float[] rangeFaceConfidence, double confidence)
|
||||||
{
|
{
|
||||||
int result = (int)(confidence / rangeFaceConfidence[1] * faceConfidencePercent);
|
int result = (int)(confidence / rangeFaceConfidence[1] * faceConfidencePercent);
|
||||||
return result;
|
return result;
|
||||||
|
@ -65,12 +65,12 @@ internal abstract class Mapping
|
|||||||
return new(id, normalizedRectangle);
|
return new(id, normalizedRectangle);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static int GetAreaPermille(int faceAreaPermille, int bottom, int height, int left, int right, int top, int width)
|
internal static int GetAreaPermyriad(int faceAreaPermyriad, int bottom, int height, int left, int right, int top, int width)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
double area = width * height;
|
double area = width * height;
|
||||||
double locationArea = (right - left) * (bottom - top);
|
double locationArea = (right - left) * (bottom - top);
|
||||||
result = (int)Math.Round(locationArea / area * faceAreaPermille, 0);
|
result = (int)Math.Round(locationArea / area * faceAreaPermyriad, 0);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -232,20 +232,20 @@ public partial class UnitTestCalculations
|
|||||||
}
|
}
|
||||||
|
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public void TestAreaPermille()
|
public void TestAreaPermyriad()
|
||||||
{
|
{
|
||||||
int faceAreaPermille = 1000;
|
int faceAreaPermyriad = 10000;
|
||||||
Location location;
|
Location location;
|
||||||
double confidence = 0.1D;
|
double confidence = 0.1D;
|
||||||
int areaPermille, left, top, right, bottom, width, height;
|
int areaPermyriad, left, top, right, bottom, width, height;
|
||||||
left = 0;
|
left = 0;
|
||||||
right = 100;
|
right = 100;
|
||||||
top = 0;
|
top = 0;
|
||||||
bottom = 100;
|
bottom = 100;
|
||||||
width = 100;
|
width = 100;
|
||||||
height = 100;
|
height = 100;
|
||||||
areaPermille = IMapping.GetAreaPermille(faceAreaPermille, bottom, height, left, right, top, width);
|
areaPermyriad = IMapping.GetAreaPermyriad(faceAreaPermyriad, bottom, height, left, right, top, width);
|
||||||
Assert.IsTrue(areaPermille == 1000);
|
Assert.IsTrue(areaPermyriad == 1000);
|
||||||
left = 0;
|
left = 0;
|
||||||
right = 50;
|
right = 50;
|
||||||
top = 0;
|
top = 0;
|
||||||
@ -253,8 +253,8 @@ public partial class UnitTestCalculations
|
|||||||
width = 100;
|
width = 100;
|
||||||
height = 100;
|
height = 100;
|
||||||
location = new(bottom, confidence, height, left, Shared.Models.Stateless.ILocation.Digits, Shared.Models.Stateless.ILocation.Factor, right, top, width, 1);
|
location = new(bottom, confidence, height, left, Shared.Models.Stateless.ILocation.Digits, Shared.Models.Stateless.ILocation.Factor, right, top, width, 1);
|
||||||
areaPermille = IMapping.GetAreaPermille(faceAreaPermille, height, location, width);
|
areaPermyriad = IMapping.GetAreaPermyriad(faceAreaPermyriad, height, location, width);
|
||||||
Assert.IsTrue(areaPermille == 250);
|
Assert.IsTrue(areaPermyriad == 250);
|
||||||
left = 0;
|
left = 0;
|
||||||
right = 25;
|
right = 25;
|
||||||
top = 0;
|
top = 0;
|
||||||
@ -263,8 +263,8 @@ public partial class UnitTestCalculations
|
|||||||
height = 100;
|
height = 100;
|
||||||
location = new(bottom, confidence, height, left, Shared.Models.Stateless.ILocation.Digits, Shared.Models.Stateless.ILocation.Factor, right, top, width, 1);
|
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);
|
OutputResolution outputResolution = new(height, 0, width);
|
||||||
areaPermille = IMapping.GetAreaPermille(faceAreaPermille, location, outputResolution);
|
areaPermyriad = IMapping.GetAreaPermyriad(faceAreaPermyriad, location, outputResolution);
|
||||||
Assert.IsTrue(areaPermille == 62);
|
Assert.IsTrue(areaPermyriad == 62);
|
||||||
}
|
}
|
||||||
|
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
@ -371,24 +371,24 @@ public partial class UnitTestCalculations
|
|||||||
public void TestGetConfidencePercent()
|
public void TestGetConfidencePercent()
|
||||||
{
|
{
|
||||||
int faceConfidencePercent = 100;
|
int faceConfidencePercent = 100;
|
||||||
double minimum, target, maximum, value, check;
|
float minimum, target, maximum, value, check;
|
||||||
minimum = 0.8f;
|
minimum = 0.8f;
|
||||||
target = 0.8f;
|
target = 0.8f;
|
||||||
maximum = int.MaxValue;
|
maximum = int.MaxValue;
|
||||||
value = 0f;
|
value = 0f;
|
||||||
check = ILocation.GetConfidencePercent(faceConfidencePercent, new double[] { minimum, target, maximum }, value);
|
check = ILocation.GetConfidencePercent(faceConfidencePercent, new float[] { minimum, target, maximum }, value);
|
||||||
Assert.IsTrue(check == 0);
|
Assert.IsTrue(check == 0);
|
||||||
target = 0.8f;
|
target = 0.8f;
|
||||||
value = 0.4f;
|
value = 0.4f;
|
||||||
check = ILocation.GetConfidencePercent(faceConfidencePercent, new double[] { minimum, target, maximum }, value);
|
check = ILocation.GetConfidencePercent(faceConfidencePercent, new float[] { minimum, target, maximum }, value);
|
||||||
Assert.IsTrue(check == 50);
|
Assert.IsTrue(check == 50);
|
||||||
target = 0.8f;
|
target = 0.8f;
|
||||||
value = 0.8f;
|
value = 0.8f;
|
||||||
check = ILocation.GetConfidencePercent(faceConfidencePercent, new double[] { minimum, target, maximum }, value);
|
check = ILocation.GetConfidencePercent(faceConfidencePercent, new float[] { minimum, target, maximum }, value);
|
||||||
Assert.IsTrue(check == 100);
|
Assert.IsTrue(check == 100);
|
||||||
target = 0.8f;
|
target = 0.8f;
|
||||||
value = 1.6f;
|
value = 1.6f;
|
||||||
check = ILocation.GetConfidencePercent(faceConfidencePercent, new double[] { minimum, target, maximum }, value);
|
check = ILocation.GetConfidencePercent(faceConfidencePercent, new float[] { minimum, target, maximum }, value);
|
||||||
Assert.IsTrue(check == 200);
|
Assert.IsTrue(check == 200);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -137,7 +137,6 @@ public class UnitTestResize
|
|||||||
bool reverse = false;
|
bool reverse = false;
|
||||||
FileHolder resizedFileHolder;
|
FileHolder resizedFileHolder;
|
||||||
List<string> parseExceptions = new();
|
List<string> parseExceptions = new();
|
||||||
const bool isIgnoreRelativePath = false;
|
|
||||||
Shared.Models.Property? property = null;
|
Shared.Models.Property? property = null;
|
||||||
const bool isValidImageFormatExtension = true;
|
const bool isValidImageFormatExtension = true;
|
||||||
Dictionary<string, int[]> outputResolutionToResize;
|
Dictionary<string, int[]> outputResolutionToResize;
|
||||||
@ -176,7 +175,7 @@ public class UnitTestResize
|
|||||||
throw new NullReferenceException(nameof(property));
|
throw new NullReferenceException(nameof(property));
|
||||||
resizedFileHolder = resize.GetResizedFileHolder(item);
|
resizedFileHolder = resize.GetResizedFileHolder(item);
|
||||||
item.SetResizedFileHolder(resize.FileNameExtension, resizedFileHolder);
|
item.SetResizedFileHolder(resize.FileNameExtension, resizedFileHolder);
|
||||||
MappingFromItem mappingFromItem = IMappingFromItem.GetMappingFromItem(item, isIgnoreRelativePath);
|
MappingFromItem mappingFromItem = IMappingFromItem.GetMappingFromItem(item);
|
||||||
(int _, metadataCollection) = metadata.GetMetadataCollection(subFileTuples, parseExceptions, mappingFromItem);
|
(int _, metadataCollection) = metadata.GetMetadataCollection(subFileTuples, parseExceptions, mappingFromItem);
|
||||||
outputResolutionToResize = resize.GetResizeKeyValuePairs(_Configuration.PropertyConfiguration, cResultsFullGroupDirectory, subFileTuples, parseExceptions, metadataCollection, item.Property, mappingFromItem);
|
outputResolutionToResize = resize.GetResizeKeyValuePairs(_Configuration.PropertyConfiguration, cResultsFullGroupDirectory, subFileTuples, parseExceptions, metadataCollection, item.Property, mappingFromItem);
|
||||||
Assert.IsNotNull(mappingFromItem.ResizedFileHolder);
|
Assert.IsNotNull(mappingFromItem.ResizedFileHolder);
|
||||||
|
@ -55,9 +55,9 @@ public class Configuration
|
|||||||
[Display(Name = "Properties Changed For Resize"), Required] public bool? PropertiesChangedForResize { 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 = "Property Configuration"), Required] public Property.Models.Configuration PropertyConfiguration { get; set; }
|
||||||
[Display(Name = "Sorting Days Delta Tolerance"), Required] public int[] RangeDaysDeltaTolerance { 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 = "Face Area Permille Tolerance"), Required] public float[] RangeFaceAreaTolerance { get; set; }
|
||||||
[Display(Name = "Location Minimum Confidence"), Required] public double[] RangeFaceConfidence { get; set; }
|
[Display(Name = "Location Minimum Confidence"), Required] public float[] RangeFaceConfidence { get; set; }
|
||||||
[Display(Name = "Face Distance Tolerance"), Required] public double[] RangeDistanceTolerance { get; set; }
|
[Display(Name = "Face Distance Tolerance"), Required] public float[] RangeDistanceTolerance { get; set; }
|
||||||
[Display(Name = "Reverse"), Required] public bool? Reverse { 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; }
|
[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 Full Year Of Random Files"), Required] public bool? SaveFullYearOfRandomFiles { get; set; }
|
||||||
@ -160,8 +160,8 @@ public class Configuration
|
|||||||
throw new NullReferenceException(nameof(configuration.PropertiesChangedForResize));
|
throw new NullReferenceException(nameof(configuration.PropertiesChangedForResize));
|
||||||
if (configuration.RangeDaysDeltaTolerance is null || configuration.RangeDaysDeltaTolerance.Length != 3)
|
if (configuration.RangeDaysDeltaTolerance is null || configuration.RangeDaysDeltaTolerance.Length != 3)
|
||||||
throw new NullReferenceException(nameof(configuration.RangeDaysDeltaTolerance));
|
throw new NullReferenceException(nameof(configuration.RangeDaysDeltaTolerance));
|
||||||
if (configuration.RangeFaceAreaPermilleTolerance is null || configuration.RangeFaceAreaPermilleTolerance.Length != 3)
|
if (configuration.RangeFaceAreaTolerance is null || configuration.RangeFaceAreaTolerance.Length != 3)
|
||||||
throw new NullReferenceException(nameof(configuration.RangeFaceAreaPermilleTolerance));
|
throw new NullReferenceException(nameof(configuration.RangeFaceAreaTolerance));
|
||||||
if (configuration.RangeFaceConfidence is null || configuration.RangeFaceConfidence.Length != 3)
|
if (configuration.RangeFaceConfidence is null || configuration.RangeFaceConfidence.Length != 3)
|
||||||
throw new NullReferenceException(nameof(configuration.RangeFaceConfidence));
|
throw new NullReferenceException(nameof(configuration.RangeFaceConfidence));
|
||||||
if (configuration.RangeDistanceTolerance is null || configuration.RangeDistanceTolerance.Length != 3)
|
if (configuration.RangeDistanceTolerance is null || configuration.RangeDistanceTolerance.Length != 3)
|
||||||
@ -233,7 +233,7 @@ public class Configuration
|
|||||||
configuration.PropertiesChangedForMetadata.Value,
|
configuration.PropertiesChangedForMetadata.Value,
|
||||||
configuration.PropertiesChangedForResize.Value,
|
configuration.PropertiesChangedForResize.Value,
|
||||||
configuration.RangeDaysDeltaTolerance,
|
configuration.RangeDaysDeltaTolerance,
|
||||||
configuration.RangeFaceAreaPermilleTolerance,
|
configuration.RangeFaceAreaTolerance,
|
||||||
configuration.RangeFaceConfidence,
|
configuration.RangeFaceConfidence,
|
||||||
configuration.RangeDistanceTolerance,
|
configuration.RangeDistanceTolerance,
|
||||||
configuration.Reverse.Value,
|
configuration.Reverse.Value,
|
||||||
|
@ -53,9 +53,9 @@ public class Configuration
|
|||||||
public bool PropertiesChangedForMetadata { init; get; }
|
public bool PropertiesChangedForMetadata { init; get; }
|
||||||
public bool PropertiesChangedForResize { init; get; }
|
public bool PropertiesChangedForResize { init; get; }
|
||||||
public int[] RangeDaysDeltaTolerance { init; get; }
|
public int[] RangeDaysDeltaTolerance { init; get; }
|
||||||
public int[] RangeFaceAreaPermilleTolerance { init; get; }
|
public float[] RangeFaceAreaTolerance { init; get; }
|
||||||
public double[] RangeFaceConfidence { init; get; }
|
public float[] RangeFaceConfidence { init; get; }
|
||||||
public double[] RangeDistanceTolerance { init; get; }
|
public float[] RangeDistanceTolerance { init; get; }
|
||||||
public bool Reverse { init; get; }
|
public bool Reverse { init; get; }
|
||||||
public string[] SaveFaceLandmarkForOutputResolutions { init; get; }
|
public string[] SaveFaceLandmarkForOutputResolutions { init; get; }
|
||||||
public bool SaveFullYearOfRandomFiles { init; get; }
|
public bool SaveFullYearOfRandomFiles { init; get; }
|
||||||
@ -115,9 +115,9 @@ public class Configuration
|
|||||||
bool propertiesChangedForMetadata,
|
bool propertiesChangedForMetadata,
|
||||||
bool propertiesChangedForResize,
|
bool propertiesChangedForResize,
|
||||||
int[] rangeDaysDeltaTolerance,
|
int[] rangeDaysDeltaTolerance,
|
||||||
int[] rangeFaceAreaPermilleTolerance,
|
float[] rangeFaceAreaPermyriadTolerance,
|
||||||
double[] rangeFaceConfidence,
|
float[] rangeFaceConfidence,
|
||||||
double[] rangeDistanceTolerance,
|
float[] rangeDistanceTolerance,
|
||||||
bool reverse,
|
bool reverse,
|
||||||
string[] saveFaceLandmarkForOutputResolutions,
|
string[] saveFaceLandmarkForOutputResolutions,
|
||||||
bool saveFullYearOfRandomFiles,
|
bool saveFullYearOfRandomFiles,
|
||||||
@ -176,7 +176,7 @@ public class Configuration
|
|||||||
PropertiesChangedForMetadata = propertiesChangedForMetadata;
|
PropertiesChangedForMetadata = propertiesChangedForMetadata;
|
||||||
PropertiesChangedForResize = propertiesChangedForResize;
|
PropertiesChangedForResize = propertiesChangedForResize;
|
||||||
RangeDaysDeltaTolerance = rangeDaysDeltaTolerance;
|
RangeDaysDeltaTolerance = rangeDaysDeltaTolerance;
|
||||||
RangeFaceAreaPermilleTolerance = rangeFaceAreaPermilleTolerance;
|
RangeFaceAreaTolerance = rangeFaceAreaPermyriadTolerance;
|
||||||
RangeFaceConfidence = rangeFaceConfidence;
|
RangeFaceConfidence = rangeFaceConfidence;
|
||||||
RangeDistanceTolerance = rangeDistanceTolerance;
|
RangeDistanceTolerance = rangeDistanceTolerance;
|
||||||
Reverse = reverse;
|
Reverse = reverse;
|
||||||
|
@ -212,7 +212,6 @@ public class UnitTestFace
|
|||||||
bool reverse = false;
|
bool reverse = false;
|
||||||
FileHolder resizedFileHolder;
|
FileHolder resizedFileHolder;
|
||||||
List<string> parseExceptions = new();
|
List<string> parseExceptions = new();
|
||||||
const bool isIgnoreRelativePath = false;
|
|
||||||
Shared.Models.Property? property = null;
|
Shared.Models.Property? property = null;
|
||||||
const bool isValidImageFormatExtension = true;
|
const bool isValidImageFormatExtension = true;
|
||||||
Dictionary<string, int[]> outputResolutionToResize;
|
Dictionary<string, int[]> outputResolutionToResize;
|
||||||
@ -252,7 +251,7 @@ public class UnitTestFace
|
|||||||
throw new NullReferenceException(nameof(property));
|
throw new NullReferenceException(nameof(property));
|
||||||
resizedFileHolder = resize.GetResizedFileHolder(item);
|
resizedFileHolder = resize.GetResizedFileHolder(item);
|
||||||
item.SetResizedFileHolder(resize.FileNameExtension, resizedFileHolder);
|
item.SetResizedFileHolder(resize.FileNameExtension, resizedFileHolder);
|
||||||
MappingFromItem mappingFromItem = IMappingFromItem.GetMappingFromItem(item, isIgnoreRelativePath);
|
MappingFromItem mappingFromItem = IMappingFromItem.GetMappingFromItem(item);
|
||||||
(int _, metadataCollection) = metadata.GetMetadataCollection(subFileTuples, parseExceptions, mappingFromItem);
|
(int _, metadataCollection) = metadata.GetMetadataCollection(subFileTuples, parseExceptions, mappingFromItem);
|
||||||
outputResolutionToResize = resize.GetResizeKeyValuePairs(_Configuration.PropertyConfiguration, cResultsFullGroupDirectory, subFileTuples, parseExceptions, metadataCollection, item.Property, mappingFromItem);
|
outputResolutionToResize = resize.GetResizeKeyValuePairs(_Configuration.PropertyConfiguration, cResultsFullGroupDirectory, subFileTuples, parseExceptions, metadataCollection, item.Property, mappingFromItem);
|
||||||
Assert.IsNotNull(mappingFromItem.ResizedFileHolder);
|
Assert.IsNotNull(mappingFromItem.ResizedFileHolder);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user