Avaliação da pose humana em imagens para iOS

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:


Para fins de demonstração, tirei imagens comigo mesmo)A estimativa de pose humana resultante desenhada sobre a imagem original

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:


AmostraImagens
Resultado de pose humano:Mapas de calor combinados em uma imagem. Cada junta tem sua própria cor:
PAFs combinados em uma imagem:Todos os candidatos ao mapa de calor. Cada candidato tem sua própria confiança, que define sua opacidade na imagem:
Uma análise mais detalhada dos candidatos ao mapa de calor correspondentes a uma cabeçaUm exame mais detalhado dos candidatos ao mapa de calor correspondentes a um pescoço:
Matriz do PAF que corresponde a um candidato à conexão cabeça-pescoço. As juntas da cabeça e do mapa de calor do pescoço também são mostradas na imagem:Matriz PAF que corresponde a um candidato à conexão LShoulder, LElbow. As juntas do mapa de calor LShoulder-LElbow também são mostradas na imagem:

Desempenho


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)


Nn tamanho da entradaiPhone XR (ms)iPhone 8 (ms)iPhone 5S (ms)
CoreML
512 x 512190367020801
256 x 2567010397162
Pós-processamento
512 x 5121967100
256 x 256535
Total
512 x 512219373720901
256 x 2567510747200

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.


A pose resultante, dependendo do tamanho da entrada NN (quanto menor e mais rápido for o resultado menos preciso)


512 x 512256 x 256

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


Informações detalhadas


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:


A imagem foi tirada do Magic Poser

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!

Source: https://habr.com/ru/post/pt458000/


All Articles