LocationContainerDistanceTolerance

This commit is contained in:
2023-08-06 22:07:23 -07:00
parent a871868aaa
commit 6b940180fa
10 changed files with 130 additions and 48 deletions

View File

@ -4,10 +4,11 @@ using System.Text.Json;
using View_by_Distance.Distance.Models.Stateless;
using View_by_Distance.FaceRecognitionDotNet;
using View_by_Distance.Shared.Models;
using View_by_Distance.Shared.Models.Methods;
namespace View_by_Distance.Distance.Models;
public partial class E_Distance
public partial class E_Distance : IDistance<MetadataExtractor.Directory>
{
private readonly List<string> _Moved;
@ -411,7 +412,7 @@ public partial class E_Distance
});
}
private static List<SortingContainer> GetSortingContainers(Map.Models.Configuration mapConfiguration, Shared.Models.Methods.IDistanceLimits distanceLimits, Face face, FaceDistance faceDistanceEncoding, List<Sorting> sortingCollection)
private static List<SortingContainer> GetSortingContainers(Map.Models.Configuration mapConfiguration, IDistanceLimits distanceLimits, Face face, FaceDistance faceDistanceEncoding, List<Sorting> sortingCollection)
{
List<SortingContainer> results = new();
SortingContainer sortingContainer;
@ -516,7 +517,7 @@ public partial class E_Distance
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)
public static SortingContainer[] SetFaceMappingSortingCollectionThenGetSortingContainers(int maxDegreeOfParallelism, Map.Models.Configuration mapConfiguration, long ticks, Map.Models.MapLogic mapLogic, IDistanceLimits distanceLimits, List<FaceDistance> faceDistanceEncodings, FaceDistanceContainer[] filteredFaceDistanceContainers)
{
SortingContainer[] results;
List<SortingContainer> collection = new();
@ -552,4 +553,65 @@ public partial class E_Distance
return results;
}
private static void ReviewLocationContainerDistanceTolerance(float locationContainerDistanceTolerance, DateTime dateTime, List<(string, FaceRecognitionDotNet.FaceEncoding)> collection)
{
List<string> files = new();
FaceDistance? faceDistanceEncoding = null;
List<FaceDistance> faceDistanceEncodings = new();
foreach ((string _, FaceRecognitionDotNet.FaceEncoding faceRecognitionDotNetFaceEncoding) in collection)
{
faceDistanceEncoding = new(faceRecognitionDotNetFaceEncoding);
break;
}
foreach ((string file, FaceRecognitionDotNet.FaceEncoding faceRecognitionDotNetFaceEncoding) in collection)
{
files.Add(file);
faceDistanceEncodings.Add(new(faceRecognitionDotNetFaceEncoding));
}
if (faceDistanceEncoding is null)
throw new Exception();
List<FaceDistance> faceDistanceLengths = FaceRecognition.FaceDistances(faceDistanceEncodings, faceDistanceEncoding);
if (faceDistanceLengths.Count != files.Count)
throw new Exception();
for (int i = 0; i < files.Count; i++)
{
if (!File.Exists(files[i]))
continue;
if (faceDistanceLengths[i].Length < locationContainerDistanceTolerance)
continue;
File.SetCreationTime(files[i], dateTime);
}
}
void IDistance<MetadataExtractor.Directory>.ReviewLocationContainerDistanceTolerance(float locationContainerDistanceTolerance, ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> locationContainers)
{
string? json;
int? lastDirectoryNumber = null;
DateTime dateTime = DateTime.Now;
Shared.Models.FaceEncoding? modelsFaceEncoding;
FaceRecognitionDotNet.FaceEncoding faceRecognitionDotNetFaceEncoding;
List<(string, FaceRecognitionDotNet.FaceEncoding)> collection = new();
foreach (LocationContainer<MetadataExtractor.Directory>? locationContainer in locationContainers)
{
if (locationContainer.DirectoryNumber is null)
continue;
if (lastDirectoryNumber is not null && locationContainer.DirectoryNumber.Value != lastDirectoryNumber.Value)
{
ReviewLocationContainerDistanceTolerance(locationContainerDistanceTolerance, dateTime, collection);
collection.Clear();
}
json = Metadata.Models.Stateless.Methods.IMetadata.GetFaceEncoding(locationContainer.Directories);
if (json is null)
continue;
modelsFaceEncoding = JsonSerializer.Deserialize<Shared.Models.FaceEncoding>(json);
if (modelsFaceEncoding is null)
throw new NotSupportedException();
faceRecognitionDotNetFaceEncoding = FaceRecognition.LoadFaceEncoding(modelsFaceEncoding.RawEncoding);
collection.Add((locationContainer.File, faceRecognitionDotNetFaceEncoding));
lastDirectoryNumber = locationContainer.DirectoryNumber.Value;
}
if (collection.Count > 0)
ReviewLocationContainerDistanceTolerance(locationContainerDistanceTolerance, dateTime, collection);
}
}