Chuyển đến nội dung chính

第 9 課:自動縮放設計 — 根據襯衫尺寸和形狀智慧調整尺寸

變更尺寸 (S→XL) 和形狀(修身 → 超大)時的自動縮放設計演算法。內容感知縮放使設計保持比例。根據列印區域動態DPI調整。

🧠 人工智慧與機器學習 — 第 8 課 第 9 課:自動縮放設計 — 調整資訊大小 請遵循襯衫的尺寸和款式

人工智慧在行動:建構時尚和按需印刷的人工智慧平台

第 3 部分:AI 設計優化與編輯

亞洲開發網

簡介

當使用者選擇 S 號襯衫,然後將其更改為 XL 號,或從修身版更改為超大號時,設計必須自我調整。這不是簡單的比例問題,而是你必須了解上下文:如果設計有文字,文字必須仍然可讀,全正面設計必須相應擴大,左胸印花必須保持小比例。


1. 尺寸與形狀資料模型

@dataclass
class GarmentSpec:
    size: str              # XS, S, M, L, XL, 2XL, 3XL
    form: str              # slim, regular, oversize
    chest_width_cm: float  # Rộng ngực
    body_length_cm: float  # Dài thân áo

GARMENT_SPECS = {
    # Size → Form → Measurements
    ("S", "slim"):     GarmentSpec("S", "slim", 46, 68),
    ("S", "regular"):  GarmentSpec("S", "regular", 48, 70),
    ("M", "slim"):     GarmentSpec("M", "slim", 49, 71),
    ("M", "regular"):  GarmentSpec("M", "regular", 51, 72),
    ("M", "oversize"): GarmentSpec("M", "oversize", 56, 74),
    ("L", "regular"):  GarmentSpec("L", "regular", 54, 74),
    ("L", "oversize"): GarmentSpec("L", "oversize", 59, 76),
    ("XL", "regular"): GarmentSpec("XL", "regular", 57, 76),
    ("XL", "oversize"):GarmentSpec("XL", "oversize", 62, 78),
    ("2XL", "regular"):GarmentSpec("2XL", "regular", 60, 78),
    ("2XL", "oversize"):GarmentSpec("2XL", "oversize", 65, 80),
}

2. 擴充引擎

class DesignScaler:
    """Auto-scale design theo size và form áo"""

    def scale_for_garment(
        self,
        design: Image.Image,
        print_zone: str,
        from_spec: GarmentSpec,
        to_spec: GarmentSpec,
    ) -> Image.Image:
        # Tính scale ratio
        ratio = self._calculate_scale_ratio(
            print_zone, from_spec, to_spec
        )

        if abs(ratio - 1.0) < 0.02:
            return design  # Không cần scale

        # Scale với anti-aliasing
        new_width = int(design.width * ratio)
        new_height = int(design.height * ratio)

        scaled = design.resize(
            (new_width, new_height),
            Image.Resampling.LANCZOS
        )

        # Verify quality after scaling
        if ratio > 1.3:  # Scale lên > 30%
            scaled = self._upscale_ai(scaled)  # Real-ESRGAN

        return scaled

    def _calculate_scale_ratio(
        self,
        print_zone: str,
        from_spec: GarmentSpec,
        to_spec: GarmentSpec,
    ) -> float:
        if print_zone == "left_chest":
            # Left chest: giữ nguyên kích thước tuyệt đối
            return 1.0

        elif print_zone == "front_chest":
            # Front chest: scale theo tỷ lệ ngực
            return to_spec.chest_width_cm / from_spec.chest_width_cm

        elif print_zone == "full_front":
            # Full front: scale theo cả width VÀ height
            width_ratio = to_spec.chest_width_cm / from_spec.chest_width_cm
            height_ratio = to_spec.body_length_cm / from_spec.body_length_cm
            return (width_ratio + height_ratio) / 2

        elif print_zone == "back_print":
            return to_spec.chest_width_cm / from_spec.chest_width_cm

        return 1.0

3. 內容感知縮放

class ContentAwareScaler:
    """Scale thông minh — giữ text readable, giữ tỷ lệ quan trọng"""

    def smart_scale(
        self,
        design: Image.Image,
        scale_ratio: float,
    ) -> Image.Image:
        # Detect content type
        has_text = self._detect_text(design)
        has_faces = self._detect_faces(design)

        if has_text and scale_ratio < 0.7:
            # Text sẽ quá nhỏ → cảnh báo
            return self._scale_with_text_preservation(
                design, scale_ratio
            )

        if has_faces and scale_ratio != 1.0:
            # Faces cần giữ tỷ lệ chính xác
            return self._scale_face_aware(design, scale_ratio)

        # Standard scaling
        return self._standard_scale(design, scale_ratio)

    def _scale_with_text_preservation(
        self,
        design: Image.Image,
        ratio: float,
    ) -> Image.Image:
        """
        Khi scale nhỏ lại, text có thể không đọc được.
        Strategy: scale graphics nhưng giữ text size minimum.
        """
        # Separate text layer và graphics layer
        text_mask = self._segment_text(design)
        graphics = self._remove_text(design, text_mask)

        # Scale graphics theo ratio
        scaled_graphics = graphics.resize(
            (int(graphics.width * ratio),
             int(graphics.height * ratio)),
            Image.Resampling.LANCZOS,
        )

        # Text: scale nhưng enforce minimum size
        min_text_ratio = max(ratio, 0.8)
        scaled_text = self._scale_text_layer(
            design, text_mask, min_text_ratio
        )

        # Composite
        return self._composite(scaled_graphics, scaled_text)

4.DPI管理

class DPIManager:
    """Quản lý DPI khi scale design"""

    MIN_PRINT_DPI = 150
    OPTIMAL_PRINT_DPI = 300

    def calculate_effective_dpi(
        self,
        design: Image.Image,
        print_zone: PrintZone,
    ) -> float:
        """Tính DPI thực tế khi in"""
        # DPI = pixels / inches
        print_width_inches = print_zone.width_cm / 2.54
        effective_dpi = design.width / print_width_inches
        return round(effective_dpi, 1)

    def needs_upscale(
        self,
        design: Image.Image,
        print_zone: PrintZone,
    ) -> bool:
        dpi = self.calculate_effective_dpi(design, print_zone)
        return dpi < self.MIN_PRINT_DPI

    def upscale_for_print(
        self,
        design: Image.Image,
        target_dpi: int = 300,
        print_zone: PrintZone = None,
    ) -> Image.Image:
        """Upscale design để đạt target DPI"""
        current_dpi = self.calculate_effective_dpi(design, print_zone)
        if current_dpi >= target_dpi:
            return design

        scale = target_dpi / current_dpi

        if scale <= 2.0:
            # Lanczos đủ tốt cho scale <= 2x
            return design.resize(
                (int(design.width * scale),
                 int(design.height * scale)),
                Image.Resampling.LANCZOS,
            )
        else:
            # Cần AI upscaling (Real-ESRGAN)
            return self._ai_upscale(design, scale)

總結

自動縮放系統:

  1. 服裝規格 — 每個尺寸/款式的準確模型數據
  2. 縮放比例 — 每個列印區域的不同計算
  3. 內容感知 — 縮放時保持文字可讀、臉部比例
  4. DPI管理 — 當DPI不足以列印時自動放大

下一篇文章:人工智慧編輯助手 — 使用自然語言編輯設計。