-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathembedding_service.py
More file actions
104 lines (90 loc) · 3.5 KB
/
Copy pathembedding_service.py
File metadata and controls
104 lines (90 loc) · 3.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#!/usr/bin/env python3
import redis
import json
import os
import sys
import numpy as np
import faiss
from config import *
from utils import generate_event_id, utc_now
class EmbeddingService:
def __init__(self, dimension=16):
self.r = redis.Redis(host=REDIS_HOST, port=REDIS_PORT)
self.pubsub = self.r.pubsub()
self.dimension = dimension
self.index = faiss.IndexFlatIP(dimension)
self.image_ids = []
self.metadata_list = []
self.vector_index = self.load_vector_index()
self.load_faiss()
def load_vector_index(self):
if os.path.exists(VECTOR_INDEX_FILE):
with open(VECTOR_INDEX_FILE, 'r') as f:
return json.load(f)
return {'items': [], 'processed_event_ids': []}
def save_vector_index(self):
with open(VECTOR_INDEX_FILE, 'w') as f:
json.dump(self.vector_index, f, indent=2)
def load_faiss(self):
if os.path.exists(FAISS_INDEX_FILE):
self.index = faiss.read_index(FAISS_INDEX_FILE)
if os.path.exists(FAISS_INDEX_FILE + ".meta"):
with open(FAISS_INDEX_FILE + ".meta", 'r') as f:
data = json.load(f)
self.image_ids = data['image_ids']
self.metadata_list = data['metadata_list']
def save_faiss(self):
faiss.write_index(self.index, FAISS_INDEX_FILE)
with open(FAISS_INDEX_FILE + ".meta", 'w') as f:
json.dump({
'image_ids': self.image_ids,
'metadata_list': self.metadata_list
}, f)
def add_to_index(self, item_id, vector, metadata):
vec_array = np.array([vector], dtype=np.float32)
faiss.normalize_L2(vec_array)
self.index.add(vec_array)
self.image_ids.append(item_id)
self.metadata_list.append(metadata)
# Update vector_index.json
self.vector_index['items'].append({
'item_id': item_id,
'vector': vector,
**metadata
})
self.save_vector_index()
self.save_faiss()
def process_embedding(self, data):
image_id = data['image_id']
# Add image embedding
image_item_id = f"image::{image_id}"
self.add_to_index(image_item_id, data['image_embedding'], {
'item_type': 'image',
'image_id': image_id,
'label': image_id
})
# Add object embeddings
for idx, obj in enumerate(data['objects']):
object_item_id = f"object::{image_id}::{idx}"
self.add_to_index(object_item_id, obj['embedding'], {
'item_type': 'object',
'image_id': image_id,
'label': obj['label'],
'bbox': obj['bbox'],
'conf': obj['conf']
})
print(f"[EMBEDDING] Indexed {len(data['objects'])} objects + 1 image for {image_id}")
def run(self):
self.pubsub.subscribe(TOPIC_EMBEDDING)
print("[EMBEDDING] Service started. Listening for embeddings to index...")
for msg in self.pubsub.listen():
if msg['type'] == 'message':
try:
data = json.loads(msg['data'])
payload = data.get('payload', data)
self.process_embedding(payload)
except Exception as e:
print(f"[EMBEDDING] Error: {e}")
if __name__ == '__main__':
service = EmbeddingService()
service.run()