Prever Ações Humanas

Detalhes
Este projeto foi o projeto nº 3 para a aula de Robótica Centrada no Humano (CSCI473) do Dr. Zhang na Colorado School of Mines durante o semestre da primavera de 2020. Foi projetado para fornecer uma introdução ao aprendizado de máquina em robótica através do uso de Máquinas de Vetor de Suporte (SVM). As entregas/descrição originais do projeto podem ser visualizadas aqui.

Para este projeto, o Conjunto de Dados MSR Daily Activity 3D (Figura 2), com algumas modificações, foi usado. Este conjunto de dados contém 16 atividades humanas coletadas de um sensor Xbox Kinect e armazenadas como esqueletos. Esqueletos são um array de coordenadas do mundo real, (x, y, z), de 20 juntas de um humano registradas em um quadro. Aqui está uma figura que mostra o que é um esqueleto:

Para alcançar a previsão de ações humanas, os dados brutos devem ser representados em uma forma que possa ser processada por um SVM. Para este projeto, as seguintes representações foram usadas:
- Representação de Ângulos Relativos e Distâncias (RAD)
- Representação de Histograma de Diferenças de Posição das Juntas (HJPD)
Para classificação, a(s) representação(ões) são enviadas para um SVM, alimentado por LIBSVM, para criar um modelo que possa prever ações humanas. Dois modelos serão criados, um usando RAD e outro usando HJPD. O objetivo é tornar esses modelos o mais precisos possível e ver qual representação tem o melhor desempenho.
Sabendo disso, aqui está uma visão geral do que o código faz:
- Carregar os dados brutos do conjunto de dados modificado
- Remover quaisquer dados outliers e/ou com erro do conjunto de dados carregado
- Converter os dados brutos finais em representações RAD e HJPD
- As representações são enviadas para SVM(s) ajustados para gerar dois modelos
- Os dois modelos são então alimentados com dados brutos de teste e uma matriz de confusão é gerada para medir como o(s) modelo(s) se desempenharam.
Resultados
Após executar o código e ajustar os modelos ao melhor da minha capacidade, aqui está a matriz de confusão final para ambos os modelos RAD e HJPD:
Representation: RAD
Accuracy: 62.5%
LIBSVM Classification 8.0 10.0 12.0 13.0 15.0 16.0
Actual Activity Number
8.0 8 0 0 0 0 0
10.0 1 5 0 0 1 1
12.0 0 1 1 0 3 3
13.0 0 0 0 6 1 1
15.0 0 0 0 1 5 2
16.0 0 0 0 0 3 5
Representation: HJPD
Accuracy: 70.83%
LIBSVM Classification 8.0 10.0 12.0 13.0 15.0 16.0
Actual Activity Number
8.0 7 1 0 0 0 0
10.0 1 5 0 0 0 2
12.0 0 0 7 0 1 0
13.0 2 0 1 5 0 0
15.0 0 0 0 0 7 1
16.0 0 2 0 0 3 3
Conclusão
Como ambas as precisões estão acima de 50%, este projeto foi um sucesso. Além disso, a representação HJPD parece ser a representação mais precisa para usar nessas classificações. Com isso, há um(s) modelo(s) que prevê(m) ações humanas usando dados de esqueleto. O(s) modelo(s) aqui estão longe de ser perfeitos, mas é melhor do que aleatório. Este projeto foi o que deu origem ao projeto Moving Pose posteriormente.
Notas Adicionais:
- Este projeto foi testado na versão Python 3.8.13
- Para este projeto, o conjunto de dados MDA3 completo e um conjunto de dados MDA3 modificado são usados. O MDA3 modificado contém apenas as atividades 8, 10, 12, 13, 15 e 16. Além disso, a versão modificada possui alguns pontos de dados “corrompidos”, enquanto o conjunto de dados completo não.
- Representação Espaço-Temporal de Pessoas Baseada em Dados Esqueléticos 3D: Uma Revisão
- YouTube: Como o Sensor de Profundidade Kinect Funciona em 2 Minutos
- Medium: Entendendo as Juntas do Kinect V2 & Sistema de Coordenadas
- Página da Wikipedia do Kinect
- Jameco Xbox Kinect
- Informação Sobre SVM(s) & LibSVM: cjlin libsvm, libsvm pypi page, & libsvm github
- Lógica & Documentação do SVM & LIBSVM: cjlin guide paper & cjlin libsvmtools datasets
- Informação Sobre o Conjunto de Dados Usado/Modificado