From 8a00cfe2e792ff8e65234779d456de5ed487b2a7 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Tue, 17 Jun 2025 15:04:29 +0530 Subject: [PATCH] cluster feedback method for face level feedback --- mobile/lib/events/people_changed_event.dart | 1 + .../face_ml/feedback/cluster_feedback.dart | 58 ++++++++++++++++++- .../face_ml/person/person_service.dart | 2 +- 3 files changed, 59 insertions(+), 2 deletions(-) diff --git a/mobile/lib/events/people_changed_event.dart b/mobile/lib/events/people_changed_event.dart index 7106421ff2..ee5b8e7192 100644 --- a/mobile/lib/events/people_changed_event.dart +++ b/mobile/lib/events/people_changed_event.dart @@ -22,6 +22,7 @@ class PeopleChangedEvent extends Event { enum PeopleEventType { defaultType, removedFilesFromCluster, + removedFaceFromCluster, syncDone, saveOrEditPerson, } diff --git a/mobile/lib/services/machine_learning/face_ml/feedback/cluster_feedback.dart b/mobile/lib/services/machine_learning/face_ml/feedback/cluster_feedback.dart index c393535ee7..dd8cb57f51 100644 --- a/mobile/lib/services/machine_learning/face_ml/feedback/cluster_feedback.dart +++ b/mobile/lib/services/machine_learning/face_ml/feedback/cluster_feedback.dart @@ -11,6 +11,7 @@ import "package:photos/db/ml/db.dart"; import "package:photos/events/people_changed_event.dart"; import "package:photos/extensions/stop_watch.dart"; import "package:photos/generated/protos/ente/common/vector.pb.dart"; +import "package:photos/models/base/id.dart"; import "package:photos/models/file/file.dart"; import "package:photos/models/ml/face/person.dart"; import "package:photos/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart"; @@ -187,7 +188,7 @@ class ClusterFeedbackService { // Update remote so new sync does not undo this change await PersonService.instance - .removeFilesFromPerson(person: p, faceIDs: faceIDs.toSet()); + .removeFacesFromPerson(person: p, faceIDs: faceIDs.toSet()); Bus.instance.fire(PeopleChangedEvent()); _logger.info('removeFilesFromPerson done'); @@ -198,6 +199,36 @@ class ClusterFeedbackService { } } + // TODO: lau:fileinfo + Future removeFaceFromPerson( + String faceID, + PersonEntity p, + ) async { + _logger.info('removeFaceFromPerson called'); + try { + final newCluster = newClusterID(); + final newFaceIdToClusterID = {faceID: newCluster}; + await mlDataDB.forceUpdateClusterIds(newFaceIdToClusterID); + + // Make sure the deleted faces don't get suggested in the future + final notClusterIdToPersonId = {newCluster: p.remoteID}; + await mlDataDB.bulkCaptureNotPersonFeedback(notClusterIdToPersonId); + + // Update remote so new sync does not undo this change + await PersonService.instance + .removeFacesFromPerson(person: p, faceIDs: {faceID}); + + Bus.instance.fire( + PeopleChangedEvent(type: PeopleEventType.removedFaceFromCluster), + ); + _logger.info('removeFaceFromPerson done'); + return; + } catch (e, s) { + _logger.severe("Error in removeFaceFromPerson", e, s); + rethrow; + } + } + Future removeFilesFromCluster( List files, String clusterID, @@ -256,6 +287,31 @@ class ClusterFeedbackService { } } + // TODO: lau:fileinfo + Future removeFaceFromCluster( + String faceID, + String clusterID, + ) async { + _logger.info('removeFaceFromCluster called'); + try { + final newCluster = newClusterID(); + final newFaceIdToClusterID = {faceID: newCluster}; + await mlDataDB.forceUpdateClusterIds(newFaceIdToClusterID); + + Bus.instance.fire( + PeopleChangedEvent( + type: PeopleEventType.removedFaceFromCluster, + source: clusterID, + ), + ); + _logger.info('removeFaceFromCluster done'); + return newCluster; + } catch (e, s) { + _logger.severe("Error in removeFaceFromCluster", e, s); + rethrow; + } + } + Future addFacesToCluster(List faceIDs, String clusterID) async { final faceIDToClusterID = {}; for (final faceID in faceIDs) { diff --git a/mobile/lib/services/machine_learning/face_ml/person/person_service.dart b/mobile/lib/services/machine_learning/face_ml/person/person_service.dart index 7c96a67dea..48355608b0 100644 --- a/mobile/lib/services/machine_learning/face_ml/person/person_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/person/person_service.dart @@ -245,7 +245,7 @@ class PersonService { personData.logStats(); } - Future removeFilesFromPerson({ + Future removeFacesFromPerson({ required PersonEntity person, required Set faceIDs, }) async {