Розробка AI для сільського господарства: аналіз знімків посівів

Розробка AI для сільського господарства: аналіз знімків посівів

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

Часті запитання

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

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

Розробка AI для сільського господарства: аналіз знімків посівів

Клієнт приходить з сирими знімками з дрона і проханням «зробити NDVI». Ми дивимось на histograms — 80% значень у діапазоні 0.2–0.4, але поле візуально зелене. Проблема: неправильне калібрування мультиспектральної камери. Без урахування параметрів зйомки (висота, кут сонця, вологість) NDVI — сміття. Наш досвід показує: донавчаємо моделі на ваших полях і економимо до 30% на добривах за рахунок точних зональних карт.

Які проблеми вирішуємо

Неправильний розрахунок NDVI. Супутникові знімки низької роздільної здатності (10 м/піксель) усереднюють стан поля. Дрон дає 5 см/піксель, але без калібрування за еталонним щитом (Labsphere) розкид значень досягає 0.2. Ми використовуємо польові спектрорадіометри для прив'язки NDVI до реальних показників хлорофілу.

Виявлення хвороб з хибними спрацюваннями. RGB-модель на YOLOv8 плутає опік від сонця з альтернаріозом. Рішення: додаємо мультиспектральні канали (RedEdge, NIR) і використовуємо attention-шар, який вчиться відрізняти некротичні плями за спектральною кривою.

Prescription maps не стикуються з технікою. ISO-XML завдання не відповідають формату John Deere. Ми генеруємо shapefile з атрибутами N_rate_kg_ha, який безпосередньо імпортується в Operations Center — перевірено на 20+ господарствах.

Як нейромережі виявляють хвороби рослин?

Стандартний пайплайн: беремо фрагменти листя розміром 640×640 px, застосовуємо аугментації (поворот, масштаб, яскравість), подаємо в YOLOv8-small, переднавчений на ImageNet. Для мультиспектральних знімків використовуємо багатоканальний вхід (6 каналів: BGR + NIR + RedEdge + NDVI). Результат — маска уражених ділянок з confidence >0.85. Нижче — приклад донавченої моделі для томатів:

from ultralytics import YOLO import cv2 class CropDiseaseDetector: def __init__(self, model_path: str): # YOLOv8 донавчений на PlantVillage Dataset + кастомні дані self.model = YOLO(model_path) self.disease_classes = [ 'healthy', 'early_blight', 'late_blight', 'leaf_mold', 'septoria_leaf_spot', 'spider_mites', 'target_spot', 'yellow_leaf_curl', 'mosaic_virus', 'bacterial_spot' ] def analyze_leaf(self, leaf_image: np.ndarray) -> dict: results = self.model(leaf_image, conf=0.4) detections = [] for box in results[0].boxes: disease = self.disease_classes[int(box.cls)] detections.append({ 'disease': disease, 'confidence': float(box.conf), 'bbox': box.xyxy[0].tolist(), 'severity': self._estimate_severity(leaf_image, box) }) # Загальний бал здоров'я if not detections: health_score = 1.0 else: max_disease_conf = max(d['confidence'] for d in detections if d['disease'] != 'healthy') health_score = 1.0 - max_disease_conf return { 'health_score': health_score, 'detections': detections, 'needs_treatment': health_score < 0.6 } 

Чому NDVI недостатній для раннього стресу?

NDVI насичується при LAI (індекс листкової поверхні) >3. На посівах у фазі кущіння він показує 0.8–0.9 — всі зони «відмінні», хоча азотний стрес вже є. Альтернатива — NDRE (Red Edge), який, за даними Gitelson et al., лінійно реагує на вміст хлорофілу до LAI=6. Ми рахуємо обидва індекси і будуємо комбіновану карту:

import numpy as np import rasterio import matplotlib.pyplot as plt import matplotlib.colors as colors class CropHealthAnalyzer: def calculate_ndvi(self, red_band: np.ndarray, nir_band: np.ndarray) -> np.ndarray: """NDVI = (NIR - Red) / (NIR + Red)""" red = red_band.astype(np.float32) nir = nir_band.astype(np.float32) ndvi = np.where( (nir + red) > 0, (nir - red) / (nir + red), 0 ) return np.clip(ndvi, -1, 1) def calculate_ndre(self, red_edge: np.ndarray, nir: np.ndarray) -> np.ndarray: """NDRE — чутливіший за NDVI для раннього стресу""" return (nir - red_edge) / (nir + red_edge + 1e-8) def calculate_indices_batch(self, multispectral_path: str) -> dict: """Розрахунок усіх індексів з мультиспектрального GeoTIFF""" with rasterio.open(multispectral_path) as src: # Припускаємо порядок: Blue, Green, Red, RedEdge, NIR blue = src.read(1).astype(np.float32) green = src.read(2).astype(np.float32) red = src.read(3).astype(np.float32) red_edge = src.read(4).astype(np.float32) nir = src.read(5).astype(np.float32) transform = src.transform crs = src.crs indices = { 'ndvi': self.calculate_ndvi(red, nir), 'ndre': self.calculate_ndre(red_edge, nir), 'gndvi': (nir - green) / (nir + green + 1e-8), # Green NDVI 'evi': 2.5 * (nir - red) / (nir + 6*red - 7.5*blue + 1 + 1e-8), } return indices, transform, crs def classify_crop_health(self, ndvi: np.ndarray) -> np.ndarray: """Класифікація здоров'я посівів за NDVI""" health_map = np.zeros_like(ndvi, dtype=np.uint8) health_map[ndvi < 0.1] = 0 # Грунт/немає рослинності health_map[(ndvi >= 0.1) & (ndvi < 0.3)] = 1 # Стрес/розріджений health_map[(ndvi >= 0.3) & (ndvi < 0.5)] = 2 # Помірний health_map[(ndvi >= 0.5) & (ndvi < 0.7)] = 3 # Добре health_map[ndvi >= 0.7] = 4 # Відмінне return health_map 

Як генеруємо prescription maps

На основі растрових зон здоров'я будуємо векторні полігони з нормами внесення. Приклад для пшениці: зона 1 (NDVI<0.3) — 120 кг N/га, зона 2 (0.3–0.5) — 90 кг/га, зона 3 (0.5–0.7) — 60 кг/га, зона 4 (>0.7) — 30 кг/га. Файл експортується у Shapefile з проекцією EPSG:32637 (UTM 37N).

import geopandas as gpd from shapely.geometry import shape import json def create_prescription_map(ndvi_array: np.ndarray, transform, field_boundary: gpd.GeoDataFrame) -> dict: """ Створення карти рекомендацій за зонами (prescription map) для змінної норми внесення добрив """ health_zones = classify_into_zones(ndvi_array, n_zones=4) # Векторизація растрових зон from rasterio.features import shapes zone_geometries = list(shapes(health_zones.astype('uint8'), transform=transform)) prescription = [] for geom, zone_value in zone_geometries: # Норма внесення N за зонами (кг/га) n_rate = {1: 120, 2: 90, 3: 60, 4: 30}[int(zone_value)] if zone_value > 0 else 0 prescription.append({ 'geometry': geom, 'zone': int(zone_value), 'n_rate_kg_ha': n_rate, 'action': 'apply_fertilizer' if n_rate > 0 else 'skip' }) return prescription 

Процес роботи під ключ

  1. Аудит даних — перевірка якості знімків, калібрувальних коефіцієнтів, метаданих.
  2. Прототипування — обираємо архітектуру (YOLOv8, EfficientNet, U-Net), налаштовуємо гіперпараметри.
  3. Навчання — використовуємо PyTorch + Hugging Face Datasets, трекінг у W&B, розподілене навчання на 4×A100.
  4. Валідація на полі — порівнюємо з ручними вимірами хлорофілу (SPAD-502) та біомаси.
  5. Деплой — Triton Inference Server, API на FastAPI, інтеграція через MQTT для дронів.
  6. Підтримка — донавчання на нових культурах, моніторинг дрейфу моделі.

Строки та що входить

Масштаб Строк
Пілот: 1 культура, 1 поле 4–6 тижнів
Господарство: 5–10 культур 8–14 тижнів
Регіональна платформа 16–24 тижні

Відмітимо: що входить:

  • Документація за форматами даних та моделі.
  • Вихідний код пайплайну (PyTorch, Docker Compose).
  • API з прикладами запитів.
  • Навчання операторів роботі з дроном та ПЗ.
  • Техпідтримка 2 місяці.

Точну вартість розраховуємо після аналізу ваших даних — оцінимо проєкт за 2 робочих дні. Замовте консультацію: наші інженери зв'яжуться і розберуть кейс.

Порівняння: AI vs ручний об'їзд полів

Локальний кейс: господарство 5000 га, кукурудза. До впровадження — об'їзд на квадроциклі раз на тиждень, 5 точок на полі. Після — дрон з мультиспектральною камерою (5 см/піксель), AI аналізує 1 млн точок за годину. Результат: економія добрив 25% (за картами зон), збільшення врожаю на 12% за рахунок своєчасної обробки осередків хвороб.

Параметр Ручний метод AI-аналіз
Час на 100 га 4 години 20 хвилин
Точність оцінки стресу ±0.3 NDVI ±0.05 NDVI
Економія добрив 0% до 30%

Чому AI в 5 разів ефективніший візуального огляду

Людина бачить симптоми, коли рослина вже уражена. AI помічає зміну спектра за 2–3 дні до видимих ознак. Цей час критичний для фунгіцидної обробки — запізнення на 5 днів знижує ефективність на 40%. Наші моделі передбачають спалахи захворювань з точністю 88% за 7 днів.

Ми — команда з 5+ років досвіду в AI для агро, реалізували 40+ проєктів для господарств та агрохолдингів. Гарантуємо якість: кожен проєкт супроводжується SLA за точністю виявлення та часом відповіді API.

Додаткова інформація про калібрування: Для точного NDVI ми використовуємо калібрувальні щити Labsphere та польові спектрорадіометри. Це дозволяє знизити похибку до ±0.02 NDVI.