Person Require People File

This commit is contained in:
2022-09-17 11:25:02 -07:00
parent 1ec9b7673d
commit 9ec5da1e7a
12 changed files with 125 additions and 127 deletions

View File

@ -33,15 +33,18 @@ public partial class DlibDotNet
private readonly IsEnvironment _IsEnvironment;
private readonly Models.Configuration _Configuration;
private readonly bool _ArgZeroIsConfigurationRootDirectory;
private readonly Map.Models.Configuration _MapConfiguration;
private readonly List<KeyValuePair<string, string>> _FileKeyValuePairs;
private readonly Dictionary<string, List<Tuple<string, Shared.Models.Property>>> _FilePropertiesKeyValuePairs;
public DlibDotNet(List<string> args, IsEnvironment isEnvironment, IConfigurationRoot configurationRoot, AppSettings appSettings, string workingDirectory, bool isSilent, IConsole console)
{
string argZero;
string message;
Person[] people;
_AppSettings = appSettings;
_IsEnvironment = isEnvironment;
long ticks = DateTime.Now.Ticks;
_Exceptions = new List<string>();
_Log = Serilog.Log.ForContext<DlibDotNet>();
_FileKeyValuePairs = new List<KeyValuePair<string, string>>();
@ -55,6 +58,7 @@ public partial class DlibDotNet
_Configuration = configuration;
_Index = new G_Index(configuration);
_Random = new F_Random(configuration);
_MapConfiguration = Get(configuration);
_People = new A2_People(configuration);
_Rename = new E3_Rename(configuration);
if (configuration.IgnoreExtensions is null)
@ -72,7 +76,14 @@ public partial class DlibDotNet
if (_FirstRun || !_ArgZeroIsConfigurationRootDirectory)
people = Array.Empty<Person>();
else
{
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
message = $") Building People Collection - {totalSeconds} total second(s)";
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
using ProgressBar progressBar = new(1, message, options);
progressBar.Tick();
people = _People.GetPeople(propertyConfiguration);
}
if (!isSilent && configuration.TestDistanceResults)
{
E2_Navigate e2Navigate = new(console, configuration, argZero);
@ -93,10 +104,9 @@ public partial class DlibDotNet
_Resize = new C_Resize(configuration.ForceResizeLastWriteTimeToCreationTime, configuration.OverrideForResizeImages, configuration.PropertiesChangedForResize, configuration.ValidResolutions, imageCodecInfo, encoderParameters, filenameExtension);
}
if (!configuration.SkipSearch)
Search(model, predictorModel, argZero, propertyRoot, people);
Search(ticks, model, predictorModel, argZero, propertyRoot, people);
if (!_FirstRun && !_IsEnvironment.Development && _Exceptions.Count == 0 && _ArgZeroIsConfigurationRootDirectory)
{
long ticks = DateTime.Now.Ticks;
List<string[]> directoryCollections = _Rename.GetDirectoryRenameCollections(propertyConfiguration, model, predictorModel, relativePath: string.Empty, newDirectoryName: string.Empty, jsonFiles4InfoAny: false);
foreach (string[] directoryCollection in directoryCollections)
{
@ -109,7 +119,7 @@ public partial class DlibDotNet
if (appSettings.MaxDegreeOfParallelism < 2)
ticks = LogDelta(ticks, nameof(Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories));
}
string message = $"There were {_Exceptions.Count} exception(s) thrown! {Environment.NewLine}{string.Join(Environment.NewLine, _Exceptions)}";
message = $"There were {_Exceptions.Count} exception(s) thrown! {Environment.NewLine}{string.Join(Environment.NewLine, _Exceptions)}";
_Log.Information(message);
if (_Exceptions.Count != 0)
throw new Exception(message);
@ -254,6 +264,32 @@ public partial class DlibDotNet
throw new Exception("Configuration has to match interface!");
}
private static Map.Models.Configuration Get(Models.Configuration configuration)
{
Map.Models.Configuration result = new(configuration.FaceDistanceHiddenImageFactor,
configuration.FaceDistancePermyriad,
configuration.FaceDistanceMinimumConfidence,
configuration.FaceDistanceTolerance,
configuration.LocationDigits,
configuration.LocationFactor,
configuration.MapLogicSigma,
configuration.MappingSaveFaceEncoding,
configuration.MappingSaveNotMapped,
configuration.MappingSaveMapped,
configuration.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping,
configuration.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping,
configuration.PersonBirthdayFirstYear,
configuration.PersonBirthdayFormat,
configuration.PersonKeyFormat,
configuration.SortingDaysDeltaTolerance,
configuration.SortingFacesToSkipAfterSortBeforeLoad,
configuration.SortingFacesToTakeAfterSortBeforeLoad,
configuration.SortingMaximumPerFaceShouldBeHigh,
configuration.SortingMaximumPerKey,
configuration.SortingSigma);
return result;
}
private void FullParallelForWork(A_Property propertyLogic, string outputResolution, string bResultsFullGroupDirectory, string cResultsFullGroupDirectory, string dResultsFullGroupDirectory, string d2ResultsFullGroupDirectory, List<Tuple<string, DateTime>> sourceDirectoryChanges, List<FileHolder?> propertyFileHolderCollection, List<Shared.Models.Property?> propertyCollection, List<List<KeyValuePair<string, string>>> metadataCollections, List<Dictionary<string, int[]>> resizeKeyValuePairs, List<List<Face>?> imageFaceCollections, Container container, int index, Item item)
{
if (item.ImageFileHolder is null)
@ -654,24 +690,13 @@ public partial class DlibDotNet
}
}
private string GetMapLogicResultsFullGroupDirectory(Model? model, PredictorModel? predictorModel)
{
const int zero = 0;
string outputResolution = _Configuration.OutputResolutions[zero];
string zResultsFullGroupDirectory = Property.Models.Stateless.IResult.GetResultsFullGroupDirectory(
_Configuration.PropertyConfiguration, model, predictorModel, $"Z_{nameof(Item)}", outputResolution, includeResizeGroup: true, includeModel: false, includePredictorModel: false);
return zResultsFullGroupDirectory;
}
private List<Face> SetMappingThenGetDistinctFilteredFacesWithMapping(string argZero, Container[] containers)
{
List<Face> results = new();
bool added;
Mapping mapping;
bool? isWrongYear;
Item[] filteredItems;
DateTime minimumDateTime;
List<int> distinctCheck = new();
MappingFromItem mappingFromItem;
MappingFromPerson mappingFromPerson;
string deterministicHashCodeKeyDisplay;
@ -691,7 +716,6 @@ public partial class DlibDotNet
continue;
if (!item.Faces.Any())
continue;
added = false;
foreach (Face face in item.Faces)
{
if (face.RelativePath != item.RelativePath)
@ -707,32 +731,13 @@ public partial class DlibDotNet
mapping = new(mappingFromItem, mappingFromLocation, mappingFromPerson);
face.SetMapping(mapping);
results.Add(face);
added = true;
}
if (added)
distinctCheck.Add(item.Property.Id.Value);
}
}
return results;
}
private Item[] GetIdSortedFilteredItems(string argZero, Container[] containers)
{
Item[] results;
List<Item> collection = new();
foreach (Container container in containers)
{
if (!container.Items.Any())
continue;
if (!_ArgZeroIsConfigurationRootDirectory && !container.SourceDirectory.StartsWith(argZero))
continue;
collection.AddRange(from l in container.Items where l.ImageFileHolder is not null && (l.Abandoned is null || !l.Abandoned.Value) && l.ValidImageFormatExtension && !_Configuration.IgnoreExtensions.Contains(l.ImageFileHolder.ExtensionLowered) select l);
}
results = (from l in collection orderby l.Property?.Id is not null, l.Property?.Id select l).ToArray();
return results;
}
private void DistanceThenMapLogic(string argZero, long ticks, Person[] people, Container[] containers, MapLogic? mapLogic, string dResultsFullGroupDirectory, string eResultsFullGroupDirectory, string d2ResultsFullGroupDirectory, string zResultsFullGroupDirectory, string peopleDateGroupDirectory, string outputResolution)
private void DistanceThenMapLogic(string argZero, long ticks, Person[] people, Container[] containers, MapLogic? mapLogic, string dResultsFullGroupDirectory, string eResultsFullGroupDirectory, string d2ResultsFullGroupDirectory, string peopleDateGroupDirectory, string outputResolution)
{
E_Distance distance = new();
if (string.IsNullOrEmpty(eResultsFullGroupDirectory))
@ -741,48 +746,25 @@ public partial class DlibDotNet
string eDistanceContentDirectory = Path.Combine(eResultsFullGroupDirectory, "([])");
if (!Directory.Exists(eDistanceContentDirectory))
_ = Directory.CreateDirectory(eDistanceContentDirectory);
Map.Models.Configuration configuration = new(_Configuration.FaceDistanceHiddenImageFactor,
_Configuration.FaceDistancePermyriad,
_Configuration.FaceDistanceMinimumConfidence,
_Configuration.FaceDistanceTolerance,
_Configuration.LocationDigits,
_Configuration.LocationFactor,
_Configuration.MapLogicSigma,
_Configuration.MappingSaveFaceEncoding,
_Configuration.MappingSaveNotMapped,
_Configuration.MappingSaveMapped,
_Configuration.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping,
_Configuration.MappingUseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping,
_Configuration.PersonBirthdayFirstYear,
_Configuration.PersonBirthdayFormat,
_Configuration.PersonKeyFormat,
_Configuration.SortingDaysDeltaTolerance,
_Configuration.SortingFacesToSkipAfterSortBeforeLoad,
_Configuration.SortingFacesToTakeAfterSortBeforeLoad,
_Configuration.SortingMaximumPerFaceShouldBeHigh,
_Configuration.SortingMaximumPerKey,
_Configuration.SortingSigma);
if (mapLogic is not null)
mapLogic.Update(configuration);
string eDistanceContentFileName = Path.Combine(eDistanceContentDirectory, $"{_Configuration.PropertyConfiguration.ResultAllInOne}.tvs");
List<Face> distinctFilteredFaces = SetMappingThenGetDistinctFilteredFacesWithMapping(argZero, containers);
List<Face> selectedFilteredFaces = E_Distance.GetSelectedFilteredFaces(configuration, distinctFilteredFaces);
List<Face> selectedFilteredFaces = E_Distance.GetSelectedFilteredFaces(_MapConfiguration, distinctFilteredFaces);
E_Distance.SetFaceDistances(_AppSettings.MaxDegreeOfParallelism, ticks, selectedFilteredFaces);
if (mapLogic is null)
mapLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _Resize.FilenameExtension, _Faces.FilenameExtension, _Faces.HiddenFilenameExtension, _FaceParts.FilenameExtension, ticks, people, peopleDateGroupDirectory, zResultsFullGroupDirectory, configuration, distinctFilteredFaces, distance);
mapLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _MapConfiguration, _Resize.FilenameExtension, _Faces.FilenameExtension, _Faces.HiddenFilenameExtension, _FaceParts.FilenameExtension, ticks, people, peopleDateGroupDirectory, eDistanceContentDirectory, distinctFilteredFaces, distance);
mapLogic.SetPersonTicks(distinctFilteredFaces);
SortingContainer[] sortingContainers = E_Distance.SetFaceMappingSortingCollectionThenGetSortingContainers(_AppSettings.MaxDegreeOfParallelism, configuration, ticks, mapLogic, selectedFilteredFaces);
SortingContainer[] sortingContainers = E_Distance.SetFaceMappingSortingCollectionThenGetSortingContainers(_AppSettings.MaxDegreeOfParallelism, _MapConfiguration, ticks, mapLogic, selectedFilteredFaces);
E_Distance.SaveFaceDistances(eDistanceContentFileName, sortingContainers);
int totalNotMapped = mapLogic.AddToMapping(distinctFilteredFaces);
if (totalNotMapped > 0)
mapLogic.ForceSingleImageThenSaveMapping(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, dFacesContentDirectory, d2ResultsFullGroupDirectory, distinctFilteredFaces, sortingContainers, totalNotMapped);
if (configuration.MappingSaveNotMapped)
if (_MapConfiguration.MappingSaveNotMapped)
mapLogic.SaveNotMappedTicks(_Configuration.PropertyConfiguration);
if (_Configuration.SaveShortcutsForOutputResolutions.Contains(outputResolution))
mapLogic.SaveShortcuts(_Configuration.JuliePhares, distinctFilteredFaces);
}
private void Search(Model? model, PredictorModel? predictorModel, string argZero, string propertyRoot, Person[] people)
private void Search(long ticks, Model? model, PredictorModel? predictorModel, string argZero, string propertyRoot, Person[] people)
{
int j;
int f;
@ -790,15 +772,13 @@ public partial class DlibDotNet
MapLogic? mapLogic;
Container[] containers;
A_Property propertyLogic;
long ticks = DateTime.Now.Ticks;
string aResultsFullGroupDirectory;
string bResultsFullGroupDirectory;
string cResultsFullGroupDirectory;
string dResultsFullGroupDirectory;
string eResultsFullGroupDirectory;
string d2ResultsFullGroupDirectory;
string zResultsFullGroupDirectory = GetMapLogicResultsFullGroupDirectory(model, predictorModel);
string peopleDateGroupDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(_Configuration.PropertyConfiguration, nameof(A2_People));
string a2PeopleDateGroupDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(_Configuration.PropertyConfiguration, nameof(A2_People));
if (!_FirstRun)
{
mapLogic = null;
@ -806,7 +786,9 @@ public partial class DlibDotNet
}
else
{
mapLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _Resize.FilenameExtension, _Faces.FilenameExtension, _Faces.HiddenFilenameExtension, _FaceParts.FilenameExtension, ticks, people, peopleDateGroupDirectory, zResultsFullGroupDirectory);
string outputResolution = _Configuration.OutputResolutions[^1];
(aResultsFullGroupDirectory, bResultsFullGroupDirectory, cResultsFullGroupDirectory, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory, eResultsFullGroupDirectory) = GetResultsFullGroupDirectories(model, predictorModel, outputResolution);
mapLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _MapConfiguration, _Resize.FilenameExtension, _Faces.FilenameExtension, _Faces.HiddenFilenameExtension, _FaceParts.FilenameExtension, ticks, people, a2PeopleDateGroupDirectory, eResultsFullGroupDirectory);
propertyLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _Resize.FilenameExtension, _Configuration.Reverse, model, predictorModel, mapLogic.IndicesFromNew, mapLogic.KeyValuePairs);
}
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
@ -830,7 +812,7 @@ public partial class DlibDotNet
{
if (!_Configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions.Any())
break;
DistanceThenMapLogic(argZero, ticks, people, containers, mapLogic, dResultsFullGroupDirectory, eResultsFullGroupDirectory, d2ResultsFullGroupDirectory, zResultsFullGroupDirectory, peopleDateGroupDirectory, outputResolution);
DistanceThenMapLogic(argZero, ticks, people, containers, mapLogic, dResultsFullGroupDirectory, eResultsFullGroupDirectory, d2ResultsFullGroupDirectory, a2PeopleDateGroupDirectory, outputResolution);
if (_IsEnvironment.Development)
continue;
if (_FileKeyValuePairs.Any())