_Original
This commit is contained in:
@ -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;
|
||||
}
|
||||
|
||||
|
@ -13,6 +13,7 @@ public class Configuration
|
||||
[Display(Name = "Check D Face and Up Dates"), Required] public bool? CheckDFaceAndUpWriteDates { get; set; }
|
||||
[Display(Name = "Check Json For Distance Results"), Required] public bool? CheckJsonForDistanceResults { get; set; }
|
||||
[Display(Name = "CrossDirectory Max Items In Distance Collection"), Required] public int? CrossDirectoryMaxItemsInDistanceCollection { get; set; }
|
||||
[Display(Name = "Delete Possible Duplicates"), Required] public bool? DeletePossibleDuplicates { get; set; }
|
||||
[Display(Name = "Distance Factor"), Required] public int? DistanceFactor { get; set; }
|
||||
[Display(Name = "Distance Move Unable to Match by 1 Tick"), Required] public bool? DistanceMoveUnableToMatch { get; set; }
|
||||
[Display(Name = "Distance Pixel Distance Tolerance"), Required] public int? DistancePixelDistanceTolerance { get; set; }
|
||||
@ -99,6 +100,8 @@ public class Configuration
|
||||
throw new NullReferenceException(nameof(configuration.CheckJsonForDistanceResults));
|
||||
if (configuration.CrossDirectoryMaxItemsInDistanceCollection is null)
|
||||
throw new NullReferenceException(nameof(configuration.CrossDirectoryMaxItemsInDistanceCollection));
|
||||
if (configuration.DeletePossibleDuplicates is null)
|
||||
throw new NullReferenceException(nameof(configuration.DeletePossibleDuplicates));
|
||||
if (configuration.DistanceFactor is null)
|
||||
throw new NullReferenceException(nameof(configuration.DistanceFactor));
|
||||
if (configuration.DistanceMoveUnableToMatch is null)
|
||||
@ -215,6 +218,7 @@ public class Configuration
|
||||
configuration.CheckDFaceAndUpWriteDates.Value,
|
||||
configuration.CheckJsonForDistanceResults.Value,
|
||||
configuration.CrossDirectoryMaxItemsInDistanceCollection.Value,
|
||||
configuration.DeletePossibleDuplicates.Value,
|
||||
configuration.DistanceFactor.Value,
|
||||
configuration.DistanceMoveUnableToMatch.Value,
|
||||
configuration.DistancePixelDistanceTolerance.Value,
|
||||
|
@ -12,6 +12,7 @@ public class Configuration
|
||||
public bool CheckDFaceAndUpWriteDates { init; get; }
|
||||
public bool CheckJsonForDistanceResults { init; get; }
|
||||
public int CrossDirectoryMaxItemsInDistanceCollection { init; get; }
|
||||
public bool DeletePossibleDuplicates { get; internal set; }
|
||||
public int DistanceFactor { init; get; }
|
||||
public bool DistanceMoveUnableToMatch { init; get; }
|
||||
public int DistancePixelDistanceTolerance { init; get; }
|
||||
@ -81,6 +82,7 @@ public class Configuration
|
||||
bool checkDFaceAndUpWriteDates,
|
||||
bool checkJsonForDistanceResults,
|
||||
int crossDirectoryMaxItemsInDistanceCollection,
|
||||
bool deletePossibleDuplicates,
|
||||
int distanceFactor,
|
||||
bool distanceMoveUnableToMatch,
|
||||
int distancePixelDistanceTolerance,
|
||||
@ -149,6 +151,7 @@ public class Configuration
|
||||
CheckDFaceAndUpWriteDates = checkDFaceAndUpWriteDates;
|
||||
CheckJsonForDistanceResults = checkJsonForDistanceResults;
|
||||
CrossDirectoryMaxItemsInDistanceCollection = crossDirectoryMaxItemsInDistanceCollection;
|
||||
DeletePossibleDuplicates = deletePossibleDuplicates;
|
||||
DistanceFactor = distanceFactor;
|
||||
DistanceMoveUnableToMatch = distanceMoveUnableToMatch;
|
||||
DistancePixelDistanceTolerance = distancePixelDistanceTolerance;
|
||||
|
@ -10,6 +10,7 @@
|
||||
},
|
||||
"Windows": {
|
||||
"Configuration": {
|
||||
"DeletePossibleDuplicates": false,
|
||||
"DistanceRenameToMatch": true,
|
||||
"DistanceMoveUnableToMatch": true,
|
||||
"PersonCharacters": "!#]^_`~+",
|
||||
@ -32,13 +33,13 @@
|
||||
"Julie"
|
||||
],
|
||||
"LoadOrCreateThenSaveDistanceResultsForOutputResolutions": [
|
||||
"7680 x 4320"
|
||||
"Original"
|
||||
],
|
||||
"LoadOrCreateThenSaveImageFacesResultsForOutputResolutions": [
|
||||
"7680 x 4320"
|
||||
"Original"
|
||||
],
|
||||
"OutputResolutions": [
|
||||
"7680 x 4320"
|
||||
"Original"
|
||||
],
|
||||
"PropertyContentCollectionFiles": [],
|
||||
"RangeDaysDeltaTolerance": [
|
||||
@ -62,13 +63,13 @@
|
||||
100
|
||||
],
|
||||
"SaveFaceDistancesForOutputResolutions": [
|
||||
"7680 x 4320"
|
||||
"Original"
|
||||
],
|
||||
"SaveFaceLandmarkForOutputResolutions": [],
|
||||
"SaveFilteredOriginalImagesFromJLinksForOutputResolutions": [],
|
||||
"SaveMappedForOutputResolutions": [],
|
||||
"SaveRandomForOutputResolutions": [
|
||||
"7680 x 4320"
|
||||
"Original"
|
||||
],
|
||||
"SaveShortcutsForOutputResolutions": [],
|
||||
"IgnoreRelativePaths": [
|
||||
|
@ -54,6 +54,7 @@
|
||||
"CheckJsonForDistanceResults": false,
|
||||
"CrossDirectoryMaxItemsInDistanceCollection": 7,
|
||||
"DateGroup": "2022-12-30",
|
||||
"DeletePossibleDuplicates": false,
|
||||
"DistanceFactor": 8,
|
||||
"DistanceMoveUnableToMatch": false,
|
||||
"DistancePixelDistanceTolerance": 1,
|
||||
@ -200,6 +201,7 @@
|
||||
".TIFF"
|
||||
],
|
||||
"ValidResolutions": [
|
||||
"Original",
|
||||
"176 x 176",
|
||||
"256 x 256",
|
||||
"353 x 353",
|
||||
|
Reference in New Issue
Block a user