Розробка AI-системи інспекції інфраструктури за допомогою дронів

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

Напрямки 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-система інспекції інфраструктури за допомогою дронів

Інспекція високовольтних ЛЕП, мостів, нафтопроводів, вітрогенераторів — дні ручної роботи промислових альпіністів чи зупинка устаткування. Дрон з AI-аналітикою проходить той же маршрут за годинник і фіксує дефекти, які людина пропускає під час побіжного огляду.

Типові завдання інспекції

Об'єкт Виявлені дефекти Метод
ЛЕП, опори Корозія, нахил опори, урвище Сегментація + anomaly detection
Лопаті вітрогенератора Тріщини, розшарування, наліт льоду High-res детекція дефектів
Міст, шляхопровід Тріщини, спалінг, корозія арматури Crack detection + classification
Нафтопровід Вм'ятини, корозійні плями, витік (тепло) RGB + тепловізор
Покрівля будівлі Протікання (теплові аномалії), дефекти Тепловізор

Детекція дефектів: crack detection як базове завдання

import torch
import numpy as np
from PIL import Image
from torchvision import transforms
import segmentation_models_pytorch as smp

class InfrastructureDefectDetector:
    def __init__(self, model_path: str, task: str = 'crack'):
        # Для трещин — сегментационная задача (пиксельная точность)
        # UNet++ с EfficientNet-B4 encoder = хорошее соотношение
        self.model = smp.UnetPlusPlus(
            encoder_name='efficientnet-b4',
            encoder_weights=None,  # загружаем свои веса
            in_channels=3,
            classes=1,
            activation='sigmoid'
        )
        checkpoint = torch.load(model_path, map_location='cpu')
        self.model.load_state_dict(checkpoint['model_state_dict'])
        self.model.eval()

        self.transform = transforms.Compose([
            transforms.Resize((512, 512)),
            transforms.ToTensor(),
            transforms.Normalize([0.485, 0.456, 0.406],
                                  [0.229, 0.224, 0.225])
        ])
        self.task = task

    @torch.no_grad()
    def detect(self, image: np.ndarray,
               threshold: float = 0.5) -> dict:
        img_pil = Image.fromarray(image)
        tensor = self.transform(img_pil).unsqueeze(0)

        pred = self.model(tensor)[0, 0].numpy()  # (H, W)
        mask = (pred > threshold).astype(np.uint8)

        # Анализ маски
        crack_pixels = int(mask.sum())
        total_pixels = mask.size
        crack_ratio = crack_pixels / total_pixels

        # Контуры трещин
        contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL,
                                        cv2.CHAIN_APPROX_SIMPLE)
        crack_regions = []
        for cnt in contours:
            area = cv2.contourArea(cnt)
            if area < 50:  # фильтр шума
                continue
            x, y, w, h = cv2.boundingRect(cnt)
            length = cv2.arcLength(cnt, False)
            crack_regions.append({
                'bbox': [x, y, x+w, y+h],
                'area_px': int(area),
                'length_px': float(length),
                'severity': self._classify_severity(area, length)
            })

        return {
            'defect_ratio': crack_ratio,
            'crack_regions': crack_regions,
            'severity': 'HIGH' if crack_ratio > 0.02 else
                        'MEDIUM' if crack_ratio > 0.005 else 'LOW',
            'raw_mask': mask
        }

    def _classify_severity(self, area: float,
                             length: float) -> str:
        if length > 200 or area > 500:
            return 'CRITICAL'
        elif length > 80 or area > 100:
            return 'HIGH'
        return 'MEDIUM'

Тепловізійна інспекція: пошук протікання та перегріву

class ThermalInspector:
    def __init__(self, baseline_temp: float = 20.0):
        self.baseline = baseline_temp

    def analyze(self, thermal_frame: np.ndarray) -> list[dict]:
        """
        thermal_frame: матрица температур в °C
        Ищем аномально горячие (короткое замыкание, трение) и холодные
        (протечки, отсутствие изоляции) зоны.
        """
        anomalies = []

        # Статистика кадра
        mean_t = float(np.mean(thermal_frame))
        std_t = float(np.std(thermal_frame))

        # Аномалии: > mean + 3*std (горячие) или < mean - 2*std (холодные)
        hot_mask = (thermal_frame > mean_t + 3 * std_t).astype(np.uint8)
        cold_mask = (thermal_frame < mean_t - 2 * std_t).astype(np.uint8)

        for mask_type, mask in [('hot', hot_mask), ('cold', cold_mask)]:
            contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL,
                                            cv2.CHAIN_APPROX_SIMPLE)
            for cnt in contours:
                if cv2.contourArea(cnt) < 20:
                    continue
                x, y, w, h = cv2.boundingRect(cnt)
                roi_temps = thermal_frame[y:y+h, x:x+w]
                anomalies.append({
                    'type': mask_type,
                    'bbox': [x, y, x+w, y+h],
                    'max_temp': float(roi_temps.max()),
                    'min_temp': float(roi_temps.min()),
                    'delta': float(abs(roi_temps.mean() - mean_t))
                })

        return anomalies

Фотограмметрія та 3D-модель об'єкта

Для детального аналізу тріщин і деформацій будуємо 3D-модель по серії знімків, що перекриваються, з дрону. Інструменти: Agisoft Metashape (комерційний), OpenDroneMap (open-source), COLMAP.

  • Перекриття знімків: 80% передньо-бічне, 60% бічне
  • GSD (Ground Sample Distance) для тріщин: 1-3 мм/піксель
  • Дрон із камерою Sony RX1R II (42 МП): GSD 1 мм/піксель з висоти 8м

Кейс: інспекція 40 км ЛЕП

Завдання: щоквартальна інспекція високовольтної ЛЕП 40 км. Раніше: 3 бригади по 2 особи, 5 робочих днів.

Після впровадження: дрон DJI M300 RTK + Zenmuse H20T (RGB 20МП + тепловізор), автономний політ GPS-маршрутом, висота 30м над проводом.

  • Час збору даних: 6–7 годин на 40 км (2 дні з урахуванням перебазувань)
  • AI-аналіз: YOLOv8l, донавчений на 3200 зображеннях дефектів опор та проводів
  • Виявлено за першу інспекцію: 14 опор з корозією > 20%, 3 натяжні затискачі з тріщинами, 8 аномальних теплових точок
Тип інспекції Термін розробки
Детектор одного типу дефектів 4–6 тижнів
Комплексна інспекційна система 8–14 тижнів
З фотограмметрією та 3D-звітами 12-20 тижнів