Fazendo download de Datasets do Kaggle automaticamente no Google Colab e atividade: Pedra, papel ou tesoura

Igor Santos
IEEE CIS UnB
Published in
3 min readNov 6, 2019

Eu não lembro exatamente porque, mas tive um certo problema em fazer isso pela primeira vez. Lembro de ter testado vários códigos que achei online e sempre havia um pedaço que não funcionava. Vou colocar aqui o código que usei, que acabou sendo a junção de outros que fui encontrando, caso alguém esteja tendo o mesmo problema que tive:

A primeira etapa é dar upload de seu arquivo kaggle.json.

from google.colab import files
files.upload()

Depois acesse:

!mkdir -p ~/.kaggle
!cp kaggle.json ~/.kaggle/
!chmod 600 ~/.kaggle/kaggle.json
!ls ~/.kaggle

Depois você pode validar e ver se deu tudo certo:

!ls -l ~/.kaggle
!cat ~/.kaggle/kaggle.json

Crie um diretório para seu Dataset:

!mkdir "NomeDaPasta"

Depois é só fazer o download e dar unzip:

!kaggle datasets download nomecriador/nomedataset -p "/content/NomeDaPasta" --unzip

Para obter seu arquivo kaggle.json, acesse o MyAccount no Kaggle e vá em create new API:

https://www.kaggle.com/<username>/account

O nome do Dataset que aparece no download é o que está no link após Kaggle.com:

~~~~~~~~~~

Para a primeira tarefa escolhi um problema bastante simples: Identificar se o gesto feito com a mão é pedra, papel ou tesoura.

O criador do dataset diz que o montou como hobby para fazer um jogo interativo com a câmera e obteve bons resultados. As imagens são algumas mãos e todas estão em fundo verde, eliminando, assim, bastante ruído de fundo e tornando o problema bem simples.

Amostra de algumas imagens.

Baixei o dataset do Kaggle diretamente no Google Colab e dividi em teste e treino passando um valor para “valid_pct” para a função e com 4 épocas extremamente rápidas consegui uma acurácia ótima acertando 1309 imagens de 1311 da validação.

É possível ver pela matriz de confusão que as duas imagens mal classificadas eram papeis apontados como tesoura e por mais que não seja comum nós humanos confundirmos isso, é bem compreensível que a rede o faça, se os dois primeiros dedos estiverem muito espaçados na representação do papel, gerando uma “tesoura dentro do papel”. Para confirmar essa suspeita fiz um mapa de calor passando “heatmap = True” para a função top_losses:

É bem claro que a rede classificou essas imagens baseada nos dois primeiros dedos e de fato enxergou uma tesoura quando era um papel pelo motivo acima.

Para melhorar o modelo, dei um unfreeze e permiti que ela mudasse pouco das primeiras camadas. Com isso obtive um valor da função custo menor, mas ainda tive duas imagens má classificadas:

A primeira continuou pelo mesmo motivo anterior, mas a segunda foi porque a rede (ironicamente) não verificou os dedos, enxergando parte de um papel, quando na verdade era uma pedra.

--

--