_Original

This commit is contained in:
2022-12-31 13:10:03 -07:00
parent 4b6811644c
commit 45f4401fa4
13 changed files with 197 additions and 141 deletions

View File

@ -2,6 +2,7 @@
using Phares.Shared;
using ShellProgressBar;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.Text.Json;
using View_by_Distance.Distance.Models;
@ -62,7 +63,7 @@ public partial class DlibDotNet
Models.Configuration configuration = Models.Binder.Configuration.Get(isEnvironment, configurationRoot, propertyConfiguration);
_Log.Information(propertyConfiguration.RootDirectory);
Property.Models.Configuration.Verify(propertyConfiguration, requireExist: false);
Verify(configuration);
OpenPossibleDuplicates(configuration);
VerifyExtra(args, propertyConfiguration, configuration);
_Configuration = configuration;
_Index = new(configuration);
@ -205,7 +206,7 @@ public partial class DlibDotNet
return result;
}
private void Verify(Models.Configuration configuration)
private void OpenPossibleDuplicates(Models.Configuration configuration)
{
if (!configuration.OutputResolutions.Any() || string.IsNullOrEmpty(configuration.OutputResolutions[0]) || !configuration.ValidResolutions.Contains(configuration.OutputResolutions[0]))
throw new NullReferenceException($"{nameof(configuration.OutputResolutions)} must be _FileNameToCollection valid outputResolution!");
@ -289,13 +290,11 @@ public partial class DlibDotNet
{
if (_Log is null)
throw new NullReferenceException(nameof(_Log));
string original = "Original";
List<Shared.Models.Face> faces;
Shared.Models.Property property;
long ticks = DateTime.Now.Ticks;
DateTime dateTime = DateTime.Now;
List<string> parseExceptions = new();
Dictionary<string, int[]> imageResizeKeyValuePairs;
List<Tuple<string, DateTime>> subFileTuples = new();
List<KeyValuePair<string, string>> metadataCollection;
if (item.Property is not null && item.Property.Id is not null && !item.Any())
@ -343,33 +342,21 @@ public partial class DlibDotNet
(int metadataGroups, metadataCollection) = _Metadata.GetMetadataCollection(_Configuration.PropertyConfiguration, bResultsFullGroupDirectory, subFileTuples, parseExceptions, mappingFromItem);
if (_AppSettings.MaxDegreeOfParallelism < 2)
ticks = LogDelta(ticks, nameof(B_Metadata.GetMetadataCollection));
imageResizeKeyValuePairs = _Resize.GetResizeKeyValuePairs(_Configuration.PropertyConfiguration, cResultsFullGroupDirectory, subFileTuples, parseExceptions, original, metadataCollection, item.Property, mappingFromItem);
Dictionary<string, int[]> outputResolutionToResize = _Resize.GetResizeKeyValuePairs(_Configuration.PropertyConfiguration, cResultsFullGroupDirectory, subFileTuples, parseExceptions, metadataCollection, item.Property, mappingFromItem);
if (_AppSettings.MaxDegreeOfParallelism < 2)
ticks = LogDelta(ticks, nameof(C_Resize.GetResizeKeyValuePairs));
if (_Configuration.SaveResizedSubfiles)
{
_Resize.SaveResizedSubfile(_Configuration.PropertyConfiguration, outputResolution, cResultsFullGroupDirectory, subFileTuples, item, item.Property, mappingFromItem, original, imageResizeKeyValuePairs);
_Resize.SaveResizedSubfile(_Configuration.PropertyConfiguration, outputResolution, cResultsFullGroupDirectory, subFileTuples, item, item.Property, mappingFromItem, outputResolutionToResize);
if (_AppSettings.MaxDegreeOfParallelism < 2)
ticks = LogDelta(ticks, nameof(C_Resize.SaveResizedSubfile));
}
else if (outputResolution == _Configuration.OutputResolutions[0] && false)
{
byte[] bytes = _Resize.GetResizedBytes(outputResolution, cResultsFullGroupDirectory, subFileTuples, item.Property, mappingFromItem, imageResizeKeyValuePairs);
if (_AppSettings.MaxDegreeOfParallelism < 2)
ticks = LogDelta(ticks, nameof(C_Resize.GetResizedBytes));
string path = Path.Combine(resizedFileHolder.DirectoryName, resizedFileHolder.NameWithoutExtension);
File.WriteAllBytes(path, bytes);
}
if (!mappingFromItem.ResizedFileHolder.Exists && !File.Exists(mappingFromItem.ResizedFileHolder.FullName))
faces = new();
else if (!_Configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions.Contains(outputResolution))
faces = new();
else
{
int[] outputResolutionCollection = imageResizeKeyValuePairs[outputResolution];
int outputResolutionWidth = outputResolutionCollection[0];
int outputResolutionHeight = outputResolutionCollection[1];
int outputResolutionOrientation = outputResolutionCollection[2];
List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection;
List<LocationContainer<MetadataExtractor.Directory>>? collection;
if (item.Property?.Id is null)
@ -378,7 +365,7 @@ public partial class DlibDotNet
_ = idToMappedFaceFilesWithCollection.TryGetValue(item.Property.Id.Value, out collection);
if (!_FileNameToCollection.TryGetValue(mappingFromItem.RelativePath[1..], out mappingFromPhotoPrismCollection))
mappingFromPhotoPrismCollection = null;
faces = _Faces.GetFaces(dResultsFullGroupDirectory, subFileTuples, parseExceptions, property, mappingFromItem, outputResolutionWidth, outputResolutionHeight, outputResolutionOrientation, collection, mappingFromPhotoPrismCollection);
faces = _Faces.GetFaces(_Resize, outputResolution, dResultsFullGroupDirectory, subFileTuples, parseExceptions, property, mappingFromItem, outputResolutionToResize, collection, mappingFromPhotoPrismCollection);
if (_AppSettings.MaxDegreeOfParallelism < 2)
ticks = LogDelta(ticks, nameof(D_Face.GetFaces));
bool anyFacesSaved = _Faces.SaveFaces(dResultsFullGroupDirectory, subFileTuples, parseExceptions, mappingFromItem, facesDirectory, faces);
@ -402,7 +389,7 @@ public partial class DlibDotNet
imageFaceCollections[index] = faces;
propertyCollection[index] = property;
metadataCollections[index] = metadataCollection;
resizeKeyValuePairs[index] = imageResizeKeyValuePairs;
resizeKeyValuePairs[index] = outputResolutionToResize;
propertyFileHolderCollection[index] = item.ImageFileHolder;
sourceDirectoryChanges.AddRange(from l in subFileTuples where l.Item2 > dateTime select l);
}
@ -991,35 +978,81 @@ public partial class DlibDotNet
directories = new List<MetadataExtractor.Directory>();
else
directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(file);
Rectangle? rectangle = Shared.Models.Stateless.Methods.ILocation.GetNormalizedRectangle(_Configuration.LocationDigits, normalizedRectangle.Value);
lock (collection)
collection.Add(new(fromDistanceContent, file, personKey, id.Value, normalizedRectangle.Value, directories, null, null));
collection.Add(new(fromDistanceContent, file, personKey, id.Value, normalizedRectangle.Value, directories, rectangle, null));
}
private void Verify(List<LocationContainer<MetadataExtractor.Directory>> collection)
private void OpenPossibleDuplicates(List<(long, int, string, double?)> duplicates)
{
string key;
int normalizedRectangle;
string personKeyFormatted;
Dictionary<string, int> distinct = new();
List<(long, int, string)> duplicates = new();
foreach (LocationContainer<MetadataExtractor.Directory> locationContainer in collection)
foreach ((long personKey, int id, string file, double? percent) in duplicates)
{
key = string.Concat(locationContainer.PersonKey, locationContainer.Id);
if (distinct.TryGetValue(key, out normalizedRectangle))
{
if (normalizedRectangle == locationContainer.NormalizedRectangle)
continue;
duplicates.Add(new(locationContainer.PersonKey, locationContainer.Id, locationContainer.File));
if (percent is null)
continue;
}
distinct.Add(key, locationContainer.NormalizedRectangle);
}
(); //Do they also intersect?
foreach ((long personKey, int id, string file) in duplicates)
{
_ = Process.Start("explorer.exe", string.Concat("\"", Path.GetDirectoryName(file), "\""));
personKeyFormatted = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, personKey);
}
foreach ((long personKey, int id, string file, double? percent) in duplicates)
{
if (percent is not null && percent.Value == 0)
continue;
_ = Process.Start("explorer.exe", string.Concat("\"", Path.GetDirectoryName(file), "\""));
personKeyFormatted = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, personKey);
}
foreach ((long personKey, int id, string file, double? percent) in duplicates)
{
if (percent is not null && percent.Value > 0)
continue;
_ = Process.Start("explorer.exe", string.Concat("\"", Path.GetDirectoryName(file), "\""));
personKeyFormatted = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, personKey);
}
}
private void LookForPossibleDuplicates(List<LocationContainer<MetadataExtractor.Directory>> collection)
{
string key;
double? percent;
Rectangle? rectangle;
Rectangle intersectRectangle;
(string File, int NormalizedRectangle) item;
Dictionary<string, (string, int)> distinct = new();
List<(long, int, string, double?)> duplicates = new();
foreach (LocationContainer<MetadataExtractor.Directory> locationContainer in collection)
{
key = string.Concat(locationContainer.PersonKey, locationContainer.Id);
if (distinct.TryGetValue(key, out item))
{
if (item.NormalizedRectangle == locationContainer.NormalizedRectangle)
continue;
if (locationContainer.Rectangle is null)
percent = null;
else
{
rectangle = Shared.Models.Stateless.Methods.ILocation.GetNormalizedRectangle(_Configuration.LocationDigits, item.NormalizedRectangle);
if (locationContainer.Rectangle is null || rectangle is null)
percent = null;
else
{
intersectRectangle = Rectangle.Intersect(locationContainer.Rectangle.Value, rectangle.Value);
percent = intersectRectangle.Width * intersectRectangle.Height;
}
}
if (!_Configuration.DeletePossibleDuplicates)
duplicates.Add(new(locationContainer.PersonKey, locationContainer.Id, locationContainer.File, percent));
else
{
if (File.Exists(item.File))
File.Delete(item.File);
if (File.Exists(locationContainer.File))
File.Delete(locationContainer.File);
}
continue;
}
distinct.Add(key, new(locationContainer.File, locationContainer.NormalizedRectangle));
}
if (duplicates.Any() && _IsEnvironment.Development)
OpenPossibleDuplicates(duplicates);
}
private List<LocationContainer<MetadataExtractor.Directory>> GetCollection(long ticks, string? a2PeopleContentDirectory, string eDistanceContentDirectory)
@ -1052,7 +1085,7 @@ public partial class DlibDotNet
ParallelFor(eDistanceContentDirectory, results, collection[i].PersonKey, collection[i].File);
});
}
Verify(results);
LookForPossibleDuplicates(results);
return results;
}