inasaidia usindikaji wa multi-modal kwa asili - inaweza kusindika maandishi na picha kwa mfano huo wa programu na kuchunguza katika mtiririko huo wa mtumiaji (katika (Kwa ajili ya Maelezo ya CocoIndex Maelezo ya CocoInsight Maelezo ya CocoIndex Maelezo ya CocoInsight Katika blogu hii, tutashughulikia mfano kamili wa kujenga pipeline ya kutambua uso kwa kutumia CocoIndex. Tutaonyesha jinsi ya kuchukua na kuingiza uso kutoka kwa picha, muundo wa data kwa uhusiano, na kuuza kila kitu kwenye database ya vector kwa ajili ya maswali ya wakati halisi. sasa inaweza kutafakari sehemu zilizojulikana za picha kulingana na sanduku la mipaka na inafanya iwe rahisi kuelewa na kutathmini uchapishaji wa AI - kwa kuunganisha kwa usahihi vipengele vya kompyuta katika mazingira ya data isiyo ya muundo. CocoInsight Maelezo ya CocoInsight If you find this tutorial helpful, we’d greatly appreciate it if you could ⭐ star . CocoIndex on GitHub CocoIndex kwenye GitHub Matumizi ya kesi Utafutaji wa picha Usimamizi na ufuatiliaji wa upatikanaji wa uso Utambulisho wa Visual na Utambulisho wa Utambulisho Utafutaji wa multimodal unaohusisha watu au utambulisho wa uso Uchambuzi wa graph ya kijamii kutoka kwa picha Tutaweza kufikia nini Picha zilizochukuliwa na washiriki wa mkutano huu wakati mwingine ni haki ya , kwa maonyesho yake ya wanasayansi wakuu wa dunia waliokusanyika pamoja katika risasi moja ( ) "Picha ya akili zaidi ambayo imechukuliwa" Wikipedia ya Hapa ni nini tunataka kufikia: Kutambua nyuso zote katika picha na kuondoa sanduku zao za mipaka Kuzaa na coding kila picha ya uso katika kuingizwa 128-dimensional uso Kuhifadhi metadata na vektor katika kielelezo cha muundo ili kusaidia maswali kama vile: "Kutafuta nyuso zote sawa na mtu huyu" au "Kutafuta picha ambazo zinajumuisha mtu huyu" Unaweza kupata msimbo kamili wa . Hapa ya Udhibiti wa Flow Tumeweka orodha ya picha. 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. Sehemu ya msingi Picha ya Injection Tunaendelea kufuatilia Kuanzishwa kwa kutumia built-in Faili zote zilizoongezwa hivi karibuni hutumiwa moja kwa moja na indexed. 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), ) Hii inajumuisha meza ya na ya Ndani ya filename content Unaweza kuunganisha na yako (Pamoja na ushirikiano wa SQS, ) au . S3 ya buckets Mfano wa Huduma ya Azure Blob Kuchunguza na kuondoa nyuso Tunatumia kwa maktaba chini ya kapu, inayotumiwa na detector ya uso wa CNN ya dlib. Kwa kuwa mfano ni wa polepole kwenye picha kubwa, tunapunguza picha kubwa kabla ya kugundua. 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 Tunabadilisha maudhui ya picha: with data_scope["images"].row() as image: image["faces"] = image["content"].transform(extract_faces) Baada ya hatua hii, kila picha ina orodha ya nyuso zilizopatikana na sanduku la mipaka. Kila uso uliopatikana unachukuliwa kutoka kwa picha ya awali na kuhifadhiwa kama PNG. Uchambuzi wa sampuli: Uchambuzi wa sampuli: Maonyesho ya Face Embeddings Tunakodisha kila uso uliochapishwa kwa kutumia maktaba hiyo hiyo. Hii inatoa muonekano wa vektor 128-dimensional kwa kila uso. @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 Tunaunganisha kazi ya kuingiza kwenye mtiririko: with image["faces"].row() as face: face["embedding"] = face["image"].transform(extract_face_embedding) Baada ya hatua hii, tuko tayari kuingizwa kwa indexed! Mkusanyiko na Usambazaji wa Embeddings Sasa tunakusanya data iliyoundwa kwa kila uso: jina la faili, sanduku la mipaka, na kuingiza. face_embeddings = data_scope.add_collector() face_embeddings.collect( id=cocoindex.GeneratedField.UUID, filename=image["filename"], rect=face["rect"], embedding=face["embedding"], ) Tunauza kwa mkusanyiko wa Qdrant: face_embeddings.export( QDRANT_COLLECTION, cocoindex.targets.Qdrant( collection_name=QDRANT_COLLECTION ), primary_key_fields=["id"], ) Sasa unaweza kuendesha maswali ya kufanana na cosine juu ya vektor ya uso. CocoIndex inasaidia switch 1-line na mifumo mingine ya data ya vektor kama vile . ya Postgres Jinsi ya kuunda index Sasa unaweza kujenga maombi ya utafutaji wa uso au dashboards. Kwa mfano: Kutokana na kuingizwa kwa uso mpya, kupata nyuso zilizo sawa zaidi Pata picha zote za uso ambazo zinaonekana kwenye picha Cluster embeddings kuunganisha watu sawa kwa mtazamo Kwa ajili ya kutafuta mbinu, angalia . Mradi wa kutafuta picha Ikiwa ungependa kuona mfano kamili juu ya njia ya swali na picha ya kulinganisha, jiulize kwenye . Kikundi chetu Msaada wetu Sisi daima kuongeza mifano zaidi na kuboresha runtime yetu. Ikiwa umepata hii ya manufaa, tafadhali ⭐ nyota na kushirikiana na wengine. CocoIndex kwenye GitHub Shukrani kwa ajili ya kusoma! Hebu tujulishe vituo ambavyo unajenga - tutakupenda kuonyesha.