IEnumerable
Filtered => ValidImage GetMappings => if (face.FaceEncoding is null || face.Location is null || face.OutputResolution is null) PreFilter skip done Removed sort Better names break out RootAmazon FilteredOriginalImage DeleteContinueFiles AppSetting PreVerify Settings Tasks
This commit is contained in:
@ -50,6 +50,7 @@ public partial class E_Distance : IDistance
|
||||
private FaceDistanceContainer[] GetFaceDistanceContainers(MappingFromItem mappingFromItem, List<Face> intersectFaces)
|
||||
{
|
||||
FaceDistanceContainer[] results;
|
||||
DateTime dateTime;
|
||||
int wholePercentages;
|
||||
int confidencePercent;
|
||||
FaceDistance faceDistance;
|
||||
@ -61,14 +62,15 @@ public partial class E_Distance : IDistance
|
||||
throw new NotSupportedException();
|
||||
if (face.Mapping?.MappingFromFilterPost is null)
|
||||
throw new NotSupportedException();
|
||||
dateTime = mappingFromItem.GetDateTimeOriginalThenMinimumDateTime();
|
||||
confidencePercent = Shared.Models.Stateless.Methods.ILocation.GetConfidencePercent(_FaceConfidencePercent, face.Location.Confidence);
|
||||
wholePercentages = Shared.Models.Stateless.Methods.ILocation.GetWholePercentages(face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution);
|
||||
if (face.FaceDistance?.Encoding is not null && face.FaceDistance.Encoding is FaceRecognitionDotNet.FaceEncoding faceEncoding)
|
||||
faceDistance = new(confidencePercent, mappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), faceEncoding, face.Mapping?.MappingFromFilterPost, mappingFromItem.Id, mappingFromItem.IsWrongYear, wholePercentages);
|
||||
faceDistance = new(confidencePercent, dateTime, faceEncoding, face.Mapping?.MappingFromFilterPost, mappingFromItem.Id, mappingFromItem.IsWrongYear, wholePercentages);
|
||||
else
|
||||
{
|
||||
faceEncoding = FaceRecognition.LoadFaceEncoding(face.FaceEncoding.RawEncoding);
|
||||
faceDistance = new(confidencePercent, mappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), faceEncoding, face.Mapping?.MappingFromFilterPost, mappingFromItem.Id, mappingFromItem.IsWrongYear, wholePercentages);
|
||||
faceDistance = new(confidencePercent, dateTime, faceEncoding, face.Mapping?.MappingFromFilterPost, mappingFromItem.Id, mappingFromItem.IsWrongYear, wholePercentages);
|
||||
lock (intersectFaces)
|
||||
face.SetFaceDistance(faceDistance);
|
||||
}
|
||||
@ -91,7 +93,7 @@ public partial class E_Distance : IDistance
|
||||
return new(faceDistanceEncodings);
|
||||
}
|
||||
|
||||
private List<(Face Face, double? Length)> GetValues(MappingFromItem mappingFromItem, List<Face> intersectFaces, Shared.Models.FaceEncoding modelsFaceEncoding)
|
||||
private List<(Face Face, double? Length)> GetValues(IDistanceLimits distanceLimits, MappingFromItem mappingFromItem, List<Face> intersectFaces, Shared.Models.FaceEncoding modelsFaceEncoding)
|
||||
{
|
||||
List<(Face Face, double? Length)> results = [];
|
||||
Face face;
|
||||
@ -112,6 +114,8 @@ public partial class E_Distance : IDistance
|
||||
{
|
||||
face = intersectFaces[i];
|
||||
faceDistanceLength = faceDistanceLengths[i];
|
||||
if (faceDistanceLength.Length is null || faceDistanceLength.Length > distanceLimits.RangeDistanceToleranceUpperLimit)
|
||||
continue;
|
||||
if (faceDistanceLength.Length is null)
|
||||
throw new NotSupportedException();
|
||||
results.Add(new(face, faceDistanceLength.Length.Value));
|
||||
@ -119,10 +123,10 @@ public partial class E_Distance : IDistance
|
||||
return results;
|
||||
}
|
||||
|
||||
private (Face, double?)[] GetClosestFaceByDistanceIgnoringTolerance(MappingFromItem mappingFromItem, List<Face> intersectFaces, Shared.Models.FaceEncoding modelsFaceEncoding)
|
||||
private (Face, double?)[] GetClosestFaceByDistanceIgnoringTolerance(IDistanceLimits distanceLimits, MappingFromItem mappingFromItem, List<Face> intersectFaces, Shared.Models.FaceEncoding modelsFaceEncoding)
|
||||
{
|
||||
(Face, double?)[] results;
|
||||
List<(Face Face, double? Length)> collection = GetValues(mappingFromItem, intersectFaces, modelsFaceEncoding);
|
||||
List<(Face Face, double? Length)> collection = GetValues(distanceLimits, mappingFromItem, intersectFaces, modelsFaceEncoding);
|
||||
results = (from l in collection where l.Length < _RangeDistanceToleranceAverage orderby l.Length select l).Take(1).ToArray();
|
||||
if (results.Length > 0)
|
||||
{
|
||||
@ -201,7 +205,7 @@ public partial class E_Distance : IDistance
|
||||
}
|
||||
}
|
||||
|
||||
public void LookForMatchFacesAndPossiblyRename(string facesFileNameExtension, FilePath filePath, MappingFromItem mappingFromItem, List<Face> faces, ReadOnlyCollection<LocationContainer> locationContainers)
|
||||
public void LookForMatchFacesAndPossiblyRename(IDistanceLimits distanceLimits, string facesFileNameExtension, FilePath filePath, MappingFromItem mappingFromItem, List<Face> faces, ReadOnlyCollection<LocationContainer> locationContainers)
|
||||
{
|
||||
string? json;
|
||||
string[] matches;
|
||||
@ -246,7 +250,7 @@ public partial class E_Distance : IDistance
|
||||
{
|
||||
intersectFaces = Shared.Models.Stateless.Methods.ILocation.FilterByIntersect(filteredFaces, _RectangleIntersectMinimum, locationContainer.WholePercentages);
|
||||
if (intersectFaces.Count > 0)
|
||||
checkFaces.AddRange(GetClosestFaceByDistanceIgnoringTolerance(mappingFromItem, intersectFaces, modelsFaceEncoding));
|
||||
checkFaces.AddRange(GetClosestFaceByDistanceIgnoringTolerance(distanceLimits, mappingFromItem, intersectFaces, modelsFaceEncoding));
|
||||
}
|
||||
}
|
||||
if (checkFaces.Count == 0)
|
||||
@ -322,10 +326,10 @@ public partial class E_Distance : IDistance
|
||||
File.WriteAllLines(eDistanceContentFileName, results);
|
||||
}
|
||||
|
||||
public static void PreFilterSetFaceDistances(int maxDegreeOfParallelism, long ticks, ReadOnlyCollection<Face> distinctFilteredFaces)
|
||||
public static void PreFilterSetFaceDistances(int maxDegreeOfParallelism, Map.Models.Configuration configuration, long ticks, ReadOnlyCollection<Face> distinctValidImageFaces)
|
||||
{
|
||||
List<Face> faces = [];
|
||||
foreach (Face face in distinctFilteredFaces)
|
||||
foreach (Face face in distinctValidImageFaces)
|
||||
{
|
||||
if (face.Mapping?.MappingFromFilterPre is null)
|
||||
throw new NotSupportedException();
|
||||
@ -335,8 +339,10 @@ public partial class E_Distance : IDistance
|
||||
continue;
|
||||
if (face.Mapping.MappingFromFilterPre.IsFocusRelativePath is not null && !face.Mapping.MappingFromFilterPre.IsFocusRelativePath.Value)
|
||||
continue;
|
||||
if (face.FaceEncoding is not null && face.FaceDistance?.Encoding is not null && face.FaceDistance.Encoding is FaceRecognitionDotNet.FaceEncoding _)
|
||||
if (!configuration.ReMap && face.Mapping.MappingFromPerson is not null)
|
||||
continue;
|
||||
if (!configuration.ReMap && face.FaceEncoding is not null && face.FaceDistance?.Encoding is not null && face.FaceDistance.Encoding is FaceRecognitionDotNet.FaceEncoding _)
|
||||
throw new NotSupportedException($"{face.Mapping.MappingFromPerson} should not be null!");
|
||||
faces.Add(face);
|
||||
}
|
||||
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
|
||||
@ -352,7 +358,8 @@ public partial class E_Distance : IDistance
|
||||
throw new NotSupportedException();
|
||||
progressBar.Tick();
|
||||
faceEncoding = FaceRecognition.LoadFaceEncoding(face.FaceEncoding.RawEncoding);
|
||||
FaceDistance faceDistance = new(face.Mapping.MappingFromLocation.ConfidencePercent, face.Mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), faceEncoding, face.Mapping.MappingFromFilterPost, face.Mapping.MappingFromItem.Id, face.Mapping.MappingFromItem.IsWrongYear, face.Mapping.MappingFromLocation.WholePercentages);
|
||||
DateTime dateTime = face.Mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime();
|
||||
FaceDistance faceDistance = new(face.Mapping.MappingFromLocation.ConfidencePercent, dateTime, faceEncoding, face.Mapping.MappingFromFilterPost, face.Mapping.MappingFromItem.Id, face.Mapping.MappingFromItem.IsWrongYear, face.Mapping.MappingFromLocation.WholePercentages);
|
||||
lock (face)
|
||||
face.SetFaceDistance(faceDistance);
|
||||
});
|
||||
@ -361,8 +368,8 @@ public partial class E_Distance : IDistance
|
||||
private static List<SortingContainer> GetSortingContainers(Map.Models.Configuration mapConfiguration, IDistanceLimits distanceLimits, Face face, FaceDistance faceDistanceEncoding, List<Sorting> sortingCollection)
|
||||
{
|
||||
List<SortingContainer> results = [];
|
||||
SortingContainer sortingContainer;
|
||||
int days = 0, distance = 0;
|
||||
SortingContainer sortingContainer;
|
||||
Sorting[] collection = Shared.Models.Stateless.Methods.ISorting.Sort(sortingCollection);
|
||||
foreach (Sorting sorting in collection)
|
||||
{
|
||||
@ -389,27 +396,29 @@ public partial class E_Distance : IDistance
|
||||
return results;
|
||||
}
|
||||
|
||||
private static List<Sorting> GetSortingCollection(Map.Models.MapLogic mapLogic, ReadOnlyCollection<FaceDistance> faceDistanceEncodings, int i, Face face, FaceDistance faceDistanceEncoding)
|
||||
private static List<Sorting> GetSortingCollection(Map.Models.MapLogic mapLogic, IDistanceLimits distanceLimits, ReadOnlyCollection<FaceDistance> faceDistanceEncodings, int i, Face face, FaceDistance faceDistanceEncoding)
|
||||
{
|
||||
List<Sorting> results;
|
||||
List<FaceDistance> faceDistanceLengths = FaceRecognition.FaceDistances(faceDistanceEncodings, faceDistanceEncoding);
|
||||
results = mapLogic.GetSortingCollection(i, face, faceDistanceEncoding, faceDistanceLengths);
|
||||
results = mapLogic.GetSortingCollection(distanceLimits, i, face, faceDistanceEncoding, faceDistanceLengths);
|
||||
return results;
|
||||
}
|
||||
|
||||
public static ReadOnlyCollection<FaceDistanceContainer> GetFaceDistanceContainers(ReadOnlyCollection<Face> distinctFilteredFaces)
|
||||
public static ReadOnlyCollection<FaceDistanceContainer> GetFaceDistanceContainers(ReadOnlyCollection<Face> distinctValidImageFaces)
|
||||
{
|
||||
ReadOnlyCollection<FaceDistanceContainer> results;
|
||||
DateTime dateTime;
|
||||
FaceDistance faceDistance;
|
||||
FaceDistanceContainer faceDistanceContainer;
|
||||
List<FaceDistanceContainer> collection = [];
|
||||
foreach (Face face in distinctFilteredFaces)
|
||||
foreach (Face face in distinctValidImageFaces)
|
||||
{
|
||||
if (face.Mapping?.MappingFromLocation is null)
|
||||
throw new NotSupportedException();
|
||||
if (face.FaceDistance?.Encoding is not FaceRecognitionDotNet.FaceEncoding faceEncoding)
|
||||
continue;
|
||||
faceDistance = new(face.Mapping.MappingFromLocation.ConfidencePercent, face.Mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), faceEncoding, face.Mapping.MappingFromFilterPost, face.Mapping.MappingFromItem.Id, face.Mapping.MappingFromItem.IsWrongYear, face.Mapping.MappingFromLocation.WholePercentages);
|
||||
dateTime = face.Mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime();
|
||||
faceDistance = new(face.Mapping.MappingFromLocation.ConfidencePercent, dateTime, faceEncoding, face.Mapping.MappingFromFilterPost, face.Mapping.MappingFromItem.Id, face.Mapping.MappingFromItem.IsWrongYear, face.Mapping.MappingFromLocation.WholePercentages);
|
||||
faceDistanceContainer = new(face, faceDistance);
|
||||
collection.Add(faceDistanceContainer);
|
||||
}
|
||||
@ -459,7 +468,7 @@ public partial class E_Distance : IDistance
|
||||
progressBar.Tick();
|
||||
Face face = filteredFaceDistanceContainers[i].Face;
|
||||
FaceDistance faceDistanceEncoding = filteredFaceDistanceContainers[i].FaceDistance;
|
||||
List<Sorting> sortingCollection = GetSortingCollection(mapLogic, faceDistanceEncodings, i, face, faceDistanceEncoding);
|
||||
List<Sorting> sortingCollection = GetSortingCollection(mapLogic, distanceLimits, faceDistanceEncodings, i, face, faceDistanceEncoding);
|
||||
if (sortingCollection.Count == 0)
|
||||
return;
|
||||
List<SortingContainer> sortingContainers = GetSortingContainers(mapConfiguration, distanceLimits, face, faceDistanceEncoding, sortingCollection);
|
||||
@ -476,7 +485,7 @@ public partial class E_Distance : IDistance
|
||||
return new(results);
|
||||
}
|
||||
|
||||
private static ReadOnlyCollection<RelationContainer> GetRelationCollections(int faceDistancePermyriad, int locationContainerDistanceTake, float distanceTolerance, List<Record> records)
|
||||
private static ReadOnlyCollection<RelationContainer> GetRelationCollections(IDistanceLimits distanceLimits, int faceDistancePermyriad, int locationContainerDistanceTake, float distanceTolerance, List<Record> records)
|
||||
{
|
||||
List<RelationContainer> results = [];
|
||||
string fileName;
|
||||
@ -496,6 +505,7 @@ public partial class E_Distance : IDistance
|
||||
foreach (Record record in records)
|
||||
{
|
||||
mappedRelations = [];
|
||||
FaceDistance faceDistanceLength;
|
||||
fileHolder = Shared.Models.Stateless.Methods.IFileHolder.Get(record.FilePath.FullName);
|
||||
if (files.Count > 1)
|
||||
{
|
||||
@ -508,10 +518,12 @@ public partial class E_Distance : IDistance
|
||||
fileName = Path.GetFileName(files[i]);
|
||||
if (fileName == fileHolder.Name)
|
||||
continue;
|
||||
FaceDistance faceDistance = faceDistanceLengths[i];
|
||||
if (faceDistance.Length is null || faceDistance.Length.Value > distanceTolerance)
|
||||
faceDistanceLength = faceDistanceLengths[i];
|
||||
if (faceDistanceLength.Length is null || faceDistanceLength.Length > distanceLimits.RangeDistanceToleranceUpperLimit)
|
||||
continue;
|
||||
distancePermyriad = (int)(faceDistance.Length.Value * faceDistancePermyriad);
|
||||
if (faceDistanceLength.Length is null || faceDistanceLength.Length.Value > distanceTolerance)
|
||||
continue;
|
||||
distancePermyriad = (int)(faceDistanceLength.Length.Value * faceDistancePermyriad);
|
||||
mappedRelations.Add(new(distancePermyriad, files[i]));
|
||||
}
|
||||
}
|
||||
@ -521,7 +533,7 @@ public partial class E_Distance : IDistance
|
||||
return new(results);
|
||||
}
|
||||
|
||||
ReadOnlyCollection<RelationContainer> IDistance.GetRelationContainers(int faceDistancePermyriad, int locationContainerDistanceTake, float locationContainerDistanceTolerance, ReadOnlyCollection<LocationContainer> locationContainers)
|
||||
ReadOnlyCollection<RelationContainer> IDistance.GetRelationContainers(IDistanceLimits distanceLimits, int faceDistancePermyriad, int locationContainerDistanceTake, float locationContainerDistanceTolerance, ReadOnlyCollection<LocationContainer> locationContainers)
|
||||
{
|
||||
ReadOnlyCollection<RelationContainer> result;
|
||||
string? json;
|
||||
@ -539,7 +551,7 @@ public partial class E_Distance : IDistance
|
||||
faceRecognitionDotNetFaceEncoding = FaceRecognition.LoadFaceEncoding(modelsFaceEncoding.RawEncoding);
|
||||
records.Add(new(locationContainer.FilePath, faceRecognitionDotNetFaceEncoding));
|
||||
}
|
||||
result = GetRelationCollections(faceDistancePermyriad, locationContainerDistanceTake, locationContainerDistanceTolerance, records);
|
||||
result = GetRelationCollections(distanceLimits, faceDistancePermyriad, locationContainerDistanceTake, locationContainerDistanceTolerance, records);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user