Разработка AI для сельского хозяйства: анализ снимков посевов
Клиент приходит с сырыми снимками с дрона и просьбой «сделать NDVI». Мы смотрим на histograms — 80% значений в диапазоне 0.2–0.4, но поле визуально зелёное. Проблема: неверная калибровка мультиспектральной камеры. Без учёта параметров съёмки (высота, угол солнца, влажность) NDVI — мусор. Наш опыт показывает: дообучаем модели на ваших полях и экономим до 30% на удобрениях за счёт точных зональных карт. За сезон на 5000 га экономия удобрений составила $11k–16k. Свяжитесь с нами для оценки вашего проекта — мы проанализируем данные за 2 дня.
Какие проблемы решаем
Неверный расчёт 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 Процесс работы под ключ
- Аудит данных — проверка качества снимков, калибровочных коэффициентов, метаданных.
- Прототипирование — выбираем архитектуру (YOLOv8, EfficientNet, U-Net), настраиваем гиперпараметры.
- Обучение — используем PyTorch + Hugging Face Datasets, трекинг в W&B, распределённое обучение на 4×A100.
- Валидация на поле — сравниваем с ручными замерами хлорофилла (SPAD-502) и биомассы.
- Деплой — Triton Inference Server, API на FastAPI, интеграция через MQTT для дронов.
- Поддержка — дообучение на новых культурах, мониторинг дрейфа модели.
Сроки и что входит
| Масштаб | Срок |
|---|---|
| Пилот: 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% за счёт своевременной обработки очагов болезней. Экономия за сезон — более $11k–16k.
| Параметр | Ручной метод | 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.







