| | --- |
| | tags: |
| | - object-detection |
| | - callout-detection |
| | - architectural-drawings |
| | - wrapper |
| | library_name: custom |
| | task: object-detection |
| | license: apache-2.0 |
| | --- |
| | |
| | # LearningStudio Callout Detection Wrapper |
| |
|
| | Wrapper for the Lambda-based callout detection pipeline, providing EMCO-compatible API format for LearningStudio integration. |
| |
|
| | ## Overview |
| |
|
| | This wrapper: |
| | 1. Accepts image input in multiple formats (URL, base64, data URL) |
| | 2. Gets a presigned S3 URL from API Gateway |
| | 3. Uploads the image directly to S3 (avoids API Gateway data transfer costs) |
| | 4. Starts the detection job via API Gateway (small JSON payload) |
| | 5. Polls for completion |
| | 6. Transforms results to EMCO-compatible format |
| |
|
| | ## Architecture |
| |
|
| | ``` |
| | HF Wrapper |
| | β |
| | ββ1ββΆ GET /upload-url (get presigned S3 URL) |
| | β |
| | ββ2ββΆ PUT image directly to S3 (free, bypasses API Gateway) |
| | β |
| | ββ3ββΆ POST /detect {"job_id", "s3_url"} (tiny payload) |
| | β |
| | ββ4ββΆ GET /status/{job_id} (poll until complete) |
| | ``` |
| |
|
| | ## API Format |
| |
|
| | ### Input |
| |
|
| | Accepts images in multiple formats: |
| |
|
| | ```json |
| | // HTTP URL |
| | {"inputs": "https://example.com/image.jpg"} |
| | |
| | // Data URL (base64 encoded) |
| | {"inputs": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA..."} |
| | |
| | // Raw base64 |
| | {"inputs": "iVBORw0KGgoAAAANSUhEUgAAAAUA..."} |
| | ``` |
| |
|
| | ### Output |
| |
|
| | Returns EMCO-compatible format: |
| |
|
| | ```json |
| | { |
| | "predictions": [ |
| | { |
| | "id": 1, |
| | "label": "callout", |
| | "class_id": 0, |
| | "confidence": 0.95, |
| | "bbox": { |
| | "x1": 100, |
| | "y1": 200, |
| | "x2": 300, |
| | "y2": 400 |
| | } |
| | } |
| | ], |
| | "total_detections": 1, |
| | "image": "base64_encoded_image", |
| | "image_width": 1920, |
| | "image_height": 1080 |
| | } |
| | ``` |
| |
|
| | ### Bounding Box Format |
| |
|
| | - **Input from Lambda**: `[x, y, width, height]` (xywh format) |
| | - **Output to LearningStudio**: `{"x1", "y1", "x2", "y2"}` (xyxy format) |
| |
|
| | The wrapper automatically converts between these formats. |
| |
|
| | ## Configuration |
| |
|
| | This endpoint requires the following secrets to be configured in HuggingFace Inference Endpoint settings: |
| |
|
| | | Secret | Description | |
| | |--------|-------------| |
| | | `API_GATEWAY_URL` | Full URL of the API Gateway endpoint (e.g., `https://xxx.execute-api.us-east-1.amazonaws.com/dev`) | |
| | | `API_KEY` | API key for authentication | |
| |
|
| | ## Usage |
| |
|
| | ### Python |
| |
|
| | ```python |
| | import requests |
| | |
| | HF_ENDPOINT = "https://your-endpoint.endpoints.huggingface.cloud" |
| | HF_TOKEN = "your-hf-token" |
| | |
| | response = requests.post( |
| | HF_ENDPOINT, |
| | headers={"Authorization": f"Bearer {HF_TOKEN}"}, |
| | json={"inputs": "https://example.com/architectural-drawing.png"} |
| | ) |
| | |
| | result = response.json() |
| | print(f"Found {result['total_detections']} callouts") |
| | for pred in result["predictions"]: |
| | print(f" Callout {pred['id']}: {pred['bbox']}, confidence={pred['confidence']}") |
| | ``` |
| |
|
| | ### cURL |
| |
|
| | ```bash |
| | curl -X POST https://your-endpoint.endpoints.huggingface.cloud \ |
| | -H "Authorization: Bearer $HF_TOKEN" \ |
| | -H "Content-Type: application/json" \ |
| | -d '{"inputs": "https://example.com/architectural-drawing.png"}' |
| | ``` |
| |
|
| | ## Processing Time |
| |
|
| | Typical processing time is 30-120 seconds depending on image size and complexity. The wrapper polls the backend every 5 seconds with a maximum timeout of 15 minutes. |
| |
|
| | ## Error Handling |
| |
|
| | Errors are returned in a consistent format: |
| |
|
| | ```json |
| | { |
| | "error": "Description of the error", |
| | "predictions": [], |
| | "total_detections": 0, |
| | "image": "" |
| | } |
| | ``` |
| |
|
| | ## License |
| |
|
| | Apache 2.0 |
| |
|