170 lekti

Ki jan yo bati rechèch imaj viv ak modèl vizyon ak kesyon ak lang natirèl

pa LJ7m2025/05/22
Read on Terminal Reader

Twò lontan; Pou li

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 "yon elefan", oswa yon "animal bèl" ak yon lis nan imaj kòm entwodiksyon. Nou pral sèvi ak modèl entegre multimodal yo konprann ak entegre imaj la, epi yo bati yon indeks vètikal pou retrè efikas. Nou pral sèvi ak CocoIndex yo bati flux la indeksasyon.
featured image - Ki jan yo bati rechèch imaj viv ak modèl vizyon ak kesyon ak lang natirèl
LJ HackerNoon profile picture
0-item
1-item

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 nanCocoIndex sou Github, si sa a tutorial se itil.


Teknoloji

CocoIndex nan

CocoIndex nanse yon ultra pèfòmans reyèl-tan date transformation framework pou AI.

Pwodwi pou Telefòn

Pwodwi pou Telefònse 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.

Nan pwojè nou an, nou itilize CLIP nan:

  1. Genere entwodiksyon nan imaj yo dirèkteman
  2. Konvèti konvèsyon rechèch lang natirèl nan menm entwodiksyon espas
  3. Pèmèt rechèch semantik pa konpare entwodiksyon pou kesyon ak entwodiksyon pou sous

Pwensipal

Pwensipalse yon baz done vètikal pèfòmans segondè. Nou sèvi ak li nan magazen ak rechèch nan embeddings yo.

Fasilite

Fasilitese 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.

Kondisyon

  • Enstale Postgres. CocoIndex sèvi ak Postgres pou kontwole lineaj done pou pwosesis incremental.
  • Enstalasyon nan Qdrant.

Deskripsyon nan Indexing Flow

Flow konsepsyon

flow design

Diagram la flux montre ki jan nou pral pwosesis baz kòd nou an:

  1. Li dosye imaj soti nan sistèm dosye lokal la
  2. Sèvi ak CLIP yo konprann ak embed imaj la
  3. 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()

flow_builder.add_sourcepral kreye yon tab ak sous jaden (filenamenancontent), nou ka refere aDokimanPou plis detay.

ingestion

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@functools.cachedecorator 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.

@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()

embed_imagese 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.

fonksyon an sipòte caching nancacheparamè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 nanDokiman.

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/searchki fè rechèch imaj semantik.

@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 lalimitRezilta

# 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è:

  1. load_dotenv(): Loads varyab anviwònman soti nan yon dosye .env, ki se itil pou konfigirasyon tankou API kle ak URLs
  2. cocoindex.init(): Inicialize Framework la CocoIndex, mete anviwònman yo ak konfigirasyon ki nesesè
  3. Qdrant Client Setup:
    • Creates a new QdrantClient instance
    • 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
  4. Live Updater Setup:
    • Creates a FlowLiveUpdater instance for the 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 frontendisit la. Nou entèdi kenbe li senp ak minimalis yo konsantre sou fonksyonalite rechèch imaj.

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 nanhttp://localhost:5174nan rechèch.


Example Search


More Example Search


Koulye a, ajoute yon lòt imaj nanimgfolder, pou egzanp, sa abon goujè, oswa nenpòt ki imaj ou renmen. Mande yon minit pou imaj la nouvo yo dwe pwosesis ak indexe.


Squirrel Search


Si ou vle kontwole progrès la nan indeksasyon, ou ka wè li nan CocoInsightcocoindex server -ci main.py .


Indexing status


Finally - we are constantly improving, and more features and examples are coming soon. If you love this article, please give us a star ⭐ at GitHub to help us grow. Thanks for reading!

GitHub nan

Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks