AgroNDVI – постановка задачи
Контекст и цель
Пет-проект по ML/геоданным. Цель трудоустройства – ML/DS-команды в банковском агро-сегменте (РСХБ-Цифровые решения, Сбер для агробизнеса, Совкомбанк Страхование), агрохолдинги, агростраховые компании, геотех-стартапы (ExactFarming, OneSoil, Геомир).
Проект расширяет портфолио после MiniProctor (CV-прокторинг) в сторону:
- работы со спутниковыми данными (Sentinel-2);
- геопространственных библиотек (rasterio, geopandas, folium);
- time-series ML (LightGBM с лагами);
- доменной специфики агро.
Исходные вводные
- Цель: портфолио/резюме, не коммерческий продукт.
- Срок: 7-10 дней плотной работы.
- Глубина: работающий pipeline + UI с интерактивной картой + метрики на исторических данных. Прод-сервиса не делаем.
- Стоимость: ноль рублей. Все данные открытые, инфраструктура локальная.
Проект: AgroNDVI – спутниковый прогноз продуктивности полей
Что делает:
- Скачивает мультиспектральные снимки Sentinel-2 (10 м/px, каждые 5 дней) над выбранным регионом.
- Считает индекс вегетации NDVI по каждому пикселю.
- Усредняет NDVI по границам конкретных полей (shapefile или нарисованные вручную).
- Строит time-series NDVI по сезону для каждого поля.
- Скачивает погоду из Open Meteo и историческую урожайность из Росстат.
- Обучает LightGBM на исторических данных для прогноза урожайности.
- Детектирует аномальные поля – те, где NDVI уходит ниже исторического коридора.
- Streamlit-приложение с интерактивной картой полей, раскрашенных по предсказанной урожайности.
Технологический стек
- Геоданные:
rasterio(чтение Sentinel-tile),geopandas+shapely(геометрия полей),pyproj(проекции),folium(интерактивная карта). - ML:
lightgbmдля регрессии, классические time-series feature engineering (лаги, скользящие средние, GDD). - Numerics:
numpy,pandas. - UI:
streamlit+foliumдля карты,plotlyдля графиков. - Источники данных (бесплатные):
- Sentinel-2 L2A через AWS S3 (
sentinel-s2-l2arequester pays, копейки за tile); - Open Meteo Historical API – без ключа;
- NASA POWER – солнечная радиация, GDD;
- Росстат – исторические урожайности по регионам в открытых данных;
- OpenStreetMap – подложка и границы.
- Sentinel-2 L2A через AWS S3 (
Что показать в портфолио
- Интерактивная карта 30-100 полей одного района Краснодарского края, раскрашенных по предсказанной урожайности (зелёный – хорошо, жёлтый – средне, красный – тревожно).
- Клик на поле → справа: timeline NDVI текущего сезона vs медиана за 5 лет, погода, прогноз ц/га, объяснение «осадки на 40% ниже нормы во второй декаде июня».
- Сводная таблица метрик: MAPE прогноза урожайности на отложенном годе, precision/recall аномалия-детектора, FPS обработки.
- README с архитектурой (C4-диаграммы через Mermaid, как в MiniProctor), описание источников данных, ограничений.
- Раздел «что дальше»: crop classification через CNN на multispectral, U-Net для автодетекции границ полей, super-resolution Sentinel → Planet.
План на 7-10 дней
| День | Задачи |
|---|---|
| 1 | Окружение, venv. Регистрация на Copernicus или настройка AWS-доступа. Скачиваем тестовый Sentinel-2 tile над Краснодарским краем за июль. Учимся читать через rasterio. |
| 2 | Считаем NDVI = (B8 - B4) / (B8 + B4) для каждого пикселя. Визуализация: серый снимок vs цветная NDVI-маска (red-yellow-green). |
| 3 | Загружаем shapefile с границами 3-5 тестовых полей (либо рисуем вручную в QGIS / folium). Усредняем NDVI по полю, сохраняем в pandas DataFrame. |
| 4 | Скачиваем серию tile за сезон апрель-октябрь (10-15 снимков), строим time-series NDVI по каждому полю. Визуализация классической «горбатой» кривой роста культуры. |
| 5 | Качаем погоду из Open Meteo + историческую урожайность Росстата по региону. Feature engineering: средний NDVI пика, длительность вегетации, кумулятивная сумма осадков, GDD. |
| 6 | Train LightGBM на 3-5 лет истории, регрессия на ц/га. Backtest на отложенном годе, метрика MAPE. |
| 7 | Аномалия-детектор: поля, где NDVI в этом сезоне идёт ниже исторического коридора для культуры. Простой algoritm на percentiles или isolation forest. |
| 8 | Streamlit UI: карта с folium, поля раскрашены по предсказанной урожайности, по клику – timeline NDVI + сравнение с прошлыми годами + прогноз. |
| 9 | README, docs/architecture.md, метрики, скрипт record_demo.py или подобный для демонстрации работы pipeline. |
| 10 | Заливка на GitHub под аккаунтом EValentyuk, англоязычный README (если хватит сил), пост в TenChat/LinkedIn с акцентом на агро-домен. |
Почему это сильно для найма в банковский агро-сегмент
- Домен один в один с задачами РСХБ-ЦР, Сбера для агро, Совкомбанк Страхования.
- Стек редкий:
rasterio+geopandas– мало кто из ML-инженеров их знает, это сразу выделяет резюме. - Time-series ML – классика, недооцененная на фоне хайпа LLM, но в банке это хлеб.
- Бизнес-смысл очевиден: «вот этим 4 полям нужно дополнительное внимание» – agronomist это понимает без объяснений.
Риски и страховки
- Доступ к Sentinel-2. Регистрация на Copernicus может занять день. Альтернатива – AWS S3 без регистрации, чуть сложнее с авторизацией. Страховка: пробуем оба, выбираем рабочий.
- Объём данных. Один Sentinel-tile 100x100 км это 1-2 ГБ. На сезон 10-15 tile = 15-30 ГБ. Страховка: брать crop bounds сразу при скачивании (по shapefile полей), не качать весь tile.
- Облачность. На некоторые даты снимки могут быть полностью в облаках. Страховка: использовать L2A с маской облачности, фильтровать снимки с >30% облаков.
- Размеченные поля. Открытых датасетов с границами российских полей мало. Страховка: рисуем 5-10 тестовых полей вручную, для MVP хватит. EuroCrops содержит несколько российских регионов.
- Урожайность из Росстата. Данные на уровне района или области, не поля. Страховка: используем районный уровень, прогнозируем среднюю урожайность по району, валидируем по аномалиям отдельных полей.
- Время. 7-10 дней – плотно. Страховка: MVP уже на дне 5-6 (без UI), UI – бонус. Если что-то идёт не так, режем scope.
Открытые вопросы к обсуждению перед стартом
- Регион полигона. Краснодарский край (много данных по урожайности, хорошее покрытие Sentinel, тёплый климат с длинным сезоном)? Ставрополье? Воронежская? Личные предпочтения нет, иду по техническим соображениям – скорее Краснодар.
- Культура. Озимая пшеница – самая массовая, много исторических данных. Кукуруза, подсолнух – интересные альтернативы. Начинаем с озимой пшеницы.
- Размеченные границы полей. Используем OpenStreetMap-полигоны (есть для большинства полей в РФ), либо EuroCrops, либо рисуем вручную 5-10 тестовых. Решение по факту того, что найдём.
- Артефакты обучения. Локально или GitHub Releases. По образцу MiniProctor – локально, GitHub только для финальных весов в Releases.
- Англоязычный README. Сразу или после русского. По образцу MiniProctor – после русского, в день заливки.
Глоссарий
Раздел для тех, кто открывает проект впервые. Все термины, которые встречаются дальше в коде, документации и логах.
Аббревиатуры и термины
| Термин | Расшифровка | Что значит |
|---|---|---|
| AgroNDVI | Agro + NDVI | Авторское название проекта. Не отраслевой термин, а заголовок этой папки. Указывает на ядро системы: классический индекс NDVI применённый к агро. |
| NDVI | Normalized Difference Vegetation Index | Нормализованный индекс растительности, базовая метрика дистанционного зондирования. Подробнее в разделе ниже. |
| Sentinel-2 | – | Группа из двух спутников ESA (S2A, S2B). Снимают одну и ту же точку Земли каждые 5 дней в 13 спектральных полосах. Разрешение 10/20/60 м/px. Бесплатно. |
| L2A | Level-2A | Уровень обработки Sentinel-2 – атмосферно скорректированный, готовый к расчёту индексов. Альтернатива L1C – без коррекции, требует допобработки. |
| B04, B08 | Band 04, Band 08 | Спектральные полосы Sentinel-2. B04 – красная (665 нм), B08 – ближний инфракрасный (842 нм), обе с разрешением 10 м/px. |
| SCL | Scene Classification Layer | Маска пиксельных классов в L2A: 4 = вегетация, 5 = голая земля, 6 = вода, 8/9 = облака, 10 = тонкий cirrus, 11 = снег. Используем для отсеивания мусора. |
| NIR | Near Infrared | Ближний инфракрасный диапазон. В Sentinel-2 – полоса B08. Растения активно отражают NIR, голая земля и вода – нет. |
| MGRS | Military Grid Reference System | Сетка, которой Sentinel-2 нарезает Землю. Каждый tile – квадрат 110×110 км с буквенно-цифровым ID, например 37TDK для юго-запада Кубани. |
| COG | Cloud Optimized GeoTIFF | Формат GeoTIFF с встроенными пирамидами и блочной структурой. Позволяет читать удалённо через HTTP-range без скачивания всего файла. |
| STAC | SpatioTemporal Asset Catalog | Открытый стандарт каталогизации геоданных. AWS Element 84 STAC API раздаёт каталог Sentinel-2 L2A бесплатно. |
| .SAFE | Standard Archive Format for Europe | Формат «коробки» Sentinel: папка с XML-метаданными и JP2-файлами всех полос. Альтернатива COG, используется Copernicus. |
| GDAL | Geospatial Data Abstraction Library | C-библиотека номер один для геоданных. rasterio – её Python-обёртка. |
| CRS | Coordinate Reference System | Система координат. WGS84 (EPSG:4326) – глобальная градусная сетка. UTM (например EPSG:32637 для зоны 37N) – метрическая, локальная, удобна для расчётов площадей. |
| GDD | Growing Degree Days | Сумма эффективных температур за период. Агрономический показатель развития культуры: пшенице нужно ~2000 GDD от посева до жатвы. |
| MAPE | Mean Absolute Percentage Error | Метрика регрессии: средняя по модулю относительная ошибка в процентах. Для прогноза урожайности 15-20% – норма для индустрии. |
| U-Net | – | Архитектура свёрточной сети для семантической сегментации. Возможный второй этап проекта: автодетекция границ полей по снимкам. В MVP не используется. |
NDVI подробнее
Формула:
NDVI = (NIR - Red) / (NIR + Red) = (B08 - B04) / (B08 + B04)
Физика, почему работает: хлорофилл поглощает красный свет (665 нм) ради фотосинтеза, а клеточная структура листа отражает ближний инфракрасный (842 нм), чтобы не перегреться. Чем активнее фотосинтез – тем сильнее этот контраст. Деление на сумму нормализует значение в диапазон [-1, +1] и убирает зависимость от яркости освещения и угла солнца.
Шкала интерпретации:
| NDVI | Что это |
|---|---|
| 0.7 - 0.9 | густой лес, пшеница в колошении, пик вегетации |
| 0.4 - 0.7 | здоровая культура в развитии |
| 0.2 - 0.4 | разреженная растительность, ранняя стадия, усыхающие посевы |
| 0.0 - 0.2 | голая земля, песок, скошенное поле |
| -0.3 - 0.0 | вода, снег |
| -1.0 - -0.3 | облака, искусственные поверхности |
Зачем нам time-series NDVI: один снимок – это срез. Серия снимков за сезон даёт характерную кривую развития культуры. У озимой пшеницы кривая двугорбая: осенние всходы → зимний минимум 0.2 → весенний пик 0.8 в мае-июне → жатва в июле, провал к 0.1. По форме этой кривой и сопутствующей погоде LightGBM учится предсказывать урожайность ц/га.
Источники данных проекта
| Источник | Что даёт | Доступ |
|---|---|---|
AWS Element 84 STAC + bucket sentinel-cogs |
Sentinel-2 L2A в формате COG | бесплатно, без регистрации, удалённое чтение |
| Copernicus Data Space | Sentinel-2 L2A в формате .SAFE | заблокирован для российских IP (санкции) |
| Microsoft Planetary Computer | Sentinel-2 L2A, STAC | бесплатно, fallback на случай отказа Element 84 |
| Open Meteo Historical API | температура, осадки, влажность, ветер | бесплатно, без ключа |
| NASA POWER | солнечная радиация, GDD | бесплатно, без ключа |
| Росстат | урожайности по районам РФ | открытые данные, ручной парсинг |
| OpenStreetMap | подложка карты, иногда границы полей (landuse=farmland) |
бесплатно, через folium или Overpass API |
| QGIS / geojson.io | ручная отрисовка тестовых границ полей | локальное использование |
| EuroCrops | европейские размеченные поля | мало российских регионов, fallback |