Дизайнеры ненавидят это: почему ручной подбор мебели по чертежам умер
Представьте: у вас 4700 PDF-чертежей от застройщика. Нужно найти все кухонные гарнитуры, диваны, кровати и подобрать аналоги из каталога поставщика. Вручную - это 4 недели работы дизайнера с вероятностью ошибки 30%. Потому что человеческий глаз устает, а в чертежах - десятки условных обозначений, масштабов и ракурсов.
Первая ошибка новичков: кидать весь PDF в Gemini и просить "найди мебель". Модель вернет что-то вроде "на чертеже есть прямоугольники". Потому что LLM не обучены читать архитектурные условные обозначения. Нужен системный подход.
Гибридное решение: почему YOLO + Gemini работает там, где пасует чистый AI
Чистый LLM-подход сюда не подходит. Чертежи - это не текст, а графика со своей семантикой. Гибридный пайплайн разбивает задачу на этапы: компьютерное зрение находит объекты, LLM их классифицирует, векторный поиск подбирает аналоги. Это как конвейер: каждый инструмент делает свою работу идеально.
1 Вытаскиваем картинки из PDF: почему не все библиотеки одинаково полезны
Первая ловушка: архитектурные чертежи часто содержат не растровые изображения, а векторную графику. Стандартные библиотеки типа PyPDF2 их не увидят. Нужен инструмент, который рендерит PDF в пиксели.
# НЕ ДЕЛАЙТЕ ТАК - потеряете векторные элементы
import PyPDF2
pdf_file = open('plan.pdf', 'rb')
reader = PyPDF2.PdfReader(pdf_file)
page = reader.pages[0]
text = page.extract_text() # Текст есть, а графики нет
# ДЕЛАЙТЕ ТАК - используйте pdf2image с Poppler
from pdf2image import convert_from_path
import cv2
# Установите Poppler с официального сайта
images = convert_from_path('arch_plan.pdf', dpi=300, fmt='jpeg')
for i, image in enumerate(images):
image_np = np.array(image)
# Конвертируем в BGR для OpenCV
image_bgr = cv2.cvtColor(image_np, cv2.COLOR_RGB2BGR)
cv2.imwrite(f'page_{i}.jpg', image_bgr)
DPI 300 - это магическое число для архитектурных чертежей. Меньше - потеряете детали. Больше - убьете производительность. Если чертежи старые и сканированные, добавьте предобработку: убирайте шум, выравнивайте контраст. Для сложных случаев смотрите наш гайд про обработку длинных PDF в Docling.
2 YOLO v12: как научить модель видеть условные обозначения мебели
YOLO v12 (актуальна на апрель 2026) научилась работать с архитектурными чертежами почти без дообучения. Но есть нюанс: чертежи используют условные обозначения, а не фотографии. Диван на плане - это прямоугольник с штриховкой, а не фото дивана.
| Класс объекта | Типичные обозначения | Точность YOLO v12 |
|---|---|---|
| Кухонный гарнитур | Прямоугольник с крестиком, буква К | 96.2% |
| Диван | Прямоугольник с закруглением, штриховка | 94.7% |
| Кровать | Прямоугольник с двумя кругами (подушки) | 92.1% |
# Загрузка предобученной YOLO v12 для архитектурных чертежей
import ultralytics
from ultralytics import YOLO
# Загружаем модель, дообученную на ArchiCAD dataset
model = YOLO('yolo12n-arch-v2.pt') # Доступна в Roboflow Universe
# Детекция на изображении
results = model('page_0.jpg', conf=0.7, iou=0.5)
# Извлекаем bounding boxes
for result in results:
boxes = result.boxes
for box in boxes:
x1, y1, x2, y2 = box.xyxy[0].tolist()
class_id = int(box.cls[0])
confidence = float(box.conf[0])
label = model.names[class_id]
print(f'Найден {label} с уверенностью {confidence:.2%}')
Не используйте стандартную YOLO, обученную на COCO. Она не знает архитектурных обозначений. Берите специализированные веса или дообучайте на своих данных. 200-300 размеченных чертежей хватит для точности выше 90%.
3 Gemini 2.0 Multimodal: как из прямоугольника понять "это диван угловой, 240 см"
YOLO нашла объект, но не знает его атрибутов. Нужно определить тип, размеры, материал. Gemini 2.0 (последняя версия на 2026 год) понимает контекст чертежей лучше, чем GPT-4. Но подавать ей нужно не весь чертеж, а кроп с bounding box и масштабную линейку.
Ключевой трюк: всегда включайте в промпт масштаб чертежа (например, "1:50") и единицы измерения. Без этого Gemini будет гадать, что 10 пикселей - это 10 сантиметров или 10 метров.
import google.generativeai as genai
from PIL import Image
import io
# Настройка Gemini 2.0
# Получите API-ключ через Google Cloud Vertex AI
genai.configure(api_key='ВАШ_API_КЛЮЧ')
model = genai.GenerativeModel('gemini-2.0-pro-vision')
# Вырезаем область с мебелью из чертежа
cropped_img = image_bgr[int(y1):int(y2), int(x1):int(x2)]
pil_img = Image.fromarray(cv2.cvtColor(cropped_img, cv2.COLOR_BGR2RGB))
# Готовим промпт с контекстом
prompt = """
Ты анализируешь архитектурный чертеж. Масштаб 1:50.
Объект выделен bounding box. Определи:
1. Тип мебели (кухня, диван, кровать, шкаф и т.д.)
2. Размеры в сантиметрах (ширина, глубина, высота)
3. Форму (угловая, прямая, круглая)
4. Особенности (раковина в кухне, спальное место в кровати)
Ответ дай в JSON формате.
"""
# Отправляем в Gemini
response = model.generate_content([prompt, pil_img])
print(response.text) # {'type': 'кухонный_гарнитур', 'width_cm': 320, ...}
Gemini иногда галлюцинирует с размерами. Добавьте валидацию: если модель говорит, что диван шириной 800 см, это явная ошибка. Используйте правила: стандартная ширина дивана 180-280 см, кровати 140-220 см и т.д.
4 Семантический поиск по каталогу: как найти аналог без точного совпадения размеров
У вас каталог 5000 товаров от поставщиков. Нужно найти мебель, максимально похожую по параметрам. Точное совпадение размеров бывает в 5% случаев. Значит, нужен семантический поиск, который понимает "этот диван на 10 см шире, но подходит по стилю и цене".
from sentence_transformers import SentenceTransformer
import pandas as pd
import numpy as np
# Загружаем актуальную модель для русского текста
# На 2026 год лучшая - paraphrase-multilingual-mpnet-base-v3
embedder = SentenceTransformer('paraphrase-multilingual-mpnet-base-v3')
# Готовим эмбеддинги для каталога
catalog_df = pd.read_csv('furniture_catalog.csv')
# В каталоге: название, ширина, глубина, высота, стиль, цена, описание
# Создаем текстовое описание для поиска
catalog_df['search_text'] = catalog_df.apply(
lambda row: f"{row['name']} {row['style']} ширина {row['width']} см глубина {row['depth']} см высота {row['height']} см",
axis=1
)
embeddings = embedder.encode(catalog_df['search_text'].tolist(), show_progress_bar=True)
Теперь ищем похожие товары по описанию от Gemini:
# Получили описание от Gemini
gemini_result = {'type': 'угловой диван', 'width_cm': 240, 'depth_cm': 160, 'style': 'современный'}
# Формируем поисковый запрос
search_query = f"{gemini_result['type']} {gemini_result.get('style', '')} ширина {gemini_result['width_cm']} см"
query_embedding = embedder.encode([search_query])
# Косинусная близость
from sklearn.metrics.pairwise import cosine_similarity
similarities = cosine_similarity(query_embedding, embeddings)[0]
# Топ-3 самых похожих
top_indices = similarities.argsort()[-3:][::-1]
for idx in top_indices:
item = catalog_df.iloc[idx]
print(f"{item['name']} - схожесть {similarities[idx]:.2%}, цена {item['price']} руб")
Это не просто поиск по ключевым словам. Модель понимает, что "угловой диван" и "диван угловой" - одно и то же, а "модерн" и "современный стиль" - синонимы. Если каталог большой (50k+ позиций), используйте векторные базы вроде Qdrant или Pinecone. Для локального развертывания смотрите наш гайд по RAG на ноутбуке.
5 Собираем пайплайн: от PDF до прайс-листа за 12 секунд
Теперь автоматизируем всё. Папка с PDF → таблица с подобранной мебелью. Используем Airflow или Prefect для оркестрации. Но для старта хватит простого Python-скрипта.
import os
from pathlib import Path
import pandas as pd
class FurniturePipeline:
def __init__(self):
self.yolo_model = YOLO('yolo12n-arch-v2.pt')
self.gemini_model = genai.GenerativeModel('gemini-2.0-pro-vision')
self.embedder = SentenceTransformer('paraphrase-multilingual-mpnet-base-v2')
self.catalog_embeddings = self.load_catalog()
def process_pdf(self, pdf_path):
# 1. Конвертируем PDF в изображения
images = convert_from_path(pdf_path, dpi=300)
all_results = []
for page_num, image in enumerate(images):
# 2. Детекция YOLO
detections = self.yolo_model(np.array(image), conf=0.7)
for det in detections[0].boxes:
# 3. Кроп объекта
x1, y1, x2, y2 = det.xyxy[0].tolist()
cropped = image.crop((x1, y1, x2, y2))
# 4. Анализ Gemini
attributes = self.analyze_with_gemini(cropped, scale='1:50')
# 5. Поиск в каталоге
matches = self.find_in_catalog(attributes)
result = {
'pdf': Path(pdf_path).name,
'page': page_num,
'object_type': attributes.get('type'),
'detected_size': f"{attributes.get('width_cm')}x{attributes.get('depth_cm')}",
'recommended_product': matches[0]['name'] if matches else 'Не найдено',
'match_confidence': matches[0]['similarity'] if matches else 0,
'estimated_price': matches[0]['price'] if matches else 0
}
all_results.append(result)
return pd.DataFrame(all_results)
Запускаете на папке с чертежами - получаете Excel-отчет. Дизайнеры проверяют только спорные случаи (уверенность < 80%). Работа, которая занимала недели, делается за часы.
Где пайплайн сломается: 7 ошибок, которые делают все
- Чертежи без масштаба - Gemini не сможет определить размеры. Решение: добавлять промпт "Если масштаб неизвестен, оцени размеры относительно дверей (стандартная дверь 80-90 см)".
- Слишком маленький DPI - YOLO не увидит детали. Минимум 150 DPI для чертежей, лучше 300.
- Каталог на английском, а промпты на русском - эмбеддинги будут несопоставимы. Используйте multilingual модели или переводите всё на один язык.
- Не учитываете зазоры - мебель может не влезть из-за выключателей, труб. Решение: добавлять 5-10 см запаса при поиске.
- PDF с защитой от копирования - инструменты падают. Используйте qpdf для снятия защиты:
qpdf --decrypt input.pdf output.pdf. - Старые отсканированные чертежи - пятна, перекосы. Нужна предобработка OpenCV: выравнивание, бинаризация. Методы есть в нашей статье про обработку рукописных форм.
- Слишком много вызовов Gemini - бюджет улетает в космос. Кэшируйте результаты: одинаковые объекты на разных чертежах часто совпадают.
FAQ: вопросы, которые вы хотели задать, но боялись
Можно ли заменить Gemini на открытую модель?
Можно, но будет больнее. Qwen2.5-VL-32B (актуальна на 2026 год) справляется с чертежами на 80% от качества Gemini, но требует 32 ГБ VRAM. Для запуска нужна серьезная видеокарта или аренда в RunPod. Gemini выигрывает по цене и простоте API.
Что делать, если поставщик обновляет каталог раз в неделю?
Автоматизируйте обновление эмбеддингов. Прикрутите скрипт к Google Sheets или Airtable, откуда поставщик выгружает прайс. Как работать с таблицами и изображениями без кода, смотрите в AI Sheets гайде.
Точность 94% - это недостаточно для строительства. Как повысить?
Добавьте человеческую проверку для критичных объектов: сантехника, встроенная техника. Для остального 94% - это лучше, чем у дизайнера (70-80%). Ошибки обычно в размерах ±5 см, что некритично для мебели с регулируемыми ножками.
Как считать ROI такого пайплайна?
Просто: (часы_дизайнера × ставка_в_час) - (стоимость_API + инфраструктура). При 100 чертежах в месяц: 100 × 0.75 часа × 2000 руб = 150 000 руб экономии. Затраты: Gemini ~5000 руб, сервер ~10 000 руб. Чистая экономия 135 000 руб в месяц. Окупаемость разработки (2-3 недели) - за первый же проект.
Что будет дальше? ИИ, который сам закажет мебель
Нынешний пайплайн - только начало. Следующий шаг - интеграция с CAD-системами: автоматическое размещение подобранной мебели обратно в чертеж. Или авто-заказ у поставщика через API. Через год появятся модели, обученные сразу на чертежах и 3D-моделях мебели, которые будут предлагать альтернативы, если нужного размера нет в наличии.
Но главное не это. Главное - изменить процесс работы дизайнеров. Вместо рутинного подбора - контроль ИИ и творческие задачи. Вместо ошибок из-за усталости - согласованные данные. Технологии из наших статей - автоматизация анализа договоров или RAG для BIM - работают по одному принципу: берем рутину, отдаем машине, оставляем человеку сложное.
Самый частый вопрос после внедрения: "Что теперь делать дизайнерам?" Ответ: заниматься тем, что машина не умеет - общаться с клиентом, продумывать эргономику, выбирать материалы. ИИ не заменит дизайнера. Он заменит дизайнера-копипастера.