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 cf8513a613..a562fea997 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 @@ -319,19 +319,20 @@ class PersonService { logger.info( "Person ${e.id} ${personData.name} has ${remotelyRejectedFaceIDs.length} rejected faces", ); - // Assign rejected faces to new clusters - for (final faceId in remotelyRejectedFaceIDs) { - faceIdToClusterID[faceId] = newClusterID(); - } + // Check that we don't have any empty clusters now final dbPersonClusterInfo = await faceMLDataDB.getClusterIdToFaceIdsForPerson(e.id); for (final clusterIdToFaceIDs in dbPersonClusterInfo.entries) { final clusterID = clusterIdToFaceIDs.key; final faceIDs = clusterIdToFaceIDs.value; - faceIDs.removeWhere( - (faceID) => remotelyRejectedFaceIDs.contains(faceID), - ); + final foundRejectedFaces = []; + for (final faceID in faceIDs) { + if (remotelyRejectedFaceIDs.contains(faceID)) { + faceIDs.remove(faceID); + foundRejectedFaces.add(faceID); + } + } if (faceIDs.isEmpty) { logger.info( "Cluster $clusterID for person ${e.id} ${personData.name} is empty due to rejected faces from remote, removing the cluster from person", @@ -340,8 +341,17 @@ class PersonService { personID: e.id, clusterID: clusterID, ); + await faceMLDataDB.captureNotPersonFeedback( + personID: e.id, + clusterID: clusterID, + ); + remotelyRejectedFaceIDs.removeAll(foundRejectedFaces); } } + // Assign rejected faces to new clusters + for (final faceId in remotelyRejectedFaceIDs) { + faceIdToClusterID[faceId] = newClusterID(); + } } } }