170 lukemat

Kuinka rakentaa live-kuvanhaku visio-mallilla ja kyselyllä luonnollisella kielellä

kirjoittaja LJ7m2025/05/22
Read on Terminal Reader

Liian pitkä; Lukea

Tässä blogissa rakennamme live-kuvan etsinnän ja kyselemme sitä luonnollisella kielellä. Esimerkiksi voit etsiä "elefanttia" tai "suloista eläintä" kuvien luettelolla syöttönä. Käytämme multimodaalista upottamista mallia kuvan ymmärtämiseksi ja upottamiseksi ja rakentaa vektorin indeksi tehokkaaseen hakemiseen. Käytämme CocoIndexia indeksointivirran rakentamiseen.
featured image - Kuinka rakentaa live-kuvanhaku visio-mallilla ja kyselyllä luonnollisella kielellä
LJ HackerNoon profile picture
0-item
1-item

Tässä blogissa rakennamme live-kuvanhakuja ja kyselemme sitä luonnollisella kielellä. Esimerkiksi voit etsiä "elefanttia" tai "lempeää eläintä" luettelon kuvista syöttönä.

Käytämme multimodaalista upottamista mallia kuvan ymmärtämiseksi ja upottamiseksi sekä vektorin indeksiä tehokkaaseen hakuun. Käytämme CocoIndexia indeksointivirran rakentamiseen, se on erittäin tehokas reaaliaikainen tietojen muuntamiskehys. Käytön aikana voit lisätä uusia tiedostoja kansioon ja se käsittelee vain muutettuja tiedostoja ja indeksoidaan minuutin kuluessa.

Se merkitsee meille paljon, jos voisit pudottaa tähdenCocoIndex on GitHubJos tämä tutoriali on hyödyllinen.


Tekniikoita

Kookospähkinä

Kookospähkinäon erittäin suorituskykyinen reaaliaikainen tietojen muuntamiskehys AI: lle.

Säästäjä ViT-L/14

Säästäjä ViT-L/14on tehokas visio-kielen malli, joka voi ymmärtää sekä kuvia että tekstejä. Se on koulutettu yhdenmukaistamaan visuaaliset ja tekstilliset esitykset jaetussa upottamisalueessa, mikä tekee siitä täydellisen kuvanhakuun.

Hankkeessamme käytämme CLIPia:

  1. Luo kuvien upotuksia suoraan
  2. Muunna luonnollisen kielen hakukyselyt samaan upotettuun tilaan
  3. Aktivoi semanttinen haku vertaamalla kyselyn upotuksia otsikon upotuksiin

Kääpiö

Kääpiöon korkean suorituskyvyn vektoritietokanta. Käytämme sitä tallentamaan ja kyselemään upotuksia.

Nopeasti

Nopeastion moderni, nopea (korkean suorituskyvyn) verkkokehys rakentaa API: t Python 3.7+ perustuu standardin Python tyyppi vihjeitä.

Edellytykset

  • Install Postgres. CocoIndex käyttää Postgres seurata tietojen linjausta lisäkäsittelyä varten.
  • Asennetaan Qdrant

Indeksointi Flow

Flow suunnittelu

flow design

Virtausdiagrammi kuvaa, miten käsittelemme kooditietokantaamme:

  1. Lue kuvatiedostoja paikallisesta tiedostojärjestelmästä
  2. Käytä CLIPia kuvan ymmärtämiseen ja upottamiseen
  3. Tallenna sisäänrakennukset vektoritietokantaan hakuun

1. Valitse kaikki kuvat.

@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_sourceluodaan taulukko alaryhmien kanssa (filenamejacontentVoimme viitata siihen, ettäDokumentaatioLisää yksityiskohtia varten.

ingestion

2. Käsittele jokainen kuva ja kerää tietoja.

2.1 Sisällytä kuva CLIP:llä

@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

Sillä@functools.cacheTällöin se varmistaa, että lataamme CLIP-mallin ja prosessorin vain kerran.

@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_imageon mukautettu toiminto, joka käyttää CLIP-mallia muuntamaan kuvan vektorin upottamiseen. Se hyväksyy kuvan tiedot byteina ja palauttaa luettelon kuvan upottamista edustavista kelluva-pisteistä.

Toiminto tukee caching kauttacacheparametri. Kun se on käytössä, suoritin tallentaa funktion tulokset uudelleenkäyttöä varten uudelleenkäsittelyn aikana, mikä on erityisen hyödyllistä laskennallisesti intensiivisissä toiminnoissa.Dokumentaatio.

Sitten käsittelemme jokaisen kuvan ja keräämme tiedot.

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 Kerää sisäänrakennukset

Vie upotukset taulukkoon Qdrantissa.

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. Käytä indeksiä

Sisällytä kysely CLIP:llä, joka kartoittaa sekä tekstin että kuvien samalle upottamisalueelle, mikä mahdollistaa moduulien välisen samankaltaisuuden etsinnän.

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

Määritä FastAPI Endpoint/searchTämä tarkoittaa semanttista kuvan etsintää.

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

Tämä etsii Qdrant-vektoritietokantaa samankaltaisista upotuksista.limittuloksia

# Format results
out = []
for result in search_results:
    out.append({
        "filename": result.payload["filename"],
        "score": result.score
    })
return {"results": out}

Tämä päätepiste mahdollistaa semanttisen kuvan etsinnän, jossa käyttäjät voivat löytää kuvia kuvaamalla niitä luonnollisella kielellä sen sijaan, että käytettäisiin tarkkoja avainsanojen vastauksia.

sovelluksen

Nopea tulipalo

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-sovelluksen asennus CORS-välilehdellä ja staattisilla tiedostoilla Sovellus on konfiguroitu seuraavasti:

  • Salli ristiin alkuperäpyyntöjä mistä tahansa alkuperästä
  • Palvella staattisia kuvatiedostoja 'img' -kansiosta
  • Käsittele API:n päätepisteitä kuvan hakutoiminnoille
@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()

Käynnistystapahtuman käsittelijä käynnistää sovelluksen, kun se käynnistyy ensimmäisen kerran.

  1. load_dotenv(): Lataa ympäristömuuttujat .env-tiedostosta, joka on hyödyllinen konfigurointiin, kuten API-avaimiin ja URL-osoitteisiin
  2. cocoindex.init(): Aloittaa CocoIndex-kehyksen ja asettaa tarvittavat komponentit ja konfiguraatiot
  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

Tämä aloittaminen varmistaa, että kaikki tarvittavat komponentit on oikein konfiguroitu ja käynnissä, kun sovellus käynnistyy.

etupuolella

Voit tarkistaa Frontend-koodinTäälläPidimme tarkoituksella yksinkertaisena ja minimalistisena keskittymällä kuvan hakutoimintoihin.

Aika pitää hauskaa!

  • 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
    

Tule mukaanhttp://localhost:5174Kaksi etsintää


Example Search


More Example Search


Lisätään nyt toinen kuvaimgTällainen lomake esimerkiksiSöpö kääpiö, tai mitä tahansa kuvaa haluat. Odota hetki, kunnes uusi kuva käsitellään ja indeksoidaan.


Squirrel Search


Jos haluat seurata indeksoinnin edistymistä, voit tarkastella sitä CocoInsightissacocoindex 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!

Githubissa

Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks