From b0b7ed7e0d5012f1f1428a7b5fbcfc24b96f0d41 Mon Sep 17 00:00:00 2001 From: Deep Koluguri Date: Wed, 8 Jul 2026 19:01:56 -0400 Subject: [PATCH] Fix cropping inaccuracies: added 15px padding and tightened article segmentation gap --- k8s/newspaper-extractor/backend.yaml | 2 +- k8s/newspaper-extractor/frontend.yaml | 2 +- k8s/newspaper-extractor/worker.yaml | 2 +- kaniko-backend.yaml | 33 +++++++++++++++++++ .../backend/app/pipeline/article_segmenter.py | 2 +- .../backend/app/pipeline/cropper.py | 13 ++++++-- 6 files changed, 47 insertions(+), 7 deletions(-) create mode 100644 kaniko-backend.yaml diff --git a/k8s/newspaper-extractor/backend.yaml b/k8s/newspaper-extractor/backend.yaml index 774b112..b1d218a 100644 --- a/k8s/newspaper-extractor/backend.yaml +++ b/k8s/newspaper-extractor/backend.yaml @@ -16,7 +16,7 @@ spec: containers: - name: backend image: 192.168.8.250:5000/agentic-os/newspaper-extractor-backend:latest - imagePullPolicy: Always + imagePullPolicy: IfNotPresent env: - name: DATABASE_URL value: "postgresql://myuser:mypassword@newspaper-db.ai-agents.svc.cluster.local:5432/mydatabase" diff --git a/k8s/newspaper-extractor/frontend.yaml b/k8s/newspaper-extractor/frontend.yaml index 8604c6a..fc77b18 100644 --- a/k8s/newspaper-extractor/frontend.yaml +++ b/k8s/newspaper-extractor/frontend.yaml @@ -16,7 +16,7 @@ spec: containers: - name: frontend image: 192.168.8.250:5000/agentic-os/newspaper-extractor-frontend:latest - imagePullPolicy: Always + imagePullPolicy: IfNotPresent ports: - containerPort: 3000 --- diff --git a/k8s/newspaper-extractor/worker.yaml b/k8s/newspaper-extractor/worker.yaml index 3ef1afc..22346c2 100644 --- a/k8s/newspaper-extractor/worker.yaml +++ b/k8s/newspaper-extractor/worker.yaml @@ -16,7 +16,7 @@ spec: containers: - name: worker image: 192.168.8.250:5000/agentic-os/newspaper-extractor-backend:latest - imagePullPolicy: Always + imagePullPolicy: IfNotPresent command: ["celery", "-A", "app.tasks.celery_app", "worker", "--loglevel=info", "-P", "solo"] env: - name: DATABASE_URL diff --git a/kaniko-backend.yaml b/kaniko-backend.yaml new file mode 100644 index 0000000..49d44e1 --- /dev/null +++ b/kaniko-backend.yaml @@ -0,0 +1,33 @@ +apiVersion: v1 +kind: Pod +metadata: + name: kaniko-backend + namespace: platform-data +spec: + restartPolicy: Never + volumes: + - name: workspace + emptyDir: {} + initContainers: + - name: clone-repo + image: alpine/git + command: + - /bin/sh + - -c + - "git clone http://gitea.gitea.svc.cluster.local:3000/deepkoluguri/agentic-os.git /workspace" + volumeMounts: + - name: workspace + mountPath: /workspace + containers: + - name: kaniko + image: gcr.io/kaniko-project/executor:latest + args: + - "--context=dir:///workspace/newspaper-extractor/backend" + - "--dockerfile=Dockerfile" + - "--destination=registry.platform-data.svc.cluster.local:5000/agentic-os/newspaper-extractor-backend:latest" + - "--insecure" + - "--skip-tls-verify" + - "--cache=false" + volumeMounts: + - name: workspace + mountPath: /workspace diff --git a/newspaper-extractor/backend/app/pipeline/article_segmenter.py b/newspaper-extractor/backend/app/pipeline/article_segmenter.py index 2a7daba..f21318d 100644 --- a/newspaper-extractor/backend/app/pipeline/article_segmenter.py +++ b/newspaper-extractor/backend/app/pipeline/article_segmenter.py @@ -89,7 +89,7 @@ class ArticleSegmenter: cur = block["bbox"] same_col = abs(last[0] - cur[0]) < 0.05 * page_width gap = cur[1] - last[3] - return same_col and gap < 0.04 * page_width + return same_col and gap < 0.025 * page_width def _merge_columns(self, articles, page_width): # Merge article fragments whose headline spans wide / text flows to next col diff --git a/newspaper-extractor/backend/app/pipeline/cropper.py b/newspaper-extractor/backend/app/pipeline/cropper.py index 8bee9f1..42f68aa 100644 --- a/newspaper-extractor/backend/app/pipeline/cropper.py +++ b/newspaper-extractor/backend/app/pipeline/cropper.py @@ -1,9 +1,16 @@ import cv2, os, uuid from app.config import settings -def crop_article(page_image, bbox, out_dir): +def crop_article(page_image, bbox, out_dir, pad=15): x, y, w, h = [int(v) for v in bbox] - crop = page_image[y:y+h, x:x+w] + img_h, img_w = page_image.shape[:2] + + x1 = max(0, x - pad) + y1 = max(0, y - pad) + x2 = min(img_w, x + w + pad) + y2 = min(img_h, y + h + pad) + + crop = page_image[y1:y2, x1:x2] os.makedirs(out_dir, exist_ok=True) path = os.path.join(out_dir, f"article_{uuid.uuid4().hex[:8]}.png") cv2.imwrite(path, cv2.cvtColor(crop, cv2.COLOR_RGB2BGR)) @@ -13,7 +20,7 @@ def crop_figures(page_image, article, out_dir): paths = [] for b in article["blocks"]: if b["type"] == "Figure": - paths.append(crop_article(page_image, _xywh(b["bbox"]), out_dir)) + paths.append(crop_article(page_image, _xywh(b["bbox"]), out_dir, pad=5)) return paths def _xywh(box):