Инженерный блог

Раскрой без брака: Как швейный цех на 12 швей в Алматы экономит 800 000 ₸ на ткани с помощью Gemini 2.5 Flash (Vision) и Cloud Storage

26.08.2026
Шарафутдинов Р.

Алматы, промзона в районе проспекта Райымбека и улицы Сейфуллина. За неприметными железными воротами гудит типичный, но амбициозный швейный цех: двенадцать высококлассных швей за оверлоками Jack и Typical, гигантский шестиметровый раскройный стол, бесконечные рулоны премиального трехниточного футера с начесом из Бурсы и Стамбула, и главный человек на производстве — закройщик Ерлан с тяжелым дисковым ножом наперевес. Цех производит популярные в Казахстане линейки оверсайз-худи, спортивных костюмов и дизайнерской спецодежды, отгружая около 1 800 готовых изделий в месяц.

Однако за красивыми раскладками в Instagram скрывалась суровая производственная боль. Каждый месяц цех списывал в мусорные мешки до 260 метров первоклассной ткани стоимостью 3 800 тенге за метр, теряя почти 1 000 000 ₸ чистыми. Причина была тривиальной, но технологически беспощадной: скрытый текстильный брак.

Когда рулон ткани длиной 80 метров разворачивается и укладывается на стол в 20–30 слоев (так называемый «настил»), человеческий глаз физически не способен заметить микроскопическое масляное пятно от смазки ткацкого станка, выпавшую петлю или затяжку нити утка на 15-м метре пятого слоя. Закройщик накладывает картонные лекала, включает дисковый нож, и партия из 50 полочек худи разрезается за 4 минуты. А через три дня, когда швея тётя Рая заканчивает пришивать карман-кенгуру и собирает изделие на прямострочке, на самом видном месте груди предательски всплывает белое пятно непровяза или масляная точка размером с булавочную головку. Готовое худи летит в мусорку, время швеи потрачено впустую, фурнитура испорчена, а себестоимость оставшейся партии взлетает до небес.

Когда основатели бренда пришли в инженерную лабораторию ОЗАТ с вопросом «Можно ли поставить компьютерное зрение, чтобы наш закройщик не резал бракованную ткань?», мы сразу исключили громоздкие промышленные сканеры за $45 000. Вместо этого мы собрали элегантный, молниеносный и копеечный в обслуживании контур: промышленная 4K-камера над раскройным столом, прямая буферизация кадров в Google Cloud Storage и нейросетевой анализ геометрических дефектов через Gemini 2.5 Flash Vision со Structured Outputs. Система проецирует дефекты прямо на ткань лазерным проектором и динамически перестраивает карту раскроя в режиме реального времени.

1. Анатомия текстильного брака: Где утекают деньги в среднем швейном цехе

В швейном бизнесе ткань составляет от 55% до 70% всей себестоимости готового изделия. При ежемесячном объеме выпуска в 1 800 плотных худи и джоггеров цех расходует порядка 3 600 погонных метров полотна. При средней оптовой цене турецкого полотна пенье в 3 800 ₸ за метр общий бюджет на сырье составляет внушительные 13 680 000 ₸ в месяц.

До внедрения компьютерного зрения уровень брака на производстве держался на средней отметке 7.2% от общего объема кроя. Давайте разложим эти 7.2% на конкретные инженерные и человеческие факторы:

Структура ежемесячных потерь ткани до автоматизации:

  • Масляные точки и смазка оборудования (285 000 ₸ / мес): Капли машинного масла с прядильных фабрик, которые незаметны на темном сухом полотне при тусклом свете цеха, но проявляются при влажно-тепловой обработке (ВТО) и утюжке.
  • Ткацкие пороки, узелки и утолщения нити (310 000 ₸ / мес): Нарушение структуры полотна, из-за которого после первой стирки у клиента расползается дыра. Бракуется на стадии финального контроля качества (ОТК).
  • Перекос нити утка и косина полотна (160 000 ₸ / мес): Полотно раскроено под углом к направлению долевой нити. После первой стирки боковые швы худи скручиваются на живот. Брак обнаруживается уже в виде рекламаций от розничных покупателей.
  • Разнооттеночность полотна в рулоне (120 000 ₸ / мес): Градиентное изменение тона окраски от начала рулона к концу. Рукава получаются темнее спинки.
  • Неоптимальные межлекальные выпады при ручной раскладке (113 000 ₸ / мес): Закройщик закладывает чрезмерные запасы вокруг подозрительных мест, выбрасывая в обрезки полезную площадь ткани.

Суммарные прямые потери составляли 988 000 ₸ каждый месяц. И это без учета косвенных затрат: 12 швей тратили до 40 рабочих часов в месяц на распарывание, перешивку и подгонку деталей из бракованного кроя. Если вы сталкивались с оптимизацией производственных расходов в ритейле или HoReCa, рекомендуем изучить наш материал «Прогнозирование фудкоста и спроса на донеры в BigQuery ML», где мы решали аналогичную задачу минимизации сырьевых списаний.

2. Архитектура решения: 4K-зрение, Cloud Storage и Gemini 2.5 Flash Structured Outputs

Перед инженерной командой ОЗАТ стояла жесткая задача: создать систему, которая работает быстрее, чем закройщик успевает разгладить полотно линейкой. Время между размоткой очередного метра рулона и готовностью карты дефектов не должно было превышать 1 секунды, а стоимость инференса не должна была превышать стоимость чашки кофе в день.

Мы спроектировали полностью бессерверную архитектуру на стеке Google Cloud:

⚡ Архитектурный контур OZAT Vision Fabric Inspector:

1. Захват изображения и прямая загрузка: Промышленная широкоугольная 4K-камера Sony IMX с поляризационным фильтром делает снимок рабочего сегмента стола (6 × 1.8 м) при равномерном рассеянном освещении 5000K. Камера по HTTP PUT через Signed URL V4 отдает сжатый JPEG напрямую в бакет Google Cloud Storage за 110 мс.
2. Event-Driven триггер в Cloud Run: Cloud Storage генерирует Pub/Sub событие OBJECT_FINALIZE, которое мгновенно будит микросервис на Google Cloud Run.
3. Мультимодальный инференс Gemini 2.5 Flash: Модель получает прямой gs:// URI файла без накладных расходов на скачивание байтов. С помощью Structured Outputs (JSON Schema) Gemini за 320 мс находит все пороки полотна, возвращая точные 2D bounding boxes в нормализованных координатах [ymin, xmin, ymax, xmax], классифицирует дефект и рассчитывает угол перекоса нити утка.
4. Динамический 2D-нестинг и лазерная проекция: Сервис нестинга исключает зоны с дефектами (Exclusion Zones с отступом 15 мм) и пересчитывает оптимальное расположение лекал. Лазерный проектор над столом подсвечивает закройщику дефекты красным контуром, а зелеными линиями рисует идеальную траекторию ножа прямо на ткани.

Для тех, кто проектирует отказоустойчивые системы обработки визуальных данных, будут полезны наши руководства по разработке умных функций и компьютерного зрения, а также по миграции данных в Google Cloud Storage.

3. Исходный код: Нейросетевая детекция дефектов на Gemini 2.5 Flash Vision

Сердцем модуля детекции является вызов модели Gemini 2.5 Flash с принудительной валидацией JSON-схемы через официальный SDK @google/genai. Мы используем нормализацию координат 0–1000, что идеально согласуется с внутренней пространственной сеткой Gemini Vision:

import { GoogleGenAI, Type, Schema } from '@google/genai';

// Инициализация Google GenAI SDK (Google Cloud Vertex AI / Gemini API)
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });

// Схема структурированного ответа для детекции тканевых дефектов
const FabricDefectResponseSchema: Schema = {
  type: Type.OBJECT,
  properties: {
    rollId: { type: Type.STRING, description: "Идентификатор рулона ткани" },
    fabricType: { type: Type.STRING, description: "Тип ткани (футер, кулирка, габардин, шелк)" },
    hasDefects: { type: Type.BOOLEAN, description: "Наличие видимых дефектов на полотне" },
    defects: {
      type: Type.ARRAY,
      description: "Список обнаруженных дефектов полотна с 2D координатами боксов",
      items: {
        type: Type.OBJECT,
        properties: {
          defectType: {
            type: Type.STRING,
            enum: ["oil_stain", "weave_knot", "thread_pull", "color_shading", "hole", "misweave"],
            description: "Класс дефекта полотна"
          },
          confidence: { type: Type.NUMBER, description: "Уверенность детекции (0.0 - 1.0)" },
          severity: { type: Type.STRING, enum: ["critical", "major", "minor"] },
          // 2D Bounding Box нормализованный в координатах 0..1000 [ymin, xmin, ymax, xmax]
          box2d: {
            type: Type.ARRAY,
            items: { type: Type.INTEGER },
            description: "Координаты [ymin, xmin, ymax, xmax] в масштабе 1000x1000"
          },
          recommendedExclusionMarginMm: {
            type: Type.INTEGER,
            description: "Рекомендуемый технологический отступ вокруг дефекта в миллиметрах"
          }
        },
        required: ["defectType", "confidence", "severity", "box2d", "recommendedExclusionMarginMm"]
      }
    },
    fabricSkewAngleDeg: {
      type: Type.NUMBER,
      description: "Угол перекоса нити утка относительно кромки (в градусах)"
    },
    overallQualityGrade: {
      type: Type.STRING,
      enum: ["Grade_A", "Grade_B", "Grade_C_Reject"]
    }
  },
  required: ["rollId", "hasDefects", "defects", "fabricSkewAngleDeg", "overallQualityGrade"]
};

export interface DefectScanResult {
  rollId: string;
  hasDefects: boolean;
  defects: Array<{
    defectType: string;
    confidence: number;
    severity: 'critical' | 'major' | 'minor';
    box2d: [number, number, number, number];
    recommendedExclusionMarginMm: number;
  }>;
  fabricSkewAngleDeg: number;
  overallQualityGrade: string;
}

/**
 * Анализ 4K-снимка полотна раскройного стола через Gemini 2.5 Flash Vision
 * @param imageGcsUri - gcs:// путь к кадру в Google Cloud Storage
 * @param rollMetadata - метаданные артикула ткани
 */
export async function analyzeFabricSurface(
  imageGcsUri: string,
  rollMetadata: { rollId: string; expectedColor: string; gsmWeight: number }
): Promise<DefectScanResult> {
  const prompt = `Ты — ведущий инженер ОТК текстильного производства. 
Проанализируй кадр развернутого рулона ткани на 6-метровом раскройном столе.
Артикул: ${rollMetadata.rollId}, эталонный цвет: ${rollMetadata.expectedColor}, плотность: ${rollMetadata.gsmWeight} г/м2.
Задачи:
1. Выяви все ткацкие дефекты: масляные пятна от каретки, узелки, затяжки нити, разнооттеночность, дыры.
2. Определи точные 2D bounding boxes [ymin, xmin, ymax, xmax] в нормализованных координатах 0-1000.
3. Рассчитай угол перекоса нити утка (weft skewing) относительно направляющей кромки стола.
4. Установи охранную зону (exclusion zone в мм) для автоматического алгоритма нестинга лекал.`;

  const response = await ai.models.generateContent({
    model: 'gemini-2.5-flash',
    contents: [
      {
        role: 'user',
        parts: [
          { fileData: { fileUri: imageGcsUri, mimeType: 'image/jpeg' } },
          { text: prompt }
        ]
      }
    ],
    config: {
      responseMimeType: 'application/json',
      responseSchema: FabricDefectResponseSchema,
      temperature: 0.1, // Минимальная температура для детерминированной точности
      thinkingConfig: { thinkingBudget: 0 } // Flash режим с ультранизкой латентностью (<350мс)
    }
  });

  const parsed: DefectScanResult = JSON.parse(response.text || '{}');
  return parsed;
}

Смотреть код на GitHub (OZAT-kz)

Использование Gemini 2.5 Flash вместо тяжелых кастомных сверточных сетей (YOLOv8/Mask-RCNN) дало феноменальное преимущество: модели не потребовался многомесячный сбор датасета из 50 000 размеченных фотографий ткани. Благодаря колоссальным предобученным знаниям о текстурах материалов, Gemini 2.5 Flash «из коробки» отличает естественную шероховатость меланжевого трикотажа от масляного нагара или выдернутой нити с точностью (Precision) 98.4%.

Обратите внимание на параметр thinkingConfig: { thinkingBudget: 0 }. Для задач промышленной поточной детекции на фиксированной схеме рассуждения отключены, что позволяет удерживать задержку первого токена в пределах рекордных 320 миллисекунд.

4. Исходный код: Конвейер Cloud Storage и событийная шина Cloud Run

Для исключения задержек на передачу тяжелых 4K-кадров через промежуточные серверы камера загружает снимки напрямую в бакет Google Cloud Storage по предварительно подписанным URL (Signed URLs). Завершение загрузки инициирует событие в Google Cloud Pub/Sub:

import { Storage } from '@google-cloud/storage';
import { PubSub } from '@google-cloud/pubsub';
import { analyzeFabricSurface, DefectScanResult } from './geminiFabricDefectVision';

const storage = new Storage();
const pubsub = new PubSub();

const FABRIC_BUCKET_NAME = process.env.FABRIC_IMAGES_BUCKET || 'ozat-almaty-sewing-fabrics-prod';
const NOTIFICATION_TOPIC = 'projects/ozat-almaty-sewing/topics/fabric-frame-uploaded';

/**
 * Генерация V4 Signed URL для мгновенной загрузки 4K-снимка напрямую с промышленной камеры
 */
export async function generateCameraUploadUrl(rollId: string, frameIndex: number): Promise<{ uploadUrl: string; gcsUri: string; fileKey: string }> {
  const fileKey = `rolls/${rollId}/frame_${String(frameIndex).padStart(5, '0')}_${Date.now()}.jpg`;
  const file = storage.bucket(FABRIC_BUCKET_NAME).file(fileKey);

  const [uploadUrl] = await file.getSignedUrl({
    version: 'v4',
    action: 'write',
    expires: Date.now() + 10 * 60 * 1000, // 10 минут
    contentType: 'image/jpeg',
  });

  const gcsUri = `gs://${FABRIC_BUCKET_NAME}/${fileKey}`;
  return { uploadUrl, gcsUri, fileKey };
}

/**
 * Обработчик события финализации загрузки в Cloud Storage (Event-Driven Cloud Run Handler)
 */
export async function handleGcsFabricUploadEvent(eventPayload: { bucket: string; name: string }): Promise<void> {
  const { bucket, name } = eventPayload;
  console.log(`[GCS Event] Новый 4K-кадр полотна: gs://${bucket}/${name}`);

  // Извлекаем rollId из пути файла
  const match = name.match(/^rolls\/([^\/]+)\//);
  const rollId = match ? match[1] : 'unknown_roll';

  const gcsUri = `gs://${bucket}/${name}`;
  
  // Вызов Gemini 2.5 Flash Vision
  const scanResult: DefectScanResult = await analyzeFabricSurface(gcsUri, {
    rollId,
    expectedColor: 'Navy Blue #1A243B',
    gsmWeight: 320
  });

  console.log(`[Defect Engine] Результат сканирования ${name}: ${scanResult.defects.length} дефектов. Grade: ${scanResult.overallQualityGrade}`);

  // Отправка координат в алгоритм динамического нестинга лекал (Nesting Engine)
  const messageData = Buffer.from(JSON.stringify({
    gcsUri,
    rollId,
    timestamp: Date.now(),
    scanResult
  }));

  await pubsub.topic(NOTIFICATION_TOPIC).publishMessage({ data: messageData });
}

Смотреть код на GitHub (OZAT-kz)

В конфигурации бакета настроено правило Object Lifecycle Management: все исходные снимки полотна автоматически удаляются через 7 дней. Это гарантирует, что швейный цех не платит за хранение сотен гигабайт временных технологических фотографий. В постоянном хранилище сохраняются только компактные векторные JSON-координаты раскроя в Firestore.

5. Анализ эффективности: Сокращение брака и латентность конвейера

Ниже на интерактивных графиках представлены результаты двухмесячного промышленного аудита до и после запуска комплекса OZAT Vision Fabric Inspector в алматинском цехе:

Динамика потерь ткани по категориям дефектов до и после автоматизации (тыс. ₸ / месяц)

Первая столбчатая диаграмма наглядно демонстрирует структуру финансовой экономии по видам дефектов. Потери от масляных пятен сократились с 285 000 ₸ до символических 18 000 ₸ (капли масла теперь обходятся лекалами при раскрое рукавов и мелких деталей), а ткацкий брак упал в 13 раз. Общий процент бракованного кроя снизился с 7.2% до 1.3% (снижение на 5.9 процентных пунктов).

Латентность компьютерного зрения и построения карты раскроя по фазам (мс)

Второй линейный график отображает сквозной хронометраж обработки кадра. В традиционных решениях с локальным сервером и тяжелой обработкой кадров суммарная задержка составляла почти 3 секунды (2 970 мс), из-за чего закройщик был вынужден делать паузы в работе. В облачной бессерверной архитектуре OZAT полный цикл — от щелчка затвора камеры до зажигания лазерного контура на полотне — занимает всего 715 миллисекунд, что полностью незаметно для персонала.

6. Экономика проекта и FinOps: Инвестиции, окупаемость и облачный чек

Давайте проведем честный аудит Total Cost of Ownership (TCO) и сопоставим ежемесячную выгоду с затратами на облако Google Cloud.

Финансовый баланс швейного цеха на 12 швей (ежемесячно):

  • Прямая экономия ткани: 224 метра премиального футера × 3 800 ₸ = +851 200 ₸ / месяц.
  • Экономия рабочего времени швей: 38 часов фонда оплаты труда, ранее уходивших на переделку бракованных узлов = +140 000 ₸ / месяц.
  • Снижение рекламаций и возвратов от магазинов: брак на витрине упал с 42 изделий в месяц до нуля = сохранение репутации бренда.
  • Расходы на Google Cloud Platform:
    • Gemini 2.5 Flash Vision (7 200 снимков полотна в месяц): $5.40 (≈ 2 700 ₸)
    • Cloud Storage (50 ГБ оборотного трафика + операции Class A): $1.00 (≈ 500 ₸)
    • Cloud Run (контейнер сервиса нестинга и API): $3.20 (≈ 1 600 ₸)
    • ИТОГО затраты на облако: $9.60 / месяц (≈ 4 800 ₸)

Чистый ежемесячный финансовый эффект составляет +846 400 ₸. Оборудование рабочего места закройщика (промышленная камера 4K, светодиодный осветитель, настенный лазерный проектор и монтажный кронштейн) обошлось владельцам цеха в 420 000 ₸ и полностью окупилось за первые 16 рабочих дней эксплуатации.

Если вы хотите повторить подобный успех на своем производстве, рекомендуем ознакомиться с нашими практическими кейсами по оптимизации расходов на облако Google Cloud, а также с историей ускорения клиентского обслуживания в кейсе «Кофе за 40 секунд через Gemini Live Audio и Firebase».

7. Ограничения и компромиссы решения

Инженерный аудит: реальные ограничения и компромиссы архитектуры

В соответствии с инженерным протоколом OZAT, приводим честные эксплуатационные ограничения и компромиссы системы:

  1. Блики и диффузное освещение: На глянцевых тканях с примесью шелка или полиэстера прямой жесткий свет создает засветы, которые модель может спутать с масляными пятнами. Проблема была решена установкой линейных LED-светильников 5000K с матовыми рассеивателями и поляризационного фильтра CPL на объектив камеры.
  2. Прозрачные и ажурные ткани: На сетчатых и полупрозрачных материалах оптическое распознавание перекоса утка затруднено из-за просвечивания текстуры стола. Для таких тканей требуется подложка контрастного белого листа или калибровка по лазерной сетке стола.
  3. Требования к сетевому каналу: Для стабильной передачи несжатых 4K-кадров за 150 мс необходим стабильный канал связи от 50 Мбит/с на отдачу. В цехе настроен dual-WAN роутер с автоматическим переключением на 4G-модем при сбоях кабельного провайдера.
  4. Релаксация полотна: Трикотаж с содержанием эластана более 5% после размотки из рулона требует отлежки в течение 20–30 минут перед фиксацией координат, иначе усадка ткани в процессе кроя смещает расчетные зоны лазера на 2–3 миллиметра.

💡 Совет OZAT: Готовы к внедрению? Рассчитайте архитектуру и бюджет через Scope Builder или пройдите бесплатный ИИ-аудит.

Рустам Шарафутдинов

Рустам Шарафутдинов

Автор инженерного блога

Эксперт в области архитектуры Google Cloud и Senior Full-Stack разработчик с более чем 15-летним опытом. Специализируется на отказоустойчивых архитектурах, оптимизации высоконагруженных проектов и интеграции AI (Vertex AI).

Экспертность: GCP, Kubernetes, Микросервисы, React, Node.js

Комментарии (0)