palaiko daugiamodalinį apdorojimą natūraliai - jis galėtų apdoroti tiek tekstą, tiek vaizdą naudojant tą patį programavimo modelį ir stebėti tame pačiame vartotojo sraute (į ) ir Kokosų indeksas Kokosų apžvalga Kokosų indeksas Kokosų apžvalga Šiame tinklaraštyje mes išnagrinėsime išsamų pavyzdį, kaip sukurti skalbiamą veido atpažinimo vamzdį naudojant CocoIndex. Mes parodysime, kaip išgauti ir įterpti veidus iš vaizdų, struktūrizuoti duomenis santykinai ir eksportuoti viską į vektoriaus duomenų bazę realaus laiko užklausoms. Dabar galima vizualizuoti nustatytas paveikslėlio dalis remiantis ribinėmis dėžutėmis ir lengviau suprasti ir įvertinti AI ištraukas - sklandžiai pridedant apskaičiuotas funkcijas į nestruktūrizuotų vizualių duomenų kontekstą. Kokosų apžvalga Kokosų apžvalga If you find this tutorial helpful, we’d greatly appreciate it if you could ⭐ star . CocoIndex on GitHub CocoIndex Github svetainėje Naudokite atvejus Nuotraukų paieška Veido prieigos kontrolė ir priežiūra Vizualus deduplikavimas ir tapatybės aptikimas Multimodalinė paieška, kurioje dalyvauja žmonės arba veido tapatybė Socialinės grafikos analizė iš nuotraukų Ką mes pasieksime Konferencijos dalyvių nuotraukos kartais yra , už savo vaizdą apie pirmaujančius pasaulio fizikus, susirinkusius į vieną nuotrauką ( ) „Protingiausias kada nors nufilmuotas vaizdas“ Vikipedijos Štai ką mes norime pasiekti: Atraskite visus paveikslėlyje esančius veidus ir ištraukite jų ribines dėžes Išauginkite ir koduokite kiekvieną veido vaizdą į 128-dimensinį veido įterpimą Išsaugokite metaduomenis ir vektorius struktūrizuotame indekse, kad palaikytumėte užklausas, pvz.: „Rasti visus panašius veidus į šį“ arba „Rasti paveikslėlius, kuriuose yra šis asmuo“. Čia rasite visą kodą . čia Indekso srautas Pateikiame vaizdų sąrašą. 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. Pagrindiniai komponentai Vaizdo įvedimas Mes stebime Programinė įranga, naudojanti built-in Visi naujai pridėti failai yra automatiškai apdorojami ir indeksuojami. 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), ) Tai sukuria stalą su ir Žemėlapiai filename content Galite jį prijungti prie savo su SQS integracija, ) arba . S3 dėžutės Pavyzdys „Azure Blob“ parduotuvė Aptikti ir ištraukti veidus Mes naudojame biblioteka po dangteliu, kurią valdo „dlib“ CNN pagrįstas veido detektorius. Kadangi modelis yra lėtas dideliuose vaizduose, mes sumažiname plačius vaizdus prieš aptikimą. 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 Mes transformuojame vaizdo turinį: with data_scope["images"].row() as image: image["faces"] = image["content"].transform(extract_faces) Po šio žingsnio kiekvienas vaizdas turi aptiktų veidų ir ribinių laukų sąrašą. Kiekvienas aptiktas veidas yra ištrauktas iš originalaus vaizdo ir saugomas kaip PNG. Ekstrakcijos pavyzdžiai: Ekstrakcijos pavyzdžiai: Kompiuteriniai veido įdėklai Mes koduojame kiekvieną iškirptą veidą naudodami tą pačią biblioteką. @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 Mes įjungiame įterpimo funkciją į srautą: with image["faces"].row() as face: face["embedding"] = face["image"].transform(extract_face_embedding) Po šio žingsnio mes turime įterpimus, paruoštus indeksavimui! Surinkti ir eksportuoti įdėklus Dabar mes renkame struktūrizuotus duomenis apie kiekvieną veidą: failo pavadinimą, ribojimo lauką ir įterpimą. face_embeddings = data_scope.add_collector() face_embeddings.collect( id=cocoindex.GeneratedField.UUID, filename=image["filename"], rect=face["rect"], embedding=face["embedding"], ) Mes eksportuojame į Qdrant kolekciją: face_embeddings.export( QDRANT_COLLECTION, cocoindex.targets.Qdrant( collection_name=QDRANT_COLLECTION ), primary_key_fields=["id"], ) Dabar galite paleisti cosine panašumo užklausas per veido vektorius. CocoIndex palaiko 1 eilutės jungiklį su kitomis vektorinėmis duomenų bazėmis, pvz., . Postūmiai Norėčiau indekso Dabar galite kurti veido paieškos programas ar skydelius. pvz.: Atsižvelgiant į naują veido įterpimą, raskite labiausiai panašius veidus Rasti visus veido vaizdus, kurie pasirodo nuotraukų rinkinyje Grupės įterpimai, skirti grupuoti vizualiai panašius žmones Norėdami užsisakyti užuolaidas, patikrinkite . Vaizdo paieškos projektas Jei norite pamatyti visą pavyzdį užklausos kelią su atitikties vaizdą, šaukite . Mūsų grupė Palaikyk mus Mes nuolat pridedame daugiau pavyzdžių ir tobuliname savo paleidimo laiką. Jei jums tai padėjo, prašome ⭐ žvaigždutė ir pasidalinti ja su kitais. CocoIndex Github svetainėje Ačiū už skaitymą! Leiskite mums žinoti, kokius vamzdynus statote - mes norėtume juos pristatyti.