támogatja a multimodális feldolgozást natív módon - ugyanolyan programozási modellel feldolgozhatja a szöveget és a képet, és ugyanabban a felhasználói áramlásban megfigyelheti ) az CocoIndex Kókuszolaj CocoIndex alkalmazás Kókuszolaj Ebben a blogban átfogó példát fogunk mutatni egy skálázható arcfelismerő csővezeték létrehozásáról a CocoIndex segítségével. megmutatjuk, hogyan lehet kivonni és beágyazni az arcokat a képekből, strukturálni az adatokat viszonylag, és exportálni mindent egy vektor adatbázisba valós idejű lekérdezéshez. Mostantól egy kép azonosított részeit vizualizálhatja a határoló dobozok alapján, és megkönnyíti az AI-kivonások megértését és értékelését - zökkenőmentesen csatolja a számítógépes funkciókat a strukturálatlan vizuális adatok összefüggésében. Kókuszolaj Kókuszolaj If you find this tutorial helpful, we’d greatly appreciate it if you could ⭐ star . CocoIndex on GitHub CocoIndex a GitHub-on Használt esetek fotó keresés Arc-alapú hozzáférés-ellenőrzés és felügyelet Vizuális deduplikáció és identitásfelismerés Multimodális keresés, amely magában foglalja az embereket vagy az arcazonosítót Szociális grafikonok elemzése fotókból Mit fogunk elérni A konferencia résztvevőinek fényképei néha , a világ vezető fizikusainak ábrázolásáért összegyűlt egy lövésben ( ) "A valaha készített legintelligensebb kép" Wikipédia Íme, mit szeretnénk elérni: Felfedezze az összes arcot a képen, és vegye ki a határoló dobozokat Gyűjtsön és kódoljon minden arcképet egy 128-dimenziós arcbevonatba Tárolja a metaadatokat és a vektorokat egy strukturált indexben, hogy támogassa a lekérdezéseket, mint például: „Megtalál minden hasonló arcot ehhez a személynek” vagy „Keresés képek, amelyek tartalmazzák ezt a személyt” Itt megtalálja a teljes kódot . Itt Flow indexelés Készítettünk egy listát a képekről. For each image, we: Extract faces from the image. Compute embeddings for each face. We export the following fields to a table in Postgres with PGVector: Filename, rect, embedding for each face. Alapvető összetevők Képek Ingestion Figyelemmel kísérjük a A beépített alkalmazás használatával Minden újonnan hozzáadott fájlt automatikusan feldolgoznak és indexelnek. images/ LocalFile python CopyEdit @cocoindex.flow_def(name="FaceRecognition") def face_recognition_flow(flow_builder, data_scope): data_scope["images"] = flow_builder.add_source( cocoindex.sources.LocalFile(path="images", binary=True), refresh_interval=datetime.timedelta(seconds=10), ) Ez egy asztal, amellyel és A mezőny filename content Ezzel összekapcsolhatja a saját (Az SQS integrációval ) vagy . S3 szőnyeg példa Azure Blob áruház Az arcok felismerése és kivonása Mi használjuk a könyvtár a fedél alatt, amely a dlib CNN-alapú arcérzékelőjével működik. Mivel a modell lassú a nagy képeken, széles képeket csökkentünk a felismerés előtt. face_recognition @cocoindex.op.function( cache=True, behavior_version=1, gpu=True, arg_relationship=(cocoindex.op.ArgRelationship.RECTS_BASE_IMAGE, "content"), ) def extract_faces(content: bytes) -> list[FaceBase]: orig_img = Image.open(io.BytesIO(content)).convert("RGB") # The model is too slow on large images, so we resize them if too large. if orig_img.width > MAX_IMAGE_WIDTH: ratio = orig_img.width * 1.0 / MAX_IMAGE_WIDTH img = orig_img.resize( (MAX_IMAGE_WIDTH, int(orig_img.height / ratio)), resample=Image.Resampling.BICUBIC, ) else: ratio = 1.0 img = orig_img # Extract face locations. locs = face_recognition.face_locations(np.array(img), model="cnn") faces: list[FaceBase] = [] for min_y, max_x, max_y, min_x in locs: rect = ImageRect( min_x=int(min_x * ratio), min_y=int(min_y * ratio), max_x=int(max_x * ratio), max_y=int(max_y * ratio), ) # Crop the face and save it as a PNG. buf = io.BytesIO() orig_img.crop((rect.min_x, rect.min_y, rect.max_x, rect.max_y)).save( buf, format="PNG" ) face = buf.getvalue() faces.append(FaceBase(rect, face)) return faces A kép tartalmát átalakítjuk: with data_scope["images"].row() as image: image["faces"] = image["content"].transform(extract_faces) Ezen lépés után minden képnek van egy listája az észlelt arcokról és a határoló dobozokról. Minden észlelt arc az eredeti képről van kivágva és PNG-ként tárolva. A minta kivonása: A minta kivonása: Számítógépes arcfelvételek Minden egyes vágott arcot ugyanazzal a könyvtárral kódolunk, ami az arconkénti 128-dimenziós vektorképet hozza létre. @cocoindex.op.function(cache=True, behavior_version=1, gpu=True) def extract_face_embedding( face: bytes, ) -> cocoindex.Vector[cocoindex.Float32, typing.Literal[128]]: """Extract the embedding of a face.""" img = Image.open(io.BytesIO(face)).convert("RGB") embedding = face_recognition.face_encodings( np.array(img), known_face_locations=[(0, img.width - 1, img.height - 1, 0)], )[0] return embedding Csatlakoztassuk a beágyazó funkciót az áramlásra: with image["faces"].row() as face: face["embedding"] = face["image"].transform(extract_face_embedding) E lépés után a beágyazások készen állnak az indexelésre! Gyűjtés és export beágyazások Most minden egyes arcra strukturált adatokat gyűjtünk: fájlnév, határoló mező és beágyazás. face_embeddings = data_scope.add_collector() face_embeddings.collect( id=cocoindex.GeneratedField.UUID, filename=image["filename"], rect=face["rect"], embedding=face["embedding"], ) Egy Qdrant gyűjteménybe exportálunk: face_embeddings.export( QDRANT_COLLECTION, cocoindex.targets.Qdrant( collection_name=QDRANT_COLLECTION ), primary_key_fields=["id"], ) Mostantól cosine hasonlósági lekérdezéseket futtathat az arcvektorokon. A CocoIndex támogatja az 1-soros kapcsolót más vektor adatbázisokkal, például . poszterek Kövesse az indexet Most már készíthet arckereső alkalmazásokat vagy dashboardokat. például: Egy új arc beágyazása, megtalálja a leginkább hasonló arcokat Keresse meg az összes arcképet, amely egy fotókészletben jelenik meg Cluster beágyazás a vizuálisan hasonló emberek csoportosításához A beépített fájlok megtekintése, ellenőrizze . Képkereső projekt Ha teljes példát szeretne látni a lekérdezési útvonalon a képmegfeleléssel, kiáltson a . A mi csoportunk Támogasson minket Folyamatosan több példát adunk hozzá, és javítjuk futási idejét. Ha hasznosnak találta ezt, kérjük ⭐ csillag És ossza meg másokkal. CocoIndex a GitHub-on Köszönöm az olvasást! Mondja el nekünk, hogy milyen csővezetékeket épít - szeretnénk bemutatni őket.