APAC Computer Vision in Production: From Model to Deployed Inference
APAC organizations deploying computer vision face three distinct challenges depending on their team's technical maturity: training accurate models on domain-specific data, deploying trained models reliably at production scale, and enabling domain experts without ML backgrounds to build inspection systems. This guide covers three tools addressing each layer of the APAC CV deployment problem.
Ultralytics YOLO — the most widely used real-time CV framework for APAC ML teams, providing training, fine-tuning, and multi-format export for detection, segmentation, pose, and classification tasks.
LandingAI — no-code visual inspection platform for APAC manufacturing engineers, enabling defect detection model building with active learning using minimal labeled images and no ML expertise.
Roboflow Inference — open-source computer vision model serving engine that deploys YOLO, GroundingDINO, and SAM2 as Docker APIs with one command for APAC edge and cloud deployment.
APAC Computer Vision Tool Selection
APAC Team Profile → Tool → Why
APAC ML team, custom CV model → Ultralytics YOLO State-of-the-art detection;
(object detection + segmentation) → fine-tuning; multi-format export
APAC factory team, no ML expertise → LandingAI No-code; active learning;
(defect detection, QA inspection) → domain expert accessible
APAC eng team, model serving layer → Roboflow Inference Docker API; YOLO + SAM2 +
(deploy trained models as API) → GroundingDINO; open-source
APAC team, dataset + model managed → Roboflow (platform) Annotation + training + deploy;
(end-to-end without custom ML code) → YOLO export; community models
APAC team, annotation first → Encord / Label Studio Active learning annotation;
(active learning prioritization) → feed into Ultralytics training
APAC Computer Vision Production Stack:
Data: Roboflow / Label Studio (annotation)
Training: Ultralytics YOLO (fine-tune on domain data)
Serving: Roboflow Inference (Docker API at edge/cloud)
No-code alt: LandingAI (replaces all three for factory inspection)
Ultralytics YOLO: APAC Model Training and Export
Ultralytics APAC fine-tuning on custom dataset
# APAC: Ultralytics YOLO — fine-tune on APAC manufacturing defect dataset
from ultralytics import YOLO
# APAC: Load pre-trained YOLO11 model (COCO-pretrained checkpoint)
apac_model = YOLO("yolo11m.pt") # APAC: medium variant — balance of speed and accuracy
# APAC: Fine-tune on custom APAC defect dataset
# Dataset structure: data/apac-pcb-defects/
# images/train/, images/val/
# labels/train/, labels/val/ (YOLO format .txt files)
# dataset.yaml (class definitions)
apac_results = apac_model.train(
data="data/apac-pcb-defects/dataset.yaml",
epochs=100,
imgsz=640, # APAC: 640px input resolution (standard for YOLO)
batch=16, # APAC: adjust for GPU VRAM (16 for RTX 3090, 8 for T4)
device=0, # APAC: GPU 0; use 'cpu' for CPU training
project="apac-pcb-defect-detector",
name="yolo11m-pcb-v1",
patience=20, # APAC: stop early if no improvement for 20 epochs
lr0=0.01, # APAC: initial learning rate
warmup_epochs=3, # APAC: gradual LR warmup for fine-tuning stability
# APAC: Data augmentation for small APAC defect dataset
augment=True,
degrees=5.0, # APAC: slight rotation (PCB orientation variance)
flipud=0.1,
fliplr=0.5,
mosaic=0.8, # APAC: mosaic augmentation for variety
)
print(f"APAC: Training complete")
print(f"APAC: Best mAP50: {apac_results.results_dict['metrics/mAP50(B)']:.4f}")
print(f"APAC: Best mAP50-95: {apac_results.results_dict['metrics/mAP50-95(B)']:.4f}")
# APAC: Output:
# Best mAP50: 0.9124
# Best mAP50-95: 0.7831
# APAC: Trained model saved: apac-pcb-defect-detector/yolo11m-pcb-v1/weights/best.pt
Ultralytics APAC multi-format export for deployment
# APAC: Ultralytics — export trained model to deployment formats
apac_trained = YOLO("apac-pcb-defect-detector/yolo11m-pcb-v1/weights/best.pt")
# APAC: Export to TensorRT for NVIDIA edge GPU (2-4x faster than PyTorch)
apac_trained.export(
format="engine", # APAC: TensorRT .engine format
device=0, # APAC: must export on the target GPU architecture
half=True, # APAC: FP16 for 2x speed with minimal accuracy loss
simplify=True, # APAC: simplify ONNX graph before TRT compilation
workspace=4, # APAC: max 4GB GPU memory for TRT optimization
)
# APAC: Output: best.engine (deploy to NVIDIA Jetson Orin / RTX production server)
# APAC: Export to ONNX for framework-agnostic deployment
apac_trained.export(
format="onnx",
imgsz=640,
half=False, # APAC: FP32 ONNX for CPU edge deployment
simplify=True,
opset=17, # APAC: ONNX opset 17 for broad runtime support
)
# APAC: Output: best.onnx (deploy to any ONNX runtime: Windows/Linux/embedded)
# APAC: Export to TFLite for Android/embedded deployment
apac_trained.export(format="tflite", imgsz=320, int8=True)
# APAC: int8 quantization for 4x size reduction with ~3% accuracy drop
# APAC: Output: best_int8.tflite (deploy to Android mobile QA scanners)
print("APAC: Models exported for: Jetson edge (TRT), server (ONNX), mobile (TFLite)")
Ultralytics APAC production inference
# APAC: Ultralytics — production inference on APAC factory camera feed
import cv2
from ultralytics import YOLO
# APAC: Load TensorRT model for production (fastest inference)
apac_inspector = YOLO("best.engine") # APAC: TRT model, runs on NVIDIA GPU only
# APAC: Define defect class names (from dataset.yaml)
APAC_DEFECT_CLASSES = {
0: "solder_bridge",
1: "missing_component",
2: "lifted_lead",
3: "insufficient_solder",
4: "tombstone",
}
# APAC: Process factory camera stream
apac_camera = cv2.VideoCapture("rtsp://apac-factory-camera-01/stream")
while True:
apac_ret, apac_frame = apac_camera.read()
if not apac_ret:
break
# APAC: Run inference (TensorRT ~8ms at 640px on RTX 3090)
apac_results = apac_inspector.predict(
apac_frame,
conf=0.65, # APAC: 65% confidence threshold for production
iou=0.45, # APAC: NMS IoU threshold
verbose=False,
)
# APAC: Process detections
for apac_box in apac_results[0].boxes:
apac_class_id = int(apac_box.cls)
apac_conf = float(apac_box.conf)
apac_defect = APAC_DEFECT_CLASSES[apac_class_id]
if apac_conf >= 0.80:
# APAC: High confidence — trigger automated reject path
apac_trigger_reject(apac_defect, apac_conf)
elif apac_conf >= 0.65:
# APAC: Medium confidence — route to human QA review
apac_route_to_human_review(apac_defect, apac_conf, apac_frame)
apac_camera.release()
LandingAI: APAC No-Code Visual Inspection
LandingAI APAC model building workflow
APAC: LandingAI LandingLens visual inspection setup for APAC food manufacturer
Context: APAC snack factory needs AI inspection for 3 defect types:
- Foreign material contamination (debris in packaging)
- Weight underfill (package appears deflated)
- Seal integrity failure (improperly sealed edges)
No ML team available — only quality engineers and production supervisors.
Step 1: Project creation (10 minutes)
→ Create LandingLens project: "APAC Snack QC Inspection"
→ Upload 50 initial images from APAC factory line camera (mix of pass + fail)
→ No special format required — JPEG/PNG from any camera
Step 2: Initial labeling (60 minutes)
→ Quality engineer labels: draw bounding boxes on each defect type
→ LandingAI suggests: "Label 30 more 'seal_failure' images for better coverage"
→ Active learning guides which images to label next
Step 3: First model training (automated, 15 minutes)
→ Click "Train" → LandingAI trains internally
→ Initial results: foreign_material 91% AP, underfill 78% AP, seal_failure 64% AP
→ LandingAI surfaces 20 images seal_failure model is uncertain about
→ Quality engineer labels the 20 uncertain images
Step 4: Iteration 2 (45 minutes labeling)
→ Retrain → seal_failure improves to 84% AP
→ All three defects exceed 80% AP threshold
→ Quality manager approves for production trial
Step 5: Edge deployment (2 hours, IT team)
→ LandingAI exports model as Docker container for APAC edge device
→ Connects to GigE industrial camera on production line
→ Rejection signal wired to existing SCADA reject mechanism
→ No cloud connectivity required during production
Total time from start to production: 2 weeks (vs 6+ months with ML team)
Total images labeled: 180 (vs thousands for traditional supervised approach)
LandingAI APAC visual prompting
# APAC: LandingAI Visual Prompting — zero-shot detection via API
import requests
import base64
import os
LANDING_AI_API_KEY = os.environ["LANDING_AI_API_KEY"]
def apac_visual_prompt_detect(
apac_image_path: str,
apac_prompts: list[dict],
) -> dict:
"""APAC: Detect objects using visual prompts (reference images + labels)."""
with open(apac_image_path, "rb") as apac_img_file:
apac_img_b64 = base64.b64encode(apac_img_file.read()).decode()
apac_response = requests.post(
"https://api.landing.ai/v1/predict",
headers={"apikey": LANDING_AI_API_KEY},
json={
"image": apac_img_b64,
"prompts": apac_prompts, # APAC: visual + text prompts defining what to detect
},
)
return apac_response.json()
# APAC: Define inspection criteria via visual examples + text labels
apac_inspection_prompts = [
{
"label": "surface_scratch",
"text": "A scratch or linear mark on the product surface, at least 1mm in length",
"positive_examples": ["examples/scratch_01.jpg", "examples/scratch_02.jpg"],
"negative_examples": ["examples/clean_surface_01.jpg"],
},
{
"label": "color_defect",
"text": "Discoloration or uneven color distribution on the product surface",
"positive_examples": ["examples/color_defect_01.jpg"],
"negative_examples": ["examples/good_color_01.jpg"],
},
]
# APAC: Inspect new product image
apac_result = apac_visual_prompt_detect(
apac_image_path="production/item_20260603_142301.jpg",
apac_prompts=apac_inspection_prompts,
)
print(f"APAC: Defects detected: {len(apac_result['predictions'])}")
for apac_pred in apac_result["predictions"]:
print(f" {apac_pred['label']}: confidence={apac_pred['score']:.2f}")
Roboflow Inference: APAC CV Model Serving
Roboflow Inference APAC deployment
# APAC: Roboflow Inference — deploy CV model serving in one command
# APAC: Install Roboflow Inference (Python package)
pip install inference
# APAC: Start inference server (Docker container with all models)
inference server start --port 9001
# APAC: Or run directly with GPU support
docker run -it --gpus all \
-p 9001:9001 \
roboflow/roboflow-inference-server-gpu:latest
# APAC: Inference server now running at http://localhost:9001
# APAC: Available endpoints:
# POST /infer/object_detection/{model_id}
# POST /infer/instance_segmentation/{model_id}
# POST /infer/classification/{model_id}
# POST /infer/grounding_dino/{model_id} ← zero-shot detection
# POST /sam2/{model_id}/infer ← interactive segmentation
Roboflow Inference APAC Python client integration
# APAC: Roboflow Inference — call deployed CV model from APAC application
from inference_sdk import InferenceHTTPClient
import cv2
import numpy as np
# APAC: Initialize client pointing to local or APAC cloud inference server
apac_cv_client = InferenceHTTPClient(
api_url="http://apac-edge-server-01:9001", # APAC: edge server in factory
api_key=os.environ["ROBOFLOW_API_KEY"],
)
# APAC: Run PCB defect detection (custom YOLO model deployed on server)
def apac_inspect_pcb(apac_image: np.ndarray) -> list[dict]:
"""APAC: Run PCB defect inspection via Roboflow Inference API."""
apac_result = apac_cv_client.infer(
inference_input=apac_image,
model_id="apac-pcb-defects/3", # APAC: model_id/version from Roboflow
)
apac_defects = []
for apac_pred in apac_result["predictions"]:
apac_defects.append({
"class": apac_pred["class"],
"confidence": apac_pred["confidence"],
"x": apac_pred["x"], "y": apac_pred["y"],
"w": apac_pred["width"], "h": apac_pred["height"],
})
return apac_defects
# APAC: Run GroundingDINO zero-shot detection (no training required)
def apac_grounding_detect(apac_image: np.ndarray, apac_query: str) -> list[dict]:
"""APAC: Open-vocabulary detection via GroundingDINO text prompt."""
apac_result = apac_cv_client.run_workflow(
workspace_name="apac-team",
workflow_id="grounding-dino-detect",
images={"image": apac_image},
parameters={"text_prompt": apac_query},
)
return apac_result["predictions"]
# APAC: Detect workers without hard hats (text prompt, zero training needed)
apac_frame = cv2.imread("factory_floor_snapshot.jpg")
apac_violations = apac_grounding_detect(
apac_image=apac_frame,
apac_query="person not wearing hard hat . worker without safety helmet",
)
print(f"APAC: Safety violations detected: {len(apac_violations)}")
Roboflow Inference APAC Workflows pipeline
# APAC: Roboflow Inference Workflows — chain detection + segmentation + classification
# APAC: Define multi-stage CV pipeline in Roboflow UI, then execute via API
apac_workflow_result = apac_cv_client.run_workflow(
workspace_name="apac-quality-team",
workflow_id="apac-pcb-full-inspection",
images={"input_image": apac_pcb_image},
)
# APAC: Workflow chain (defined in Roboflow UI):
# 1. YOLOv11 defect detector → finds suspect regions
# 2. SAM2 segmentation → precise mask for each suspect region
# 3. ResNet classifier → classify defect type from cropped region
# 4. Aggregator → combines all results into single response
print("APAC: Full inspection results:")
for apac_region in apac_workflow_result["inspection_results"]:
print(
f" Region ({apac_region['x']:.0f},{apac_region['y']:.0f}): "
f"defect={apac_region['class']}, "
f"mask_area={apac_region['mask_area_px']:.0f}px², "
f"confidence={apac_region['confidence']:.2f}"
)
APAC Computer Vision Deployment Cost Comparison
Use case: APAC PCB defect detection, 3 shifts × 1,000 boards/shift = 3,000 boards/day
Option A: Ultralytics YOLO + custom serving (internal ML team)
Training: 2 months ML engineer × SGD 12,000/month = SGD 24,000
Infrastructure: 1× NVIDIA T4 GPU server = SGD 8,000/year
Model: YOLOv11m, 8ms/frame on T4, handles 3,000 boards/day at 30 FPS
Ongoing: 0.5 FTE ML engineer for maintenance = SGD 72,000/year
Total Year 1: SGD ~104,000
Option B: Ultralytics + Roboflow Inference (engineer-friendly stack)
Training: 3 weeks ML engineer × SGD 12,000/month = SGD 9,000
Roboflow Inference: open-source, edge server SGD 6,000/year
Ongoing: 0.2 FTE = SGD 28,800/year
Total Year 1: SGD ~44,000 (57% cheaper than Option A)
Option C: LandingAI (no-code, domain expert-led)
Implementation: 2 weeks quality engineer × SGD 6,000/month = SGD 3,000
LandingAI license: ~SGD 24,000/year
Ongoing: 0.1 FTE quality engineer = SGD 7,200/year
Total Year 1: SGD ~34,200 (67% cheaper than Option A)
APAC decision guide:
Custom objects + high accuracy + own team → Ultralytics + Roboflow Inference
Standard defects + no ML team + speed to deploy → LandingAI
Both? → LandingAI for proof-of-concept, migrate to Ultralytics at scale
Related APAC Computer Vision Resources
For the data annotation platforms (Encord, SuperAnnotate, V7 Labs) that produce the labeled datasets used to fine-tune Ultralytics YOLO models — including active learning prioritization for which images to annotate next — see the APAC data-centric AI guide and the APAC enterprise data labeling guide.
For the ML model serving platforms (Triton Inference Server, Ray Serve, BentoML) that serve general ML models at scale — complementing Roboflow Inference's CV-specific serving with general-purpose model serving for APAC teams running mixed CV and NLP inference workloads — see the APAC ML model serving guides in the APAC AI tools catalog.
For the ML model monitoring platforms (Evidently AI, WhyLabs, Arize AI) that detect production drift in computer vision model predictions — identifying when APAC factory line conditions change enough that the CV model's accuracy degrades and retraining is needed — see the APAC AI tools catalog.
Beyond this insight
Cross-reference our practice depth.
If this article matches your stage of thinking, the underlying capabilities ship across all six pillars, ten verticals, and nine Asian markets.