From d43ed15cdfc3458507cb05e9e6c6ae66761874b7 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 9 Apr 2024 14:48:05 +0530 Subject: [PATCH] [mob] Add support for syncing multile clusters for a person --- .../face_ml/feedback/cluster_feedback.dart | 3 ++- .../face_ml/person/person_service.dart | 23 +++++++++++++++++++ .../people/add_person_action_sheet.dart | 3 +-- .../people/person_cluster_suggestion.dart | 3 ++- 4 files changed, 28 insertions(+), 4 deletions(-) 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 64402ebff..903bb140e 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 @@ -14,6 +14,7 @@ import "package:photos/models/file/file.dart"; import 'package:photos/services/machine_learning/face_ml/face_clustering/cosine_distance.dart'; import "package:photos/services/machine_learning/face_ml/face_clustering/linear_clustering_service.dart"; import "package:photos/services/machine_learning/face_ml/face_ml_result.dart"; +import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; import "package:photos/services/search_service.dart"; class ClusterSuggestion { @@ -393,7 +394,7 @@ class ClusterFeedbackService { for (final suggestionsPerCluster in suggestions.values) { for (final suggestion in suggestionsPerCluster) { final clusterID = suggestion.$1; - await faceMlDb.assignClusterToPerson( + await PersonService.instance.assignClusterToPerson( personID: p.remoteID, clusterID: clusterID, ); 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 bb66161cb..30f3a0d91 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 @@ -86,6 +86,29 @@ class PersonService { return PersonEntity(result.id, data); } + Future assignClusterToPerson({ + required String personID, + required int clusterID, + }) async { + final person = (await getPerson(personID))!; + final personData = person.data; + final faceIds = await faceMLDataDB.getFaceIDsForCluster(clusterID); + final clusterInfo = ClusterInfo( + id: clusterID, + faces: faceIds.toSet(), + ); + personData.assigned!.add(clusterInfo); + await entityService.addOrUpdate( + EntityType.person, + json.encode(personData.toJson()), + id: personID, + ); + await faceMLDataDB.assignClusterToPerson( + personID: personID, + clusterID: clusterID, + ); + } + Future deletePerson(String personID, {bool onlyMapping = true}) async { if (onlyMapping) { final PersonEntity? entity = await getPerson(personID); diff --git a/mobile/lib/ui/viewer/people/add_person_action_sheet.dart b/mobile/lib/ui/viewer/people/add_person_action_sheet.dart index 67759dcf7..552ed2cf0 100644 --- a/mobile/lib/ui/viewer/people/add_person_action_sheet.dart +++ b/mobile/lib/ui/viewer/people/add_person_action_sheet.dart @@ -7,7 +7,6 @@ import "package:logging/logging.dart"; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import "package:photos/core/event_bus.dart"; import "package:photos/events/people_changed_event.dart"; -import "package:photos/face/db.dart"; import "package:photos/face/model/person.dart"; import "package:photos/generated/l10n.dart"; import 'package:photos/services/machine_learning/face_ml/feedback/cluster_feedback.dart'; @@ -225,7 +224,7 @@ class _PersonActionSheetState extends State { return PersonRowItem( person: person, onTap: () async { - await FaceMLDataDB.instance.assignClusterToPerson( + await PersonService.instance.assignClusterToPerson( personID: person.remoteID, clusterID: widget.cluserID, ); diff --git a/mobile/lib/ui/viewer/people/person_cluster_suggestion.dart b/mobile/lib/ui/viewer/people/person_cluster_suggestion.dart index 8c77496e7..583aaccf6 100644 --- a/mobile/lib/ui/viewer/people/person_cluster_suggestion.dart +++ b/mobile/lib/ui/viewer/people/person_cluster_suggestion.dart @@ -8,6 +8,7 @@ import "package:photos/face/db.dart"; import "package:photos/face/model/person.dart"; import "package:photos/models/file/file.dart"; import 'package:photos/services/machine_learning/face_ml/feedback/cluster_feedback.dart'; +import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; import "package:photos/theme/ente_theme.dart"; import "package:photos/ui/components/buttons/button_widget.dart"; import "package:photos/ui/components/models/button_type.dart"; @@ -110,7 +111,7 @@ class _PersonClustersState extends State { ) async { // Perform the action based on clusterID, e.g., assignClusterToPerson or captureNotPersonFeedback if (yesOrNo) { - await FaceMLDataDB.instance.assignClusterToPerson( + await PersonService.instance.assignClusterToPerson( personID: widget.person.remoteID, clusterID: clusterID, );