LocationContainer
This commit is contained in:
@ -38,53 +38,14 @@ public partial class E_Distance
|
||||
_DistanceMoveUnableToMatch = distanceMoveUnableToMatch;
|
||||
}
|
||||
|
||||
private void MoveUnableToMatch(string eDistanceContentDirectory, string file, string fileName)
|
||||
private static void MoveUnableToMatch(string file)
|
||||
{
|
||||
bool check;
|
||||
string? directoryName = Path.GetDirectoryName(file);
|
||||
if (fileName is null || directoryName is null)
|
||||
check = false;
|
||||
else
|
||||
{
|
||||
if (string.IsNullOrEmpty(directoryName) || string.IsNullOrEmpty(directoryName) || !directoryName.Contains(eDistanceContentDirectory))
|
||||
check = false;
|
||||
else
|
||||
{
|
||||
List<string> directoryNames = new();
|
||||
string? checkDirectoryName = directoryName;
|
||||
for (int i = 0; i < int.MaxValue; i++)
|
||||
{
|
||||
if (string.IsNullOrEmpty(checkDirectoryName))
|
||||
continue;
|
||||
directoryNames.Add(Path.GetFileName(checkDirectoryName));
|
||||
checkDirectoryName = Path.GetDirectoryName(checkDirectoryName);
|
||||
if (string.IsNullOrEmpty(checkDirectoryName))
|
||||
continue;
|
||||
if (checkDirectoryName == eDistanceContentDirectory)
|
||||
break;
|
||||
}
|
||||
if (string.IsNullOrEmpty(checkDirectoryName) || !directoryNames.Any() || !long.TryParse(directoryNames[^1][1..^1], out long directoryTicks))
|
||||
{
|
||||
check = false;
|
||||
File.Delete(file);
|
||||
}
|
||||
else
|
||||
{
|
||||
checkDirectoryName = Path.Combine(checkDirectoryName, $"({directoryTicks}_{string.Join('-', _RangeDistanceTolerance)})");
|
||||
for (int i = directoryNames.Count - 1 - 1; i > -1; i--)
|
||||
checkDirectoryName = Path.Combine(checkDirectoryName, directoryNames[i]);
|
||||
if (!Directory.Exists(checkDirectoryName))
|
||||
_ = Directory.CreateDirectory(checkDirectoryName);
|
||||
File.Move(file, Path.Combine(checkDirectoryName, fileName));
|
||||
check = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (check)
|
||||
_Moved.Add(file);
|
||||
string checkFile = string.Concat(file, ".unk");
|
||||
if (File.Exists(file) && !File.Exists(checkFile))
|
||||
File.Move(file, checkFile);
|
||||
}
|
||||
|
||||
private FaceDistanceContainer[] GetFaceDistanceContainers(MappingFromItem mappingFromItem, List<Face> filteredFaces)
|
||||
private FaceDistanceContainer[] GetFaceDistanceContainers(MappingFromItem mappingFromItem, List<Face> intersectFaces)
|
||||
{
|
||||
FaceDistanceContainer[] results;
|
||||
int confidencePercent;
|
||||
@ -92,7 +53,7 @@ public partial class E_Distance
|
||||
FaceDistance faceDistance;
|
||||
FaceDistanceContainer faceDistanceContainer;
|
||||
List<FaceDistanceContainer> collection = new();
|
||||
foreach (Face face in filteredFaces)
|
||||
foreach (Face face in intersectFaces)
|
||||
{
|
||||
if (face.FaceEncoding is null || face.Location is null || face.OutputResolution is null)
|
||||
throw new NotSupportedException();
|
||||
@ -104,7 +65,7 @@ public partial class E_Distance
|
||||
{
|
||||
faceEncoding = FaceRecognition.LoadFaceEncoding(face.FaceEncoding.RawEncoding);
|
||||
faceDistance = new(confidencePercent, faceEncoding, mappingFromItem.Id, mappingFromItem.IsWrongYear, mappingFromItem.MinimumDateTime, normalizedRectangle);
|
||||
lock (filteredFaces)
|
||||
lock (intersectFaces)
|
||||
face.SetFaceDistance(faceDistance);
|
||||
}
|
||||
faceDistanceContainer = new(face, faceDistance);
|
||||
@ -126,42 +87,38 @@ public partial class E_Distance
|
||||
return faceDistanceEncodings;
|
||||
}
|
||||
|
||||
private List<(Face Face, double? Length)> GetValues(MappingFromItem mappingFromItem, Face[] faces, Shared.Models.FaceEncoding modelsFaceEncoding, int normalizedRectangle)
|
||||
private List<(Face Face, double? Length)> GetValues(MappingFromItem mappingFromItem, List<Face> intersectFaces, Shared.Models.FaceEncoding modelsFaceEncoding)
|
||||
{
|
||||
List<(Face Face, double? Length)> results = new();
|
||||
Face face;
|
||||
FaceDistance faceDistanceLength;
|
||||
List<Face> filteredFaces = FilterByIntersect(faces, normalizedRectangle);
|
||||
if (filteredFaces.Any())
|
||||
FaceRecognitionDotNet.FaceEncoding faceRecognitionDotNetFaceEncoding = FaceRecognition.LoadFaceEncoding(modelsFaceEncoding.RawEncoding);
|
||||
FaceDistance faceDistanceEncoding = new(faceRecognitionDotNetFaceEncoding);
|
||||
FaceDistanceContainer[] faceDistanceContainers = GetFaceDistanceContainers(mappingFromItem, intersectFaces);
|
||||
int faceDistanceContainersLength = faceDistanceContainers.Length;
|
||||
if (faceDistanceContainersLength != intersectFaces.Count)
|
||||
throw new NotSupportedException();
|
||||
List<FaceDistance> faceDistanceEncodings = GetFaceDistanceEncodings(faceDistanceContainers);
|
||||
if (faceDistanceEncodings.Count != intersectFaces.Count)
|
||||
throw new NotSupportedException();
|
||||
List<FaceDistance> faceDistanceLengths = FaceRecognition.FaceDistances(faceDistanceEncodings, faceDistanceEncoding);
|
||||
if (faceDistanceLengths.Count != faceDistanceContainersLength)
|
||||
throw new NotSupportedException();
|
||||
for (int i = 0; i < intersectFaces.Count; i++)
|
||||
{
|
||||
FaceRecognitionDotNet.FaceEncoding faceRecognitionDotNetFaceEncoding = FaceRecognition.LoadFaceEncoding(modelsFaceEncoding.RawEncoding);
|
||||
FaceDistance faceDistanceEncoding = new(faceRecognitionDotNetFaceEncoding);
|
||||
FaceDistanceContainer[] faceDistanceContainers = GetFaceDistanceContainers(mappingFromItem, filteredFaces);
|
||||
int faceDistanceContainersLength = faceDistanceContainers.Length;
|
||||
if (faceDistanceContainersLength != filteredFaces.Count)
|
||||
face = intersectFaces[i];
|
||||
faceDistanceLength = faceDistanceLengths[i];
|
||||
if (faceDistanceLength.Length is null)
|
||||
throw new NotSupportedException();
|
||||
List<FaceDistance> faceDistanceEncodings = GetFaceDistanceEncodings(faceDistanceContainers);
|
||||
if (faceDistanceEncodings.Count != filteredFaces.Count)
|
||||
throw new NotSupportedException();
|
||||
List<FaceDistance> faceDistanceLengths = FaceRecognition.FaceDistances(faceDistanceEncodings, faceDistanceEncoding);
|
||||
if (faceDistanceLengths.Count != faceDistanceContainersLength)
|
||||
throw new NotSupportedException();
|
||||
for (int i = 0; i < filteredFaces.Count; i++)
|
||||
{
|
||||
face = filteredFaces[i];
|
||||
faceDistanceLength = faceDistanceLengths[i];
|
||||
if (faceDistanceLength.Length is null)
|
||||
throw new NotSupportedException();
|
||||
results.Add(new(face, faceDistanceLength.Length.Value));
|
||||
}
|
||||
results.Add(new(face, faceDistanceLength.Length.Value));
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
private (Face, double?)[] GetClosestFaceByDistanceIgnoringTolerance(MappingFromItem mappingFromItem, int normalizedRectangle, Face[] filteredFaces, Shared.Models.FaceEncoding modelsFaceEncoding)
|
||||
private (Face, double?)[] GetClosestFaceByDistanceIgnoringTolerance(MappingFromItem mappingFromItem, List<Face> intersectFaces, Shared.Models.FaceEncoding modelsFaceEncoding)
|
||||
{
|
||||
(Face, double?)[] results;
|
||||
List<(Face Face, double? Length)> collection = GetValues(mappingFromItem, filteredFaces, modelsFaceEncoding, normalizedRectangle);
|
||||
List<(Face Face, double? Length)> collection = GetValues(mappingFromItem, intersectFaces, modelsFaceEncoding);
|
||||
results = (from l in collection orderby l.Length select l).Take(1).ToArray();
|
||||
if (results.Any())
|
||||
{
|
||||
@ -240,70 +197,41 @@ public partial class E_Distance
|
||||
}
|
||||
}
|
||||
|
||||
private static List<Face> FilterByIntersect(Face[] faces, int normalizedRectangle)
|
||||
{
|
||||
List<Face> results = new();
|
||||
bool useOldWay;
|
||||
double? percent;
|
||||
System.Drawing.Rectangle checkRectangle;
|
||||
System.Drawing.Rectangle sourceRectangle;
|
||||
System.Drawing.Rectangle intersectRectangle;
|
||||
foreach (Face face in faces)
|
||||
{
|
||||
if (face.Location is null || face.OutputResolution is null)
|
||||
continue;
|
||||
checkRectangle = new(face.Location.Left, face.Location.Top, face.Location.Right - face.Location.Left, face.Location.Bottom - face.Location.Top);
|
||||
for (int i = 1; i < 3; i++)
|
||||
{
|
||||
useOldWay = i == 1;
|
||||
sourceRectangle = Shared.Models.Stateless.Methods.ILocation.GetRectangle(checkRectangle, Shared.Models.Stateless.ILocation.Digits, Shared.Models.Stateless.ILocation.Factor, normalizedRectangle, face.OutputResolution, useOldWay);
|
||||
intersectRectangle = System.Drawing.Rectangle.Intersect(checkRectangle, sourceRectangle);
|
||||
if (intersectRectangle.Width == 0 || intersectRectangle.Height == 0)
|
||||
continue;
|
||||
percent = (double)intersectRectangle.Width * intersectRectangle.Height / (checkRectangle.Width * checkRectangle.Height);
|
||||
if (percent < 0.000001)
|
||||
continue;
|
||||
results.Add(face);
|
||||
}
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
public void LookForMatchFacesAndPossiblyRename(string facesFileNameExtension, string eDistanceContentDirectory, MappingFromItem mappingFromItem, List<Face> faces, List<(bool c, string File, int NormalizedRectangle, IReadOnlyList<MetadataExtractor.Directory>? Directories)> collection)
|
||||
public void LookForMatchFacesAndPossiblyRename(string facesFileNameExtension, string eDistanceContentDirectory, MappingFromItem mappingFromItem, List<Face> faces, List<LocationContainer<MetadataExtractor.Directory>> collection)
|
||||
{
|
||||
string? json;
|
||||
string fileName;
|
||||
string[] matches;
|
||||
FileInfo? fileInfo;
|
||||
List<Face> intersectFaces;
|
||||
List<(Face, double?)> checkFaces = new();
|
||||
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();
|
||||
foreach ((bool fromDistanceContent, string file, int normalizedRectangle, IReadOnlyList<MetadataExtractor.Directory>? directories) in collection)
|
||||
foreach (LocationContainer<MetadataExtractor.Directory>? locationContainer in collection)
|
||||
{
|
||||
if (!filteredFaces.Any())
|
||||
break;
|
||||
if (_Renamed.Contains(file))
|
||||
if (_Renamed.Contains(locationContainer.File))
|
||||
continue;
|
||||
fileName = Path.GetFileName(file);
|
||||
if (fromDistanceContent && _DuplicateMappedFaceFiles.Contains(fileName))
|
||||
fileName = Path.GetFileName(locationContainer.File);
|
||||
if (locationContainer.FromDistanceContent && _DuplicateMappedFaceFiles.Contains(fileName))
|
||||
continue;
|
||||
checkFaces.Clear();
|
||||
if (directories is null)
|
||||
if (!locationContainer.Directories.Any())
|
||||
{
|
||||
if (fromDistanceContent)
|
||||
throw new NullReferenceException(nameof(directories));
|
||||
if (locationContainer.FromDistanceContent)
|
||||
throw new NullReferenceException(nameof(locationContainer.Directories));
|
||||
continue;
|
||||
}
|
||||
json = Metadata.Models.Stateless.IMetadata.GetFaceEncoding(directories);
|
||||
json = Metadata.Models.Stateless.IMetadata.GetFaceEncoding(locationContainer.Directories);
|
||||
if (json is null)
|
||||
{
|
||||
if (_DistanceMoveUnableToMatch)
|
||||
MoveUnableToMatch(eDistanceContentDirectory, file, fileName);
|
||||
MoveUnableToMatch(locationContainer.File);
|
||||
continue;
|
||||
}
|
||||
checkFaces.AddRange(GetMatchingFacesByFaceEncoding(filteredFaces, json));
|
||||
if (filteredFaces.Any())
|
||||
checkFaces.AddRange(GetMatchingFacesByFaceEncoding(filteredFaces, json));
|
||||
if (checkFaces.Count == 1)
|
||||
_Debug.Add(0);
|
||||
if (checkFaces.Count != 1 && !string.IsNullOrEmpty(json))
|
||||
@ -312,44 +240,49 @@ public partial class E_Distance
|
||||
modelsFaceEncoding = JsonSerializer.Deserialize<Shared.Models.FaceEncoding>(json);
|
||||
if (modelsFaceEncoding is null)
|
||||
throw new NotSupportedException();
|
||||
checkFaces.AddRange(GetClosestFaceByDistanceIgnoringTolerance(mappingFromItem, normalizedRectangle, filteredFaces, modelsFaceEncoding));
|
||||
if (filteredFaces.Any())
|
||||
{
|
||||
intersectFaces = Shared.Models.Stateless.Methods.ILocation.FilterByIntersect(filteredFaces, locationContainer.NormalizedRectangle);
|
||||
if (intersectFaces.Any())
|
||||
checkFaces.AddRange(GetClosestFaceByDistanceIgnoringTolerance(mappingFromItem, intersectFaces, modelsFaceEncoding));
|
||||
}
|
||||
}
|
||||
if (!checkFaces.Any())
|
||||
{
|
||||
if (_DistanceMoveUnableToMatch)
|
||||
MoveUnableToMatch(eDistanceContentDirectory, file, fileName);
|
||||
MoveUnableToMatch(locationContainer.File);
|
||||
continue;
|
||||
}
|
||||
if (checkFaces.Count != 1)
|
||||
{
|
||||
if (_DistanceMoveUnableToMatch)
|
||||
MoveUnableToMatch(eDistanceContentDirectory, file, fileName);
|
||||
MoveUnableToMatch(locationContainer.File);
|
||||
continue;
|
||||
}
|
||||
fileInfo = CheckFileThenGetFileInfo(facesFileNameExtension, mappingFromItem, file, checkFaces);
|
||||
fileInfo = CheckFileThenGetFileInfo(facesFileNameExtension, mappingFromItem, locationContainer.File, checkFaces);
|
||||
if (fileInfo is not null)
|
||||
{
|
||||
if (_DistanceRenameToMatch && fileInfo is not null)
|
||||
{
|
||||
if (fileInfo.Exists)
|
||||
File.Delete(file);
|
||||
File.Delete(locationContainer.File);
|
||||
else
|
||||
File.Move(file, fileInfo.FullName);
|
||||
_Renamed.Add(file);
|
||||
File.Move(locationContainer.File, fileInfo.FullName);
|
||||
_Renamed.Add(locationContainer.File);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (_AllMappedFaceFileNames.Contains(fileName))
|
||||
{
|
||||
lock (_AllMappedFaceFiles)
|
||||
matches = (from l in _AllMappedFaceFiles where l != file && Path.GetFileName(l) == fileName select l).ToArray();
|
||||
if (fromDistanceContent && matches.Any())
|
||||
AppendMatchingDuplicates(file, matches);
|
||||
matches = (from l in _AllMappedFaceFiles where l != locationContainer.File && Path.GetFileName(l) == fileName select l).ToArray();
|
||||
if (locationContainer.FromDistanceContent && matches.Any())
|
||||
AppendMatchingDuplicates(locationContainer.File, matches);
|
||||
}
|
||||
if (!fromDistanceContent)
|
||||
if (!locationContainer.FromDistanceContent)
|
||||
continue;
|
||||
lock (_AllMappedFaceFiles)
|
||||
_AllMappedFaceFiles.Add(file);
|
||||
_AllMappedFaceFiles.Add(locationContainer.File);
|
||||
lock (_AllMappedFaceFileNames)
|
||||
_AllMappedFaceFileNames.Add(fileName);
|
||||
}
|
||||
|
Reference in New Issue
Block a user