Розробка AI-системи автоматичного підрахунку будівельних матеріалів за знімками

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1566 послуг
Розробка AI-системи автоматичного підрахунку будівельних матеріалів за знімками
Середній
~1-2 тижні
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1284
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1196
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    901
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1119
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    586
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    853

AI-підрахунок будівельних матеріалів по фото та відео

Інвентаризація матеріалів на будівництві вручну - джерело помилок та втрат. Арматура, цегла, мішки з цементом, труби, листи фанери - все це можна перерахувати автоматично по фото з телефону або дрону.

Методи підрахунку в залежності від типу матеріалу

import cv2
import numpy as np
from ultralytics import YOLO
import torch

class ConstructionMaterialCounter:
    def __init__(self, config: dict):
        # YOLOv8m дообученный на строительных материалах
        self.detector = YOLO(config['model_path'])
        # SAM для точной сегментации при плотном расположении
        self.segmentor = self._load_sam(config.get('sam_checkpoint'))

    def count_by_detection(self, image: np.ndarray,
                             material_class: str) -> dict:
        """
        Подходит для: кирпичи в поддонах, мешки, листы OSB/фанеры.
        Не подходит для: длинные трубы, арматура в пучках.
        """
        results = self.detector(image, conf=0.4)
        class_counts = {}

        for box in results[0].boxes:
            cls = self.detector.model.names[int(box.cls)]
            class_counts[cls] = class_counts.get(cls, 0) + 1

        return {
            'method': 'detection',
            'counts': class_counts,
            'target_count': class_counts.get(material_class, 0)
        }

    def count_rebar_by_cross_section(self,
                                      end_view_image: np.ndarray) -> dict:
        """
        Арматура в пачке: фотографируем торец.
        Детектируем круглые сечения через Hough circles или Watershed.
        """
        gray = cv2.cvtColor(end_view_image, cv2.COLOR_BGR2GRAY)
        blurred = cv2.GaussianBlur(gray, (9, 9), 2)

        # Hough Circle Transform для круглых сечений арматуры
        circles = cv2.HoughCircles(
            blurred,
            cv2.HOUGH_GRADIENT,
            dp=1.2,
            minDist=15,
            param1=50,
            param2=30,
            minRadius=8,
            maxRadius=40
        )

        count = 0
        if circles is not None:
            circles = np.uint16(np.around(circles))
            count = len(circles[0])

        return {
            'method': 'hough_circles',
            'rebar_count': count,
            'circles': circles[0].tolist() if circles is not None else []
        }

    def count_pipes_stacked(self, side_view: np.ndarray) -> dict:
        """
        Трубы в штабеле: детектируем через ellipse fitting (вид сбоку)
        или circle detection (вид спереди).
        """
        gray = cv2.cvtColor(side_view, cv2.COLOR_BGR2GRAY)
        edges = cv2.Canny(gray, 50, 150)

        # Контуры → эллипсы
        contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL,
                                        cv2.CHAIN_APPROX_SIMPLE)
        pipe_count = 0
        for cnt in contours:
            if len(cnt) < 5:
                continue
            area = cv2.contourArea(cnt)
            if area < 200:
                continue
            ellipse = cv2.fitEllipse(cnt)
            # Проверяем, что это круглое сечение (a ≈ b)
            a, b = ellipse[1]
            if b > 0 and 0.7 < a/b < 1.3:  # близко к кругу
                pipe_count += 1

        return {'method': 'ellipse_fitting', 'pipe_count': pipe_count}

Підрахунок мішків: метод density estimation

Для насипних матеріалів та об'єктів у щільних рядах класичний детектор збоїть: IoU між сусідніми об'єктами > 0.6, NMS пригнічує правильні детекції. Використовуємо density map approach:

class DensityBasedCounter:
    """
    CSRNet или CrowdCounting подход, адаптированный для материалов.
    Вместо детекции каждого объекта предсказываем карту плотности.
    Сумма пикселей карты плотности ≈ количество объектов.
    """
    def __init__(self, model_path: str):
        import torchvision.models as models
        # VGG16 backbone + density head
        self.model = self._build_csrnet()
        self.model.load_state_dict(torch.load(model_path))
        self.model.eval()

    @torch.no_grad()
    def count(self, image: np.ndarray) -> dict:
        from torchvision import transforms
        transform = transforms.Compose([
            transforms.ToTensor(),
            transforms.Normalize([0.485, 0.456, 0.406],
                                  [0.229, 0.224, 0.225])
        ])

        tensor = transform(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
        tensor = tensor.unsqueeze(0)

        density_map = self.model(tensor)[0, 0].numpy()
        # Сумма карты плотности = количество объектов
        count = float(density_map.sum())

        return {
            'method': 'density_estimation',
            'count': round(count),
            'count_float': count,
            'density_map': density_map
        }

Кейс: інвентаризація складу арматури

Склад: 800 т арматури у пачках, 6 типорозмірів (d8 до d32). Щомісячна інвентаризація вручну: 2 особи, 1 робочий день.

Після впровадження оператор фотографує торці пачок на планшет (20–30 фото за годину). AI підраховує кількість прутків у кожній пачці через Hough circles (для d12–d25) та density estimation (для d8 — дрібні, щільно).

  • Точність підрахунку: ±2% від ручного перерахунку
  • час інвентаризації: 1.5 години vs. 8 годин вручну
  • Інтеграція з 1С: автоматичне оновлення залишків
Тип матеріалу Метод Точність
Цегла в піддоні YOLO детекція 93–97%
Арматура (торець) Hough circles 95–98%
Мішки в штабелі Density estimation 91-95%
Листи OSB/фанера YOLO + segmentation 96–99%
Труби (торець) Ellipse fitting 94–97%
Тип проекту Термін
Лічильник одного типу матеріалу 2-4 тижні
Мультиматеріальна система (5+ типів) 5-9 тижнів
З інтеграцією в WMS/1С 7–12 тижнів