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ähden Jos tämä tutoriali on hyödyllinen. CocoIndex on GitHub Tekniikoita Kookospähkinä on erittäin suorituskykyinen reaaliaikainen tietojen muuntamiskehys AI: lle. Kookospähkinä Säästäjä ViT-L/14 on 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. Säästäjä ViT-L/14 Hankkeessamme käytämme CLIPia: Luo kuvien upotuksia suoraan Muunna luonnollisen kielen hakukyselyt samaan upotettuun tilaan Aktivoi semanttinen haku vertaamalla kyselyn upotuksia otsikon upotuksiin Kääpiö on korkean suorituskyvyn vektoritietokanta. Käytämme sitä tallentamaan ja kyselemään upotuksia. Kääpiö Nopeasti on moderni, nopea (korkean suorituskyvyn) verkkokehys rakentaa API: t Python 3.7+ perustuu standardin Python tyyppi vihjeitä. Nopeasti Edellytykset Install Postgres. CocoIndex käyttää Postgres seurata tietojen linjausta lisäkäsittelyä varten. Asennetaan Qdrant Indeksointi Flow Flow suunnittelu Virtausdiagrammi kuvaa, miten käsittelemme kooditietokantaamme: Lue kuvatiedostoja paikallisesta tiedostojärjestelmästä Käytä CLIPia kuvan ymmärtämiseen ja upottamiseen 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() luodaan taulukko alaryhmien kanssa ( ja Voimme viitata siihen, että Lisää yksityiskohtia varten. flow_builder.add_source filename content Dokumentaatio 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ä Tällöin se varmistaa, että lataamme CLIP-mallin ja prosessorin vain kerran. @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() on 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ä. embed_image Toiminto tukee caching kautta parametri. Kun se on käytössä, suoritin tallentaa funktion tulokset uudelleenkäyttöä varten uudelleenkäsittelyn aikana, mikä on erityisen hyödyllistä laskennallisesti intensiivisissä toiminnoissa. . cache 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 Tämä tarkoittaa semanttista kuvan etsintää. /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 ) Tämä etsii Qdrant-vektoritietokantaa samankaltaisista upotuksista. tuloksia limit # 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. load_dotenv(): Lataa ympäristömuuttujat .env-tiedostosta, joka on hyödyllinen konfigurointiin, kuten API-avaimiin ja URL-osoitteisiin cocoindex.init(): Aloittaa CocoIndex-kehyksen ja asettaa tarvittavat komponentit ja konfiguraatiot 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 Tämä aloittaminen varmistaa, että kaikki tarvittavat komponentit on oikein konfiguroitu ja käynnissä, kun sovellus käynnistyy. etupuolella Voit tarkistaa Frontend-koodin Pidimme tarkoituksella yksinkertaisena ja minimalistisena keskittymällä kuvan hakutoimintoihin. Täällä 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 mukaan Kaksi etsintää http://localhost:5174 Lisätään nyt toinen kuva Tällainen lomake esimerkiksi , tai mitä tahansa kuvaa haluat. Odota hetki, kunnes uusi kuva käsitellään ja indeksoidaan. img Söpö kääpiö Jos haluat seurata indeksoinnin edistymistä, voit tarkastella sitä CocoInsightissa . 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 Githubissa