Removed both

faceDistanceLength.Length.Value / distanceTolerance
and
confidence / rangeFaceConfidence[1]
Removed ReviewLocationContainerDistanceTolerance
Added MoveToDecade
IFaceDistance.MappingFromFilterPost
ISorting.CanReMap
This commit is contained in:
2023-09-04 23:25:31 -07:00
parent 600f6e7e2b
commit b2e2a66101
23 changed files with 275 additions and 239 deletions

View File

@ -26,7 +26,6 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
private readonly Serilog.ILogger? _Log;
private readonly int _FaceConfidencePercent;
private readonly bool _DistanceRenameToMatch;
private readonly float[] _RangeFaceConfidence;
private readonly bool _DistanceMoveUnableToMatch;
private readonly float _RectangleIntersectMinimum;
private readonly List<string> _AllMappedFaceFiles;
@ -34,7 +33,7 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
private readonly double _RangeDistanceToleranceAverage;
private readonly List<string> _DuplicateMappedFaceFiles;
public E_Distance(bool distanceMoveUnableToMatch, bool distanceRenameToMatch, int faceConfidencePercent, float[] rangeDistanceTolerance, float[] rangeFaceConfidence, float[] rectangleIntersectMinimums)
public E_Distance(bool distanceMoveUnableToMatch, bool distanceRenameToMatch, int faceConfidencePercent, float[] rangeDistanceTolerance, float[] rectangleIntersectMinimums)
{
_Debug = new();
_Moved = new();
@ -42,7 +41,6 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
_AllMappedFaceFiles = new();
_AllMappedFaceFileNames = new();
_DuplicateMappedFaceFiles = new();
_RangeFaceConfidence = rangeFaceConfidence;
_Log = Serilog.Log.ForContext<E_Distance>();
_DistanceRenameToMatch = distanceRenameToMatch;
_FaceConfidencePercent = faceConfidencePercent;
@ -70,14 +68,16 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
{
if (face.FaceEncoding is null || face.Location is null || face.OutputResolution is null)
throw new NotSupportedException();
confidencePercent = Shared.Models.Stateless.Methods.ILocation.GetConfidencePercent(_FaceConfidencePercent, _RangeFaceConfidence, face.Location.Confidence);
if (face.Mapping?.MappingFromFilterPost is null)
throw new NotSupportedException();
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, mappingFromItem.Id, mappingFromItem.IsWrongYear, wholePercentages);
faceDistance = new(confidencePercent, mappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), faceEncoding, face.Mapping?.MappingFromFilterPost, mappingFromItem.Id, mappingFromItem.IsWrongYear, wholePercentages);
else
{
faceEncoding = FaceRecognition.LoadFaceEncoding(face.FaceEncoding.RawEncoding);
faceDistance = new(confidencePercent, mappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), faceEncoding, mappingFromItem.Id, mappingFromItem.IsWrongYear, wholePercentages);
faceDistance = new(confidencePercent, mappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), faceEncoding, face.Mapping?.MappingFromFilterPost, mappingFromItem.Id, mappingFromItem.IsWrongYear, wholePercentages);
lock (intersectFaces)
face.SetFaceDistance(faceDistance);
}
@ -336,7 +336,7 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
File.WriteAllLines(eDistanceContentFileName, results);
}
public static void SetFaceDistances(int maxDegreeOfParallelism, long ticks, ReadOnlyCollection<Face> distinctFilteredFaces)
public static void PreFilterSetFaceDistances(int maxDegreeOfParallelism, long ticks, ReadOnlyCollection<Face> distinctFilteredFaces)
{
List<Face> faces = new();
foreach (Face face in distinctFilteredFaces)
@ -362,7 +362,7 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
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.MappingFromItem.Id, face.Mapping.MappingFromItem.IsWrongYear, face.Mapping.MappingFromLocation.WholePercentages);
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);
lock (face)
face.SetFaceDistance(faceDistance);
});
@ -419,7 +419,7 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
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.MappingFromItem.Id, face.Mapping.MappingFromItem.IsWrongYear, face.Mapping.MappingFromLocation.WholePercentages);
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);
faceDistanceContainer = new(face, faceDistance);
collection.Add(faceDistanceContainer);
}
@ -489,90 +489,6 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
return results;
}
private static void ReviewLocationContainerDistanceTolerance(float locationContainerDistanceTolerance, DateTime dateTime, DateTime yesterday, List<Record> records)
{
FileInfo fileInfo;
List<string> files = new();
FaceDistance? faceDistanceEncoding;
List<FaceDistance> faceDistanceLengths;
List<string> firstPassFailures = new();
List<FaceDistance> faceDistanceEncodings = new();
faceDistanceEncoding = new(records[0].FaceRecognitionDotNetFaceEncoding);
foreach (Record record in records)
{
files.Add(record.File);
faceDistanceEncodings.Add(new(record.FaceRecognitionDotNetFaceEncoding));
}
if (faceDistanceEncoding is null)
throw new NullReferenceException(nameof(faceDistanceEncoding));
faceDistanceLengths = FaceRecognition.FaceDistances(new(faceDistanceEncodings), faceDistanceEncoding);
if (faceDistanceLengths.Count != files.Count)
throw new Exception();
for (int i = 0; i < files.Count; i++)
{
if (faceDistanceLengths[i].Length < locationContainerDistanceTolerance)
continue;
firstPassFailures.Add(files[i]);
}
faceDistanceEncoding = new(records[^1].FaceRecognitionDotNetFaceEncoding);
foreach (Record record in records)
{
files.Add(record.File);
faceDistanceEncodings.Add(new(record.FaceRecognitionDotNetFaceEncoding));
}
if (faceDistanceEncoding is null)
throw new NullReferenceException(nameof(faceDistanceEncoding));
faceDistanceLengths = FaceRecognition.FaceDistances(new(faceDistanceEncodings), faceDistanceEncoding);
if (faceDistanceLengths.Count != files.Count)
throw new Exception();
for (int i = 0; i < files.Count; i++)
{
fileInfo = new(files[i]);
if (!fileInfo.Exists)
continue;
if (fileInfo.CreationTime > yesterday)
File.SetCreationTime(fileInfo.FullName, yesterday);
if (faceDistanceLengths[i].Length < locationContainerDistanceTolerance)
continue;
if (firstPassFailures.Contains(fileInfo.FullName))
continue;
File.SetCreationTime(fileInfo.FullName, dateTime);
}
}
void IDistance<MetadataExtractor.Directory>.ReviewLocationContainerDistanceTolerance(float locationContainerDistanceTolerance, ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> locationContainers)
{
string? json;
List<Record> records = new();
int? lastDirectoryNumber = null;
DateTime dateTime = DateTime.Now;
DateTime yesterday = DateTime.Now.AddDays(-1);
Shared.Models.FaceEncoding? modelsFaceEncoding;
FaceRecognitionDotNet.FaceEncoding faceRecognitionDotNetFaceEncoding;
foreach (LocationContainer<MetadataExtractor.Directory> locationContainer in locationContainers)
{
if (locationContainer.DirectoryNumber is null)
continue;
if (lastDirectoryNumber is not null && locationContainer.DirectoryNumber.Value != lastDirectoryNumber.Value)
{
if (records.Count > 2)
ReviewLocationContainerDistanceTolerance(locationContainerDistanceTolerance, dateTime, yesterday, records);
records.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);
records.Add(new(locationContainer.File, faceRecognitionDotNetFaceEncoding));
lastDirectoryNumber = locationContainer.DirectoryNumber.Value;
}
if (records.Count > 2)
ReviewLocationContainerDistanceTolerance(locationContainerDistanceTolerance, dateTime, yesterday, records);
}
private static void WriteVsCodeFiles(string eDistanceContentDirectory, string? displayDirectoryName, string directory)
{
string json;
@ -622,14 +538,17 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
}
}
private static void SaveMappedForOutputResolutions(string eDistanceContentDirectory, float distanceTolerance, string personKeyFormatted, string? displayDirectoryName, List<Record> records, string directory)
private static void SaveMappedForOutputResolutions(string eDistanceContentDirectory, float distanceTolerance, long personKey, bool isCounterPersonYear, string personKeyFormatted, string? displayDirectoryName, List<Record> records, string directory)
{
int years;
string text;
string fileName;
FileInfo fileInfo;
List<string> files = new();
List<string> lines = new();
List<Mapped> results = new();
List<string> linkedOnce = new();
long ticks = DateTime.Now.Ticks;
string fileNameWithoutExtension;
List<string> linkedTwice = new();
List<string> linkedThrice = new();
@ -639,7 +558,6 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
Uri uri = new(eDistanceContentDirectory);
Dictionary<string, int> keyValuePairs = new();
List<FaceDistance> faceDistanceEncodings = new();
List<Mapped> results = new();
foreach (Record record in records)
{
files.Add(record.File);
@ -689,6 +607,10 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
continue;
}
}
if (isCounterPersonYear)
(years, _) = Shared.Models.Stateless.Methods.IAge.GetAge(ticks, fileInfo.CreationTime.Ticks);
else
(years, _) = Shared.Models.Stateless.Methods.IAge.GetAge(fileInfo.CreationTime.Ticks, personKey);
fileNameWithoutExtension = Path.GetFileNameWithoutExtension(Path.GetFileNameWithoutExtension(fileInfo.Name));
lines.Add("---");
lines.Add("type: \"distance\"");
@ -701,6 +623,10 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
lines.Add(string.Empty);
lines.Add($"![0]({uri.MakeRelativeUri(new(record.File)).OriginalString})");
lines.Add($"__{fileNameWithoutExtension}__");
if (isCounterPersonYear)
lines.Add($"#{years}yrs-ago");
else
lines.Add($"#{years}yrs-old");
lines.Add(string.Empty);
lines.AddRange(results.Select(l => $"{l.Image}{Environment.NewLine}{l.Link}{Environment.NewLine}"));
text = string.Join(Environment.NewLine, lines);
@ -710,7 +636,7 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
MoveFiles(keyValuePairs, linkedOnce, linkedTwice, linkedThrice);
}
void IDistance<MetadataExtractor.Directory>.SaveMappedForOutputResolutions(string a2PeopleContentDirectory, string eDistanceContentDirectory, float[] rangeDistanceTolerance, ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> locationContainers, string personKeyFormatted, string? displayDirectoryName)
void IDistance<MetadataExtractor.Directory>.SaveMappedForOutputResolutions(string a2PeopleContentDirectory, string eDistanceContentDirectory, float locationContainerDistanceTolerance, ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> locationContainers, long personKey, bool isCounterPersonYear, string personKeyFormatted, string? displayDirectoryName)
{
string? json;
List<Record> records = new();
@ -727,13 +653,13 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
faceRecognitionDotNetFaceEncoding = FaceRecognition.LoadFaceEncoding(modelsFaceEncoding.RawEncoding);
records.Add(new(locationContainer.File, faceRecognitionDotNetFaceEncoding));
}
string directory = Path.Combine(a2PeopleContentDirectory, rangeDistanceTolerance[1].ToString(), personKeyFormatted);
string directory = Path.Combine(a2PeopleContentDirectory, locationContainerDistanceTolerance.ToString(), personKeyFormatted);
if (!Directory.Exists(directory))
_ = Directory.CreateDirectory(directory);
if (records.Count > 0)
{
WriteVsCodeFiles(eDistanceContentDirectory, displayDirectoryName, directory);
SaveMappedForOutputResolutions(eDistanceContentDirectory, rangeDistanceTolerance[1], personKeyFormatted, displayDirectoryName, records, directory);
SaveMappedForOutputResolutions(eDistanceContentDirectory, locationContainerDistanceTolerance, personKey, isCounterPersonYear, personKeyFormatted, displayDirectoryName, records, directory);
}
_ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(directory);
}