Segmentation QA
Image Segmentation Testing Strategy QA Evaluation Metrics IoU mIoU Dice Coefficient Test Dataset Edge Cases CI/CD Pipeline U-Net DeepLab Mask R-CNN Production
| Metric | Formula | Range | Good Score | ใช้กับ |
|---|---|---|---|---|
| IoU | TP / (TP+FP+FN) | 0-1 | > 0.7 | ทุก Segmentation |
| mIoU | Mean IoU all classes | 0-1 | > 0.6 | Multi-class |
| Dice | 2*TP / (2*TP+FP+FN) | 0-1 | > 0.8 | Medical Imaging |
| Pixel Acc | Correct / Total pixels | 0-100% | > 90% | Quick check |
| Boundary F1 | F1 at boundary pixels | 0-1 | > 0.6 | Edge quality |
| PQ | SQ * RQ | 0-1 | > 0.5 | Panoptic |
Evaluation Code
# === Image Segmentation Evaluation ===
# pip install numpy scikit-image torch torchvision
import numpy as np
from dataclasses import dataclass
def calculate_iou(pred, target, num_classes):
ious = []
for cls in range(num_classes):
pred_mask = (pred == cls)
target_mask = (target == cls)
intersection = np.logical_and(pred_mask, target_mask).sum()
union = np.logical_or(pred_mask, target_mask).sum()
if union == 0:
ious.append(float('nan'))
else:
ious.append(intersection / union)
return ious
def calculate_dice(pred, target, num_classes):
dices = []
for cls in range(num_classes):
pred_mask = (pred == cls)
target_mask = (target == cls)
intersection = np.logical_and(pred_mask, target_mask).sum()
total = pred_mask.sum() + target_mask.sum()
if total == 0:
dices.append(float('nan'))
else:
dices.append(2 * intersection / total)
return dices
def pixel_accuracy(pred, target):
correct = (pred == target).sum()
total = pred.size
return correct / total
# Simulate evaluation
np.random.seed(42)
num_classes = 5
classes = ["Background", "Person", "Car", "Road", "Tree"]
# Mock results
mock_ious = [0.92, 0.78, 0.71, 0.85, 0.68]
mock_dices = [0.96, 0.88, 0.83, 0.92, 0.81]
mock_pixel_acc = 0.934
print("=== Segmentation Evaluation Results ===")
print(f" Pixel Accuracy: {mock_pixel_acc:.1%}")
print(f" mIoU: {np.nanmean(mock_ious):.4f}")
print(f" Mean Dice: {np.nanmean(mock_dices):.4f}")
print(f"\n Per-class IoU / Dice:")
for i, cls in enumerate(classes):
print(f" [{cls}] IoU: {mock_ious[i]:.4f} | Dice: {mock_dices[i]:.4f}")
Edge Case Testing
# === Edge Case Test Suite ===
@dataclass
class EdgeCaseTest:
case_name: str
description: str
num_samples: int
miou_result: float
status: str
action: str
edge_cases = [
EdgeCaseTest("Normal", "Standard lighting clear objects", 500, 0.79, "PASS", "Baseline"),
EdgeCaseTest("Low Light", "Dark indoor/night scenes", 100, 0.62, "WARN", "Add augmentation"),
EdgeCaseTest("Overexposure", "Bright glare blown highlights", 80, 0.65, "WARN", "HDR augmentation"),
EdgeCaseTest("Occlusion", "Partially hidden objects", 120, 0.58, "FAIL", "More training data"),
EdgeCaseTest("Small Objects", "Objects < 32x32 pixels", 150, 0.45, "FAIL", "Multi-scale features"),
EdgeCaseTest("Overlapping", "Stacked/touching objects", 90, 0.55, "FAIL", "Instance segmentation"),
EdgeCaseTest("Complex BG", "Cluttered background", 100, 0.68, "WARN", "Context module"),
EdgeCaseTest("Motion Blur", "Moving camera/objects", 60, 0.61, "WARN", "Blur augmentation"),
EdgeCaseTest("Rain/Fog", "Weather conditions", 80, 0.54, "FAIL", "Weather augmentation"),
]
print("=== Edge Case Results ===")
passed = sum(1 for e in edge_cases if e.status == "PASS")
warned = sum(1 for e in edge_cases if e.status == "WARN")
failed = sum(1 for e in edge_cases if e.status == "FAIL")
print(f" Summary: {passed} PASS | {warned} WARN | {failed} FAIL\n")
for e in edge_cases:
print(f" [{e.status}] {e.case_name} (n={e.num_samples})")
print(f" {e.description}")
print(f" mIoU: {e.miou_result:.2f} | Action: {e.action}")
# Augmentation strategies for failed cases
augmentations = {
"Low Light": "RandomBrightnessContrast(brightness_limit=(-0.4, 0), p=0.3)",
"Overexposure": "RandomBrightnessContrast(brightness_limit=(0, 0.4), p=0.3)",
"Occlusion": "CoarseDropout(max_holes=8, max_height=64, max_width=64, p=0.3)",
"Motion Blur": "MotionBlur(blur_limit=7, p=0.3)",
"Rain/Fog": "RandomFog(fog_coef_lower=0.1, fog_coef_upper=0.3, p=0.2)",
"Scale": "RandomScale(scale_limit=(-0.5, 0.5), p=0.3)",
}
print(f"\n\nAugmentation Strategies:")
for k, v in augmentations.items():
print(f" [{k}]: {v}")
CI/CD Pipeline
# === CI/CD for Model Testing ===
# GitHub Actions Pipeline
# name: Segmentation Model QA
# on: [push, pull_request]
# jobs:
# test:
# runs-on: ubuntu-latest
# steps:
# - uses: actions/checkout@v4
# - name: Setup Python
# uses: actions/setup-python@v5
# with: {python-version: '3.11'}
# - name: Install deps
# run: pip install -r requirements.txt
# - name: Run unit tests
# run: pytest tests/test_metrics.py -v
# - name: Run model evaluation
# run: python evaluate.py --model best.pth --test-dir data/test/
# - name: Check mIoU threshold
# run: |
# MIOU=$(python evaluate.py --model best.pth --metric miou)
# if (( $(echo "$MIOU < 0.65" | bc -l) )); then
# echo "FAIL: mIoU $MIOU < 0.65 threshold"
# exit 1
# fi
@dataclass
class QAGate:
gate: str
metric: str
threshold: str
current: str
status: str
gates = [
QAGate("mIoU Overall", "mIoU", "> 0.65", "0.79", "PASS"),
QAGate("mIoU Per-class Min", "Min class IoU", "> 0.50", "0.68", "PASS"),
QAGate("Pixel Accuracy", "Accuracy", "> 90%", "93.4%", "PASS"),
QAGate("Inference Speed", "FPS", "> 30", "42", "PASS"),
QAGate("Model Size", "Parameters", "< 50M", "31M", "PASS"),
QAGate("Edge Case mIoU", "Worst case mIoU", "> 0.45", "0.45", "BORDERLINE"),
QAGate("Memory Usage", "GPU Memory", "< 4GB", "2.8GB", "PASS"),
QAGate("Regression", "mIoU vs previous", "No decrease > 0.02", "+0.01", "PASS"),
]
print("QA Gates:")
for g in gates:
print(f" [{g.status}] {g.gate}: {g.current} (Threshold: {g.threshold})")
release_checklist = {
"All QA gates passed": "mIoU, accuracy, speed, memory",
"Edge case report reviewed": "Action items for FAIL cases documented",
"A/B test plan ready": "Compare new model vs current in production",
"Rollback plan": "Previous model version tagged for quick rollback",
"Monitoring dashboard": "mIoU drift detection, latency alerts",
"Documentation updated": "Model card, changelog, known limitations",
}
print(f"\n\nRelease Checklist:")
for k, v in release_checklist.items():
print(f" [{k}]: {v}")
เคล็ดลับ
- mIoU: ใช้ mIoU เป็น Primary Metric ดีกว่า Pixel Accuracy
- Edge Cases: ทดสอบ Edge Cases แยกกันดูจุดอ่อน Model
- Augmentation: เพิ่ม Augmentation สำหรับ Case ที่ Fail
- CI/CD: ตั้ง QA Gate ใน Pipeline ไม่ Deploy ถ้า mIoU ต่ำ
- Regression: เปรียบเทียบกับ Model เดิมทุกครั้งป้องกัน Regression
การนำความรู้ไปประยุกต์ใช้งานจริง
การเรียนรู้เทคโนโลยีใหม่ในปี 2026 ไม่ใช่แค่อ่านทฤษฎีแต่ต้องลงมือทำจริงแนะนำให้สร้าง Lab Environment สำหรับทดลองไม่ว่าจะเป็น Virtual Machine บน VirtualBox/VMware Home Lab ด้วย Raspberry Pi หรือ Cloud Free Tier จาก AWS, GCP, Azure การทำ Side Project ที่ใช้เทคโนโลยีที่เรียนจะช่วยให้เข้าใจลึกซึ้งกว่าแค่อ่านตำรา
สำหรับผู้ที่ต้องการพัฒนาสายอาชีพควรศึกษา Certification ที่เกี่ยวข้องเช่น AWS Solutions Architect, CompTIA, CCNA, CKA เป็นต้นใบ Cert ช่วยยืนยันความรู้และเพิ่มมูลค่าในตลาดแรงงานเงินเดือนเฉลี่ยสำหรับผู้มี Certification สูงกว่าผู้ไม่มีประมาณ 20-40%
แหล่งเรียนรู้ที่แนะนำได้แก่ Official Documentation ที่อัพเดทล่าสุดเสมอ Online Course จาก Coursera Udemy edX ช่อง YouTube คุณภาพทั้งไทยและอังกฤษและ Community อย่าง Discord Reddit Stack Overflow ที่ช่วยแลกเปลี่ยนประสบการณ์กับนักพัฒนาทั่วโลก
เคล็ดลับจากประสบการณ์จริง
จากประสบการณ์ทำงานด้าน IT มากว่า 25 ปีสิ่งที่ผมอยากแนะนำคืออย่าหยุดเรียนรู้เทคโนโลยีเปลี่ยนแปลงตลอดเวลาสิ่งที่เป็นมาตรฐานวันนี้อาจล้าสมัยในอีก 2-3 ปีจัดสรรเวลาอย่างน้อย 1 ชั่วโมงต่อวันสำหรับเรียนรู้สิ่งใหม่
การ Document ทุกอย่างที่ทำเป็นนิสัยที่ดีไม่ว่าจะเป็นการตั้งค่าระบบการแก้ปัญหาหรือ Decision Log ว่าทำไมถึงเลือกใช้เทคโนโลยีนี้เมื่อมีปัญหาในอนาคต Documentation จะช่วยให้ย้อนกลับมาดูได้ทันทีไม่ต้องเสียเวลาค้นหาใหม่
เปรียบเทียบข้อดีและข้อเสีย
จากตารางเปรียบเทียบจะเห็นว่าข้อดีมีมากกว่าข้อเสียอย่างชัดเจนโดยเฉพาะในแง่ของประสิทธิภาพและความสามารถในการ Scale สำหรับข้อเสียส่วนใหญ่สามารถแก้ไขได้ด้วยการเรียนรู้อย่างเป็นระบบและวางแผนทรัพยากรให้เหมาะสม
Image Segmentation คืออะไร
แบ่งภาพตาม Pixel Label Class Semantic Instance Panoptic U-Net DeepLab Mask R-CNN Segment Anything คนรถถนนต้นไม้
ใช้ Metric อะไรวัดผล
IoU Overlap Predicted Ground Truth mIoU เฉลี่ยทุก Class Dice Medical Pixel Accuracy Boundary F1 ขอบ PQ Panoptic
ออกแบบ Test Dataset อย่างไร
Train Validation Test 70:15:15 Edge Cases ซ้อนแสง Blur เล็ก Stratified Split LabelMe CVAT Annotation Quality Cross-validation
ทดสอบ Edge Cases อย่างไร
Test Suite Low Light Overexposure Occlusion Small Objects Overlapping Complex BG Motion Blur Rain Fog Augmentation วัด Metric แยก
สรุป
Image Segmentation Testing Strategy QA IoU mIoU Dice Pixel Accuracy Edge Cases Augmentation CI/CD Pipeline QA Gate Regression Model Evaluation Production
