Разработка AI-системы инспекции инфраструктуры с помощью дронов

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1 услугВсе 1566 услуг
Разработка AI-системы инспекции инфраструктуры с помощью дронов
Сложная
~2-4 недели
Часто задаваемые вопросы
Направления AI-разработки
Этапы разработки AI-решения
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1218
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    853
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1047
  • image_logo-advance_0.png
    Разработка логотипа компании B2B Advance
    561
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    825

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 недель