(637967784888423594)-2,042.zip
(637969699845057599)-548.zip
This commit is contained in:
Mike Phares 2022-08-24 21:25:03 -07:00
parent 2d9c912ba7
commit 674555b4fc
17 changed files with 184 additions and 230 deletions

View File

@ -21,6 +21,7 @@
"nosj", "nosj",
"paramref", "paramref",
"Phares", "Phares",
"RDHC",
"Rects", "Rects",
"resnet", "resnet",
"Serilog", "Serilog",

View File

@ -222,9 +222,9 @@ public class FaceRecognition : DisposableObject
return results; return results;
} }
public List<(Location, FaceEncoding?, Dictionary<FacePart, FacePoint[]>?)> GetCollection(Image image, bool includeFaceEncoding, bool includeFaceParts, bool sortByNormalizedPixelPercentage) public List<(int, Location, FaceEncoding?, Dictionary<FacePart, FacePoint[]>?)> GetCollection(Image image, bool includeFaceEncoding, bool includeFaceParts, bool sortByNormalizedPixelPercentage)
{ {
List<(Location, FaceEncoding?, Dictionary<FacePart, FacePoint[]>?)> results = new(); List<(int, Location, FaceEncoding?, Dictionary<FacePart, FacePoint[]>?)> results = new();
if (image is null) if (image is null)
throw new NullReferenceException(nameof(image)); throw new NullReferenceException(nameof(image));
image.ThrowIfDisposed(); image.ThrowIfDisposed();
@ -235,9 +235,9 @@ public class FaceRecognition : DisposableObject
List<FullObjectDetection> fullObjectDetections = GetFullObjectDetections(image, locations); List<FullObjectDetection> fullObjectDetections = GetFullObjectDetections(image, locations);
if (fullObjectDetections.Count != locations.Count) if (fullObjectDetections.Count != locations.Count)
throw new Exception(); throw new Exception();
List<(Location Location, List<FaceEncoding?> FaceEncodings, List<List<(FacePart, FacePoint[])>> FaceParts)> collection = new(); List<(int LocationIndex, Location Location, List<FaceEncoding?> FaceEncodings, List<List<(FacePart, FacePoint[])>> FaceParts)> collection = new();
foreach (Location location in locations) for (int i = 0; i < locations.Count; i++)
collection.Add(new(location, new(), new())); collection.Add(new(i, locations[i], new(), new()));
if (locations.Count != collection.Count) if (locations.Count != collection.Count)
throw new Exception(); throw new Exception();
if (!includeFaceEncoding) if (!includeFaceEncoding)
@ -274,18 +274,18 @@ public class FaceRecognition : DisposableObject
fullObjectDetection.Dispose(); fullObjectDetection.Dispose();
const int indexZero = 0; const int indexZero = 0;
Dictionary<FacePart, FacePoint[]> keyValuePairs; Dictionary<FacePart, FacePoint[]> keyValuePairs;
foreach ((Location location, List<FaceEncoding?> faceEncodings, List<List<(FacePart, FacePoint[])>> faceParts) in collection) foreach ((int locationIndex, Location location, List<FaceEncoding?> faceEncodings, List<List<(FacePart, FacePoint[])>> faceParts) in collection)
{ {
if (faceEncodings.Count != 1 || faceParts.Count != 1) if (faceEncodings.Count != 1 || faceParts.Count != 1)
continue; continue;
if (!faceParts[indexZero].Any()) if (!faceParts[indexZero].Any())
results.Add(new(location, faceEncodings[indexZero], null)); results.Add(new(locationIndex, location, faceEncodings[indexZero], null));
else else
{ {
keyValuePairs = new(); keyValuePairs = new();
foreach ((FacePart facePart, FacePoint[] facePoints) in faceParts[indexZero]) foreach ((FacePart facePart, FacePoint[] facePoints) in faceParts[indexZero])
keyValuePairs.Add(facePart, facePoints); keyValuePairs.Add(facePart, facePoints);
results.Add(new(location, faceEncodings[indexZero], keyValuePairs)); results.Add(new(locationIndex, location, faceEncodings[indexZero], keyValuePairs));
} }
} }
return results; return results;

View File

@ -664,13 +664,12 @@ public class DlibDotNet
foreach (string outputResolution in _Configuration.OutputResolutions) foreach (string outputResolution in _Configuration.OutputResolutions)
{ {
(aResultsFullGroupDirectory, bResultsFullGroupDirectory, cResultsFullGroupDirectory, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory, eResultsFullGroupDirectory, zResultsFullGroupDirectory) = GetResultsFullGroupDirectories(configuration, model, predictorModel, outputResolution); (aResultsFullGroupDirectory, bResultsFullGroupDirectory, cResultsFullGroupDirectory, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory, eResultsFullGroupDirectory, zResultsFullGroupDirectory) = GetResultsFullGroupDirectories(configuration, model, predictorModel, outputResolution);
if (_ArgZeroIsConfigurationRootDirectory && _Exceptions.Count == 0 && outputResolution == _Configuration.OutputResolutions[0] && (mapLogic.NamedFaceInfoDeterministicHashCodeKeyValuePairs.Any() || mapLogic.NamedDeterministicHashCodeKeyValuePairs.Any())) if (_ArgZeroIsConfigurationRootDirectory && _Exceptions.Count == 0 && outputResolution == _Configuration.OutputResolutions[0])
{ {
if (!string.IsNullOrEmpty(mapLogic.DeterministicHashCodeRootDirectory) && !mapLogic.IncorrectDeterministicHashCodeKeyValuePairs.Any()) mapLogic.UseKeyValuePairsSaveFaceEncoding(containers);
mapLogic.UpdateKeyValuePairs(containers);
foreach (Container container in containers) foreach (Container container in containers)
{ {
Map.Models.MapLogic.AddToNamed(mapLogic, container.Items); mapLogic.AddToNamed(container.Items);
if (_Configuration.SaveShortcutsForOutputResolutions.Contains(outputResolution)) if (_Configuration.SaveShortcutsForOutputResolutions.Contains(outputResolution))
D_Face.SaveShortcuts(_Configuration.JuliePhares, dResultsFullGroupDirectory, ticks, peopleCollection, mapLogic, container.Items); D_Face.SaveShortcuts(_Configuration.JuliePhares, dResultsFullGroupDirectory, ticks, peopleCollection, mapLogic, container.Items);
} }

View File

@ -182,20 +182,19 @@ public class D_Face
results.Add(new(property, outputResolutionWidth, outputResolutionHeight, outputResolutionOrientation, item.RelativePath, i: null, location: null)); results.Add(new(property, outputResolutionWidth, outputResolutionHeight, outputResolutionOrientation, item.RelativePath, i: null, location: null));
else else
{ {
List<(Location Location, FaceRecognitionDotNet.FaceEncoding? FaceEncoding, Dictionary<FacePart, FacePoint[]>? FaceParts)> collection; List<(int, Location Location, FaceRecognitionDotNet.FaceEncoding? FaceEncoding, Dictionary<FacePart, FacePoint[]>? FaceParts)> collection;
FaceRecognition faceRecognition = new(_Configuration.NumberOfTimesToUpsample, _Configuration.NumberOfJitters, _PredictorModel, _Model, _ModelParameter); FaceRecognition faceRecognition = new(_Configuration.NumberOfTimesToUpsample, _Configuration.NumberOfJitters, _PredictorModel, _Model, _ModelParameter);
collection = faceRecognition.GetCollection(unknownImage, includeFaceEncoding: true, includeFaceParts: true, sortByNormalizedPixelPercentage: true); collection = faceRecognition.GetCollection(unknownImage, includeFaceEncoding: true, includeFaceParts: true, sortByNormalizedPixelPercentage: true);
if (!collection.Any()) if (!collection.Any())
results.Add(new(property, outputResolutionWidth, outputResolutionHeight, outputResolutionOrientation, item.RelativePath, i: null, location: null)); results.Add(new(property, outputResolutionWidth, outputResolutionHeight, outputResolutionOrientation, item.RelativePath, i: null, location: null));
else else
{ {
int i = 0;
Face face; Face face;
double[] rawEncoding; double[] rawEncoding;
Shared.Models.FaceEncoding convertedFaceEncoding; Shared.Models.FaceEncoding convertedFaceEncoding;
foreach ((Location location, FaceRecognitionDotNet.FaceEncoding? faceEncoding, Dictionary<FacePart, FacePoint[]>? faceParts) in collection) foreach ((int locationIndex, Location location, FaceRecognitionDotNet.FaceEncoding? faceEncoding, Dictionary<FacePart, FacePoint[]>? faceParts) in collection)
{ {
face = new(property, outputResolutionWidth, outputResolutionHeight, outputResolutionOrientation, item.RelativePath, i, location); face = new(property, outputResolutionWidth, outputResolutionHeight, outputResolutionOrientation, item.RelativePath, locationIndex, location);
if (faceEncoding is not null) if (faceEncoding is not null)
{ {
rawEncoding = faceEncoding.GetRawEncoding(); rawEncoding = faceEncoding.GetRawEncoding();
@ -205,7 +204,6 @@ public class D_Face
if (faceParts is not null) if (faceParts is not null)
face.SetFaceParts(faceParts); face.SetFaceParts(faceParts);
results.Add(face); results.Add(face);
i += 1;
} }
} }
unknownImage.Dispose(); unknownImage.Dispose();
@ -379,7 +377,7 @@ public class D_Face
WindowsShortcut windowsShortcut; WindowsShortcut windowsShortcut;
const string pattern = @"[\\,\/,\:,\*,\?,\"",\<,\>,\|]"; const string pattern = @"[\\,\/,\:,\*,\?,\"",\<,\>,\|]";
string dFacesContentDirectory = Path.Combine(dResultsFullGroupDirectory, $"({ticks})"); string dFacesContentDirectory = Path.Combine(dResultsFullGroupDirectory, $"({ticks})");
List<(Item, (string, Face?, (string, string, string, string))[])> collections = Map.Models.MapLogic.GetCollection(mapLogic, items, dFacesContentDirectory); List<(Item, (string, Face?, (string, string, string, string))[])> collections = mapLogic.GetCollection(items, dFacesContentDirectory);
foreach ((Item item, (string personKey, Face? _, (string, string, string, string))[] collection) in collections) foreach ((Item item, (string personKey, Face? _, (string, string, string, string))[] collection) in collections)
{ {
if (collection.Length != 1) if (collection.Length != 1)

View File

@ -541,7 +541,7 @@ internal class E_Distance
{ {
List<double> faceDistances = FaceRecognition.FaceDistances(tuple.FaceEncodings, faceEncoding); List<double> faceDistances = FaceRecognition.FaceDistances(tuple.FaceEncodings, faceEncoding);
result = new(face.Location?.NormalizedPixelPercentage, tuple.MinimumDateTime, tuple.IsWrongYear, tuple.PersonBirthday, faceDistances); result = new(face.Location?.NormalizedPixelPercentage, tuple.MinimumDateTime, tuple.IsWrongYear, tuple.PersonBirthday, faceDistances);
if (result.Minimum > Shared.Models.Stateless.Methods.IClosest.MaximumMinimum) if (result.Minimum > Shared.Models.Stateless.IClosest.MaximumMinimum)
result = null; result = null;
} }
return result; return result;
@ -565,7 +565,7 @@ internal class E_Distance
continue; continue;
faceDistances = FaceRecognition.FaceDistances(faceEncodings, faceEncoding); faceDistances = FaceRecognition.FaceDistances(faceEncodings, faceEncoding);
closest = new(face.Location?.NormalizedPixelPercentage, minimumDateTime, isWrongYear, personBirthday, faceDistances); closest = new(face.Location?.NormalizedPixelPercentage, minimumDateTime, isWrongYear, personBirthday, faceDistances);
if (closest.Minimum > Shared.Models.Stateless.Methods.IClosest.MaximumMinimum) if (closest.Minimum > Shared.Models.Stateless.IClosest.MaximumMinimum)
continue; continue;
closestCollection.Add(closest); closestCollection.Add(closest);
} }
@ -613,7 +613,7 @@ internal class E_Distance
if (itemMinimumDateTime is null) if (itemMinimumDateTime is null)
continue; continue;
(itemIsWrongYear, _) = Map.Models.MapLogic.IsWrongYear(item); (itemIsWrongYear, _) = Map.Models.MapLogic.IsWrongYear(item);
if (Shared.Models.Stateless.Methods.IClosest.SkipIsWrongYear && itemIsWrongYear.HasValue && itemIsWrongYear.Value) if (Shared.Models.Stateless.IClosest.SkipIsWrongYear && itemIsWrongYear.HasValue && itemIsWrongYear.Value)
continue; continue;
item.Closest.Clear(); item.Closest.Clear();
for (int i = 0; i < item.Faces.Count; i++) for (int i = 0; i < item.Faces.Count; i++)
@ -631,12 +631,12 @@ internal class E_Distance
if (closest.PersonBirthday is null) if (closest.PersonBirthday is null)
continue; continue;
personKey = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(closest.PersonBirthday); personKey = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(closest.PersonBirthday);
if (mapLogic.IncorrectDeterministicHashCodeKeyValuePairs.ContainsKey(deterministicHashCodeKey) && mapLogic.IncorrectDeterministicHashCodeKeyValuePairs[deterministicHashCodeKey].Contains(personKey)) if (mapLogic.IsIncorrect(deterministicHashCodeKey, personKey))
continue; continue;
key = Map.Models.MapLogic.GetKey(closest.MinimumDateTime, closest.IsWrongYear, closest.PersonBirthday); key = Map.Models.MapLogic.GetKey(closest.MinimumDateTime, closest.IsWrongYear, closest.PersonBirthday);
if (!results.ContainsKey(key)) if (!results.ContainsKey(key))
results.Add(key, 0); results.Add(key, 0);
else if (results[key] > Shared.Models.Stateless.Methods.IClosest.MaximumPer) else if (results[key] > Shared.Models.Stateless.IClosest.MaximumPer)
continue; continue;
results[key] += 1; results[key] += 1;
item.Closest[0] = closest; item.Closest[0] = closest;
@ -732,7 +732,7 @@ internal class E_Distance
FileInfo landmarkFileInfo; FileInfo landmarkFileInfo;
string landmarksDirectory; string landmarksDirectory;
double deterministicHashCodeKey; double deterministicHashCodeKey;
const string facePopulatedKey = "Closest"; const string facePopulatedKey = nameof(Closest);
const string pattern = @"[\\,\/,\:,\*,\?,\"",\<,\>,\|]"; const string pattern = @"[\\,\/,\:,\*,\?,\"",\<,\>,\|]";
foreach (Container container in containers) foreach (Container container in containers)
{ {

View File

@ -12,16 +12,12 @@ public class MapLogic
protected readonly Dictionary<int, int[]> _IndicesFromNew; protected readonly Dictionary<int, int[]> _IndicesFromNew;
protected readonly string _DeterministicHashCodeRootDirectory; protected readonly string _DeterministicHashCodeRootDirectory;
protected readonly Dictionary<int, string[]> _SixCharacterNamedFaceInfo; protected readonly Dictionary<int, string[]> _SixCharacterNamedFaceInfo;
protected readonly Dictionary<int, string[]> _NamedFaceInfoDeterministicHashCodeKeyValuePairs; protected readonly Dictionary<int, string[]> _DeterministicHashCodeUnknownFaceKeyValuePairs;
protected readonly Dictionary<double, string[]> _NamedDeterministicHashCodeKeyValuePairs; protected readonly Dictionary<double, string[]> _DeterministicHashCodeKeyValuePairs;
protected readonly Dictionary<double, string[]> _IncorrectDeterministicHashCodeKeyValuePairs; protected readonly Dictionary<double, string[]> _IncorrectDeterministicHashCodeKeyValuePairs;
public Dictionary<int, int[]> KeyValuePairs => _KeyValuePairs; public Dictionary<int, int[]> KeyValuePairs => _KeyValuePairs;
public Dictionary<int, int[]> IndicesFromNew => _IndicesFromNew; public Dictionary<int, int[]> IndicesFromNew => _IndicesFromNew;
public string DeterministicHashCodeRootDirectory => _DeterministicHashCodeRootDirectory;
public Dictionary<double, string[]> NamedDeterministicHashCodeKeyValuePairs => _NamedDeterministicHashCodeKeyValuePairs;
public Dictionary<double, string[]> IncorrectDeterministicHashCodeKeyValuePairs => _IncorrectDeterministicHashCodeKeyValuePairs;
public Dictionary<int, string[]> NamedFaceInfoDeterministicHashCodeKeyValuePairs => _NamedFaceInfoDeterministicHashCodeKeyValuePairs;
private readonly Serilog.ILogger? _Log; private readonly Serilog.ILogger? _Log;
private readonly Configuration _Configuration; private readonly Configuration _Configuration;
@ -31,7 +27,7 @@ public class MapLogic
_AllCollection = new(); _AllCollection = new();
_Configuration = configuration; _Configuration = configuration;
_Log = Serilog.Log.ForContext<MapLogic>(); _Log = Serilog.Log.ForContext<MapLogic>();
Dictionary<int, string[]>? namedFaceInfoDeterministicHashCode; Dictionary<int, string[]>? deterministicHashCodeUnknownFaceKeyValuePairs;
if (configuration.VerifyToSeason is null || !configuration.VerifyToSeason.Any()) if (configuration.VerifyToSeason is null || !configuration.VerifyToSeason.Any())
throw new Exception(); throw new Exception();
string json; string json;
@ -42,20 +38,20 @@ public class MapLogic
List<KeyValuePair<int, int[]>>? collection; List<KeyValuePair<int, int[]>>? collection;
Dictionary<int, int[]> indicesFromNew = new(); Dictionary<int, int[]> indicesFromNew = new();
Dictionary<int, string[]>? sixCharacterNamedFaceInfo; Dictionary<int, string[]>? sixCharacterNamedFaceInfo;
Dictionary<double, string[]> namedDeterministicHashCode = new(); Dictionary<double, string[]> deterministicHashCodeKeyValuePairs = new();
Dictionary<double, string[]> incorrectDeterministicHashCode = new(); Dictionary<double, string[]> incorrectDeterministicHashCodeKeyValuePairs = new();
string? rootDirectoryParent = Path.GetDirectoryName(configuration.RootDirectory); string? rootDirectoryParent = Path.GetDirectoryName(configuration.RootDirectory);
if (string.IsNullOrEmpty(rootDirectoryParent)) if (string.IsNullOrEmpty(rootDirectoryParent))
throw new NullReferenceException(nameof(rootDirectoryParent)); throw new NullReferenceException(nameof(rootDirectoryParent));
files = Directory.GetFiles(rootDirectoryParent, "*DeterministicHashCode*.json", SearchOption.TopDirectoryOnly); files = Directory.GetFiles(rootDirectoryParent, "*DeterministicHashCode*.json", SearchOption.TopDirectoryOnly);
if (files.Length != 1) if (files.Length != 1)
namedFaceInfoDeterministicHashCode = new(); deterministicHashCodeUnknownFaceKeyValuePairs = new();
else else
{ {
json = File.ReadAllText(files[0]); json = File.ReadAllText(files[0]);
namedFaceInfoDeterministicHashCode = JsonSerializer.Deserialize<Dictionary<int, string[]>>(json); deterministicHashCodeUnknownFaceKeyValuePairs = JsonSerializer.Deserialize<Dictionary<int, string[]>>(json);
if (namedFaceInfoDeterministicHashCode is null) if (deterministicHashCodeUnknownFaceKeyValuePairs is null)
throw new NullReferenceException(nameof(namedFaceInfoDeterministicHashCode)); throw new NullReferenceException(nameof(deterministicHashCodeUnknownFaceKeyValuePairs));
} }
string[] directories = Directory.GetDirectories(rootDirectoryParent, "*DeterministicHashCode*", SearchOption.TopDirectoryOnly); string[] directories = Directory.GetDirectories(rootDirectoryParent, "*DeterministicHashCode*", SearchOption.TopDirectoryOnly);
if (!directories.Any()) if (!directories.Any())
@ -64,9 +60,9 @@ public class MapLogic
{ {
Dictionary<int, List<Shared.Models.Face>> faces = new(); Dictionary<int, List<Shared.Models.Face>> faces = new();
deterministicHashCodeRootDirectory = directories[0]; deterministicHashCodeRootDirectory = directories[0];
SetKeyValuePairs(deterministicHashCodeRootDirectory, namedDeterministicHashCode, incorrectDeterministicHashCode, faces); SetKeyValuePairs(deterministicHashCodeRootDirectory, deterministicHashCodeKeyValuePairs, incorrectDeterministicHashCodeKeyValuePairs, faces);
} }
if (!namedFaceInfoDeterministicHashCode.Any()) if (!deterministicHashCodeUnknownFaceKeyValuePairs.Any())
sixCharacterNamedFaceInfo = new(); sixCharacterNamedFaceInfo = new();
else else
{ {
@ -112,78 +108,79 @@ public class MapLogic
_KeyValuePairs = keyValuePairs; _KeyValuePairs = keyValuePairs;
_IndicesFromNew = indicesFromNew; _IndicesFromNew = indicesFromNew;
_SixCharacterNamedFaceInfo = sixCharacterNamedFaceInfo; _SixCharacterNamedFaceInfo = sixCharacterNamedFaceInfo;
_NamedDeterministicHashCodeKeyValuePairs = namedDeterministicHashCode;
_DeterministicHashCodeRootDirectory = deterministicHashCodeRootDirectory; _DeterministicHashCodeRootDirectory = deterministicHashCodeRootDirectory;
_IncorrectDeterministicHashCodeKeyValuePairs = incorrectDeterministicHashCode; _DeterministicHashCodeKeyValuePairs = deterministicHashCodeKeyValuePairs;
_NamedFaceInfoDeterministicHashCodeKeyValuePairs = namedFaceInfoDeterministicHashCode; _IncorrectDeterministicHashCodeKeyValuePairs = incorrectDeterministicHashCodeKeyValuePairs;
_DeterministicHashCodeUnknownFaceKeyValuePairs = deterministicHashCodeUnknownFaceKeyValuePairs;
} }
private static void SetKeyValuePairs(string deterministicHashCodeRootDirectory, List<(string, double)> named, List<(string, double)> incorrect, Dictionary<int, List<Shared.Models.Face>> keyValuePairs) public bool IsIncorrect(double deterministicHashCodeKey, string personKey) => _DeterministicHashCodeKeyValuePairs.ContainsKey(deterministicHashCodeKey) && _IncorrectDeterministicHashCodeKeyValuePairs[deterministicHashCodeKey].Contains(personKey);
private void SetKeyValuePairs(string deterministicHashCodeRootDirectory, List<(string, double)> named, List<(string, double)> incorrect, Dictionary<int, List<Shared.Models.Face>> keyValuePairs)
{ {
string[] files; string[] files;
string fileName;
string personKey; string personKey;
string? checkFile;
string[] yearDirectories; string[] yearDirectories;
string ticksDirectoryName;
string[] personKeyDirectories; string[] personKeyDirectories;
string[] personNameDirectories; string[] personNameDirectories;
double? idAndNormalizedPixelPercentage; string[] personNameLinkDirectories;
double? reversedDeterministicHashCodeKey;
bool keyValuePairsAny = keyValuePairs.Any();
string[] ticksDirectories = Directory.GetDirectories(deterministicHashCodeRootDirectory, "*", SearchOption.TopDirectoryOnly); string[] ticksDirectories = Directory.GetDirectories(deterministicHashCodeRootDirectory, "*", SearchOption.TopDirectoryOnly);
foreach (string ticksDirectory in ticksDirectories) foreach (string ticksDirectory in ticksDirectories)
{ {
if (!ticksDirectory.EndsWith(')')) ticksDirectoryName = Path.GetFileName(ticksDirectory);
if (ticksDirectoryName.Length < 3 || ticksDirectoryName[0] != '(' || ticksDirectoryName[^1] != ')')
continue; continue;
personKeyDirectories = Directory.GetDirectories(ticksDirectory, "*", SearchOption.TopDirectoryOnly); personKeyDirectories = Directory.GetDirectories(ticksDirectory, "*", SearchOption.TopDirectoryOnly);
foreach (string personKeyDirectory in personKeyDirectories) foreach (string personKeyDirectory in personKeyDirectories)
{ {
personKey = Path.GetFileName(personKeyDirectory); personKey = Path.GetFileName(personKeyDirectory);
if (personKey == nameof(Shared.Models.Closest))
throw new Exception($"Move personKey directories up one from {nameof(Shared.Models.Closest)} and delete {nameof(Shared.Models.Closest)} directory!");
yearDirectories = Directory.GetDirectories(personKeyDirectory, "*", SearchOption.TopDirectoryOnly); yearDirectories = Directory.GetDirectories(personKeyDirectory, "*", SearchOption.TopDirectoryOnly);
foreach (string yearDirectory in yearDirectories) foreach (string yearDirectory in yearDirectories)
{ {
files = Directory.GetFiles(yearDirectory, "*", SearchOption.TopDirectoryOnly); files = Directory.GetFiles(yearDirectory, "*", SearchOption.TopDirectoryOnly);
personNameDirectories = Directory.GetDirectories(yearDirectory, "*", SearchOption.TopDirectoryOnly); personNameDirectories = Directory.GetDirectories(yearDirectory, "*", SearchOption.TopDirectoryOnly);
foreach (string file in files) foreach (string file in files)
{ File.Delete(file);
if (file.EndsWith(".lnk"))
continue;
fileName = Path.GetFileName(file);
idAndNormalizedPixelPercentage = Shared.Models.Stateless.Methods.INamed.GetReversedDeterministicHashCode(fileName);
if (idAndNormalizedPixelPercentage is null)
{
(checkFile, idAndNormalizedPixelPercentage) = Shared.Models.Stateless.Methods.INamed.GetReversedDeterministicHashCode(keyValuePairs, file);
if (idAndNormalizedPixelPercentage is null)
break;
if (!string.IsNullOrEmpty(checkFile))
File.Move(file, checkFile);
}
incorrect.Add(new(personKey, idAndNormalizedPixelPercentage.Value));
}
foreach (string personNameDirectory in personNameDirectories) foreach (string personNameDirectory in personNameDirectories)
{ {
files = Directory.GetFiles(personNameDirectory, "*", SearchOption.TopDirectoryOnly); files = Directory.GetFiles(personNameDirectory, "*", SearchOption.TopDirectoryOnly);
personNameLinkDirectories = Directory.GetDirectories(personNameDirectory, "*", SearchOption.TopDirectoryOnly);
foreach (string file in files) foreach (string file in files)
{ {
if (file.EndsWith(".lnk")) if (file.EndsWith(".lnk") || file.EndsWith(".json"))
continue; continue;
fileName = Path.GetFileName(file); reversedDeterministicHashCodeKey = Shared.Models.Stateless.Methods.INamed.GetReversedDeterministicHashCodeKey(keyValuePairsAny, keyValuePairs, file);
idAndNormalizedPixelPercentage = Shared.Models.Stateless.Methods.INamed.GetReversedDeterministicHashCode(fileName); if (reversedDeterministicHashCodeKey is null)
if (idAndNormalizedPixelPercentage is null) continue;
named.Add(new(personKey, reversedDeterministicHashCodeKey.Value));
}
foreach (string personNameLinkDirectory in personNameLinkDirectories)
{ {
(checkFile, idAndNormalizedPixelPercentage) = Shared.Models.Stateless.Methods.INamed.GetReversedDeterministicHashCode(keyValuePairs, file); files = Directory.GetFiles(personNameLinkDirectory, "*", SearchOption.TopDirectoryOnly);
if (idAndNormalizedPixelPercentage is null) foreach (string file in files)
break; {
if (!string.IsNullOrEmpty(checkFile)) if (!file.EndsWith(".lnk"))
File.Move(file, checkFile); continue;
File.Delete(file);
} }
named.Add(new(personKey, idAndNormalizedPixelPercentage.Value)); _ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(personNameLinkDirectory);
} }
_ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(personNameDirectory);
} }
_ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(yearDirectory);
} }
_ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(personKeyDirectory);
} }
_ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(ticksDirectory);
} }
} }
private static void SetKeyValuePairs(string deterministicHashCodeRootDirectory, Dictionary<double, string[]> namedDeterministicHashCode, Dictionary<double, string[]> incorrectDeterministicHashCode, Dictionary<int, List<Shared.Models.Face>> keyValuePairs) private void SetKeyValuePairs(string deterministicHashCodeRootDirectory, Dictionary<double, string[]> deterministicHashCodeKeyValuePairs, Dictionary<double, string[]> incorrectDeterministicHashCodeKeyValuePairs, Dictionary<int, List<Shared.Models.Face>> keyValuePairs)
{ {
Dictionary<double, List<string>> namedKeyValuePairs = new(); Dictionary<double, List<string>> namedKeyValuePairs = new();
Dictionary<double, List<string>> incorrectKeyValuePairs = new(); Dictionary<double, List<string>> incorrectKeyValuePairs = new();
@ -205,16 +202,18 @@ public class MapLogic
incorrectKeyValuePairs[idAndNormalizedPixelPercentage].Add(personKey); incorrectKeyValuePairs[idAndNormalizedPixelPercentage].Add(personKey);
} }
foreach (KeyValuePair<double, List<string>> keyValuePair in namedKeyValuePairs) foreach (KeyValuePair<double, List<string>> keyValuePair in namedKeyValuePairs)
namedDeterministicHashCode.Add(keyValuePair.Key, keyValuePair.Value.Distinct().ToArray()); deterministicHashCodeKeyValuePairs.Add(keyValuePair.Key, keyValuePair.Value.Distinct().ToArray());
foreach (KeyValuePair<double, List<string>> keyValuePair in incorrectKeyValuePairs) foreach (KeyValuePair<double, List<string>> keyValuePair in incorrectKeyValuePairs)
incorrectDeterministicHashCode.Add(keyValuePair.Key, keyValuePair.Value.Distinct().ToArray()); incorrectDeterministicHashCodeKeyValuePairs.Add(keyValuePair.Key, keyValuePair.Value.Distinct().ToArray());
} }
public void UpdateKeyValuePairs(List<Shared.Models.Container> containers) public void UseKeyValuePairsSaveFaceEncoding(List<Shared.Models.Container> containers)
{
if (!string.IsNullOrEmpty(_DeterministicHashCodeRootDirectory))
{ {
Dictionary<int, List<Shared.Models.Face>> keyValuePairs = new(); Dictionary<int, List<Shared.Models.Face>> keyValuePairs = new();
Dictionary<double, string[]> namedDeterministicHashCode = new(); List<(string PersonKey, double IdAndNormalizedPixelPercentage)> named = new();
Dictionary<double, string[]> incorrectDeterministicHashCode = new(); List<(string PersonKey, double IdAndNormalizedPixelPercentage)> incorrect = new();
foreach (Shared.Models.Container container in containers) foreach (Shared.Models.Container container in containers)
{ {
foreach (Shared.Models.Item item in container.Items) foreach (Shared.Models.Item item in container.Items)
@ -230,11 +229,8 @@ public class MapLogic
keyValuePairs.Add(item.Property.Id.Value, item.Faces); keyValuePairs.Add(item.Property.Id.Value, item.Faces);
} }
} }
SetKeyValuePairs(_DeterministicHashCodeRootDirectory, namedDeterministicHashCode, incorrectDeterministicHashCode, keyValuePairs); SetKeyValuePairs(_DeterministicHashCodeRootDirectory, named, incorrect, keyValuePairs);
foreach (KeyValuePair<double, string[]> keyValuePair in namedDeterministicHashCode) }
_NamedDeterministicHashCodeKeyValuePairs.Add(keyValuePair.Key, keyValuePair.Value);
foreach (KeyValuePair<double, string[]> keyValuePair in incorrectDeterministicHashCode)
_IncorrectDeterministicHashCodeKeyValuePairs.Add(keyValuePair.Key, keyValuePair.Value);
} }
public override string ToString() public override string ToString()
@ -305,7 +301,7 @@ public class MapLogic
} }
} }
public static void AddToNamed(MapLogic mapLogic, List<Shared.Models.Item> items) public void AddToNamed(List<Shared.Models.Item> items)
{ {
bool? isWrongYear; bool? isWrongYear;
DateTime minimumDateTime; DateTime minimumDateTime;
@ -324,10 +320,10 @@ public class MapLogic
if (face.LocationIndex is null) if (face.LocationIndex is null)
continue; continue;
deterministicHashCodeKey = Shared.Models.Stateless.Methods.INamed.GetDeterministicHashCodeKey(item, face); deterministicHashCodeKey = Shared.Models.Stateless.Methods.INamed.GetDeterministicHashCodeKey(item, face);
if (!mapLogic.NamedDeterministicHashCodeKeyValuePairs.ContainsKey(deterministicHashCodeKey)) if (!_DeterministicHashCodeKeyValuePairs.ContainsKey(deterministicHashCodeKey))
continue; continue;
minimumDateTime = Shared.Models.Stateless.Methods.IProperty.GetMinimumDateTime(item.Property); minimumDateTime = Shared.Models.Stateless.Methods.IProperty.GetMinimumDateTime(item.Property);
personKeys.AddRange(mapLogic.NamedDeterministicHashCodeKeyValuePairs[deterministicHashCodeKey]); personKeys.AddRange(_DeterministicHashCodeKeyValuePairs[deterministicHashCodeKey]);
(isWrongYear, _) = item.Property.IsWrongYear(item.ImageFileHolder.FullName, minimumDateTime); (isWrongYear, _) = item.Property.IsWrongYear(item.ImageFileHolder.FullName, minimumDateTime);
for (int i = 0; i < personKeys.Count; i++) for (int i = 0; i < personKeys.Count; i++)
{ {
@ -341,10 +337,10 @@ public class MapLogic
} }
if (!personKeys.Any()) if (!personKeys.Any())
{ {
if (!mapLogic.NamedFaceInfoDeterministicHashCodeKeyValuePairs.ContainsKey(item.Property.Id.Value)) if (!_DeterministicHashCodeUnknownFaceKeyValuePairs.ContainsKey(item.Property.Id.Value))
continue; continue;
minimumDateTime = Shared.Models.Stateless.Methods.IProperty.GetMinimumDateTime(item.Property); minimumDateTime = Shared.Models.Stateless.Methods.IProperty.GetMinimumDateTime(item.Property);
personKeys.AddRange(mapLogic.NamedFaceInfoDeterministicHashCodeKeyValuePairs[item.Property.Id.Value]); personKeys.AddRange(_DeterministicHashCodeUnknownFaceKeyValuePairs[item.Property.Id.Value]);
(isWrongYear, _) = item.Property.IsWrongYear(item.ImageFileHolder.FullName, minimumDateTime); (isWrongYear, _) = item.Property.IsWrongYear(item.ImageFileHolder.FullName, minimumDateTime);
for (int i = 0; i < personKeys.Count; i++) for (int i = 0; i < personKeys.Count; i++)
{ {
@ -357,7 +353,7 @@ public class MapLogic
} }
} }
public static List<(Shared.Models.Item, (string, Shared.Models.Face?, (string, string, string, string))[])> GetCollection(MapLogic mapLogic, List<Shared.Models.Item> items, string dFacesContentDirectory) public List<(Shared.Models.Item, (string, Shared.Models.Face?, (string, string, string, string))[])> GetCollection(List<Shared.Models.Item> items, string dFacesContentDirectory)
{ {
List<(Shared.Models.Item, (string, Shared.Models.Face?, (string, string, string, string))[])> results = new(); List<(Shared.Models.Item, (string, Shared.Models.Face?, (string, string, string, string))[])> results = new();
string[] keys; string[] keys;
@ -393,7 +389,7 @@ public class MapLogic
if (item.Property?.Id is null || item.ResizedFileHolder is null) if (item.Property?.Id is null || item.ResizedFileHolder is null)
continue; continue;
collection = new(); collection = new();
if (!mapLogic.NamedFaceInfoDeterministicHashCodeKeyValuePairs.ContainsKey(item.Property.Id.Value)) if (!_DeterministicHashCodeUnknownFaceKeyValuePairs.ContainsKey(item.Property.Id.Value))
{ {
faceCollection = new(); faceCollection = new();
personKey = string.Empty; personKey = string.Empty;
@ -402,7 +398,7 @@ public class MapLogic
else else
{ {
faceCollection = item.Faces; faceCollection = item.Faces;
keys = mapLogic.NamedFaceInfoDeterministicHashCodeKeyValuePairs[item.Property.Id.Value]; keys = _DeterministicHashCodeUnknownFaceKeyValuePairs[item.Property.Id.Value];
minimumDateTime = Shared.Models.Stateless.Methods.IProperty.GetMinimumDateTime(item.Property); minimumDateTime = Shared.Models.Stateless.Methods.IProperty.GetMinimumDateTime(item.Property);
if (minimumDateTime is null) if (minimumDateTime is null)
continue; continue;

View File

@ -85,7 +85,7 @@ public class Item : Properties.IItem
else if (fileHolder.ExtensionLowered.Length > 3 && fileHolder.ExtensionLowered[3] == 'e' && fileHolder.ExtensionLowered.Remove(3, 1) == filenameExtension) else if (fileHolder.ExtensionLowered.Length > 3 && fileHolder.ExtensionLowered[3] == 'e' && fileHolder.ExtensionLowered.Remove(3, 1) == filenameExtension)
_ResizedFileHolder = fileHolder; _ResizedFileHolder = fileHolder;
else else
throw new NotImplementedException(); _ResizedFileHolder = fileHolder;
} }
public bool Any() => (_Abandoned.HasValue && _Abandoned.Value) || (_Changed.HasValue && _Changed.Value) || (_Moved.HasValue && _Moved.Value) || (_NoJson.HasValue && _NoJson.Value); public bool Any() => (_Abandoned.HasValue && _Abandoned.Value) || (_Changed.HasValue && _Changed.Value) || (_Moved.HasValue && _Moved.Value) || (_NoJson.HasValue && _NoJson.Value);

View File

@ -108,8 +108,6 @@ public class Location : Properties.ILocation, IEquatable<Location>
{ {
int result; int result;
double value; double value;
int decimals = 6;
int factor = 1000000;
double total = width * height; double total = width * height;
Check(bottom, left, right, top, zCount); Check(bottom, left, right, top, zCount);
double xCenter = left + ((right - left) / 2); double xCenter = left + ((right - left) / 2);
@ -118,7 +116,7 @@ public class Location : Properties.ILocation, IEquatable<Location>
value = at / total; value = at / total;
if (value < 0) if (value < 0)
value = 3; value = 3;
result = (int)(Math.Round(value, decimals) * factor); result = (int)(Math.Round(value, Stateless.ILocation.Decimals) * Stateless.ILocation.Factor);
return result; return result;
} }

View File

@ -0,0 +1,11 @@
namespace View_by_Distance.Shared.Models.Stateless;
public interface IClosest
{
const int MaximumPer = 50;
const float MaximumMinimum = 0.50f;
const bool SkipIsWrongYear = true;
const float MinimumMinimum = 0.05f;
}

View File

@ -0,0 +1,9 @@
namespace View_by_Distance.Shared.Models.Stateless;
public interface ILocation
{
const int Decimals = 6;
const int Factor = 1000000;
}

View File

@ -0,0 +1,7 @@
namespace View_by_Distance.Shared.Models.Stateless;
public interface IPerson
{
const string KeyFormat = "yyyy-MM-dd_HH";
}

View File

@ -3,6 +3,6 @@ namespace View_by_Distance.Shared.Models.Stateless.Methods;
internal abstract class Closest internal abstract class Closest
{ {
internal static Models.Closest[] Get(List<Models.Closest> collection) => (from l in collection orderby l.Minimum < IClosest.MinimumMinimum, l.Average select l).ToArray(); internal static Models.Closest[] Get(List<Models.Closest> collection) => (from l in collection orderby l.Minimum < Stateless.IClosest.MinimumMinimum, l.Average select l).ToArray();
} }

View File

@ -3,11 +3,6 @@ namespace View_by_Distance.Shared.Models.Stateless.Methods;
public interface IClosest public interface IClosest
{ // ... { // ...
const int MaximumPer = 50;
const float MaximumMinimum = 0.50f;
const bool SkipIsWrongYear = true;
const float MinimumMinimum = 0.05f;
Models.Closest[] TestStatic_Get(List<Models.Closest> collection); Models.Closest[] TestStatic_Get(List<Models.Closest> collection);
static Models.Closest[] Get(List<Models.Closest> collection) => Closest.Get(collection); static Models.Closest[] Get(List<Models.Closest> collection) => Closest.Get(collection);

View File

@ -3,9 +3,9 @@ namespace View_by_Distance.Shared.Models.Stateless.Methods;
public interface INamed public interface INamed
{ // ... { // ...
double? TestStatic_GetReversedDeterministicHashCode(string fileName); double? TestStatic_GetReversedDeterministicHashCodeKey(string file);
static double? GetReversedDeterministicHashCode(string fileName) => static double? GetReversedDeterministicHashCodeKey(bool keyValuePairsAny, Dictionary<int, List<Models.Face>> keyValuePairs, string file) =>
Named.GetReversedDeterministicHashCode(fileName); Named.GetReversedDeterministicHashCodeKey(keyValuePairsAny, keyValuePairs, file);
double TestStatic_GetDeterministicHashCodeKey(Models.Item item, Models.Face face); double TestStatic_GetDeterministicHashCodeKey(Models.Item item, Models.Face face);
static double GetDeterministicHashCodeKey(Models.Item item, Models.Face face) => static double GetDeterministicHashCodeKey(Models.Item item, Models.Face face) =>
@ -15,8 +15,4 @@ public interface INamed
static double GetDeterministicHashCodeKey(Models.Item item, Models.Closest closest) => static double GetDeterministicHashCodeKey(Models.Item item, Models.Closest closest) =>
Named.GetDeterministicHashCodeKey(item, closest); Named.GetDeterministicHashCodeKey(item, closest);
(string?, double?) TestStatic_GetReversedDeterministicHashCode(Dictionary<int, List<Models.Face>> keyValuePairs, string file);
static (string?, double?) GetReversedDeterministicHashCode(Dictionary<int, List<Models.Face>> keyValuePairs, string file) =>
Named.GetReversedDeterministicHashCode(keyValuePairs, file);
} }

View File

@ -1,17 +1,19 @@
using System.Text.Json;
namespace View_by_Distance.Shared.Models.Stateless.Methods; namespace View_by_Distance.Shared.Models.Stateless.Methods;
internal abstract class Named internal abstract class Named
{ {
private static double GetDeterministicHashCodeFileName(int id, int normalizedPixelPercentage) private static double GetDeterministicHashCodeKey(int id, int normalizedPixelPercentage)
=> double.Parse($"{id}.{normalizedPixelPercentage}"); => Math.Round(double.Parse($"{id}.{normalizedPixelPercentage}"), Stateless.ILocation.Decimals);
internal static double GetDeterministicHashCodeKey(Models.Item item, Models.Closest closest) internal static double GetDeterministicHashCodeKey(Models.Item item, Models.Closest closest)
{ {
double result; double result;
if (item.Property?.Id is null || item.ImageFileHolder is null || closest.NormalizedPixelPercentage is null) if (item.Property?.Id is null || item.ImageFileHolder is null || closest.NormalizedPixelPercentage is null)
throw new NullReferenceException(); throw new NullReferenceException();
result = GetDeterministicHashCodeFileName(item.Property.Id.Value, closest.NormalizedPixelPercentage.Value); result = GetDeterministicHashCodeKey(item.Property.Id.Value, closest.NormalizedPixelPercentage.Value);
return result; return result;
} }
@ -20,127 +22,70 @@ internal abstract class Named
double result; double result;
if (item.Property?.Id is null || item.ImageFileHolder is null || face.Location?.NormalizedPixelPercentage is null) if (item.Property?.Id is null || item.ImageFileHolder is null || face.Location?.NormalizedPixelPercentage is null)
throw new NullReferenceException(); throw new NullReferenceException();
result = GetDeterministicHashCodeFileName(item.Property.Id.Value, face.Location.NormalizedPixelPercentage.Value); result = GetDeterministicHashCodeKey(item.Property.Id.Value, face.Location.NormalizedPixelPercentage.Value);
return result; return result;
} }
private static double? GetReversedDeterministicHashCodeB(string fileName) private static void UseKeyValuePairsSaveFaceEncoding(Dictionary<int, List<Models.Face>> keyValuePairs, string file, int id, int normalizedPixelPercentageValue, double deterministicHashCodeKey, string extensionLowered)
{
string json;
string checkFile;
string? directoryName;
List<Models.Face> collection = new();
List<Models.Face> faces = keyValuePairs[id];
foreach (Models.Face face in faces)
{
if (face.FaceEncoding is null || face.Location?.NormalizedPixelPercentage is null)
continue;
if (normalizedPixelPercentageValue != face.Location.NormalizedPixelPercentage.Value && deterministicHashCodeKey != GetDeterministicHashCodeKey(id, face.Location.NormalizedPixelPercentage.Value))
continue;
collection.Add(face);
}
if (collection.Count != 1)
throw new Exception();
foreach (Models.Face face in collection)
{
directoryName = Path.GetDirectoryName(file);
if (string.IsNullOrEmpty(directoryName))
continue;
checkFile = Path.Combine(directoryName, $"{deterministicHashCodeKey}{extensionLowered}.json");
if (File.Exists(checkFile))
continue;
json = JsonSerializer.Serialize(face.FaceEncoding);
_ = IPath.WriteAllText(checkFile, json, updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null);
}
}
private static double? GetReversedDeterministicHashCodeFromSegments(bool keyValuePairsAny, Dictionary<int, List<Models.Face>> keyValuePairs, string file, string[] segments)
{ {
double? result; double? result;
string[] segments = fileName.Split('.'); if (segments.Length != 3)
if (segments.Length < 2)
throw new Exception(); throw new Exception();
string id = segments[0]; string id = segments[0];
string normalizedPixelPercentage = segments[1]; string normalizedPixelPercentage = segments[1];
if (!double.TryParse(string.Concat(id, '.', normalizedPixelPercentage), out double resultValue)) if (!int.TryParse(id, out int idValue) || !int.TryParse(normalizedPixelPercentage, out int normalizedPixelPercentageValue))
result = null; result = null;
else else
result = resultValue; {
result = GetDeterministicHashCodeKey(idValue, normalizedPixelPercentageValue);
if (keyValuePairsAny && keyValuePairs.ContainsKey(idValue))
UseKeyValuePairsSaveFaceEncoding(keyValuePairs, file, idValue, normalizedPixelPercentageValue, result.Value, $".{segments[2]}");
}
return result; return result;
} }
internal static double? GetReversedDeterministicHashCode(string fileName) internal static double? GetReversedDeterministicHashCodeKey(bool keyValuePairsAny, Dictionary<int, List<Models.Face>> keyValuePairs, string file)
{ {
double? result; double? result;
string fileName = Path.GetFileName(file);
if (fileName.Length < 2 || fileName[1..].Contains('-')) if (fileName.Length < 2 || fileName[1..].Contains('-'))
result = null; result = null;
else else
result = GetReversedDeterministicHashCodeB(fileName); {
string[] segments = fileName.Split('.');
result = GetReversedDeterministicHashCodeFromSegments(keyValuePairsAny, keyValuePairs, file, segments);
}
return result; return result;
} }
private static (string? check, int? normalizedPixelPercentage) GetReversedDeterministicHashCodeFromFace(string file, int idValue, int locationIndexValue, List<Models.Face> faces)
{
string? check;
int? normalizedPixelPercentage;
Models.Face face = faces[locationIndexValue];
if (face.Location?.NormalizedPixelPercentage is null)
{
check = null;
normalizedPixelPercentage = null;
}
else
{
string extensionLowered = Path.GetExtension(file).ToLower();
normalizedPixelPercentage = face.Location.NormalizedPixelPercentage.Value;
double deterministicHashCodeKey = GetDeterministicHashCodeFileName(idValue, normalizedPixelPercentage.Value);
check = Path.Combine(string.Concat(Path.GetDirectoryName(file)), $"{deterministicHashCodeKey}{extensionLowered}");
}
return (check, normalizedPixelPercentage);
}
private static (string? check, int? normalizedPixelPercentage) GetReversedDeterministicHashCodeAfterParse(Dictionary<int, List<Models.Face>> keyValuePairs, string file, int idValue, int locationIndexValue)
{
string? check;
int? normalizedPixelPercentage;
List<Models.Face> faces = keyValuePairs[idValue];
if (faces.Count > locationIndexValue)
(check, normalizedPixelPercentage) = GetReversedDeterministicHashCodeFromFace(file, idValue, locationIndexValue, faces);
else
{
check = null;
normalizedPixelPercentage = null;
}
return (check, normalizedPixelPercentage);
}
private static (string? check, string id, int? normalizedPixelPercentage) GetReversedDeterministicHashCodeFromCollection(Dictionary<int, List<Models.Face>> keyValuePairs, string file, string fileName)
{
string id;
string? check;
int? normalizedPixelPercentage;
string[] segments = fileName.Split(' ');
if (segments.Length < 3)
throw new Exception();
id = segments[2].Split('.')[0];
string locationIdex = segments[0];
if (int.TryParse(id, out int idValue) && int.TryParse(locationIdex, out int locationIndexValue) && keyValuePairs.ContainsKey(idValue))
(check, normalizedPixelPercentage) = GetReversedDeterministicHashCodeAfterParse(keyValuePairs, file, idValue, locationIndexValue);
else
{
check = null;
id = string.Empty;
normalizedPixelPercentage = null;
}
if (normalizedPixelPercentage is null)
id = string.Empty;
return new(check, id, normalizedPixelPercentage);
}
private static (string?, double?) GetReversedDeterministicHashCode(Dictionary<int, List<Models.Face>> keyValuePairs, string file, string fileName)
{
double? result;
string? check;
string id;
int? normalizedPixelPercentage;
if (keyValuePairs.Any())
(check, id, normalizedPixelPercentage) = GetReversedDeterministicHashCodeFromCollection(keyValuePairs, file, fileName);
else
{
check = null;
id = string.Empty;
normalizedPixelPercentage = null;
}
if (normalizedPixelPercentage is null || !double.TryParse(string.Concat(id, '.', normalizedPixelPercentage.Value), out double resultValue))
result = null;
else
result = resultValue;
return new(check, result);
}
internal static (string?, double?) GetReversedDeterministicHashCode(Dictionary<int, List<Models.Face>> keyValuePairs, string file)
{
double? result;
string? check;
string fileName = Path.GetFileName(file);
if (fileName.Contains('-'))
(check, result) = GetReversedDeterministicHashCode(keyValuePairs, file, fileName);
else
{
check = null;
result = null;
}
return new(check, result);
}
} }

View File

@ -65,7 +65,6 @@ internal abstract class Person
Dictionary<DateTime, string[]> results = new(); Dictionary<DateTime, string[]> results = new();
string[] segments; string[] segments;
DateTime personKey; DateTime personKey;
const string KeyFormat = "yyyy-MM-dd_HH";
DateTime incrementDate = new(1500, 1, 1); DateTime incrementDate = new(1500, 1, 1);
string[] lines = File.ReadAllLines(knownPeopleFile); string[] lines = File.ReadAllLines(knownPeopleFile);
_ = incrementDate.AddDays(lines.Length); _ = incrementDate.AddDays(lines.Length);
@ -77,8 +76,8 @@ internal abstract class Person
segments = line.Replace(" //", "\t//").Split('\t'); segments = line.Replace(" //", "\t//").Split('\t');
if (segments.Length < 1) if (segments.Length < 1)
continue; continue;
SetSegments(ref segments, KeyFormat, ref incrementDate); SetSegments(ref segments, Stateless.IPerson.KeyFormat, ref incrementDate);
personKey = DateTime.ParseExact(segments[0], KeyFormat, cultureInfo); personKey = DateTime.ParseExact(segments[0], Stateless.IPerson.KeyFormat, cultureInfo);
if (results.ContainsKey(personKey)) if (results.ContainsKey(personKey))
continue; continue;
results.Add(personKey, segments); results.Add(personKey, segments);
@ -88,7 +87,7 @@ internal abstract class Person
for (int i = 1; i < (1000 - countBefore); i++) for (int i = 1; i < (1000 - countBefore); i++)
{ {
personKey = minimumDateTime.AddDays(i * -1); personKey = minimumDateTime.AddDays(i * -1);
results.Add(personKey, new string[] { personKey.ToString(KeyFormat) }); results.Add(personKey, new string[] { personKey.ToString(Stateless.IPerson.KeyFormat) });
} }
return results.OrderBy(l => l.Key).ToDictionary(l => l.Key, l => l.Value); return results.OrderBy(l => l.Key).ToDictionary(l => l.Key, l => l.Value);
} }

View File

@ -214,7 +214,7 @@ public class UnitTestFace
Image image = FaceRecognition.LoadImageFile(item.ResizedFileHolder.FullName); Image image = FaceRecognition.LoadImageFile(item.ResizedFileHolder.FullName);
Assert.IsNotNull(image); Assert.IsNotNull(image);
FaceRecognition faceRecognition = new(_Configuration.NumberOfTimesToUpsample, _Configuration.NumberOfJitters, predictorModel, model, modelParameter); FaceRecognition faceRecognition = new(_Configuration.NumberOfTimesToUpsample, _Configuration.NumberOfJitters, predictorModel, model, modelParameter);
List<(Location Location, FaceRecognitionDotNet.FaceEncoding? FaceEncoding, Dictionary<FacePart, FacePoint[]>? FaceParts)> collection; List<(int, Location Location, FaceRecognitionDotNet.FaceEncoding? FaceEncoding, Dictionary<FacePart, FacePoint[]>? FaceParts)> collection;
collection = faceRecognition.GetCollection(image, includeFaceEncoding: true, includeFaceParts: true, sortByNormalizedPixelPercentage: true); collection = faceRecognition.GetCollection(image, includeFaceEncoding: true, includeFaceParts: true, sortByNormalizedPixelPercentage: true);
Assert.IsTrue(collection.Count == 2); Assert.IsTrue(collection.Count == 2);
FaceRecognitionDotNet.FaceEncoding[] faceEncodings = (from l in collection where l.FaceEncoding is not null select l.FaceEncoding).ToArray(); FaceRecognitionDotNet.FaceEncoding[] faceEncodings = (from l in collection where l.FaceEncoding is not null select l.FaceEncoding).ToArray();