Fetch and cache embeddings

This commit is contained in:
vishnukvmd 2023-09-22 21:17:33 +05:30
parent 8f4078fc5d
commit a5e2fff272
3 changed files with 41 additions and 17 deletions

View file

@ -5,6 +5,10 @@ import "package:computer/computer.dart";
import "package:flutter/services.dart";
import "package:logging/logging.dart";
import "package:path_provider/path_provider.dart";
import "package:photos/db/files_db.dart";
import "package:photos/models/embedding.dart";
import "package:photos/models/file/file.dart";
import "package:photos/utils/thumbnail_util.dart";
class SemanticSearchService {
SemanticSearchService._privateConstructor();
@ -21,22 +25,37 @@ class SemanticSearchService {
await _loadModel();
}
Future<void> runInference(Uint8List image, String text) async {
Future<void> runInference(EnteFile file, String text) async {
if (!hasLoaded || isRunning) {
return;
}
isRunning = true;
_logger.info("Running clip");
final imagePath = await _writeToFile(image, "input.jpg");
final imagePath = (await getThumbnailFile(file))!.path;
var startTime = DateTime.now();
final imageEmbedding = await _computer.compute(
createImageEmbedding,
param: {
"imagePath": imagePath,
},
taskName: "createImageEmbedding",
);
// ignore: prefer_typing_uninitialized_variables
var imageEmbedding;
final embeddings = await FilesDB.instance.getAllEmbeddings();
bool hasCachedEmbedding = false;
for (final embedding in embeddings) {
if (embedding.id == file.generatedID) {
imageEmbedding = embedding.embedding;
hasCachedEmbedding = true;
_logger.info("Found cached embedding");
}
}
if (!hasCachedEmbedding) {
imageEmbedding ??= await _computer.compute(
createImageEmbedding,
param: {
"imagePath": imagePath,
},
taskName: "createImageEmbedding",
);
await FilesDB.instance
.insertEmbedding(Embedding(file.generatedID!, imageEmbedding, -1));
}
var endTime = DateTime.now();
_logger.info(
"createImageEmbedding took: " +

View file

@ -60,7 +60,7 @@ class _ZoomableImageState extends State<ZoomableImage>
@override
void initState() {
_photo = widget.photo;
_test();
SemanticSearchService.instance.runInference(_photo, "desert with a tree");
_logger = Logger("ZoomableImage");
_logger.info('initState for ${_photo.generatedID} with tag ${_photo.tag}');
_scaleStateChangedCallback = (value) {
@ -80,13 +80,6 @@ class _ZoomableImageState extends State<ZoomableImage>
super.dispose();
}
void _test() {
final thumb = ThumbnailInMemoryLruCache.get(_photo);
if (thumb != null) {
SemanticSearchService.instance.runInference(thumb, "desert with a tree");
}
}
@override
Widget build(BuildContext context) {
if (_photo.isRemoteFile) {

View file

@ -42,6 +42,18 @@ Future<Uint8List?> getThumbnail(EnteFile file) async {
}
}
Future<File?> getThumbnailFile(EnteFile file) async {
final thumbnail = await getThumbnail(file);
if (thumbnail != null) {
final cachedThumbnail = cachedThumbnailPath(file);
if (!await cachedThumbnail.exists()) {
await cachedThumbnail.writeAsBytes(thumbnail, flush: true);
}
return cachedThumbnail;
}
return null;
}
Future<Uint8List> getThumbnailFromServer(EnteFile file) async {
final cachedThumbnail = cachedThumbnailPath(file);
if (await cachedThumbnail.exists()) {