ondersteun multi-modale verwerking natief - dit kan beide teks en beeld verwerk met dieselfde programmeringsmodel en waarneem in dieselfde gebruiker vloei (in die Die CocoIndex CocoInsight Die CocoIndex Kokainsig In hierdie blog, sal ons loop deur 'n omvattende voorbeeld van die bou van 'n skaalbare gesig herkenning pipeline met behulp van CocoIndex. Ons sal wys hoe om gesigte uit beelde te onttrek en in te voeg, struktureer die data relasionaal, en alles in 'n vektor databasis te eksporteer vir real-time querying. kan nou geïdentifiseerde dele van 'n beeld visualiser op grond van die grensbokse en maak dit makliker om AI-uittreksels te verstaan en te evalueer - naadloos berekende funksies in die konteks van ongestruktureerde visuele data byvoeg. Kokainsig Kokainsig If you find this tutorial helpful, we’d greatly appreciate it if you could ⭐ star . CocoIndex on GitHub CocoIndex op GitHub Gebruik gevalle Foto soek Gesiggebaseerde toegangsbeheer en -bewaking Visuele deduplikasie en identiteitsdeteksie Multimodale soeke wat mense of gesigidentiteit betrek Sosiale grafieke analise van foto's Wat ons sal bereik Die foto’s van die deelnemers aan hierdie konferensie word soms , vir sy beskrywing van die wêreld se toonaangevende fisici versamel in een skoot ( ) Die slimste foto wat ooit geneem is Die Wikipedia Hier is wat ons wil bereik: Detekteer al die gesigte in die prentjie en verwyder hul grensbokse Crop en kodeer elke gesig beeld in 'n 128-dimensionele gesig embedding Bewaar metadata en vektorte in 'n gestruktureerde indeks om queries soos: "Vind al soortgelyke gesigte aan hierdie persoon" of "Soek beelde wat hierdie persoon insluit" te ondersteun. Jy kan die volledige kode . hier Indekseer die vloei Ons het 'n lys van beelde ingesluit. 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. Kernkomponente Afbeelding ingestel Ons monitor 'n Gebruik die ingebouwde Alle nuwe bygevoegde lêers word outomaties verwerk en geïndexeer. 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), ) Dit maak 'n tafel met en die veld. filename content Jy kan dit verbind met jou (met die SQS integrasie, ) of . S3 Bottles Voorbeeld Die Azure Blob Store Ontdek en ekstraer gesigte Ons gebruik die 'n biblioteek onder die hoed, aangedryf deur dlib se CNN-gebaseerde gesigdetektor. Aangesien die model stadig is op groot beelde, verlaag ons breë beelde voor deteksie. 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 Ons verander die inhoud van die beeld: with data_scope["images"].row() as image: image["faces"] = image["content"].transform(extract_faces) Na hierdie stap, elke prentjie het 'n lys van gedetekteerde gesigte en grensbokse. Elke gedetekteerde gesig word van die oorspronklike prentjie afgesny en as 'n PNG gestoor. Ekstraktiewe voorbeelde: Ekstraktiewe voorbeelde: Geskryf vir Face Embeddings Ons kodeer elke gesnyde gesig met dieselfde biblioteek.Dit genereer 'n 128-dimensionele vektorverteenwoordiging per gesig. @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 Ons sluit die embeddingfunksie in die vloei: with image["faces"].row() as face: face["embedding"] = face["image"].transform(extract_face_embedding) Na hierdie stap, ons het embeddings gereed om geïndexeer te word! Versameling en uitvoer van embeddings Ons versamel nou gestruktureerde data vir elke gesig: lêername, bounding boks en insette. face_embeddings = data_scope.add_collector() face_embeddings.collect( id=cocoindex.GeneratedField.UUID, filename=image["filename"], rect=face["rect"], embedding=face["embedding"], ) Ons eksporteer na 'n Qdrant-kolleksie: face_embeddings.export( QDRANT_COLLECTION, cocoindex.targets.Qdrant( collection_name=QDRANT_COLLECTION ), primary_key_fields=["id"], ) Nou kan jy cosine-gelykheidsvrae oor gesigvektore uitvoer. CocoIndex ondersteun 1-lyn-skakelaar met ander vektordatabasisse soos . Postgres Kyk na die indeks U kan nou gesigssoek-apps of dashboards bou. byvoorbeeld: Gegewe 'n nuwe gesig insluit, vind die mees soortgelyke gesigte Vind al die gesigte foto's wat in 'n stel foto's verskyn Cluster embeddings om visueel soortgelyke mense te groepeer Vir die inskrywing, kyk uit . Image soek projek As jy 'n volledige voorbeeld op die query pad met beeld ooreenstem wil sien, gee dit 'n skreeu op . Ons groep Ondersteun ons Ons voeg voortdurend meer voorbeelde by en verbeter ons loop tyd. As jy dit nuttig gevind het, asseblief ⭐ ster En deel dit met ander. CocoIndex op GitHub Dankie vir die lees! Laat ons weet watter pijpleidings jy bou - ons wil graag dit aanbied.