cluster feedback method for face level feedback

This commit is contained in:
laurenspriem
2025-06-17 15:04:29 +05:30
parent 0aaed84549
commit 8a00cfe2e7
3 changed files with 59 additions and 2 deletions

View File

@@ -22,6 +22,7 @@ class PeopleChangedEvent extends Event {
enum PeopleEventType {
defaultType,
removedFilesFromCluster,
removedFaceFromCluster,
syncDone,
saveOrEditPerson,
}

View File

@@ -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<T> {
// 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<T> {
}
}
// TODO: lau:fileinfo
Future<void> 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<void> removeFilesFromCluster(
List<EnteFile> files,
String clusterID,
@@ -256,6 +287,31 @@ class ClusterFeedbackService<T> {
}
}
// TODO: lau:fileinfo
Future<String> 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<void> addFacesToCluster(List<String> faceIDs, String clusterID) async {
final faceIDToClusterID = <String, String>{};
for (final faceID in faceIDs) {

View File

@@ -245,7 +245,7 @@ class PersonService {
personData.logStats();
}
Future<void> removeFilesFromPerson({
Future<void> removeFacesFromPerson({
required PersonEntity person,
required Set<String> faceIDs,
}) async {