[mob][photos] Only check automatic merges on big clusters

This commit is contained in:
laurenspriem 2024-05-07 12:27:01 +05:30
parent 115f1bd42e
commit 0ecbb73f1e
2 changed files with 27 additions and 18 deletions

View file

@ -240,44 +240,53 @@ class ClusterFeedbackService {
return;
}
Future<bool> checkAndDoAutomaticMerges(PersonEntity p) async {
Future<bool> checkAndDoAutomaticMerges(
PersonEntity p, {
required int personClusterID,
}) async {
final faceMlDb = FaceMLDataDB.instance;
final faceIDs = await faceMlDb.getFaceIDsForCluster(personClusterID);
if (faceIDs.length < 2 * kMinimumClusterSizeSearchResult) {
final fileIDs = faceIDs.map(getFileIdFromFaceId).toSet();
if (fileIDs.length < kMinimumClusterSizeSearchResult) {
_logger.info(
'Cluster $personClusterID has less than $kMinimumClusterSizeSearchResult faces, not doing automatic merges',
);
return false;
}
}
final allClusterIdsToCountMap = (await faceMlDb.clusterIdToFaceCount());
final ignoredClusters = await faceMlDb.getPersonIgnoredClusters(p.remoteID);
final personClusters = await faceMlDb.getPersonClusterIDs(p.remoteID);
dev.log(
'${p.data.name} has ${personClusters.length} existing clusters',
name: "ClusterFeedbackService",
_logger.info(
'${kDebugMode ? p.data.name : "private"} has existing clusterID $personClusterID, checking if we can automatically merge more',
);
// Get and update the cluster summary to get the avg (centroid) and count
final EnteWatch watch = EnteWatch("ClusterFeedbackService")..start();
final Map<int, Vector> clusterAvg = await _getUpdateClusterAvg(
allClusterIdsToCountMap,
ignoredClusters,
{},
minClusterSize: kMinimumClusterSizeSearchResult,
);
watch.log('computed avg for ${clusterAvg.length} clusters');
// Find the actual closest clusters for the person
final List<(int, double)> suggestions = await calcSuggestionsMeanInComputer(
clusterAvg,
personClusters,
ignoredClusters,
0.3,
{personClusterID},
{},
0.34,
);
if (suggestions.isEmpty) {
dev.log(
'No automatic merge suggestions for ${p.data.name}',
name: "ClusterFeedbackService",
_logger.info(
'No automatic merge suggestions for ${kDebugMode ? p.data.name : "private"}',
);
return false;
}
// log suggestions
dev.log(
'suggestions for ${p.data.name} for cluster ID ${p.remoteID} are suggestions $suggestions}',
name: "ClusterFeedbackService",
_logger.info(
'suggestions for ${kDebugMode ? p.data.name : "private"} for cluster ID ${p.remoteID} are suggestions $suggestions}',
);
for (final suggestion in suggestions) {
@ -441,7 +450,7 @@ class ClusterFeedbackService {
_logger.info(
"Debug logging for cluster $clusterID${clusterSize != null ? ' with $clusterSize photos' : ''}",
);
const int biggestClusterID = 1714971868664806;
const int biggestClusterID = 1715061228725148;
// Logging the cluster summary for the cluster
if (logClusterSummary) {

View file

@ -271,7 +271,7 @@ class _PersonActionSheetState extends State<PersonActionSheet> {
final PersonEntity p =
await PersonService.instance.addPerson(text, clusterID);
final bool extraPhotosFound = await ClusterFeedbackService.instance
.checkAndDoAutomaticMerges(p);
.checkAndDoAutomaticMerges(p, personClusterID: clusterID);
if (extraPhotosFound) {
showShortToast(context, "Extra photos found for $text");
}