Skip to content

richlukich/Keypoints

Repository files navigation

Human Pose Estimation

Введение

В данном репозиториии представлена реализация нейросети для решение задачи Human Pose Estimation. Learning Feature Pyramids for Human Pose Estimation: https://arxiv.org/pdf/1708.01101.pdf . Также проделаны эксперименты с разными подходами обработки тепловых карт (heatmaps).

Нейросеть

Данная нейросеть выглядит следующим образом:

github

Как видно нейросеть основана на PRM блоках. Они бывают различных видов PRM-A,PRM-B,PRM-C,PRM-D. В данном репозитории использовался PRM-A.

github

То есть пусть у нас входные данные имеют вид $x^{(l)}$ и $W^{(l)}$ Тогда выход PRM блока будет равен

$$ x^{(l+1)}=x^{(l)}+ \Theta (x^{(l)} ; W^{(l)} )$$

где

$$ \Theta (x^{(l)} ; W^{(l)} ) = g (\sum_{с=1}^С f_c(x^{(l)};w^{(l)}_{f_c});w^{(l)}_g)+f_0(x^{(l)};w^{(l)}_{f_0}) $$

Где $C$ - это номер ответвления,$W^{(l)}={w^{(l)}_{f_c},w^{(l)}_g}$-множество параметров, $f_c(.)$- функция преобразования $x^{(l)}$, $g(.)$-функция преобразования суммы или конкатенации $f_c(.)$

Обучение Нейросети

Для обучения используются тепловые карты (heatmaps). Пусть координата сустава равна $z_k=(x_k,y_k)^K_{k=1}$ , $K$ -кол-во суставов. Тогда тепловая карта (heatmap) будет генерироваться с помощью функции Гаусса с средним $z_k$ и отклонением $\Sigma$ т.е.

$$ S_k(p) \sim \mathcal{N} (z_k, \Sigma) $$

где, $p \in R^2 $-обозначает локацию, $\Sigma$- диагональная матрица, на диагонали которой стоят квадраты отклоений по Х и Y. Пример:

github

В качестве функции потерь используется MSE. В качестве оптимизатора используется RMSProp с шагом 2e-5.

Данные

Данные взяты из датасета MPII Human Pose Dataset. Данные представляют собой изображения людей и анотации к ним. Для тренировки используется около 25 тыс. изображений и для валидации около 3 тыс. . В качестве анотаций нам даны координаты суставов, если суставов не видно на картинке их координаты равны (0,0) , вместо координат бокса в которой помещен был бы помещен человек используется координата центра бокса (center) и размер деленный на 200 (scale) (бокс квадрантый) . Подробнее про данные: https://odr.chalmers.se/bitstream/20.500.12380/253624/1/253624.pdf#page26

Аугментация данных

Очень важным качественного обучения была правильная агументация данных. Т.к. мы предсказываем точки на одном человеке, для тренировки нам также нужно использовать фотографии, где будет только один человек. Из-за того, что в датасете много фотографии где изображено несколько человек, мы будем вырезать нужного нам человека имея параметры center и scale. Но обрезание человека будет делаться специальным образом, чтобы сохранить прапорции тела, а также чтобы человек всегда был в центре фотографии.

Для данной трансформации воспользуемся следующей матрицей:

$$A= \begin{pmatrix} s_x & 0 & t_x\\ 0 & s_y & t_y\\ 0 & 0 & 1 \end{pmatrix} $$

$$ A \cdot \begin{pmatrix} x &\ y &\ 1 \end{pmatrix}^T = \begin{pmatrix} x' &\ y' &\ 1 \end{pmatrix}^T$$

Где $s_x$,$s_y$-изменение масштаба по Ox,Oy , $t_x$,$t_y$-сдвиг по Ох,Оу, $x$,$y$-изначальные координаты, $x'$,$y'$-измененные координаты.

Пример: Фото до:

github

Фото после:

github

Обработка тепловых карт

Возникает вопрос как получить координаты из тепловых карт (heatmaps). Рассмотрим 4 способа.

1-ый самый-простой это просто применить argmax к карте.

2-ой это брать "центр тяжести" карты.

3-ий это находить две координаты с максимальными значениями и немного сдвигаться в направлении второго максимального значения.

4-ый с помощью функции максимального правдоподобия оценить $\mu$.

1.Применение argmax к карте

В данном случае $$z_k= \underset{p}{\operatorname{argmax}} S_k(p)\ k=1..K $$

2.Центр тяжести карты

$$ (x_c,y_c)= ( \frac{\sum_i x_i \cdot p_i}{\sum_i p_i},\frac{\sum_i y_i \cdot p_i}{\sum_i p_i}) $$

Где $p_i$-значение тепловой карты в определенном пикселе.

3.Сдвиг ко второму максимальному значению

В данном случае вычисляем координаты $m$ максимального значения и координаты второго максимального значения $s$ тогда предсказанная координата будет равна

$$ p=m+ 0.25 \cdot \frac{s-m}{||s-m||_2} $$

4. Оценка $\mu$ c помощью функции максимального правдоподобия

Данный метод рассматривался в этой статье: https://arxiv.org/pdf/1910.06278.pdf

github

Что предлагают авторы в этой статье?

Допустим мы предсказали тепловую карту:

$$\Gamma(x;\mu;\Sigma)= \frac{1}{(2\pi)|\Sigma|^\frac{1}{2}} exp (-\frac{1}{2} (x-\mu)^T \Sigma^{-1} (x-\mu)) \ (1)$$

Тогда функция максимального правдоподобия равна:

$$ \Theta(x;\mu;\Sigma)=ln (\Gamma)= -ln(2\pi)-\frac{1}{2}ln(|\Sigma|)-\frac{1}{2} (x-\mu)^T \Sigma^{-1} (x-\mu) \ (2)$$

Вычислим первую производную:

$$ \digamma ' = \frac{\partial \Theta^T}{\partial x}= \left. -\Sigma^{-1}(x-u) \right|_{x=\mu} =0 \ (3) $$

Разложим $\Theta(\mu)$ в ряд Тейлора в окрестности максимального значения $m$

$$ \Theta(\mu)= \Theta(m) + \digamma ' (m)(\mu -m) + \frac{1}{2}(\mu-m)^T \digamma '' (m)(\mu-m) \ (4)$$

Где $\digamma '' (m)$ вторая производная (т.е. Гессиан)

$$ \digamma '' (m)= \left. \digamma '' (x) \right|_{x=m} = \Sigma^{-1} (5) $$

Из (5), (4), (3) Получаем

$$ \mu = m- (\digamma '' (m))^{-1} \digamma ' (m) $$

Посчитать производные мы можем с помощью численного дифференцирования:

$$ f'(x)= \frac{f(x+h)-f(x-h)}{2h} $$

$$ \frac {\partial^2 f}{\partial x^2} = \frac{f(x-2h,y)-2f(x,y)+f(x+2h,y)}{(2h)^2} $$

$$ \frac {\partial^2 f}{\partial x \partial y}= \frac{f(x+h,y+h)-f(x+h,y-h)-f(x-h,y+h)+f(x-h,y-h)}{(2h)^2} $$

Также для сглаживания тепловой карты можно применить Гауссовское ядро

$$ h'=K \odot h $$

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages