Inline UpdateMappingFromPerson

This commit is contained in:
Mike Phares 2023-03-24 21:57:29 -07:00
parent c48a30f42f
commit 90b3f93e6e
4 changed files with 86 additions and 97 deletions

View File

@ -237,6 +237,7 @@ public class D2_FaceParts
{ {
int x; int x;
int y; int y;
Pen pen;
string? firstFileName = null; string? firstFileName = null;
using Image image = Image.FromFile(resizedFileHolder.FullName); using Image image = Image.FromFile(resizedFileHolder.FullName);
using Graphics graphic = Graphics.FromImage(image); using Graphics graphic = Graphics.FromImage(image);
@ -253,7 +254,8 @@ public class D2_FaceParts
{ {
if (face.Location is null) if (face.Location is null)
continue; continue;
graphic.DrawEllipse(Pens.GreenYellow, facePoint.X - pointSize, facePoint.Y - pointSize, pointSize * 2, pointSize * 2); pen = face.Mapping?.MappingFromPerson is null ? Pens.Red : Pens.GreenYellow;
graphic.DrawEllipse(pen, facePoint.X - pointSize, facePoint.Y - pointSize, pointSize * 2, pointSize * 2);
} }
if (facePart == FacePart.Chin) if (facePart == FacePart.Chin)
continue; continue;

View File

@ -261,9 +261,60 @@ public partial class DlibDotNet
return result; return result;
} }
private void SetMapping(Dictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers, MapLogic mapLogic, Item item, bool? isFocusRelativePath, bool? isIgnoreRelativePath, MappingFromItem mappingFromItem, List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection, List<Shared.Models.Face> faces)
{
string? model;
Mapping mapping;
bool? isFocusModel;
int faceAreaPermyriad;
int confidencePercent;
int normalizedRectangle;
string deterministicHashCodeKey;
MappingFromFilter mappingFromFilter;
MappingFromLocation? mappingFromLocation;
IReadOnlyList<MetadataExtractor.Directory> directories;
List<LocationContainer<MetadataExtractor.Directory>>? locationContainers;
if (string.IsNullOrEmpty(_Configuration.FocusModel))
isFocusModel = null;
else
{
if (!idToLocationContainers.TryGetValue(mappingFromItem.Id, out locationContainers) || !locationContainers.Any())
isFocusModel = false;
else
{
directories = locationContainers.First().Directories;
model = Metadata.Models.Stateless.Methods.IMetadata.GetModel(directories);
if (model is null)
directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(mappingFromItem.ResizedFileHolder.FullName);
model = Metadata.Models.Stateless.Methods.IMetadata.GetModel(directories);
isFocusModel = model is not null && model.Contains(_Configuration.FocusModel);
if (isFocusModel.Value)
isFocusModel = true;
}
}
mappingFromFilter = new(isFocusModel, isFocusRelativePath, isIgnoreRelativePath);
foreach (Shared.Models.Face face in faces)
{
if (item.Property?.Id is null || face.FaceEncoding is null || face.Location is null || face.OutputResolution is null)
mappingFromLocation = null;
else
{
confidencePercent = Shared.Models.Stateless.Methods.ILocation.GetConfidencePercent(_Configuration.FaceConfidencePercent, _Configuration.RangeFaceConfidence, face.Location.Confidence);
faceAreaPermyriad = Shared.Models.Stateless.Methods.IMapping.GetAreaPermyriad(_Configuration.FaceAreaPermyriad, face.Location, face.OutputResolution);
normalizedRectangle = Shared.Models.Stateless.Methods.ILocation.GetNormalizedRectangle(face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution);
deterministicHashCodeKey = Shared.Models.Stateless.Methods.IMapping.GetDeterministicHashCodeKey(item.Property.Id.Value, face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution);
mappingFromLocation = new(faceAreaPermyriad, confidencePercent, deterministicHashCodeKey, normalizedRectangle);
}
mapping = new(mappingFromItem, mappingFromFilter, mappingFromLocation, mappingFromPhotoPrismCollection);
_ = mapLogic.UpdateMappingFromPerson(mapping);
face.SetMapping(mapping);
}
}
private void FullParallelForWork(A_Property propertyLogic, private void FullParallelForWork(A_Property propertyLogic,
B_Metadata metadata, B_Metadata metadata,
Dictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers, Dictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers,
MapLogic mapLogic,
string outputResolution, string outputResolution,
string cResultsFullGroupDirectory, string cResultsFullGroupDirectory,
string dResultsDateGroupDirectory, string dResultsDateGroupDirectory,
@ -274,7 +325,9 @@ public partial class DlibDotNet
Container container, Container container,
int index, int index,
Item item, Item item,
DateTime[] containerDateTimes) DateTime[] containerDateTimes,
bool? isFocusRelativePath,
bool? isIgnoreRelativePath)
{ {
if (_Log is null) if (_Log is null)
throw new NullReferenceException(nameof(_Log)); throw new NullReferenceException(nameof(_Log));
@ -364,6 +417,7 @@ public partial class DlibDotNet
&& _Configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions.Contains(outputResolution) && _Configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions.Contains(outputResolution)
&& !anyFacesSaved && collection is not null) && !anyFacesSaved && collection is not null)
_Distance.LookForMatchFacesAndPossiblyRename(_Faces.FileNameExtension, eDistanceContentDirectory, mappingFromItem, faces, collection); _Distance.LookForMatchFacesAndPossiblyRename(_Faces.FileNameExtension, eDistanceContentDirectory, mappingFromItem, faces, collection);
SetMapping(idToLocationContainers, mapLogic, item, isFocusRelativePath, isIgnoreRelativePath, mappingFromItem, mappingFromPhotoPrismCollection, faces);
if (_Configuration.SaveFaceLandmarkForOutputResolutions.Contains(outputResolution)) if (_Configuration.SaveFaceLandmarkForOutputResolutions.Contains(outputResolution))
{ {
bool saveRotated = false; bool saveRotated = false;
@ -384,6 +438,7 @@ public partial class DlibDotNet
A_Property propertyLogic, A_Property propertyLogic,
B_Metadata metadata, B_Metadata metadata,
Dictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers, Dictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers,
MapLogic mapLogic,
string outputResolution, string outputResolution,
string cResultsFullGroupDirectory, string cResultsFullGroupDirectory,
string dResultsDateGroupDirectory, string dResultsDateGroupDirectory,
@ -399,9 +454,12 @@ public partial class DlibDotNet
throw new NullReferenceException(nameof(_Log)); throw new NullReferenceException(nameof(_Log));
int result = 0; int result = 0;
ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = maxDegreeOfParallelism }; ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = maxDegreeOfParallelism };
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
DateTime[] containerDateTimes = Shared.Models.Stateless.Methods.IContainer.GetContainerDateTimes(filteredItems); DateTime[] containerDateTimes = Shared.Models.Stateless.Methods.IContainer.GetContainerDateTimes(filteredItems);
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
using ProgressBar progressBar = new(filteredItems.Length, message, options); using ProgressBar progressBar = new(filteredItems.Length, message, options);
string focusRelativePath = Path.GetFullPath(string.Concat(_Configuration.PropertyConfiguration.RootDirectory, _Configuration.FocusDirectory));
bool? isFocusRelativePath = string.IsNullOrEmpty(_Configuration.FocusDirectory) ? null : container.SourceDirectory.StartsWith(focusRelativePath);
bool? isIgnoreRelativePath = !_Configuration.IgnoreRelativePaths.Any() ? null : _Configuration.IgnoreRelativePaths.Any(l => container.SourceDirectory.Contains(l)) && Shared.Models.Stateless.Methods.IContainer.IsIgnoreRelativePath(_Configuration.PropertyConfiguration, _Configuration.IgnoreRelativePaths, container.SourceDirectory);
_ = Parallel.For(0, filteredItems.Length, parallelOptions, (i, state) => _ = Parallel.For(0, filteredItems.Length, parallelOptions, (i, state) =>
{ {
try try
@ -409,6 +467,7 @@ public partial class DlibDotNet
FullParallelForWork(propertyLogic, FullParallelForWork(propertyLogic,
metadata, metadata,
idToLocationContainers, idToLocationContainers,
mapLogic,
outputResolution, outputResolution,
cResultsFullGroupDirectory, cResultsFullGroupDirectory,
dResultsDateGroupDirectory, dResultsDateGroupDirectory,
@ -419,7 +478,9 @@ public partial class DlibDotNet
container, container,
index: i, index: i,
filteredItems[i], filteredItems[i],
containerDateTimes); containerDateTimes,
isFocusRelativePath,
isIgnoreRelativePath);
if (i == 0 || sourceDirectoryChanges.Any()) if (i == 0 || sourceDirectoryChanges.Any())
progressBar.Tick(); progressBar.Tick();
} }
@ -514,7 +575,7 @@ public partial class DlibDotNet
return new(cResultsFullGroupDirectory, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory); return new(cResultsFullGroupDirectory, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory);
} }
private void FullDoWork(string argZero, string propertyRoot, long ticks, string aResultsFullGroupDirectory, string bResultsFullGroupDirectory, int t, Container[] containers, A_Property propertyLogic, B_Metadata metadata, string eDistanceContentDirectory, Dictionary<string, List<MappingFromPhotoPrism>> fileNameToCollection, Dictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers) private void FullDoWork(string argZero, string propertyRoot, long ticks, string aResultsFullGroupDirectory, string bResultsFullGroupDirectory, int t, Container[] containers, A_Property propertyLogic, B_Metadata metadata, string eDistanceContentDirectory, Dictionary<string, List<MappingFromPhotoPrism>> fileNameToCollection, Dictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers, MapLogic mapLogic)
{ {
if (_Log is null) if (_Log is null)
throw new NullReferenceException(nameof(_Log)); throw new NullReferenceException(nameof(_Log));
@ -560,6 +621,7 @@ public partial class DlibDotNet
propertyLogic, propertyLogic,
metadata, metadata,
idToLocationContainers, idToLocationContainers,
mapLogic,
outputResolution, outputResolution,
cResultsFullGroupDirectory, cResultsFullGroupDirectory,
dResultsDateGroupDirectory, dResultsDateGroupDirectory,
@ -590,86 +652,6 @@ public partial class DlibDotNet
} }
} }
private void SetMapping(string argZero, Container[] containers, Dictionary<string, List<MappingFromPhotoPrism>> fileNameToCollection, Dictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers)
{
string? model;
Mapping mapping;
bool? isFocusModel;
int faceAreaPermyriad;
Item[] filteredItems;
int confidencePercent;
int normalizedRectangle;
bool? isFocusRelativePath;
bool? isIgnoreRelativePath;
DateTime[] containerDateTimes;
string deterministicHashCodeKey;
MappingFromItem mappingFromItem;
MappingFromFilter mappingFromFilter;
MappingFromLocation? mappingFromLocation;
IReadOnlyList<MetadataExtractor.Directory> directories;
List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection;
List<LocationContainer<MetadataExtractor.Directory>>? locationContainers;
string focusRelativePath = Path.GetFullPath(string.Concat(_Configuration.PropertyConfiguration.RootDirectory, _Configuration.FocusDirectory));
foreach (Container container in containers)
{
if (!container.Items.Any())
continue;
if (!_ArgZeroIsConfigurationRootDirectory && !container.SourceDirectory.StartsWith(argZero))
continue;
filteredItems = Shared.Models.Stateless.Methods.IContainer.GetFilterItems(_Configuration.PropertyConfiguration, container);
if (!filteredItems.Any())
continue;
containerDateTimes = Shared.Models.Stateless.Methods.IContainer.GetContainerDateTimes(filteredItems);
isFocusRelativePath = string.IsNullOrEmpty(_Configuration.FocusDirectory) ? null : container.SourceDirectory.StartsWith(focusRelativePath);
if (!_Configuration.IgnoreRelativePaths.Any())
isIgnoreRelativePath = null;
else
isIgnoreRelativePath = _Configuration.IgnoreRelativePaths.Any(l => container.SourceDirectory.Contains(l)) && Shared.Models.Stateless.Methods.IContainer.IsIgnoreRelativePath(_Configuration.PropertyConfiguration, _Configuration.IgnoreRelativePaths, container.SourceDirectory);
foreach (Item item in filteredItems)
{
if (item.Property?.Id is null || item.ResizedFileHolder is null)
continue;
mappingFromItem = Shared.Models.Stateless.Methods.IMappingFromItem.GetMappingFromItem(containerDateTimes, item);
if (string.IsNullOrEmpty(_Configuration.FocusModel))
isFocusModel = null;
else
{
if (!idToLocationContainers.TryGetValue(mappingFromItem.Id, out locationContainers) || !locationContainers.Any())
isFocusModel = false;
else
{
directories = locationContainers.First().Directories;
model = Metadata.Models.Stateless.Methods.IMetadata.GetModel(directories);
if (model is null)
directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(mappingFromItem.ResizedFileHolder.FullName);
model = Metadata.Models.Stateless.Methods.IMetadata.GetModel(directories);
isFocusModel = model is not null && model.Contains(_Configuration.FocusModel);
if (isFocusModel.Value)
isFocusModel = true;
}
}
mappingFromFilter = new(isFocusModel, isFocusRelativePath, isIgnoreRelativePath);
foreach (Shared.Models.Face face in item.Faces)
{
if (face.FaceEncoding is null || face.Location is null || face.OutputResolution is null)
mappingFromLocation = null;
else
{
confidencePercent = Shared.Models.Stateless.Methods.ILocation.GetConfidencePercent(_Configuration.FaceConfidencePercent, _Configuration.RangeFaceConfidence, face.Location.Confidence);
faceAreaPermyriad = Shared.Models.Stateless.Methods.IMapping.GetAreaPermyriad(_Configuration.FaceAreaPermyriad, face.Location, face.OutputResolution);
normalizedRectangle = Shared.Models.Stateless.Methods.ILocation.GetNormalizedRectangle(face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution);
deterministicHashCodeKey = Shared.Models.Stateless.Methods.IMapping.GetDeterministicHashCodeKey(item.Property.Id.Value, face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution);
mappingFromLocation = new(faceAreaPermyriad, confidencePercent, deterministicHashCodeKey, normalizedRectangle);
}
if (!fileNameToCollection.TryGetValue(mappingFromItem.RelativePath[1..], out mappingFromPhotoPrismCollection))
mappingFromPhotoPrismCollection = null;
mapping = new(mappingFromItem, mappingFromFilter, mappingFromLocation, mappingFromPhotoPrismCollection);
face.SetMapping(mapping);
}
}
}
}
private (List<int>, List<Shared.Models.Face>) GetFilteredDistinct(string argZero, Container[] containers) private (List<int>, List<Shared.Models.Face>) GetFilteredDistinct(string argZero, Container[] containers)
{ {
List<int> resultIds = new(); List<int> resultIds = new();
@ -1103,14 +1085,12 @@ public partial class DlibDotNet
propertyLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _Resize.FileNameExtension, _Configuration.Reverse, aResultsFullGroupDirectory); propertyLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _Resize.FileNameExtension, _Configuration.Reverse, aResultsFullGroupDirectory);
} }
containers = Shared.Models.Stateless.Methods.IContainer.SortContainers(_Configuration.PropertyConfiguration, _Configuration.IgnoreRelativePaths, _ArgZeroIsConfigurationRootDirectory, argZero, containers); containers = Shared.Models.Stateless.Methods.IContainer.SortContainers(_Configuration.PropertyConfiguration, _Configuration.IgnoreRelativePaths, _ArgZeroIsConfigurationRootDirectory, argZero, containers);
MapLogic? mapLogic = _Configuration.DistanceMoveUnableToMatch ? null : new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _MapConfiguration, ticks, _PersonContainers, a2PeopleSingletonDirectory, eDistanceContentDirectory); MapLogic mapLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _MapConfiguration, ticks, _PersonContainers, a2PeopleSingletonDirectory, eDistanceContentDirectory);
personKeyToIds = mapLogic is null ? new() : mapLogic.GetPersonKeyToIds(); personKeyToIds = mapLogic.GetPersonKeyToIds();
fileNameToCollection = !Directory.Exists(fPhotoPrismSingletonDirectory) ? fileNameToCollection = new() : F_PhotoPrism.GetFileNameToCollection(fPhotoPrismSingletonDirectory); fileNameToCollection = !Directory.Exists(fPhotoPrismSingletonDirectory) ? fileNameToCollection = new() : F_PhotoPrism.GetFileNameToCollection(fPhotoPrismSingletonDirectory);
Dictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers = GetDictionary(ticks, a2PeopleContentDirectory, eDistanceContentDirectory); Dictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers = GetDictionary(ticks, a2PeopleContentDirectory, eDistanceContentDirectory);
FullDoWork(argZero, propertyRoot, ticks, aResultsFullGroupDirectory, bResultsFullGroupDirectory, t, containers, propertyLogic, metadata, eDistanceContentDirectory, fileNameToCollection, idToLocationContainers); FullDoWork(argZero, propertyRoot, ticks, aResultsFullGroupDirectory, bResultsFullGroupDirectory, t, containers, propertyLogic, metadata, eDistanceContentDirectory, fileNameToCollection, idToLocationContainers, mapLogic);
_Distance.Clear(); _Distance.Clear();
mapLogic ??= new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _MapConfiguration, ticks, _PersonContainers, a2PeopleSingletonDirectory, eDistanceContentDirectory);
SetMapping(argZero, containers, fileNameToCollection, idToLocationContainers);
if (!personKeyToIds.Any()) if (!personKeyToIds.Any())
personKeyToIds = mapLogic.GetPersonKeyToIds(); personKeyToIds = mapLogic.GetPersonKeyToIds();
(List<int> distinctFilteredIds, List<Shared.Models.Face> distinctFilteredFaces) = GetFilteredDistinct(argZero, containers); (List<int> distinctFilteredIds, List<Shared.Models.Face> distinctFilteredFaces) = GetFilteredDistinct(argZero, containers);

View File

@ -171,7 +171,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
return new(result, normalizedRectangleToPersonContainers); return new(result, normalizedRectangleToPersonContainers);
} }
public int UpdateMappingFromPerson(Mapping[] mappingCollection) public int UpdateMappingFromPerson(Mapping mapping)
{ {
if (_Configuration is null) if (_Configuration is null)
throw new NullReferenceException(nameof(_Configuration)); throw new NullReferenceException(nameof(_Configuration));
@ -183,7 +183,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
List<int>? normalizedRectangles; List<int>? normalizedRectangles;
PersonContainer[]? personContainers; PersonContainer[]? personContainers;
Dictionary<int, PersonContainer[]>? normalizedRectangleToPersonContainers; Dictionary<int, PersonContainer[]>? normalizedRectangleToPersonContainers;
foreach (Mapping mapping in mappingCollection) for (int i = 1; i < 2; i++)
{ {
if (mapping.MappingFromLocation is null) if (mapping.MappingFromLocation is null)
continue; continue;
@ -214,6 +214,18 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
return result; return result;
} }
public int UpdateMappingFromPerson(Mapping[] mappingCollection)
{
int result = 0;
foreach (Mapping mapping in mappingCollection)
{
if (mapping.MappingFromLocation is null)
continue;
result += UpdateMappingFromPerson(mapping);
}
return result;
}
public void SaveContainers(int totalNotMapped, int? updated, List<SaveContainer> saveContainers) public void SaveContainers(int totalNotMapped, int? updated, List<SaveContainer> saveContainers)
{ {
if (_Configuration is null) if (_Configuration is null)

View File

@ -8,11 +8,6 @@ public interface IMappingFromItem
static MappingFromItem GetMappingFromItem(DateTime[] containerDateTimes, Models.Item item, Models.FileHolder? resizedFileHolder) static MappingFromItem GetMappingFromItem(DateTime[] containerDateTimes, Models.Item item, Models.FileHolder? resizedFileHolder)
=> MappingFromItem.GetMappingFromItem(containerDateTimes, item, resizedFileHolder); => MappingFromItem.GetMappingFromItem(containerDateTimes, item, resizedFileHolder);
MappingFromItem TestStatic_GetMappingFromItem(DateTime[] containerDateTimes, Models.Item item)
=> GetMappingFromItem(containerDateTimes, item);
static MappingFromItem GetMappingFromItem(DateTime[] containerDateTimes, Models.Item item)
=> GetMappingFromItem(containerDateTimes, item, item.ResizedFileHolder);
MappingFromItem TestStatic_GetMappingFromItem(Models.Item item) MappingFromItem TestStatic_GetMappingFromItem(Models.Item item)
=> GetMappingFromItem(item); => GetMappingFromItem(item);
static MappingFromItem GetMappingFromItem(Models.Item item) static MappingFromItem GetMappingFromItem(Models.Item item)