Avaliação da pose humana
Há alguns meses, me deparei com um projeto interessante de código aberto na Internet - o Openpose, cujo objetivo é estimar uma pose humana em tempo real em um fluxo de vídeo. Devido às minhas atividades profissionais, eu estava interessado em executá-lo no dispositivo iOS mais recente da Apple para verificar o desempenho e descobrir se é possível. Também foi interessante ver como o desempenho da estrutura de rede neural para iOS foi alterado nos últimos anos.
O projeto Openpose original é escrito em C ++ e não usa o CoreML - a estrutura de rede neural no iOS. Portanto, tive que reescrever uma parte principal do Swift e usar o CoreML para fazer o trabalho de conclusão. Vamos dar uma olhada na seguinte imagem de como o corpo humano é representado:

Mais informações sobre o modelo de pose humana podem ser encontradas aqui: MPI-pose
O resultado é mostrado na imagem abaixo:
Preparando o modelo
Para começar a usar a estrutura, é necessário criar um modelo Core ML. Este modelo é baseado em um do projeto de posição aberta . Para preparar um modelo, execute as seguintes etapas:
1) Instale as ferramentas Python e CoreML
2) Execute models / getModels.sh no Open Pose para obter os modelos openpose originais
3) Copie modelos / pose / mpi / pose_deploy_linevec_faster_4_stages.prototxt para modelos / pose / mpi / pose_deploy_linevec_faster_4_stages_fixed_size.prototxt
4) Altere o seguinte no arquivo pose_deploy_linevec_faster_4_stages_fixed_size.prototxt:
input_dim: 1 # This value will be defined at runtime -> input_dim: 512 input_dim: 1 # This value will be defined at runtime -> input_dim: 512
5) Crie um link para o diretório de modelos. Vamos supor que o projeto de estrutura pose e o projeto openpose estejam no diretório inicial, então um comando para criar um link seria o seguinte:
ln -s ~/openpose/models ~/models
6) Vá para ~ / pose / pose / CoreMLModels e execute o seguinte comando:
python convertModel.py
O script acima mencionado contém valores codificados no arquivo pose_deploy_linevec_faster_4_stages_fixed_size.prototxt e no arquivo de modelo pose_iter_160000.caffemodel.
Eles podem ser alterados para outro modelo, mas não esqueça de alterar o arquivo .prototxt para ter um tamanho fixo da imagem de entrada:
input_dim: XXX - corresponde ao da entrada NN.
input_dim: XXX - corresponde à altura da entrada NN.
Também não se esqueça de alterar a configuração do modelo PoseModelConfigurationMPI15.inputSize para um valor de entrada especificado e use essa configuração em vez de uma existente na estrutura que define 512x512 como um tamanho de entrada.
Quaisquer valores funcionarão, mas os melhores resultados poderão ser alcançados se uma proporção corresponder à que a imagem original possui. Além disso, deve-se levar em consideração que valores maiores afetarão significativamente o desempenho, o que é mostrado na seção Desempenho.
Detalhes da saída da rede neural
Vamos dar uma olhada na saída do NN. A saída do modelo MPI15 é um grupo de matrizes com dimensões (input_image_width / 8, input_image_height / 8)
. Cada elemento na matriz tem tipo de flutuação. Mapeamento entre o índice da matriz na saída e a parte do corpo:
POSE_MPI_BODY_PARTS { {0, "Head"}, {1, "Neck"}, {2, "RShoulder"}, {3, "RElbow"}, {4, "RWrist"}, {5, "LShoulder"}, {6, "LElbow"}, {7, "LWrist"}, {8, "RHip"}, {9, "RKnee"}, {10, "RAnkle"}, {11, "LHip"}, {12, "LKnee"}, {13, "LAnkle"}, {14, "Chest"}, {15, "Background"} };
Como cada matriz tem um tamanho fixo acessando um determinado, é uma leitura trifial por operação de deslocamento: [Background] = NNOutput [sizeOfTheMatrix * 15]
Mapas de calor e PAFs
Existem dois tipos de matrizes de saída no modelo MPI15. Os que representam mapas de calor e os outros que representam PAFs. Cada matriz de calor corresponde a uma parte da junta que é de 15 no total. As matrizes do PAF representam conexões do corpo. Para cada conexão do corpo, existe uma matriz X e Y que é 28 no total (14 + 14). A quantidade total de matrizes, incluindo uma de fundo, é 44.
Projeto de demonstração
O repositório do projeto também contém um projeto de demonstração 'poseDemo' que demonstra o uso da estrutura. As matrizes de resultados NN para uma imagem de entrada específica são mostradas abaixo:
O projeto da meta seria inútil sem medições de desempenho. É claramente visto nos resultados abaixo que a Apple fez um tremendo aumento no desempenho do mecanismo NN nos últimos modelos. Além disso, de acordo com as previsões do analista, a Apple tornará o hardware NN ainda mais rápido no próximo iPhone. Os resultados das medições de desempenho são mostrados abaixo:
Hora de processar um quadro (1-2 pessoas na exibição)
Vale ressaltar que todos os números mostrados acima podem variar para cada execução específica. Suponho que isso esteja acontecendo por causa da otimização interna do CoreML.
Fontes de código
O link para o repositório GitHub: Clique para verificar
Aplicações
É importante notar que todos os aplicativos mencionados abaixo saíram da cabeça e não foram confirmados oficialmente pela Apple ou por alguma autoridade.
Saúde
1) Detecção de anomalias na coluna vertebral humana em imagens estáticas:

2) Guia de saúde e fitness.
1) Detectar se há pessoas em casa e verificar se todo o equipamento está desligado (ferro / ferro).
2) Localização de pessoas dentro da sala de estar e automação (acenda luzes / música / tv)
Plugins para aplicativos de estúdio de arte
1) 2D -> mapeamento 3D e pose de dedução para reconstruir uma pose 3D com base na fonte 2D
Melhorias e desenvolvimentos futuros
Existem várias melhorias que podem ser feitas para aumentar o desempenho da etapa de pós-processamento e torná-la mais precisa. Além disso, pode ser interessante combiná-lo com o mapeamento 2D-> 3D para reconstruir a pose 3D. A lista de possíveis melhorias é mostrada abaixo:
1) otimização de NMS. Uma implementação de GPU paralela usando a API METAL.
2) Use uma aproximação diferente para a conexão das articulações mais próxima dos ossos do esqueleto da vida real. Ossos não são retos.
3) Implemente uma filtragem mais robusta para a pose de saída para se livrar dos artefatos.
4) Implementar uma estimativa de pose em um fluxo de vídeo
5) 2D -> mapeamento 3D
Para aqueles que estão interessados no plano de fundo deste projeto e no Openpose, podem encontrar informações úteis abaixo:
1) http://posefs1.perception.cs.cmu.edu/Users/ZheCao/Multi-person%20pose%20estimation-CMU.pdf
2) https://www.ri.cmu.edu/wp-content/uploads/2017/04/thesis.pdf
3) https://pose.mpi-inf.mpg.de/
Um pouco de diversão
É sempre interessante ver como a aplicação da tecnologia funcionará com informações incomuns. Alguns resultados divertidos são mostrados abaixo. Observe como o NN previu o pé onde está oculto:
Conclusão
Neste artigo, o aplicativo iOS para inferir pose humana é descrito. De acordo com os resultados do desempenho, é claramente visto que a Apple deu um salto gigantesco no desempenho do mecanismo de rede neural. Além disso, os próximos modelos do iPhone provavelmente permitirão inferir em tempo real. Combinando isso com a reconstrução de pose 2D-> 3D, é possível inferir a pose 3D humana em tempo real em um fluxo de vídeo!