diff --git a/mobile/lib/face/db.dart b/mobile/lib/face/db.dart index 95eb0ac15..8063acc8b 100644 --- a/mobile/lib/face/db.dart +++ b/mobile/lib/face/db.dart @@ -9,7 +9,6 @@ import 'package:path_provider/path_provider.dart'; import 'package:photos/face/db_fields.dart'; import "package:photos/face/db_model_mappers.dart"; import "package:photos/face/model/face.dart"; -import "package:photos/face/model/person.dart"; import "package:photos/models/file/file.dart"; import 'package:photos/services/machine_learning/face_ml/face_filtering/face_filtering_constants.dart'; import 'package:sqflite/sqflite.dart'; @@ -49,10 +48,10 @@ class FaceMLDataDB { Future _onCreate(Database db, int version) async { await db.execute(createFacesTable); + await db.execute(createFaceClustersTable); await db.execute(createClusterPersonTable); await db.execute(createClusterSummaryTable); await db.execute(createNotPersonFeedbackTable); - await db.execute(createFaceClustersTable); await db.execute(fcClusterIDIndex); } @@ -416,7 +415,7 @@ class FaceMLDataDB { Future> getFaceEmbeddingMapForFile( List fileIDs, ) async { - _logger.info('reading as float'); + _logger.info('reading face embeddings for ${fileIDs.length} files'); final db = await instance.database; // Define the batch size @@ -448,6 +447,7 @@ class FaceMLDataDB { } offset += batchSize; } + _logger.info('done reading face embeddings for ${fileIDs.length} files'); return result; } @@ -591,24 +591,14 @@ class FaceMLDataDB { return result; } - Future> getClusterIdToPerson( - Map personMap, - ) async { + Future> getClusterIDToPersonID() async { final db = await instance.database; final List> maps = await db.rawQuery( 'SELECT $personIdColumn, $cluserIDColumn FROM $clusterPersonTable', ); - - final Map result = {}; + final Map result = {}; for (final map in maps) { - final PersonEntity? p = personMap[map[personIdColumn] as String]; - if (p != null) { - result[map[cluserIDColumn] as int] = p; - } else { - _logger.warning( - 'Person with id ${map[personIdColumn]} not found', - ); - } + result[map[cluserIDColumn] as int] = map[personIdColumn] as String; } return result; } @@ -648,14 +638,14 @@ class FaceMLDataDB { Future removeFilesFromPerson( List files, - PersonEntity p, + String personID, ) async { final db = await instance.database; final faceIdsResult = await db.rawQuery( 'SELECT $fcFaceId FROM $faceClustersTable LEFT JOIN $clusterPersonTable ' 'ON $faceClustersTable.$fcClusterID = $clusterPersonTable.$cluserIDColumn ' 'WHERE $clusterPersonTable.$personIdColumn = ?', - [p.remoteID], + [personID], ); final Set fileIds = {}; for (final enteFile in files) { 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 11e5110fc..b923cf037 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 @@ -326,7 +326,7 @@ class ClusterFeedbackService { } Future removeFilesFromPerson(List files, PersonEntity p) { - return FaceMLDataDB.instance.removeFilesFromPerson(files, p); + return FaceMLDataDB.instance.removeFilesFromPerson(files, p.remoteID); } Future removeFilesFromCluster(List files, int clusterID) { diff --git a/mobile/lib/services/search_service.dart b/mobile/lib/services/search_service.dart index c597c2219..3e1826561 100644 --- a/mobile/lib/services/search_service.dart +++ b/mobile/lib/services/search_service.dart @@ -742,8 +742,8 @@ class SearchService { await FaceMLDataDB.instance.getFileIdToClusterIds(); final Map personIdToPerson = await PersonService.instance.getPersonsMap(); - final clusterIDToPerson = - await FaceMLDataDB.instance.getClusterIdToPerson(personIdToPerson); + final clusterIDToPersonID = + await FaceMLDataDB.instance.getClusterIDToPersonID(); final List facesResult = []; final Map> clusterIdToFiles = {}; @@ -755,7 +755,7 @@ class SearchService { } final cluserIds = fileIdToClusterID[f.uploadedFileID ?? -1]!; for (final cluster in cluserIds) { - final PersonEntity? p = clusterIDToPerson[cluster]; + final PersonEntity? p = personIdToPerson[clusterIDToPersonID[cluster] ?? ""]; if (p != null) { if (personIdToFiles.containsKey(p.remoteID)) { personIdToFiles[p.remoteID]!.add(f); @@ -815,9 +815,9 @@ class SearchService { final files = clusterIdToFiles[clusterId]!; // final String clusterName = "ID:$clusterId, ${files.length}"; final String clusterName = "${files.length}"; - final PersonEntity? p = clusterIDToPerson[clusterId]; - if (p != null) { - throw Exception("Person should be null"); + + if (clusterIDToPersonID[clusterId] != null) { + throw Exception("Cluster $clusterId should not have person id ${clusterIDToPersonID[clusterId]}"); } if (files.length < 3) { continue; diff --git a/mobile/lib/ui/viewer/file_details/faces_item_widget.dart b/mobile/lib/ui/viewer/file_details/faces_item_widget.dart index 3efb094a5..693fdfeb7 100644 --- a/mobile/lib/ui/viewer/file_details/faces_item_widget.dart +++ b/mobile/lib/ui/viewer/file_details/faces_item_widget.dart @@ -70,14 +70,16 @@ class FacesItemWidget extends StatelessWidget { final Map persons = await PersonService.instance.getPersonsMap(); final clusterIDToPerson = - await FaceMLDataDB.instance.getClusterIdToPerson(persons); + await FaceMLDataDB.instance.getClusterIDToPersonID(); final lastViewedClusterID = ClusterFeedbackService.lastViewedClusterID; final faceWidgets = []; for (final Face face in faces) { final int? clusterID = faceIdsToClusterIds[face.faceID]; - final PersonEntity? person = clusterIDToPerson[clusterID]; + final PersonEntity? person = clusterIDToPerson[clusterID] != null + ? persons[clusterIDToPerson[clusterID]!] + : null; final highlight = (clusterID == lastViewedClusterID) && (person == null); faceWidgets.add(