Runs but broken
This commit is contained in:
@ -1,10 +1,13 @@
|
||||
using ShellProgressBar;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Data;
|
||||
using System.Text.Json;
|
||||
using View_by_Distance.FaceRecognitionDotNet;
|
||||
using View_by_Distance.Map.Models;
|
||||
using View_by_Distance.Property.Models.Stateless;
|
||||
using View_by_Distance.Shared.Models;
|
||||
using View_by_Distance.Shared.Models.Methods;
|
||||
using View_by_Distance.Shared.Models.Stateless.Methods;
|
||||
|
||||
namespace View_by_Distance.Distance.Models;
|
||||
|
||||
@ -50,6 +53,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 +65,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 +96,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 +117,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 +126,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)
|
||||
{
|
||||
@ -132,11 +139,11 @@ public partial class E_Distance : IDistance
|
||||
return results;
|
||||
}
|
||||
|
||||
private static List<(Face, double?)> GetMatchingFacesByFaceEncoding(Face[] filteredFaces, string? json)
|
||||
private static List<(Face, double?)> GetMatchingFacesByFaceEncoding(List<Face> faces, string? json)
|
||||
{
|
||||
List<(Face, double?)> results = [];
|
||||
string check;
|
||||
foreach (Face face in filteredFaces)
|
||||
foreach (Face face in faces)
|
||||
{
|
||||
if (json is null || face.FaceEncoding is null)
|
||||
continue;
|
||||
@ -165,7 +172,7 @@ public partial class E_Distance : IDistance
|
||||
mappedFaceDirectory = Path.GetDirectoryName(file);
|
||||
if (mappedFaceDirectory is null)
|
||||
throw new NotSupportedException();
|
||||
deterministicHashCodeKey = Shared.Models.Stateless.Methods.IMapping.GetDeterministicHashCodeKey(filePath, face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution);
|
||||
deterministicHashCodeKey = IMapping.GetDeterministicHashCodeKey(filePath, face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution);
|
||||
checkFile = Path.Combine(mappedFaceDirectory, $"{deterministicHashCodeKey}{mappingFromItem.FilePath.ExtensionLowered}{facesFileNameExtension}");
|
||||
if (checkFile == file)
|
||||
continue;
|
||||
@ -201,17 +208,14 @@ public partial class E_Distance : IDistance
|
||||
}
|
||||
}
|
||||
|
||||
public void LookForMatchFacesAndPossiblyRename(string facesFileNameExtension, FilePath filePath, MappingFromItem mappingFromItem, List<Face> faces, ReadOnlyCollection<LocationContainer> locationContainers)
|
||||
public void LookForMatchFacesAndPossiblyRename(bool overrideForFaceImages, IDistanceLimits distanceLimits, IFaceD dFace, FilePath filePath, MappingFromItem mappingFromItem, ExifDirectory exifDirectory, List<Face> faces, ReadOnlyCollection<LocationContainer> locationContainers)
|
||||
{
|
||||
string? json;
|
||||
string[] matches;
|
||||
FileInfo? fileInfo;
|
||||
List<Face> intersectFaces;
|
||||
List<(Face, double?)> checkFaces = [];
|
||||
Shared.Models.FaceEncoding? modelsFaceEncoding;
|
||||
Face[] filteredFaces = (from l in faces where l.FaceEncoding is not null && l.Location is not null && l.OutputResolution is not null select l).ToArray();
|
||||
if (filteredFaces.Length != faces.Count)
|
||||
checkFaces.Clear();
|
||||
List<(Face Face, double? Distance)> checkFaces = [];
|
||||
foreach (LocationContainer locationContainer in locationContainers)
|
||||
{
|
||||
if (_Renamed.Contains(locationContainer.FilePath.FullName))
|
||||
@ -232,8 +236,8 @@ public partial class E_Distance : IDistance
|
||||
MoveUnableToMatch(locationContainer.FilePath);
|
||||
continue;
|
||||
}
|
||||
if (filteredFaces.Length > 0)
|
||||
checkFaces.AddRange(GetMatchingFacesByFaceEncoding(filteredFaces, json));
|
||||
if (faces.Count > 0)
|
||||
checkFaces.AddRange(GetMatchingFacesByFaceEncoding(faces, json));
|
||||
if (checkFaces.Count == 1)
|
||||
_Debug.Add(0);
|
||||
if (checkFaces.Count != 1 && !string.IsNullOrEmpty(json))
|
||||
@ -242,11 +246,11 @@ public partial class E_Distance : IDistance
|
||||
modelsFaceEncoding = JsonSerializer.Deserialize<Shared.Models.FaceEncoding>(json);
|
||||
if (modelsFaceEncoding is null)
|
||||
throw new NotSupportedException();
|
||||
if (filteredFaces.Length > 0)
|
||||
if (faces.Count > 0)
|
||||
{
|
||||
intersectFaces = Shared.Models.Stateless.Methods.ILocation.FilterByIntersect(filteredFaces, _RectangleIntersectMinimum, locationContainer.WholePercentages);
|
||||
intersectFaces = Shared.Models.Stateless.Methods.ILocation.FilterByIntersect(faces, _RectangleIntersectMinimum, locationContainer.WholePercentages);
|
||||
if (intersectFaces.Count > 0)
|
||||
checkFaces.AddRange(GetClosestFaceByDistanceIgnoringTolerance(mappingFromItem, intersectFaces, modelsFaceEncoding));
|
||||
checkFaces.AddRange(GetClosestFaceByDistanceIgnoringTolerance(distanceLimits, mappingFromItem, intersectFaces, modelsFaceEncoding));
|
||||
}
|
||||
}
|
||||
if (checkFaces.Count == 0)
|
||||
@ -261,7 +265,7 @@ public partial class E_Distance : IDistance
|
||||
MoveUnableToMatch(locationContainer.FilePath);
|
||||
continue;
|
||||
}
|
||||
fileInfo = CheckFileThenGetFileInfo(facesFileNameExtension, filePath, mappingFromItem, locationContainer.FilePath.FullName, checkFaces);
|
||||
fileInfo = CheckFileThenGetFileInfo(dFace.FileNameExtension, filePath, mappingFromItem, locationContainer.FilePath.FullName, checkFaces);
|
||||
if (fileInfo is not null)
|
||||
{
|
||||
if (_DistanceRenameToMatch && fileInfo is not null)
|
||||
@ -275,6 +279,15 @@ public partial class E_Distance : IDistance
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (overrideForFaceImages)
|
||||
{
|
||||
json = Metadata.Models.Stateless.Methods.IMetadata.GetOutputResolution(locationContainer.ExifDirectory);
|
||||
if (json is null || !json.Contains(nameof(DateTime)))
|
||||
{
|
||||
if (checkFaces.Count == 1)
|
||||
dFace.ReSaveFace(exifDirectory, locationContainer.FilePath, checkFaces[0].Face, mappedFile: true);
|
||||
}
|
||||
}
|
||||
if (_AllMappedFaceFileNames.Contains(locationContainer.FilePath.Name))
|
||||
{
|
||||
lock (_AllMappedFaceFiles)
|
||||
@ -322,10 +335,88 @@ public partial class E_Distance : IDistance
|
||||
File.WriteAllLines(eDistanceContentFileName, results);
|
||||
}
|
||||
|
||||
public static void PreFilterSetFaceDistances(int maxDegreeOfParallelism, long ticks, ReadOnlyCollection<Face> distinctFilteredFaces)
|
||||
public static ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> GetMappedWithEncoding(ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> mapped)
|
||||
{
|
||||
Dictionary<int, ReadOnlyDictionary<int, LocationContainer>> results = [];
|
||||
string? json;
|
||||
LocationContainer? locationContainer;
|
||||
Shared.Models.FaceEncoding? faceEncoding;
|
||||
FaceRecognitionDotNet.FaceEncoding? encoding;
|
||||
Dictionary<int, LocationContainer> keyValuePairs;
|
||||
foreach (KeyValuePair<int, ReadOnlyDictionary<int, LocationContainer>> keyValuePair in mapped)
|
||||
{
|
||||
keyValuePairs = [];
|
||||
foreach (KeyValuePair<int, LocationContainer> keyValue in keyValuePair.Value)
|
||||
{
|
||||
json = Metadata.Models.Stateless.Methods.IMetadata.GetFaceEncoding(keyValue.Value.ExifDirectory);
|
||||
faceEncoding = json is null ? null : JsonSerializer.Deserialize<Shared.Models.FaceEncoding>(json);
|
||||
if (faceEncoding is null)
|
||||
continue;
|
||||
encoding = FaceRecognition.LoadFaceEncoding(faceEncoding.RawEncoding);
|
||||
locationContainer = LocationContainer.Get(keyValue.Value, encoding, keepExifDirectory: false);
|
||||
keyValuePairs.Add(keyValue.Key, locationContainer);
|
||||
}
|
||||
results.Add(keyValuePair.Key, new(keyValuePairs));
|
||||
}
|
||||
return new(results);
|
||||
}
|
||||
|
||||
public static List<LocationContainer> GetPreFilterLocationContainer(int maxDegreeOfParallelism, Configuration configuration, string focusDirectory, string focusModel, int? skipPersonWithMoreThen, long ticks, MapLogic mapLogic, long[] jLinkResolvedPersonKeys, ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> mapped, List<LocationContainer> available)
|
||||
{
|
||||
List<LocationContainer> results = [];
|
||||
string? json;
|
||||
string? model;
|
||||
bool? canReMap;
|
||||
bool? isFocusPerson;
|
||||
bool? inSkipCollection;
|
||||
Shared.Models.FaceEncoding? faceEncoding;
|
||||
FaceRecognitionDotNet.FaceEncoding? encoding;
|
||||
ReadOnlyDictionary<int, LocationContainer>? keyValuePairs;
|
||||
ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPersonContainers;
|
||||
foreach (LocationContainer locationContainer in available)
|
||||
{
|
||||
if (mapped.TryGetValue(locationContainer.Id, out keyValuePairs))
|
||||
{
|
||||
if (keyValuePairs.ContainsKey(locationContainer.WholePercentages))
|
||||
continue;
|
||||
}
|
||||
if (locationContainer.ExifDirectory is null || locationContainer.FaceFile is null)
|
||||
continue;
|
||||
inSkipCollection = mapLogic.InSkipCollection(locationContainer.Id, locationContainer.WholePercentages);
|
||||
if (inSkipCollection is not null && inSkipCollection.Value)
|
||||
continue;
|
||||
wholePercentagesToPersonContainers = mapLogic.GetWholePercentagesToPersonContainers(locationContainer.Id);
|
||||
canReMap = Map.Models.Stateless.Methods.IMapLogic.CanReMap(jLinkResolvedPersonKeys, wholePercentagesToPersonContainers, locationContainer.WholePercentages);
|
||||
if (canReMap is not null && !canReMap.Value)
|
||||
continue;
|
||||
isFocusPerson = mapLogic.IsFocusPerson(skipPersonWithMoreThen, jLinkResolvedPersonKeys, wholePercentagesToPersonContainers, locationContainer.WholePercentages);
|
||||
if (isFocusPerson is not null && !isFocusPerson.Value)
|
||||
continue;
|
||||
if (!string.IsNullOrEmpty(focusModel))
|
||||
{
|
||||
model = Metadata.Models.Stateless.Methods.IMetadata.GetModel(locationContainer.ExifDirectory);
|
||||
if (string.IsNullOrEmpty(model) || !model.Contains(focusModel))
|
||||
continue;
|
||||
}
|
||||
if (!string.IsNullOrEmpty(focusDirectory))
|
||||
{
|
||||
if (!locationContainer.FilePath.DirectoryName.Contains(focusDirectory))
|
||||
continue;
|
||||
}
|
||||
json = Metadata.Models.Stateless.Methods.IMetadata.GetFaceEncoding(locationContainer.ExifDirectory);
|
||||
faceEncoding = json is null ? null : JsonSerializer.Deserialize<Shared.Models.FaceEncoding>(json);
|
||||
if (faceEncoding is null)
|
||||
continue;
|
||||
encoding = FaceRecognition.LoadFaceEncoding(faceEncoding.RawEncoding);
|
||||
results.Add(LocationContainer.Get(locationContainer, encoding, keepExifDirectory: false));
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
public static void PreFilterSetFaceDistances(int maxDegreeOfParallelism, 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,7 +426,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.FaceEncoding} should not be null!");
|
||||
continue;
|
||||
faces.Add(face);
|
||||
}
|
||||
@ -352,18 +446,19 @@ 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);
|
||||
});
|
||||
}
|
||||
|
||||
private static List<SortingContainer> GetSortingContainers(Map.Models.Configuration mapConfiguration, IDistanceLimits distanceLimits, Face face, FaceDistance faceDistanceEncoding, List<Sorting> sortingCollection)
|
||||
private static List<SortingContainer> GetSortingContainers(Configuration mapConfiguration, IDistanceLimits distanceLimits, Face face, FaceDistance faceDistanceEncoding, List<Sorting> sortingCollection)
|
||||
{
|
||||
List<SortingContainer> results = [];
|
||||
SortingContainer sortingContainer;
|
||||
int days = 0, distance = 0;
|
||||
Sorting[] collection = Shared.Models.Stateless.Methods.ISorting.Sort(sortingCollection);
|
||||
SortingContainer sortingContainer;
|
||||
Sorting[] collection = ISorting.Sort(sortingCollection);
|
||||
foreach (Sorting sorting in collection)
|
||||
{
|
||||
if (face.Mapping?.MappingFromLocation is null || faceDistanceEncoding.WholePercentages is null)
|
||||
@ -389,7 +484,7 @@ 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(MapLogic mapLogic, ReadOnlyCollection<FaceDistance> faceDistanceEncodings, int i, Face face, FaceDistance faceDistanceEncoding)
|
||||
{
|
||||
List<Sorting> results;
|
||||
List<FaceDistance> faceDistanceLengths = FaceRecognition.FaceDistances(faceDistanceEncodings, faceDistanceEncoding);
|
||||
@ -397,19 +492,21 @@ public partial class E_Distance : IDistance
|
||||
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);
|
||||
}
|
||||
@ -417,7 +514,23 @@ public partial class E_Distance : IDistance
|
||||
return results;
|
||||
}
|
||||
|
||||
public static FaceDistanceContainer[] FilteredPostLoadFaceDistanceContainers(Map.Models.MapLogic mapLogic, ReadOnlyCollection<FaceDistanceContainer> faceDistanceContainers, long? skipOlderThan, DistanceLimits distanceLimits)
|
||||
public static List<LocationContainer> GetPostFilterLocationContainer(MapLogic mapLogic, List<LocationContainer> preFiltered, DistanceLimits distanceLimits)
|
||||
{
|
||||
List<LocationContainer> results = [];
|
||||
foreach (LocationContainer locationContainer in preFiltered)
|
||||
{
|
||||
if (locationContainer.FaceFile is null)
|
||||
continue;
|
||||
if (locationContainer.FaceFile.AreaPermyriad < distanceLimits.FaceAreaPermyriad)
|
||||
continue;
|
||||
if (locationContainer.FaceFile.ConfidencePercent < distanceLimits.FaceConfidencePercent)
|
||||
continue;
|
||||
results.Add(locationContainer);
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
public static FaceDistanceContainer[] FilteredPostLoadFaceDistanceContainers(MapLogic mapLogic, ReadOnlyCollection<FaceDistanceContainer> faceDistanceContainers, long? skipOlderThan, DistanceLimits distanceLimits)
|
||||
{
|
||||
List<FaceDistanceContainer> results = [];
|
||||
foreach (FaceDistanceContainer faceDistanceContainer in faceDistanceContainers)
|
||||
@ -446,7 +559,46 @@ public partial class E_Distance : IDistance
|
||||
return results.ToArray();
|
||||
}
|
||||
|
||||
public static ReadOnlyCollection<SortingContainer> SetFaceMappingSortingCollectionThenGetSortedSortingContainers(int maxDegreeOfParallelism, Map.Models.Configuration mapConfiguration, long ticks, Map.Models.MapLogic mapLogic, IDistanceLimits distanceLimits, ReadOnlyCollection<FaceDistance> faceDistanceEncodings, FaceDistanceContainer[] filteredFaceDistanceContainers)
|
||||
private static ReadOnlyCollection<LocationContainer> GetReadOnlyLocationContainer(ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> mappedWithEncoding, List<LocationContainer> postFiltered)
|
||||
{
|
||||
List<LocationContainer> results = [];
|
||||
foreach (LocationContainer locationContainer in postFiltered)
|
||||
results.Add(locationContainer);
|
||||
foreach (KeyValuePair<int, ReadOnlyDictionary<int, LocationContainer>> keyValuePair in mappedWithEncoding)
|
||||
{
|
||||
foreach (KeyValuePair<int, LocationContainer> keyValue in keyValuePair.Value)
|
||||
results.Add(keyValue.Value);
|
||||
}
|
||||
return new(results);
|
||||
}
|
||||
|
||||
public static ReadOnlyCollection<LocationContainer> GetMatrixLocationContainers(IDlibDotNet dlibDotNet, Configuration mapConfiguration, long ticks, MapLogic mapLogic, ReadOnlyDictionary<int, ReadOnlyDictionary<int, LocationContainer>> mappedWithEncoding, List<LocationContainer> preFiltered, DistanceLimits distanceLimits, List<LocationContainer> postFiltered)
|
||||
{
|
||||
List<LocationContainer> results = [];
|
||||
ReadOnlyCollection<LocationContainer> locationContainers;
|
||||
ReadOnlyCollection<LocationContainer> readOnlyLocationContainers = GetReadOnlyLocationContainer(mappedWithEncoding, postFiltered);
|
||||
foreach (LocationContainer locationContainer in postFiltered)
|
||||
{
|
||||
dlibDotNet.Tick();
|
||||
locationContainers = FaceRecognition.GetLocationContainers(mapConfiguration.FaceDistancePermyriad, readOnlyLocationContainers, locationContainer);
|
||||
foreach (LocationContainer item in locationContainers)
|
||||
{
|
||||
if (item.LengthPermyriad is null)
|
||||
continue;
|
||||
if (item.LengthPermyriad > distanceLimits.FaceDistancePermyriad)
|
||||
break;
|
||||
if (!mapConfiguration.SaveSortingWithoutPerson && item.PersonKey is null)
|
||||
continue;
|
||||
if (item.Id == locationContainer.Id && item.WholePercentages == locationContainer.WholePercentages)
|
||||
continue;
|
||||
results.Add(item);
|
||||
}
|
||||
}
|
||||
LocationContainer[] array = results.OrderBy(l => l.LengthPermyriad).ToArray();
|
||||
return new(array);
|
||||
}
|
||||
|
||||
public static ReadOnlyCollection<SortingContainer> SetFaceMappingSortingCollectionThenGetSortedSortingContainers(int maxDegreeOfParallelism, Configuration mapConfiguration, long ticks, MapLogic mapLogic, IDistanceLimits distanceLimits, ReadOnlyCollection<FaceDistance> faceDistanceEncodings, FaceDistanceContainer[] filteredFaceDistanceContainers)
|
||||
{
|
||||
List<SortingContainer> results = [];
|
||||
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
|
||||
@ -470,13 +622,13 @@ public partial class E_Distance : IDistance
|
||||
}
|
||||
});
|
||||
if (distanceLimits is not null && distanceLimits.RangeDaysDeltaTargetLessThenUpper)
|
||||
results = Shared.Models.Stateless.Methods.ISortingContainer.Sort(results);
|
||||
results = ISortingContainer.Sort(results);
|
||||
else
|
||||
results = Shared.Models.Stateless.Methods.ISortingContainer.SortUsingDaysDelta(results);
|
||||
results = ISortingContainer.SortUsingDaysDelta(results);
|
||||
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 +648,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 +661,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 +676,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 +694,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