Mass push
This commit is contained in:
@ -39,7 +39,7 @@
|
||||
<PackageReference Include="Serilog" Version="2.12.0" />
|
||||
<PackageReference Include="ShellProgressBar" Version="5.2.0" />
|
||||
<PackageReference Include="WindowsShortcutFactory" Version="1.1.0" />
|
||||
<PackageReference Include="System.Text.Json" Version="7.0.0" />
|
||||
<PackageReference Include="System.Text.Json" Version="7.0.1" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\FaceRecognitionDotNet\FaceRecognitionDotNet.csproj" />
|
||||
|
@ -135,7 +135,7 @@ public class MapLogicSupport : Shared.Models.Methods.IMapLogicSupport
|
||||
}
|
||||
foreach (Sorting sorting in collection)
|
||||
{
|
||||
if (face.Mapping is null || faceDistanceEncoding.NormalizedPixelPercentage is null)
|
||||
if (face.Mapping is null || faceDistanceEncoding.NormalizedRectangle is null)
|
||||
throw new NotSupportedException();
|
||||
if (sorting.DaysDelta > rangeDaysDeltaTolerance)
|
||||
{
|
||||
@ -165,12 +165,10 @@ public class MapLogicSupport : Shared.Models.Methods.IMapLogicSupport
|
||||
return results;
|
||||
}
|
||||
|
||||
private static List<Sorting> GetSortingCollection(MapLogic mapLogic, List<FaceDistance> faceDistanceEncodings, int faceDistanceContainersLength, int i, FaceDistance faceDistanceEncoding)
|
||||
private static List<Sorting> GetSortingCollection(MapLogic mapLogic, List<FaceDistance> faceDistanceEncodings, int i, FaceDistance faceDistanceEncoding)
|
||||
{
|
||||
List<Sorting> results;
|
||||
List<FaceDistance> faceDistanceLengths = FaceRecognition.FaceDistances(faceDistanceEncodings, faceDistanceEncoding);
|
||||
if (faceDistanceLengths.Count != faceDistanceContainersLength)
|
||||
throw new NotSupportedException();
|
||||
results = mapLogic.GetSortingCollection(i, faceDistanceEncoding, faceDistanceLengths);
|
||||
return results;
|
||||
}
|
||||
@ -187,7 +185,7 @@ public class MapLogicSupport : Shared.Models.Methods.IMapLogicSupport
|
||||
throw new NotSupportedException();
|
||||
if (face.FaceDistance?.Encoding is not FaceRecognitionDotNet.FaceEncoding faceEncoding)
|
||||
continue;
|
||||
faceDistance = new(face.Mapping.MappingFromLocation.ConfidencePercent, faceEncoding, face.Mapping.MappingFromItem.Id, face.Mapping.MappingFromItem.IsWrongYear, face.Mapping.MappingFromItem.MinimumDateTime, face.Mapping.MappingFromLocation.NormalizedPixelPercentage);
|
||||
faceDistance = new(face.Mapping.MappingFromLocation.ConfidencePercent, faceEncoding, face.Mapping.MappingFromItem.Id, face.Mapping.MappingFromItem.IsWrongYear, face.Mapping.MappingFromItem.MinimumDateTime, face.Mapping.MappingFromLocation.NormalizedRectangle);
|
||||
faceDistanceContainer = new(face, faceDistance);
|
||||
collection.Add(faceDistanceContainer);
|
||||
}
|
||||
@ -195,7 +193,7 @@ public class MapLogicSupport : Shared.Models.Methods.IMapLogicSupport
|
||||
return results;
|
||||
}
|
||||
|
||||
private static List<FaceDistance> GetFaceDistanceEncodings(FaceDistanceContainer[] faceDistanceContainers)
|
||||
private static List<FaceDistance> GetFaceDistanceEncodings(FaceDistanceContainer[] faceDistanceContainers, List<FaceDistanceContainer> missingFaceDistanceContainers)
|
||||
{
|
||||
List<FaceDistance> faceDistanceEncodings = new();
|
||||
foreach (FaceDistanceContainer faceDistanceContainer in faceDistanceContainers)
|
||||
@ -204,30 +202,36 @@ public class MapLogicSupport : Shared.Models.Methods.IMapLogicSupport
|
||||
continue;
|
||||
faceDistanceEncodings.Add(faceDistanceContainer.FaceDistance);
|
||||
}
|
||||
foreach (FaceDistanceContainer faceDistanceContainer in missingFaceDistanceContainers)
|
||||
{
|
||||
if (faceDistanceContainer.FaceDistance.Encoding is null)
|
||||
continue;
|
||||
faceDistanceEncodings.Add(faceDistanceContainer.FaceDistance);
|
||||
}
|
||||
return faceDistanceEncodings;
|
||||
}
|
||||
|
||||
public SortingContainer[] SetFaceMappingSortingCollectionThenGetSortingContainers(int maxDegreeOfParallelism, long ticks, MapLogic mapLogic, Face[] distinctFilteredFaces, int? useFiltersCounter)
|
||||
public SortingContainer[] SetFaceMappingSortingCollectionThenGetSortingContainers(int maxDegreeOfParallelism, long ticks, MapLogic mapLogic, Face[] distinctFilteredFaces, List<FaceDistanceContainer> missingFaceDistanceContainers, int? useFiltersCounter)
|
||||
{
|
||||
SortingContainer[] results;
|
||||
List<SortingContainer> collection = new();
|
||||
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
|
||||
ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = maxDegreeOfParallelism };
|
||||
FaceDistanceContainer[] faceDistanceContainers = GetFaceDistanceContainers(distinctFilteredFaces);
|
||||
List<FaceDistance> faceDistanceEncodings = GetFaceDistanceEncodings(faceDistanceContainers);
|
||||
List<FaceDistance> faceDistanceEncodings = GetFaceDistanceEncodings(faceDistanceContainers, missingFaceDistanceContainers);
|
||||
string message = $") {faceDistanceContainers.Length:000} Get Sorting Containers Then Set Face Mapping Sorting Collection - {totalSeconds} total second(s)";
|
||||
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
|
||||
using ProgressBar progressBar = new(faceDistanceContainers.Length, message, options);
|
||||
_ = Parallel.For(0, faceDistanceContainers.Length, parallelOptions, (i, state) =>
|
||||
{
|
||||
progressBar.Tick();
|
||||
Face face = faceDistanceContainers[i].Face;
|
||||
if (face.Mapping is null)
|
||||
throw new NotSupportedException();
|
||||
FaceDistance faceDistanceEncoding = faceDistanceContainers[i].FaceDistance;
|
||||
if (mapLogic.Used(faceDistanceEncoding))
|
||||
return;
|
||||
List<Sorting> sortingCollection = GetSortingCollection(mapLogic, faceDistanceEncodings, faceDistanceContainers.Length, i, faceDistanceEncoding);
|
||||
Face face = faceDistanceContainers[i].Face;
|
||||
if (face.Mapping is null)
|
||||
throw new NotSupportedException();
|
||||
List<Sorting> sortingCollection = GetSortingCollection(mapLogic, faceDistanceEncodings, i, faceDistanceEncoding);
|
||||
if (!sortingCollection.Any())
|
||||
return;
|
||||
List<SortingContainer> sortingContainers = GetSortingContainers(face, faceDistanceEncoding, sortingCollection, useFiltersCounter);
|
||||
@ -268,7 +272,7 @@ public class MapLogicSupport : Shared.Models.Methods.IMapLogicSupport
|
||||
return;
|
||||
progressBar.Tick();
|
||||
faceEncoding = FaceRecognition.LoadFaceEncoding(face.FaceEncoding.RawEncoding);
|
||||
FaceDistance faceDistance = new(face.Mapping.MappingFromLocation.ConfidencePercent, faceEncoding, face.Mapping.MappingFromItem.Id, face.Mapping.MappingFromItem.IsWrongYear, face.Mapping.MappingFromItem.MinimumDateTime, face.Mapping.MappingFromLocation.NormalizedPixelPercentage);
|
||||
FaceDistance faceDistance = new(face.Mapping.MappingFromLocation.ConfidencePercent, faceEncoding, face.Mapping.MappingFromItem.Id, face.Mapping.MappingFromItem.IsWrongYear, face.Mapping.MappingFromItem.MinimumDateTime, face.Mapping.MappingFromLocation.NormalizedRectangle);
|
||||
lock (face)
|
||||
face.SetFaceDistance(faceDistance);
|
||||
});
|
||||
@ -325,7 +329,7 @@ public class MapLogicSupport : Shared.Models.Methods.IMapLogicSupport
|
||||
}
|
||||
}
|
||||
|
||||
public static Dictionary<int, Dictionary<int, Mapping>> GetIdToNormalizedPixelPercentageToFace(Mapping[] mappingCollection)
|
||||
public static Dictionary<int, Dictionary<int, Mapping>> GetIdToNormalizedRectangleToFace(Mapping[] mappingCollection)
|
||||
{
|
||||
Dictionary<int, Dictionary<int, Mapping>> results = new();
|
||||
Dictionary<int, Mapping> keyValuePairs;
|
||||
@ -334,9 +338,9 @@ public class MapLogicSupport : Shared.Models.Methods.IMapLogicSupport
|
||||
if (!results.ContainsKey(mapping.MappingFromItem.Id))
|
||||
results.Add(mapping.MappingFromItem.Id, new());
|
||||
keyValuePairs = results[mapping.MappingFromItem.Id];
|
||||
if (keyValuePairs.ContainsKey(mapping.MappingFromLocation.NormalizedPixelPercentage))
|
||||
throw new NotSupportedException();
|
||||
keyValuePairs.Add(mapping.MappingFromLocation.NormalizedPixelPercentage, mapping);
|
||||
if (keyValuePairs.ContainsKey(mapping.MappingFromLocation.NormalizedRectangle))
|
||||
continue;
|
||||
keyValuePairs.Add(mapping.MappingFromLocation.NormalizedRectangle, mapping);
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
@ -1,3 +1,4 @@
|
||||
using ShellProgressBar;
|
||||
using System.Text.Json;
|
||||
using View_by_Distance.Distance.Models.Stateless;
|
||||
using View_by_Distance.FaceRecognitionDotNet;
|
||||
@ -18,11 +19,10 @@ public partial class E_Distance
|
||||
private readonly bool _DistanceMoveUnableToMatch;
|
||||
private readonly List<string> _AllMappedFaceFiles;
|
||||
private readonly double[] _RangeDistanceTolerance;
|
||||
private readonly int _DistancePixelDistanceTolerance;
|
||||
private readonly List<string> _AllMappedFaceFileNames;
|
||||
private readonly List<string> _DuplicateMappedFaceFiles;
|
||||
|
||||
public E_Distance(bool distanceMoveUnableToMatch, int distancePixelDistanceTolerance, bool distanceRenameToMatch, int faceConfidencePercent, double[] rangeDistanceTolerance, double[] rangeFaceConfidence)
|
||||
public E_Distance(bool distanceMoveUnableToMatch, bool distanceRenameToMatch, int faceConfidencePercent, double[] rangeDistanceTolerance, double[] rangeFaceConfidence)
|
||||
{
|
||||
_Debug = new();
|
||||
_Moved = new();
|
||||
@ -36,7 +36,6 @@ public partial class E_Distance
|
||||
_FaceConfidencePercent = faceConfidencePercent;
|
||||
_RangeDistanceTolerance = rangeDistanceTolerance;
|
||||
_DistanceMoveUnableToMatch = distanceMoveUnableToMatch;
|
||||
_DistancePixelDistanceTolerance = distancePixelDistanceTolerance;
|
||||
}
|
||||
|
||||
private void MoveUnableToMatch(string eDistanceContentDirectory, string mappedFaceFile, string mappedFaceFileName)
|
||||
@ -85,12 +84,12 @@ public partial class E_Distance
|
||||
_Moved.Add(mappedFaceFile);
|
||||
}
|
||||
|
||||
private FaceDistanceContainer[] GetFaceDistanceContainers(MappingFromItem mappingFromItem, Face[] filteredFaces)
|
||||
private FaceDistanceContainer[] GetFaceDistanceContainers(MappingFromItem mappingFromItem, List<Face> filteredFaces)
|
||||
{
|
||||
FaceDistanceContainer[] results;
|
||||
int confidencePercent;
|
||||
int normalizedRectangle;
|
||||
FaceDistance faceDistance;
|
||||
int normalizedPixelPercentage;
|
||||
FaceDistanceContainer faceDistanceContainer;
|
||||
List<FaceDistanceContainer> collection = new();
|
||||
foreach (Face face in filteredFaces)
|
||||
@ -98,13 +97,13 @@ public partial class E_Distance
|
||||
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);
|
||||
normalizedPixelPercentage = Shared.Models.Stateless.Methods.ILocation.GetNormalizedPixelPercentage(face.Location, Shared.Models.Stateless.ILocation.Digits, Shared.Models.Stateless.ILocation.Factor, face.OutputResolution);
|
||||
normalizedRectangle = Shared.Models.Stateless.Methods.ILocation.GetNormalizedRectangle(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, faceEncoding, mappingFromItem.Id, mappingFromItem.IsWrongYear, mappingFromItem.MinimumDateTime, normalizedPixelPercentage);
|
||||
faceDistance = new(confidencePercent, faceEncoding, mappingFromItem.Id, mappingFromItem.IsWrongYear, mappingFromItem.MinimumDateTime, normalizedRectangle);
|
||||
else
|
||||
{
|
||||
faceEncoding = FaceRecognition.LoadFaceEncoding(face.FaceEncoding.RawEncoding);
|
||||
faceDistance = new(confidencePercent, faceEncoding, mappingFromItem.Id, mappingFromItem.IsWrongYear, mappingFromItem.MinimumDateTime, normalizedPixelPercentage);
|
||||
faceDistance = new(confidencePercent, faceEncoding, mappingFromItem.Id, mappingFromItem.IsWrongYear, mappingFromItem.MinimumDateTime, normalizedRectangle);
|
||||
lock (filteredFaces)
|
||||
face.SetFaceDistance(faceDistance);
|
||||
}
|
||||
@ -127,119 +126,45 @@ public partial class E_Distance
|
||||
return faceDistanceEncodings;
|
||||
}
|
||||
|
||||
private List<(Face Face, double? Length)> GetValues(MappingFromItem mappingFromItem, Face[] filteredFaces, string json)
|
||||
private List<(Face Face, double? Length)> GetValues(MappingFromItem mappingFromItem, Face[] faces, Shared.Models.FaceEncoding modelsFaceEncoding, int normalizedRectangle)
|
||||
{
|
||||
List<(Face Face, double? Length)> results = new();
|
||||
Face face;
|
||||
FaceDistance faceDistanceLength;
|
||||
Shared.Models.FaceEncoding? modelsFaceEncoding = JsonSerializer.Deserialize<Shared.Models.FaceEncoding>(json);
|
||||
if (modelsFaceEncoding is null)
|
||||
throw new NotSupportedException();
|
||||
FaceRecognitionDotNet.FaceEncoding faceRecognitionDotNetFaceEncoding = FaceRecognition.LoadFaceEncoding(modelsFaceEncoding.RawEncoding);
|
||||
FaceDistance faceDistanceEncoding = new(faceRecognitionDotNetFaceEncoding);
|
||||
FaceDistanceContainer[] faceDistanceContainers = GetFaceDistanceContainers(mappingFromItem, filteredFaces);
|
||||
int faceDistanceContainersLength = faceDistanceContainers.Length;
|
||||
if (faceDistanceContainersLength != filteredFaces.Length)
|
||||
throw new NotSupportedException();
|
||||
List<FaceDistance> faceDistanceEncodings = GetFaceDistanceEncodings(faceDistanceContainers);
|
||||
if (faceDistanceEncodings.Count != filteredFaces.Length)
|
||||
throw new NotSupportedException();
|
||||
List<FaceDistance> faceDistanceLengths = FaceRecognition.FaceDistances(faceDistanceEncodings, faceDistanceEncoding);
|
||||
if (faceDistanceLengths.Count != faceDistanceContainersLength)
|
||||
throw new NotSupportedException();
|
||||
for (int i = 0; i < filteredFaces.Length; i++)
|
||||
List<Face> filteredFaces = FilterByIntersect(faces, normalizedRectangle);
|
||||
if (filteredFaces.Any())
|
||||
{
|
||||
face = filteredFaces[i];
|
||||
faceDistanceLength = faceDistanceLengths[i];
|
||||
if (faceDistanceLength.Length is null)
|
||||
FaceRecognitionDotNet.FaceEncoding faceRecognitionDotNetFaceEncoding = FaceRecognition.LoadFaceEncoding(modelsFaceEncoding.RawEncoding);
|
||||
FaceDistance faceDistanceEncoding = new(faceRecognitionDotNetFaceEncoding);
|
||||
FaceDistanceContainer[] faceDistanceContainers = GetFaceDistanceContainers(mappingFromItem, filteredFaces);
|
||||
int faceDistanceContainersLength = faceDistanceContainers.Length;
|
||||
if (faceDistanceContainersLength != filteredFaces.Count)
|
||||
throw new NotSupportedException();
|
||||
results.Add(new(face, faceDistanceLength.Length.Value));
|
||||
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));
|
||||
}
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
private (Face, double?)[] GetClosestFaceByDistanceIgnoringTolerance(MappingFromItem mappingFromItem, Face[] filteredFaces, string json)
|
||||
private (Face, double?)[] GetClosestFaceByDistanceIgnoringTolerance(MappingFromItem mappingFromItem, int normalizedRectangle, Face[] filteredFaces, Shared.Models.FaceEncoding modelsFaceEncoding)
|
||||
{
|
||||
(Face, double?)[] results;
|
||||
List<(Face Face, double? Length)> collection = GetValues(mappingFromItem, filteredFaces, json);
|
||||
List<(Face Face, double? Length)> collection = GetValues(mappingFromItem, filteredFaces, modelsFaceEncoding, normalizedRectangle);
|
||||
results = (from l in collection orderby l.Length select l).Take(1).ToArray();
|
||||
(Face face, double? length) = results.First();
|
||||
lock (_Debug)
|
||||
_Debug.Add(length);
|
||||
return results;
|
||||
}
|
||||
|
||||
private static (int?, int?) GetXY(int normalizedPixelPercentage, OutputResolution? outputResolution)
|
||||
{
|
||||
int? x;
|
||||
int? y;
|
||||
if (outputResolution is null)
|
||||
{
|
||||
x = null;
|
||||
y = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
string normalizedPixelPercentagePadded = Shared.Models.Stateless.Methods.ILocation.GetLeftPadded(Shared.Models.Stateless.ILocation.Digits, normalizedPixelPercentage);
|
||||
(x, y) = Shared.Models.Stateless.Methods.ILocation.GetXY(Shared.Models.Stateless.ILocation.Digits, Shared.Models.Stateless.ILocation.Factor, outputResolution.Width, outputResolution.Height, normalizedPixelPercentagePadded);
|
||||
}
|
||||
return new(x, y);
|
||||
}
|
||||
|
||||
private (Face, double?)[] GetClosestFaceByPixel(Face[] filteredFaces, int? x1, int? y1)
|
||||
{
|
||||
(Face, double?)[] results;
|
||||
int? x2;
|
||||
int? y2;
|
||||
double distance;
|
||||
int normalizedPixelPercentageLoop;
|
||||
string normalizedPixelPercentagePadded;
|
||||
List<(Face Face, double? Order)> collection = new();
|
||||
if (x1 is null || y1 is null)
|
||||
throw new NotSupportedException();
|
||||
foreach (Face face in filteredFaces)
|
||||
{
|
||||
if (face.Location is null || face.OutputResolution is null)
|
||||
throw new NotSupportedException();
|
||||
normalizedPixelPercentageLoop = Shared.Models.Stateless.Methods.ILocation.GetNormalizedPixelPercentage(face.Location, Shared.Models.Stateless.ILocation.Digits, Shared.Models.Stateless.ILocation.Factor, face.OutputResolution);
|
||||
normalizedPixelPercentagePadded = Shared.Models.Stateless.Methods.ILocation.GetLeftPadded(Shared.Models.Stateless.ILocation.Digits, normalizedPixelPercentageLoop);
|
||||
(x2, y2) = Shared.Models.Stateless.Methods.ILocation.GetXY(Shared.Models.Stateless.ILocation.Digits, Shared.Models.Stateless.ILocation.Factor, face.OutputResolution.Width, face.OutputResolution.Height, normalizedPixelPercentagePadded);
|
||||
if (x2 is null || y2 is null)
|
||||
throw new NotSupportedException();
|
||||
distance = Math.Sqrt(Math.Pow(x1.Value - x2.Value, 2) + Math.Pow(y1.Value - y2.Value, 2));
|
||||
collection.Add(new(face, distance));
|
||||
}
|
||||
results = (from l in collection orderby l.Order where l.Order < _DistancePixelDistanceTolerance select l).Take(1).ToArray();
|
||||
return results;
|
||||
}
|
||||
|
||||
private (Face, double?)[] GetClosestFaceByPixel(Face[] filteredFaces, int normalizedPixelPercentage)
|
||||
{
|
||||
if (!filteredFaces.Any())
|
||||
throw new NotSupportedException();
|
||||
(Face, double?)[] results;
|
||||
const int zero = 0;
|
||||
OutputResolution? outputResolution = filteredFaces[zero].OutputResolution;
|
||||
(int? x1, int? y1) = GetXY(normalizedPixelPercentage, outputResolution);
|
||||
results = GetClosestFaceByPixel(filteredFaces, x1, y1);
|
||||
return results;
|
||||
}
|
||||
|
||||
private (Face, double?)[] GetClosestFaceByPixel(Face[] filteredFaces, string json)
|
||||
{
|
||||
if (!filteredFaces.Any())
|
||||
throw new NotSupportedException();
|
||||
(Face, double?)[] results;
|
||||
const int zero = 0;
|
||||
OutputResolution? outputResolution = filteredFaces[zero].OutputResolution;
|
||||
if (outputResolution is null)
|
||||
throw new NullReferenceException(nameof(outputResolution));
|
||||
Location? location = JsonSerializer.Deserialize<Location>(json);
|
||||
if (location is null)
|
||||
throw new NullReferenceException(nameof(location));
|
||||
int normalizedPixelPercentage = Shared.Models.Stateless.Methods.ILocation.GetNormalizedPixelPercentage(location, Shared.Models.Stateless.ILocation.Digits, Shared.Models.Stateless.ILocation.Factor, outputResolution);
|
||||
(int? x1, int? y1) = GetXY(normalizedPixelPercentage, outputResolution);
|
||||
results = GetClosestFaceByPixel(filteredFaces, x1, y1);
|
||||
(Face _, double? length) = results.First();
|
||||
_Debug.Add(length);
|
||||
return results;
|
||||
}
|
||||
|
||||
@ -276,7 +201,7 @@ public partial class E_Distance
|
||||
mappedFaceDirectory = Path.GetDirectoryName(mappedFaceFile);
|
||||
if (mappedFaceDirectory is null)
|
||||
throw new NotSupportedException();
|
||||
deterministicHashCodeKey = Shared.Models.Stateless.Methods.IMapping.GetDeterministicHashCodeKey(mappingFromItem.Id, face.Location, Shared.Models.Stateless.ILocation.Digits, Shared.Models.Stateless.ILocation.Factor, face.OutputResolution);
|
||||
deterministicHashCodeKey = Shared.Models.Stateless.Methods.IMapping.GetDeterministicHashCodeKey(mappingFromItem.Id, face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution);
|
||||
checkFile = Path.Combine(mappedFaceDirectory, $"{deterministicHashCodeKey}{mappingFromItem.ImageFileHolder.ExtensionLowered}{facesFileNameExtension}");
|
||||
if (checkFile == mappedFaceFile)
|
||||
continue;
|
||||
@ -312,17 +237,44 @@ public partial class E_Distance
|
||||
}
|
||||
}
|
||||
|
||||
public void LookForMatchFacesAndPossiblyRename(string facesFileNameExtension, string? eDistanceContentDirectory, MappingFromItem mappingFromItem, List<Face> faces, List<(string MappedFaceFile, int normalizedPixelPercentage)> collection)
|
||||
private static List<Face> FilterByIntersect(Face[] faces, int normalizedRectangle)
|
||||
{
|
||||
List<Face> results = new();
|
||||
results.AddRange(faces);
|
||||
// double? percent;
|
||||
// System.Drawing.Rectangle checkRectangle;
|
||||
// System.Drawing.Rectangle sourceRectangle;
|
||||
// System.Drawing.Rectangle intersectRectangle;
|
||||
// string npp = normalizedRectangle.ToString();
|
||||
// foreach (Face face in faces)
|
||||
// {
|
||||
// if (face.Location is null || face.OutputResolution is null)
|
||||
// continue;
|
||||
// sourceRectangle = new(npp, npp, npp, npp);
|
||||
// checkRectangle = new(face.Location.Left, face.Location.Top, face.Location.Right - face.Location.Left, face.Location.Bottom - face.Location.Top);
|
||||
// intersectRectangle = System.Drawing.Rectangle.Intersect(sourceRectangle, checkRectangle);
|
||||
// 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<(string MappedFaceFile, int normalizedRectangle)> collection)
|
||||
{
|
||||
string? json;
|
||||
string[] matches;
|
||||
FileInfo? fileInfo;
|
||||
string mappedFaceFileName;
|
||||
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 ((string mappedFaceFile, int normalizedPixelPercentage) in collection)
|
||||
foreach ((string mappedFaceFile, int normalizedRectangle) in collection)
|
||||
{
|
||||
if (!filteredFaces.Any())
|
||||
break;
|
||||
@ -343,19 +295,10 @@ public partial class E_Distance
|
||||
if (checkFaces.Count != 1 && !string.IsNullOrEmpty(json))
|
||||
{
|
||||
checkFaces.Clear();
|
||||
if (json is null)
|
||||
modelsFaceEncoding = JsonSerializer.Deserialize<Shared.Models.FaceEncoding>(json);
|
||||
if (modelsFaceEncoding is null)
|
||||
throw new NotSupportedException();
|
||||
checkFaces.AddRange(GetClosestFaceByDistanceIgnoringTolerance(mappingFromItem, filteredFaces, json));
|
||||
}
|
||||
if (checkFaces.Count != 1 && _DistancePixelDistanceTolerance > 0)
|
||||
{
|
||||
checkFaces.Clear();
|
||||
json = Metadata.Models.Stateless.IMetadata.GetFaceLocation(mappedFaceFile);
|
||||
if (json is not null)
|
||||
checkFaces.AddRange(GetClosestFaceByPixel(filteredFaces, json));
|
||||
else
|
||||
checkFaces.AddRange(GetClosestFaceByPixel(filteredFaces, normalizedPixelPercentage));
|
||||
throw new NotImplementedException("Without a tolerance this should not ever occur!");
|
||||
checkFaces.AddRange(GetClosestFaceByDistanceIgnoringTolerance(mappingFromItem, normalizedRectangle, filteredFaces, modelsFaceEncoding));
|
||||
}
|
||||
if (!checkFaces.Any())
|
||||
{
|
||||
@ -415,4 +358,57 @@ public partial class E_Distance
|
||||
_DuplicateMappedFaceFiles.Clear();
|
||||
}
|
||||
|
||||
public List<FaceDistanceContainer> GetMissingFaceDistanceContainer(int maxDegreeOfParallelism, long ticks, string dFacesCollectionDirectory, Dictionary<int, Dictionary<int, PersonContainer[]>> missingIdThenNormalizedRectangleToPersonContainers)
|
||||
{
|
||||
List<FaceDistanceContainer> results = new();
|
||||
string[] files;
|
||||
List<Face>? faces;
|
||||
int confidencePercent;
|
||||
int normalizedRectangle;
|
||||
bool? isWrongYear = null;
|
||||
FaceDistance faceDistance;
|
||||
List<(int id, string json)> collection = new();
|
||||
FaceDistanceContainer faceDistanceContainer;
|
||||
foreach (KeyValuePair<int, Dictionary<int, PersonContainer[]>> keyValuePair in missingIdThenNormalizedRectangleToPersonContainers)
|
||||
{
|
||||
files = Directory.GetFiles(dFacesCollectionDirectory, $"{keyValuePair.Key}*.json", SearchOption.TopDirectoryOnly);
|
||||
if (files.Length != 1)
|
||||
continue;
|
||||
collection.Add(new(keyValuePair.Key, Shared.Models.Stateless.Methods.IFace.GetJson(files[0])));
|
||||
}
|
||||
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
|
||||
ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = maxDegreeOfParallelism };
|
||||
string message = $") {collection.Count:000} Setting missing distance containers - {totalSeconds} total second(s)";
|
||||
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
|
||||
using ProgressBar progressBar = new(collection.Count, message, options);
|
||||
_ = Parallel.For(0, collection.Count, parallelOptions, (i, state) =>
|
||||
{
|
||||
progressBar.Tick();
|
||||
int id = collection[i].id;
|
||||
string json = collection[i].json;
|
||||
faces = JsonSerializer.Deserialize<List<Face>>(json);
|
||||
if (faces is null)
|
||||
throw new NullReferenceException(nameof(faces));
|
||||
foreach (Face face in faces)
|
||||
{
|
||||
if (face.FaceEncoding is null || face.Location is null || face.OutputResolution is null)
|
||||
continue;
|
||||
confidencePercent = Shared.Models.Stateless.Methods.ILocation.GetConfidencePercent(_FaceConfidencePercent, _RangeFaceConfidence, face.Location.Confidence);
|
||||
normalizedRectangle = Shared.Models.Stateless.Methods.ILocation.GetNormalizedRectangle(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, faceEncoding, id, isWrongYear, face.DateTime, normalizedRectangle);
|
||||
else
|
||||
{
|
||||
faceEncoding = FaceRecognition.LoadFaceEncoding(face.FaceEncoding.RawEncoding);
|
||||
faceDistance = new(confidencePercent, faceEncoding, id, isWrongYear, face.DateTime, normalizedRectangle);
|
||||
face.SetFaceDistance(faceDistance);
|
||||
}
|
||||
faceDistanceContainer = new(face, faceDistance);
|
||||
lock (results)
|
||||
results.Add(faceDistanceContainer);
|
||||
}
|
||||
});
|
||||
return results;
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user