Quando você precisa de melhores resultados do que satisfatórios
Parte 1
Parte 2

A transição da zona do inverno para o verão é composta por imagens do Sentinel-2. Você pode notar algumas diferenças nos tipos de cobertura na neve, descritas em um artigo anterior.
Prefácio
As duas últimas semanas foram muito difíceis. Publicamos a primeira e a segunda partes de nossos artigos sobre a classificação da capa em todo o país, usando a estrutura eo-learn
. eo-learn
é uma biblioteca de código aberto para criar uma camada entre o recebimento e o processamento de imagens de satélite e o aprendizado de máquina. Nos artigos anteriores dos exemplos, indicamos apenas um pequeno subconjunto dos dados e mostramos os resultados apenas em uma pequena porcentagem de toda a área de interesse (AOI - área de interesse). Eu sei que isso parece pelo menos não muito impressionante, e talvez muito rude da nossa parte. Todo esse tempo você foi atormentado por questões de como você pode usar esse conhecimento e transferi-lo para o próximo nível.
Não se preocupe, é para isso que serve o terceiro artigo desta série! Pegue uma xícara de café e sente-se ...
Todos os nossos dados pertencem a você!
Você já está sentado? Talvez deixe o café na mesa por mais um segundo, porque agora você ouvirá as melhores notícias de hoje ...
Na Sinergise, decidimos publicar o conjunto completo de dados para a Eslovênia para 2017. De graça. Você pode acessar livremente 200 GB de dados na forma de ~ 300 fragmentos de EOPatch, cada um aproximadamente do tamanho de 1000x1000, em uma resolução de 10m! Você pode ler mais sobre o formato EOPatch na última postagem sobre o eo-learn
, mas, na verdade, é um contêiner para dados geo-temporais de EO (Observação da Terra) e não-EO: por exemplo, imagens de satélite, máscaras, mapas etc.

Estrutura do EOPatch )
Não invadimos quando baixamos esses dados. Cada EOPatch contém imagens do Sentinel-2 L1C, a máscara s2cloudless correspondente e o mapa oficial da cobertura terrestre em formato raster!
Os dados são armazenados no AWS S3 em: http://eo-learn.sentinel-hub.com/
Desserializar um objeto EOPatch é bastante simples:
EOPatch.load('path_to_eopatches/eopatch-0x6/')
Como resultado, você obtém um objeto da seguinte estrutura:
EOPatch( data: { BANDS: numpy.ndarray(shape=(80, 1010, 999, 6), dtype=float32) } mask: { CLM: numpy.ndarray(shape=(80, 1010, 999, 1), dtype=uint8) IS_DATA: numpy.ndarray(shape=(80, 1010, 999, 1), dtype=uint8) IS_VALID: numpy.ndarray(shape=(80, 1010, 999, 1), dtype=bool) } mask_timeless: { LULC: numpy.ndarray(shape=(1010, 999, 1), dtype=uint8) VALID_COUNT: numpy.ndarray(shape=(1010, 999, 1), dtype=int64) } meta_info: { maxcc: 0.8 service_type: 'wcs' size_x: '10m' size_y: '10m' time_difference: datetime.timedelta(-1, 86399) time_interval: (datetime.datetime(2017, 1, 1, 0, 0), datetime.datetime(2017, 12, 31, 0, 0)) } bbox: BBox(((370230.5261411405, 5085303.344972428), (380225.31836121203, 5095400.767924464)), crs=EPSG:32633) timestamp: [datetime.datetime(2017, 1, 1, 10, 4, 7), ..., datetime.datetime(2017, 12, 25, 10, 15, 32)], length=80 )
O acesso aos vários atributos do EOPatch é o seguinte:
eopatch.timestamp eopatch.mask['LULC'] eopatch.data['CLM'][0] eopatch.data['BANDS'][5][..., [3, 2, 1]]
Pedido EOExecute 66
Ótimo, os dados estão carregando. Enquanto aguardamos a conclusão desse processo, vamos dar uma olhada nos recursos de uma classe que ainda não foi discutida nesses artigos - EOExecutor
. Este módulo está envolvido na execução e no monitoramento do pipeline e permite que o multi-threading seja usado sem esforços desnecessários. Chega de pesquisas no Stack Overflow sobre como paralelizar o pipeline corretamente ou como fazer a barra de progresso funcionar nesse modo - já fizemos tudo por você!
Além disso, ele lida com os erros que ocorrem e pode gerar um breve resumo do processo de execução. Este último é o momento mais importante para garantir a repetibilidade dos seus resultados no futuro, para que o usuário não precise gastar um tempo precioso de trabalho procurando parâmetros que ele usou na última quinta-feira às 9 horas, após uma noite inteira de folia (não misture álcool e programação). vale a pena!). Essa classe também pode gerar um bom gráfico de dependência para o pipeline, que você pode mostrar ao seu chefe!

Gráfico de dependência de pipeline gerado pelo eo-learn
Experiências de aprendizado de máquina
Conforme prometido, este artigo tem como objetivo principal estudar diferentes modelos com o eo-learn
usando os dados que fornecemos. Abaixo, preparamos dois experimentos onde estudamos o efeito das nuvens e diferentes algoritmos de reamostragem durante a interpolação temporal no resultado final. Depois de tudo isso, começaremos a trabalhar com redes de convolução (CNN) e compararemos os resultados de duas abordagens - análise pixel por pixel da árvore de decisão e aprendizado profundo usando redes neurais convolucionais.
Infelizmente, não se pode dar uma resposta inequívoca a respeito de quais decisões devem ser tomadas durante os experimentos. Você pode estudar a área de assunto mais profundamente e fazer suposições para decidir se o jogo vale a pena, mas, no final das contas, o trabalho continuará sendo por tentativa e erro.
Brinque com as nuvens
As nuvens são uma grande dor no mundo da EO, especialmente quando se trata de algoritmos de aprendizado de máquina, onde você deseja determiná-las e removê-las do conjunto de dados para interpolação com base nos valores ausentes. Mas qual é o tamanho do benefício desse procedimento? Vale a pena? Rußwurm e Körner, em seu artigo Classificação multitemporal de cobertura da terra com codificadores recorrentes sequenciais, até mostraram que, para aprendizado profundo, o processo de filtragem de nuvens é provavelmente absolutamente sem importância, pois o próprio classificador é capaz de detectar nuvens e ignorá-las.

Ativação da camada de entrada (superior) e da camada de modulação (inferior) na sequência de imagens de um fragmento específico para uma rede neural. Você pode perceber que esse fragmento de rede aprendeu a criar máscaras na nuvem e filtrar os resultados obtidos. (Página 9 em https://www.researchgate.net/publication/322975904_Multi-Temporal_Land_Cover_Classification_with_Sequential_Recurrent_Encoders )
Recordamos brevemente a estrutura da etapa de filtragem de dados (para detalhes, consulte [artigo anterior] ()). Depois de tirar os instantâneos do Sentinel-2, começamos a filtrar os instantâneos da nuvem. Todas as imagens nas quais o número de pixels não nublados não exceda 80% estão sujeitas a triagem (os valores limite podem diferir para diferentes áreas de interesse). Depois disso, para obter valores de pixel em dias arbitrários, máscaras de nuvem são usadas para não levar esses dados em consideração.
No total, são possíveis quatro comportamentos:
- com filtro de imagem, com máscaras de nuvem
- sem filtro de instantâneo, dadas máscaras de nuvem
- com filtro de imagem, excluindo máscaras de nuvens
- sem filtro de imagem, sem incluir máscaras de nuvem

Exibição visual da pilha de imagens do satélite Sentinel-2. Pixels transparentes à esquerda significam pixels ausentes devido à cobertura de nuvens. A pilha central mostra os valores de pixel após filtrar as imagens e interpolá-las com uma máscara de nuvem (Caso 4), e a pilha à direita mostra o resultado da interpolação no caso sem filtrar as imagens e sem máscaras de nuvem (1). (Note lane - aparentemente, o artigo contém um erro de digitação, e foi o contrário - caso 1 no centro e 4 à direita).
No último artigo, já executamos uma variação do caso 1 e mostramos os resultados, por isso vamos usá-los para comparação. Preparar outros transportadores e treinar o modelo parece uma tarefa simples - você só precisa ter certeza de que estamos comparando os valores corretos. Para fazer isso, basta usar o mesmo conjunto de pixels para treinar e validar o modelo.
Os resultados são mostrados na tabela abaixo. Você pode ver que, em geral, a influência das nuvens no resultado do modelo é bastante baixa! Isso pode ser devido ao fato de o cartão de referência ser de muito boa qualidade e o modelo poder ignorar a maioria das imagens. De qualquer forma, esse comportamento não pode ser garantido por nenhuma AOI, portanto, dedique um tempo para dar esse passo fora de seus modelos!
O impacto de diferentes abordagens de reamostragem
A escolha das opções de reamostragem temporal não é óbvia. Por um lado, precisamos de uma matriz detalhada de imagens que mostre bem os detalhes das imagens de origem - queremos incluir o número mais próximo possível de imagens nos dados de origem. Por outro lado, estamos limitados por recursos de computação. A redução da etapa de reamostragem dobra o número de quadros após a interpolação e, portanto, aumenta o número de atributos usados no treinamento. Essa melhoria vale o custo dos recursos? É isso que temos que descobrir.
Para este experimento, usaremos a variação 1 da etapa anterior. Após a interpolação, fazemos uma nova amostra com as seguintes variações:
- Reamostragem uniforme com um intervalo de 16 dias
- Reamostragem uniforme com um intervalo de 8 dias
- Na escolha das "melhores" datas, o número coincide com o caso 2.
A amostra no caso 3 é baseada no maior número de datas comuns para todo o EOPatch na AOI selecionada

O gráfico mostra o número de fragmentos do EOPatch que contêm dados para cada dia de 2017 (azul). As linhas vermelhas mostram as datas ideais para a reamostragem, que são baseadas nas datas das imagens do Sentinel-2 para a AOI de 2017.
Observando a tabela abaixo, você pode ver que os resultados não são muito impressionantes, como na experiência anterior. Nos casos 2 e 3, a quantidade de tempo gasto dobra, mas a diferença com a abordagem inicial é menor que 1%. Essas melhorias são muito discretas para uso prático, para que possamos considerar o intervalo de 16 dias adequado para a tarefa.
Resultados de precisão geral e F1 ponderada para diferentes tubulações com uma alteração na abordagem da reamostragem.
Aprendizagem Profunda: Usando a Rede Neural Convolucional (CNN)
O aprendizado profundo tornou-se a abordagem padrão para muitas tarefas, como visão computacional, processamento de palavras em linguagem natural e processamento de sinais. Isso se deve à sua capacidade de extrair padrões de entradas multidimensionais complexas. Abordagens clássicas de aprendizado de máquina (como árvores de decisão) têm sido usadas em muitas tarefas de dados geográficos temporais. Redes convolucionais, por outro lado, foram usadas para analisar a correlação espacial entre imagens adjacentes. Basicamente, seu uso foi limitado ao trabalho com imagens únicas.
Queríamos estudar a arquitetura de modelos de aprendizagem profunda e tentar escolher uma que seja capaz de analisar os aspectos espaciais e temporais dos dados de satélite ao mesmo tempo.
Para fazer isso, usamos o Netvork Totalmente Convolucional Temporal, TFCN, ou melhor, a extensão temporal para o U-Net, implementada no TensorFlow. Mais especificamente, a arquitetura usa correlações espaço-temporais para melhorar o resultado. Uma vantagem adicional é que a estrutura da rede permite representar melhor as relações espaciais em diferentes escalas, graças ao processo de codificação / decodificação no U-net. Como nos modelos clássicos, na saída obtemos uma matriz bidimensional de rótulos, que compararemos com a verdade.

Utilizamos o modelo treinado para prever as notas no conjunto de testes, e os valores obtidos foram verificados com a verdade. No geral, a precisão foi de 84,4% e a F1 foi de 85,4%.

Comparação de diferentes previsões para nossa tarefa. Imagem visual (canto superior esquerdo), mapa de referência verdadeiro (canto superior direito), previsão do modelo LightGBM (canto inferior esquerdo) e previsão de rede U (canto inferior direito)
Esses resultados mostram apenas o trabalho inicial desse protótipo, que não é altamente otimizado para a tarefa atual. Apesar disso, os resultados concordam com algumas estatísticas obtidas na região. Para liberar o potencial de uma rede neural, é necessário otimizar a arquitetura (conjunto de atributos, profundidade da rede, número de circunvoluções), além de definir hiper parâmetros (velocidade de aprendizado, número de épocas, ponderação de classe). Esperamos nos aprofundar ainda mais neste tópico (ha ha) e planejamos distribuir nosso código quando ele estiver de uma forma aceitável.
Outras experiências
Você pode encontrar várias maneiras de melhorar seus resultados atuais, mas não podemos resolver nem experimentar todos eles. É nesse momento que você aparece em cena! Mostre o que você pode fazer com esse conjunto de dados e ajude-nos a melhorar os resultados!
Por exemplo, em um futuro próximo, um de nossos colegas participará da classificação da capa com base na pilha temporal de imagens individuais usando redes de convolução. A ideia é que algumas superfícies, por exemplo, artificiais, possam ser distinguidas sem características temporais - bastante espaciais. Ficaremos felizes em escrever um artigo separado quando este trabalho levar a resultados!
Do tradutor
Infelizmente, a próxima parte desta série de artigos não foi publicada, o que significa que os autores não mostraram exemplos de código fonte na criação da U-Net. Como alternativa, posso oferecer as seguintes fontes:
- U-Net: Redes Convolucionais para Segmentação de Imagem Biomédica - Olaf Ronneberger, Philipp Fischer, Thomas Brox é um dos artigos básicos sobre arquitetura de U-Net que não envolve dados temporais.
- https://eo-learn.readthedocs.io/en/latest/examples/land-cover-map/SI_LULC_pipeline.html - A página de documentação do eo-learn, onde (possivelmente) está localizada uma versão mais recente dos pipelines de 1,2 partes.
- https://github.com/divamgupta/image-segmentation-keras - Um repositório com várias redes implementadas usando keras. Eu tenho algumas perguntas sobre implementações (elas são um pouco diferentes das descritas nos artigos originais), mas, em geral, as soluções são facilmente adaptadas para fins pessoais e estão funcionando.