Nan blog sa a, nou pral bati rechèch imaj viv ak rechèch li ak lang natirèl. Pou egzanp, ou ka rechèch pou "an elefan", oswa yon "animal bèl" ak yon lis imaj kòm entwodiksyon. Nou pral sèvi ak modèl entegre multimodal yo konprann ak entegre imaj la, epi yo bati yon endèks vètikal pou retrè efikas. Nou pral sèvi ak CocoIndex yo bati flux la indeksasyon, li se yon ultra pèfòmans tan reyèl transformasyon done ankadreman. Pandan kouri, ou ka ajoute nouvo dosye nan dosye a ak li sèlman pwosesis dosye chanje epi yo pral endèks nan yon minit. Li ta vle di anpil pou nou si ou ka mete yon star nan , si sa a tutorial se itil. CocoIndex sou Github Teknoloji CocoIndex nan se yon ultra pèfòmans reyèl-tan date transformation framework pou AI. CocoIndex nan Pwodwi pou Telefòn se yon modèl fòs vizyon-language ki ka konprann tou de imaj ak tèks. Li te fòme yo aliye reprezantan vizyèl ak tèks nan yon espò entegrasyon pataje, fè li pafè pou ka itilize nan rechèch imaj nou an. Pwodwi pou Telefòn Nan pwojè nou an, nou itilize CLIP nan: Genere entwodiksyon nan imaj yo dirèkteman Konvèti konvèsyon rechèch lang natirèl nan menm entwodiksyon espas Pèmèt rechèch semantik pa konpare entwodiksyon pou kesyon ak entwodiksyon pou sous Pwensipal se yon baz done vètikal pèfòmans segondè. Nou sèvi ak li nan magazen ak rechèch nan embeddings yo. Pwensipal Fasilite se yon modèn, vit (hache-performance), web framework pou bati APIs ak Python 3.7 + ki baze sou tip tip tip python estanda. Nou itilize li yo bati web API pou rechèch imaj. Fasilite Kondisyon Enstale Postgres. CocoIndex sèvi ak Postgres pou kontwole lineaj done pou pwosesis incremental. Enstalasyon nan Qdrant. Deskripsyon nan Indexing Flow Flow konsepsyon Diagram la flux montre ki jan nou pral pwosesis baz kòd nou an: Li dosye imaj soti nan sistèm dosye lokal la Sèvi ak CLIP yo konprann ak embed imaj la Depoze embeddings yo nan yon databas vètikal pou retrieval 1. Entegre imaj yo. @cocoindex.flow_def(name="ImageObjectEmbedding") def image_object_embedding_flow(flow_builder: cocoindex.FlowBuilder, data_scope: cocoindex.DataScope): data_scope["images"] = flow_builder.add_source( cocoindex.sources.LocalFile(path="img", included_patterns=["*.jpg", "*.jpeg", "*.png"], binary=True), refresh_interval=datetime.timedelta(minutes=1) # Poll for changes every 1 minute ) img_embeddings = data_scope.add_collector() pral kreye yon tab ak sous jaden ( nan ), nou ka refere a Pou plis detay. flow_builder.add_source filename content Dokiman 2. pwosesis chak imaj ak kolekte enfòmasyon. 2.1 Embed imaj la ak CLIP @functools.cache def get_clip_model() -> tuple[CLIPModel, CLIPProcessor]: model = CLIPModel.from_pretrained(CLIP_MODEL_NAME) processor = CLIPProcessor.from_pretrained(CLIP_MODEL_NAME) return model, processor nan decorator cache rezilta yo nan yon apèl fonksyon. Nan ka sa a, li asire ke nou sèlman chaje modèl la CLIP ak pwosè yon fwa. @functools.cache @cocoindex.op.function(cache=True, behavior_version=1, gpu=True) def embed_image(img_bytes: bytes) -> cocoindex.Vector[cocoindex.Float32, Literal[384]]: """ Convert image to embedding using CLIP model. """ model, processor = get_clip_model() image = Image.open(io.BytesIO(img_bytes)).convert("RGB") inputs = processor(images=image, return_tensors="pt") with torch.no_grad(): features = model.get_image_features(**inputs) return features[0].tolist() se yon fonksyon Custom ki sèvi ak modèl la CLIP konvèti yon imaj nan yon embedding vètikal. Li aksepte done imaj nan fòma byte ak retire yon lis nan nimewo pwen flòt ki reprezante embedding nan imaj la. embed_image fonksyon an sipòte caching nan paramèt. Lè pèmèt, egzekitè a pral sove rezilta yo nan fonksyon an pou re-ap itilize pandan reprocessing, ki se espesyalman itil pou operasyon òdinatè-intensive. Pou plis enfòmasyon sou paramèt fonksyon Custom, tanpri ale nan . cache Dokiman Apre sa, nou pral pwosesis chak imaj ak kolekte enfòmasyon. with data_scope["images"].row() as img: img["embedding"] = img["content"].transform(embed_image) img_embeddings.collect( id=cocoindex.GeneratedField.UUID, filename=img["filename"], embedding=img["embedding"], ) 2.3 Kolekte entwodiksyon yo Ekspòte entwodiksyon yo nan yon tab nan Qdrant. img_embeddings.export( "img_embeddings", cocoindex.storages.Qdrant( collection_name="image_search", grpc_url=QDRANT_GRPC_URL, ), primary_key_fields=["id"], setup_by_user=True, ) 3. Rechèch pou indeksasyon Embed kesyon an ak CLIP, ki maps tou de tèks ak imaj nan menm espò embed, pèmèt rechèch nan konparablite ant-modal. def embed_query(text: str) -> list[float]: model, processor = get_clip_model() inputs = processor(text=[text], return_tensors="pt", padding=True) with torch.no_grad(): features = model.get_text_features(**inputs) return features[0].tolist() Definye yon FastAPI Endpoint ki fè rechèch imaj semantik. /search @app.get("/search") def search(q: str = Query(..., description="Search query"), limit: int = Query(5, description="Number of results")): # Get the embedding for the query query_embedding = embed_query(q) # Search in Qdrant search_results = app.state.qdrant_client.search( collection_name="image_search", query_vector=("embedding", query_embedding), limit=limit ) Sa a fè rechèch nan baz la vètikal Qdrant pou entwodiksyon menm jan an. Retourne tèt la Rezilta limit # Format results out = [] for result in search_results: out.append({ "filename": result.payload["filename"], "score": result.score }) return {"results": out} Sa a fini pèmèt rechèch imaj semantik kote itilizatè ka jwenn imaj pa deskripsyon yo nan lang natirèl, olye de lè l sèvi avèk matche keyword egzak. aplikasyon Fasilite nan API app = FastAPI() app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # Serve images from the 'img' directory at /img app.mount("/img", StaticFiles(directory="img"), name="img") FastAPI enstalasyon aplikasyon ak CORS middleware ak dosye estatik sèvis aplikasyon an se konfigirasyon pou: Pèmèt demann atravè orijin soti nan nenpòt orijin Sèvi dosye imaj estatik soti nan 'img' katwòk Kòmanse Endpoints API pou fonksyonalite rechèch imaj @app.on_event("startup") def startup_event(): load_dotenv() cocoindex.init() # Initialize Qdrant client app.state.qdrant_client = QdrantClient( url=QDRANT_GRPC_URL, prefer_grpc=True ) app.state.live_updater = cocoindex.FlowLiveUpdater(image_object_embedding_flow) app.state.live_updater.start() Manadjè evènman kòmanse inisyalize aplikasyon an lè li premye kòmanse. Isit la se sa chak pati fè: load_dotenv(): Loads varyab anviwònman soti nan yon dosye .env, ki se itil pou konfigirasyon tankou API kle ak URLs cocoindex.init(): Inicialize Framework la CocoIndex, mete anviwònman yo ak konfigirasyon ki nesesè Qdrant Client Setup: Creates a new instance QdrantClient Configures it to use the gRPC URL specified in environment variables Enables gRPC preference for better performance Stores the client in the FastAPI app state for access across requests Live Updater Setup: Creates a instance for the FlowLiveUpdater image_object_embedding_flow This enables real-time updates to the image search index Starts the live updater to begin monitoring for changes Inicializasyon sa a asire ke tout eleman ki nesesè yo konfigirasyon ak kouri kòrèk la lè aplikasyon an kòmanse. Frontèn ou ka tcheke kòd la frontend . Nou entèdi kenbe li senp ak minimalis yo konsantre sou fonksyonalite rechèch imaj. isit la Tan pou plezi! Create a collection in Qdrant curl -X PUT 'http://localhost:6333/collections/image_search' \ -H 'Content-Type: application/json' \ -d '{ "vectors": { "embedding": { "size": 768, "distance": "Cosine" } } }' Setup indexing flow cocoindex setup main.py It is setup with a live updater, so you can add new files to the folder and it will be indexed within a minute. Run backend uvicorn main:app --reload --host 0.0.0.0 --port 8000 Run frontend cd frontend npm install npm run dev Li nan nan rechèch. http://localhost:5174 Koulye a, ajoute yon lòt imaj nan folder, pou egzanp, sa a , oswa nenpòt ki imaj ou renmen. Mande yon minit pou imaj la nouvo yo dwe pwosesis ak indexe. img bon goujè Si ou vle kontwole progrès la nan indeksasyon, ou ka wè li nan CocoInsight . cocoindex server -ci main.py Finally - we are constantly improving, and more features and examples are coming soon. If you love this article, please give us a star ⭐ at to help us grow. Thanks for reading! GitHub GitHub nan