From d9e8ce7a9c1dfe94eb7f44e7b882ab57b48e7138 Mon Sep 17 00:00:00 2001 From: Jiangzhou He Date: Sun, 20 Jul 2025 23:11:00 -0700 Subject: [PATCH 1/4] example: annotated related arg for `extract_faces()` --- examples/face_recognition/main.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/examples/face_recognition/main.py b/examples/face_recognition/main.py index ef241265..343d437b 100644 --- a/examples/face_recognition/main.py +++ b/examples/face_recognition/main.py @@ -28,7 +28,12 @@ class FaceBase: MAX_IMAGE_WIDTH = 1280 -@cocoindex.op.function(cache=True, behavior_version=1, gpu=True) +@cocoindex.op.function( + cache=True, + behavior_version=1, + gpu=True, + related_arg_attr=(cocoindex.op.RelatedFieldAttribute.RECTS_BASE_IMAGE, "content"), +) def extract_faces(content: bytes) -> list[FaceBase]: """Extract the first pages of a PDF.""" orig_img = Image.open(io.BytesIO(content)).convert("RGB") From 7c81a9a961f1cc83e01047929ee6f5eb6e1ac90c Mon Sep 17 00:00:00 2001 From: Jiangzhou He Date: Mon, 21 Jul 2025 22:41:40 -0700 Subject: [PATCH 2/4] example: update rect field names --- examples/face_recognition/main.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/examples/face_recognition/main.py b/examples/face_recognition/main.py index 343d437b..4b5acb53 100644 --- a/examples/face_recognition/main.py +++ b/examples/face_recognition/main.py @@ -11,10 +11,10 @@ @dataclasses.dataclass class ImageRect: - top: int - left: int - bottom: int - right: int + min_x: int + min_y: int + max_x: int + max_y: int @dataclasses.dataclass @@ -53,17 +53,17 @@ def extract_faces(content: bytes) -> list[FaceBase]: locs = face_recognition.face_locations(np.array(img), model="cnn") faces: list[FaceBase] = [] - for top, right, bottom, left in locs: + for min_y, max_x, max_y, min_x in locs: rect = ImageRect( - left=int(left * ratio), - top=int(top * ratio), - right=int(right * ratio), - bottom=int(bottom * ratio), + 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.left, rect.top, rect.right, rect.bottom)).save( + orig_img.crop((rect.min_x, rect.min_y, rect.max_x, rect.max_y)).save( buf, format="PNG" ) face = buf.getvalue() From 28d626411aee30d2d0126f5ea8cb1379e1a8a634 Mon Sep 17 00:00:00 2001 From: Jiangzhou He Date: Mon, 21 Jul 2025 23:00:12 -0700 Subject: [PATCH 3/4] migrate: update field name accordingly --- examples/face_recognition/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/face_recognition/main.py b/examples/face_recognition/main.py index 4b5acb53..c90ebf35 100644 --- a/examples/face_recognition/main.py +++ b/examples/face_recognition/main.py @@ -32,7 +32,7 @@ class FaceBase: cache=True, behavior_version=1, gpu=True, - related_arg_attr=(cocoindex.op.RelatedFieldAttribute.RECTS_BASE_IMAGE, "content"), + arg_relationship=(cocoindex.op.ArgRelationship.RECTS_BASE_IMAGE, "content"), ) def extract_faces(content: bytes) -> list[FaceBase]: """Extract the first pages of a PDF.""" From 94328a16e127441e0f4a357c0ca132cdb7b81fbb Mon Sep 17 00:00:00 2001 From: Jiangzhou He Date: Mon, 21 Jul 2025 23:17:31 -0700 Subject: [PATCH 4/4] chore: bump `cocoindex` dependency version --- examples/face_recognition/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/face_recognition/pyproject.toml b/examples/face_recognition/pyproject.toml index 5fdd96e4..414fd7b6 100644 --- a/examples/face_recognition/pyproject.toml +++ b/examples/face_recognition/pyproject.toml @@ -4,7 +4,7 @@ version = "0.1.0" description = "Build index for papers with both metadata and content embeddings" requires-python = ">=3.11" dependencies = [ - "cocoindex>=0.1.67", + "cocoindex>=0.1.71", "face-recognition>=1.3.0", "pillow>=10.0.0", "numpy>=1.26.0",