Setup semantic search service

This commit is contained in:
vishnukvmd 2023-09-22 12:56:51 +05:30
parent d70c3386f4
commit 10ab2c53b0
2 changed files with 73 additions and 0 deletions

View file

@ -34,6 +34,7 @@ import 'package:photos/services/memories_service.dart';
import 'package:photos/services/push_service.dart';
import 'package:photos/services/remote_sync_service.dart';
import 'package:photos/services/search_service.dart';
import "package:photos/services/semantic_search_service.dart";
import "package:photos/services/storage_bonus_service.dart";
import 'package:photos/services/sync_service.dart';
import 'package:photos/services/trash_sync_service.dart';
@ -189,6 +190,7 @@ Future<void> _init(bool isBackground, {String via = ''}) async {
});
}
FeatureFlagService.instance.init();
SemanticSearchService.instance.init();
// Can not including existing tf/ml binaries as they are not being built
// from source.

View file

@ -0,0 +1,71 @@
import "dart:convert";
import "dart:io";
import "package:clip_ggml/clip_ggml.dart";
import "package:flutter/services.dart";
import "package:logging/logging.dart";
import "package:path_provider/path_provider.dart";
class SemanticSearchService {
SemanticSearchService._privateConstructor();
static final SemanticSearchService instance =
SemanticSearchService._privateConstructor();
late CLIP _clip;
final _logger = Logger("SemanticSearchService");
Future<void> init() async {
_clip = CLIP();
await _loadModel();
_testJson();
}
Future<void> _loadModel() async {
final clip = CLIP();
const modelPath =
"assets/models/clip/openai_clip-vit-base-patch32.ggmlv0.f16.bin";
final path = await _getAccessiblePathForAsset(modelPath, "model.bin");
final startTime = DateTime.now();
clip.loadModel(path);
final endTime = DateTime.now();
_logger.info(
"Loading model took: " +
(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch)
.toString() +
"ms",
);
_testJson();
}
Future<void> _testJson() async {
final startTime = DateTime.now();
final input = {
"embedding": [1.1, 2.2],
};
_logger.info(jsonEncode(input));
final result = _clip.testJSON(jsonEncode(input));
final endTime = DateTime.now();
_logger.info(
"Output: " +
result +
" (" +
(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch)
.toString() +
"ms)",
);
}
Future<String> _getAccessiblePathForAsset(
String assetPath,
String tempName,
) async {
final byteData = await rootBundle.load(assetPath);
final tempDir = await getTemporaryDirectory();
final file = await File('${tempDir.path}/$tempName')
.writeAsBytes(byteData.buffer.asUint8List());
return file.path;
}
}