Atividade #636
FechadaObjetivo #623: Criar software para análise estatística dos jogos
Criar VI para desenhar um heatmap no campo
Adicionado por Lucas Germano mais de 6 anos atrás. Atualizado mais de 6 anos atrás.
Descrição
A VI tem o intuito de fazer um heatmap com base nas probabilidades obtidas no programa que o Ricardo irá fazer. A ideia será receber um grid do campo, onde cada quadradinho terá um número associado à probabilidade de o robô estar naquele grid (ou quanto tempo o robô passou por ele durante o jogo). Quanto maior a probabilidade, maior será a cor vermelha naquele ponto. O heatmap é muito comum, por exemplo o heatmap do jogo Brasil x Alemanha:
![](picture12-3.png)
Arquivos
picture12-3.png (316 KB) picture12-3.png | Lucas Germano, 23/03/2018 03:52 h | ||
picture565-1.png (144 KB) picture565-1.png | Lucas Germano, 23/03/2018 04:03 h | ||
picture648-1.png (101 KB) picture648-1.png | Lucas Germano, 23/03/2018 12:55 h | ||
picture41-1.png (12,2 KB) picture41-1.png | Lucas Germano, 25/03/2018 02:38 h | ||
picture317-1.png (33,9 KB) picture317-1.png | Lucas Germano, 27/03/2018 05:51 h | ||
picture317-2.png (59,3 KB) picture317-2.png | Lucas Germano, 27/03/2018 05:51 h | ||
picture848-1.png (24,9 KB) picture848-1.png | Lucas Germano, 27/03/2018 12:25 h | ||
heatmap.csv (137 KB) heatmap.csv | Nicolas Oliveira, 27/03/2018 12:51 h | ||
heatmap.PNG (85,7 KB) heatmap.PNG | Nicolas Oliveira, 27/03/2018 12:59 h | ||
picture906-1.png (44,8 KB) picture906-1.png | Lucas Germano, 27/03/2018 14:20 h | ||
picture164-1.png (73,9 KB) picture164-1.png | Lucas Germano, 27/03/2018 20:31 h | ||
picture352-1.png (40,2 KB) picture352-1.png | Lucas Germano, 13/04/2018 22:00 h | ||
picture352-2.png (40,8 KB) picture352-2.png | Lucas Germano, 13/04/2018 22:00 h | ||
heatmaplog.PNG (7,48 KB) heatmaplog.PNG | Nicolas Oliveira, 16/04/2018 02:27 h | ||
escala.png (14,2 KB) escala.png | Nicolas Oliveira, 16/04/2018 02:29 h | ||
goleiro.png (12,2 KB) goleiro.png | Lucas Germano, 17/04/2018 02:24 h | ||
atacante.png (16,6 KB) atacante.png | Lucas Germano, 17/04/2018 02:24 h | ||
zagueiro.png (12,3 KB) zagueiro.png | Lucas Germano, 17/04/2018 02:25 h |
Atualizado por Lucas Germano há mais de 6 anos
- Atribuído para ajustado para Lucas Germano
- Tarefa mãe ajustado para #623
Atualizado por Lucas Germano há mais de 6 anos
- Arquivo picture565-1.png picture565-1.png adicionado
Outra ideia de heatmap, mas que pode ser de mais fácil implementação é essa:
![](picture565-1.png)
Atualmente estou tendo dificuldades para gerar o heatmap do jogo Brasil x Alemanha, é necessário analisar os pixels do estado atual do campo e fazer uma média ponderada entre eles e a cor que se quer colorir, como uma espécie de transparência, não sei ao certo como fazer isso. Andei pesquisando sobre como fazer isso em LabView, mas acho que essa ideia não é muito utilizada. Pretendo focar na ideia de colorir quadrado por quadrado, como na imagem mostrada acima.
Estou utilizando as VI's que o Luciano fez na tarefa [623](http://redmine.roboime.com.br/issues/623) que são example-gradient.VI e PercentageToRGB.vi
Atualizado por Lucas Germano há mais de 6 anos
- Arquivo picture648-1.png picture648-1.png adicionado
Para essa ideia, é bom dar uma lida nesse link: [Multivarate kernel density estimation](https://en.wikipedia.org/wiki/Multivariate_kernel_density_estimation).
De onde tirei esse mapa, que é parecido com a ideia que quero implementar:
![](picture648-1.png)
Uma ideia complementar seria utilizar esse pseudo-código que fala de uma ideia para células adjacentes influenciarem uma nas outras, como parece ser de fácil implementação, fica para um teste futuro:
```
*for each coord
cell = coord projected to grid
increment cell value
end
for 0 to # of passes
for each row
for each col
if grid[row,col] > 0 then
grid[row,col] += 1
increment_adjacent_cells(row, col)
end
end
end
end*
```
Atualizado por Luciano Barreira há mais de 6 anos
Não seria suficiente usar a probabilidade de um grid do histograma, normalizada pela maior de todas do grid, e usar a VI de porcentagem pra RGB da demo ?
Atualizado por Lucas Germano há mais de 6 anos
Luciano Barreira escreveu:
Não seria suficiente usar a probabilidade de um grid do histograma, normalizada pela maior de todas do grid, e usar a VI de porcentagem pra RGB da demo ?
É suficente pro primeiro protótipo mesmo, e isso vai ser a primeira coisa que vou fazer. Mas estou pesquisando para um projeto mais a longo prazo e também porque gostei do assunto haha
Atualizado por Lucas Germano há mais de 6 anos
- Arquivo picture41-1.png picture41-1.png adicionado
Com base na VI fornecida pelo Luciano, criei uma VI para colorir um retângulo no campo com uma cor desejada. A VI funcionará transformando o campo em um grid e pintando-se o retângulo desejado, para isso, temos que ter como entrada:
- Número de linhas do grid
- Número de colunas do grid
- Linha do retângulo a ser pintado
- Coluna do retângulo a ser pintado
- Cor que se deseja pintar
Aqui está um exemplo de:
- Número de linhas do grid = 20
- Número de colunas do grid = 25
- Linha do retângulo a ser pintado = 5
- Coluna do retângulo a ser pintado = 8
- Cor que se deseja pintar = 0,99
![](picture41-1.png)
Com isso, é só pegar as informações obtidas pela distribuição de probabilidades e pintar o campo com as cores desejadas, de acordo com cada probabilidade.
Atualizado por Nicolas Oliveira há mais de 6 anos
- Data prevista ajustado para 28/03/2018
Acho que assim já está perfeito para o primeiro protótipo, bom trabalho. Sugiro focar na geração dos dados agora.
Atualizado por Luciano Barreira há mais de 6 anos
Lucas Germano escreveu:
Com base na VI fornecida pelo Luciano, criei uma VI para colorir um retângulo no campo com uma cor desejada. A VI funcionará transformando o campo em um grid e pintando-se o retângulo desejado, para isso, temos que ter como entrada:
- Número de linhas do grid
- Número de colunas do grid
- Linha do retângulo a ser pintado
- Coluna do retângulo a ser pintado
- Cor que se deseja pintar
Aqui está um exemplo de:
- Número de linhas do grid = 20
- Número de colunas do grid = 25
- Linha do retângulo a ser pintado = 5
- Coluna do retângulo a ser pintado = 8
- Cor que se deseja pintar = 0,99
![](picture41-1.png)
Com isso, é só pegar as informações obtidas pela distribuição de probabilidades e pintar o campo com as cores desejadas, de acordo com cada probabilidade.
Massa. É preciso tomar cuidado com o mapeamento dos elementos da matriz de probabilidades que será utilizada para colorir esse mapa. Supondo, por exemplo, que esta tenha 9 colunas e 6 linhas, sendo cada elemento i,j da matriz correspondente a um metro quadrado dentro do campo, é preciso que estes quadrados sejam pintados a partir do canto branco do campo, e cada quadrado de nxn pixels mantém uma relação com um metro quadrado do campo. Este n você encontra pelas dimensões da foto. Isso pode ser feito na mão, olhando num editor de imagem onde que o pixel do canto superior esquerdo está e onde o inferior direito está, daí fazer uma razão com as dimensões m,n da matrix e py,px das diferenças em y e x desses pixels. Ou vc pode guardar os primeiro e último pixels brancos na primeira vez que abre a imagem. Só garante que a imagem ta bem dimensionada, eu fiz isso no paint, n deve estar perfeita, mas isso é galho fraco.
Outra coisa que se precisa tomar cuidado é, na hora de rodar o loop da VI estatística, garantir que a imagem está sendo carregada uma vez apenas, antes de entrar no loop principal, em vez de recarregada da memória secundária. Não tenho certeza se o LV já cuida disso, mas é bom garantir. Quando fiz a demo, uma execução da VI demorava para ser processada, acredito que por isso.
Atualizado por Lucas Germano há mais de 6 anos
- Arquivo picture317-1.png picture317-1.png adicionado
- Arquivo picture317-2.png picture317-2.png adicionado
Primeiramente o campo será dividido em um grid n x m. Cada célula desse grid terá um valor de probabilidade que pode variar de 0 a 1 e cada valor real de probabilidade terá sua cor correspondente no heatmap. A VI que cria o heatmap com base em uma matriz de probabilidades está feita. Aqui está uma matriz de probabilidades genérica:
![](picture317-2.png)
E aqui está o campo pintado de acordo com a matriz acima:
![](picture317-1.png)
Atualizado por Lucas Germano há mais de 6 anos
- Situação alterado de Em andamento para Feedback
Atualizado por Nicolas Oliveira há mais de 6 anos
Ficou legal. Poderia postar uma foto com um grid menor pf?
Atualizado por Lucas Germano há mais de 6 anos
- Arquivo picture848-1.png picture848-1.png adicionado
Grid 12x18 e valores aleatórios de probabilidade:
![](picture848-1.png)
Agora que vi que tem um pequeno errinho quando o número de linhas ou colunas do grid não divide o número de pixels, vou ajeitar isto.
Atualizado por Nicolas Oliveira há mais de 6 anos
- Arquivo heatmap.csv heatmap.csv adicionado
- Arquivo heatmap.PNG heatmap.PNG adicionado
Criei aqui no matlab uma matriz de probabilidade que se parece mais com um jogo real. No eixo x é gaussiana e no y exponencial. Segue arquivo .csv e referência de como deve ficar o heatmap:
![](heatmap.PNG)
Atualizado por Lucas Germano há mais de 6 anos
- Arquivo picture906-1.png picture906-1.png adicionado
A função de normalização usada nos dados que o Nicolas mandou foi: (a - v_min)(v_max - v_min) Onde v_min é o mínimo valor da tabela, v_max o máximo valor e "a" é o valor da célula que se quer normalizar.
Com isso, o campo ficará:
![](picture906-1.png)
Atualizado por Luciano Barreira há mais de 6 anos
Lucas Germano escreveu:
A função de normalização usada nos dados que o Nicolas mandou foi: (a - v_min)(v_max - v_min) Onde v_min é o mínimo valor da tabela, v_max o máximo valor e "a" é o valor da célula que se quer normalizar.
Com isso, o campo ficará:![](picture906-1.png)
Quanto tempo demora para executar a VI ?
Atualizado por Lucas Germano há mais de 6 anos
- Arquivo picture164-1.png picture164-1.png adicionado
Para medir o tempo de execução da VI foi usada a seguinte estrutura que utiliza a VI Tick Count e a Flat Sequence:
![](picture164-1.png)
O tempo de execução da VI foi em média 300ms, para um grid 181x121, o que gera aproximadamente 33 FPS. Porém este valor pode ser melhorado se a parte que abre o arquivo .png só for executada 1 vez.
Atualizado por Lucas Germano há mais de 6 anos
- Arquivo picture352-1.png picture352-1.png adicionado
- Arquivo picture352-2.png picture352-2.png adicionado
- Situação alterado de Feedback para Em andamento
Eu e o Nicolas fomos para a IMBEL na quinta e resolvemos um problema quando tentava pintar um certo ponto (x,y) do campo, ele estava pintando outro ponto aleatório por causa de um erro no código.
O intuito agora é procurar uma escala que se encaixe nos propósitos aqui determinados, pois precisamos que não só o ponto que o robô está fique vermelho, mas também os pontos nos quais ele passou.
Supondo que o robô está no ponto (0,0):
![](picture352-1.png)
Ele irá para o ponto (500,0) e após 5 segundos:
![](picture352-2.png)
Ou seja, rapidamente ele perde as informações sobre os pontos nos quais ele esteve. Tenho que achar uma escala agora que se adeque às nossas necessidades. Tal escala deve valorizar mais os pontos pelo qual o robô passou rapidamente, pois os pontos que ele geralmente fica parado, como a zona de defesa para um zagueiro, já irá ser contabilizada muitas vezes e ter uma grande probabilidade.
Atualizado por Luiz Renault Leite Rodrigues há mais de 6 anos
Podem usar escala logarítmica.
Atualizado por Nicolas Oliveira há mais de 6 anos
- Arquivo heatmaplog.PNG heatmaplog.PNG adicionado
- Arquivo escala.png escala.png adicionado
Ajustei a VI para um escala logarítmica. Germano, coloque para a cor começar em um valor mais quente agora, como já havíamos conversado. Coloque para começar mais ou menos aonde está marcado na foto abaixo.
![](escala.png)
Segue heatmap gerado por um atacante chutando repetidamente para gol.
![](heatmaplog.PNG)
Atualizado por Nicolas Oliveira há mais de 6 anos
- Data prevista alterado de 28/03/2018 para 17/04/2018
Gerar protótipo funcional, permitindo a visualização do heatmap de todos os robôs, sendo o map a ser mostrado na tela escolhido pelo id do robô.
Atualizado por Lucas Germano há mais de 6 anos
- Arquivo picture10-1.png adicionado
- Arquivo picture10-2.png adicionado
- Arquivo picture10-3.png adicionado
Aqui está os heatmaps dos robôs para uma simulação feita no grSim (aproximadamente 1 minuto). Agora podemos mudar o ID dos robôs durante a execução do código:
Atualizado por Lucas Germano há mais de 6 anos
- Arquivo picture114-1.png adicionado
- Arquivo picture114-2.png adicionado
- Arquivo picture114-3.png adicionado
Atualizado por Lucas Germano há mais de 6 anos
- Arquivo zagueiro.png adicionado
- Arquivo atacante.png adicionado
- Arquivo goleiro.png adicionado
Atualizado por Lucas Germano há mais de 6 anos
- Arquivo excluído (
picture114-3.png)
Atualizado por Lucas Germano há mais de 6 anos
- Arquivo excluído (
picture114-2.png)
Atualizado por Lucas Germano há mais de 6 anos
- Arquivo excluído (
picture114-1.png)
Atualizado por Lucas Germano há mais de 6 anos
- Arquivo excluído (
picture10-3.png)
Atualizado por Lucas Germano há mais de 6 anos
- Arquivo excluído (
picture10-2.png)
Atualizado por Lucas Germano há mais de 6 anos
- Arquivo excluído (
picture10-1.png)
Atualizado por Lucas Germano há mais de 6 anos
- Arquivo goleiro.png goleiro.png adicionado
- Arquivo atacante.png atacante.png adicionado
- Arquivo zagueiro.png zagueiro.png adicionado
Goleiro:
![](goleiro.png)
Atacante:
![](atacante.png)
Zagueiro:
![](zagueiro.png)
Atualizado por Lucas Germano há mais de 6 anos
Falta testar com um log de um jogo inteiro, para ver como o software se comporta.
Atualizado por Luciano Barreira há mais de 6 anos
- Versão ajustado para RoboCup 2018
Atualizado por Lucas Germano há mais de 6 anos
- Situação alterado de Em andamento para Feedback
Algo mais a ser feito por enquanto?
Atualizado por Nicolas Oliveira há mais de 6 anos
- Situação alterado de Feedback para Resolvida
Por mim ta ok.
Atualizado por Lucas Germano há mais de 6 anos
- Situação alterado de Resolvida para Fechada
O heatmap se mostrou bastante demonstrativo em alguns exemplos rápidos de partida que fizemos. Pensaremos em algum jeito de implementar isso na inteligência futuramente.