Добрый вечер. Уже 3 месяца бьюсь над задачей восстановления 3D модели руки по фото.
Сгенерировал выборку данных - это 10 000 изображений руки сделанных в Blender, с разным положением костей. В качестве выходного вектора решил взять положения вершин 3D модели. (Да, я понимаю, что разумнее было задать положения костей, но я решил попробовать так)
Сделал аугментацию данных таким образом, что два одинаковых изображения в выборке встретить почти невозможно. (изображение руки накладывается на любую другую фотографию, и применяются фильтры, чтобы рука не выделялась на общем фоне. Так же добавлены шумы, имитирующие не очень хорошее качество съемки.) Выглядит одна из фотографий примерно так:
В Keras была построена модель сверточной нейронной сети (картинку предоставить не могу, так как не получилось установить graphvis).
inp = Input(shape=(res,res,3))
bath_0 = BatchNormalization(axis=1)(inp)
x1 = Conv2D(primitives, kernel_size=(9, 9), border_mode='same', activation='relu')(bath_0)
pool_1 = MaxPooling2D(pool_size=(2, 2))(x1)
bath_1 = BatchNormalization(axis=1)(pool_1)
x2 = Conv2D(primitives*2, kernel_size=(3, 3), border_mode='same', activation='relu')(bath_1)
x3 = Conv2D(primitives*2, kernel_size=(3, 3), border_mode='same', activation='relu')(x2)
x4 = Conv2D(primitives*2, kernel_size=(3, 3), border_mode='same', activation='relu')(x3)
pool_2 = MaxPooling2D(pool_size=(2, 2))(x4)
bath_2 = BatchNormalization(axis=1)(pool_2)
x5 = Conv2D(primitives*4, kernel_size=(3, 3), border_mode='same', activation='relu')(bath_2)
x6 = Conv2D(primitives*4, kernel_size=(3, 3), border_mode='same', activation='relu')(x5)
x7 = Conv2D(primitives*4, kernel_size=(3, 3), border_mode='same', activation='relu')(x6)
pool_3 = MaxPooling2D(pool_size=(2, 2))(x7)
x8 = Flatten()(pool_3)
x9 = Dense(1700,activation='relu')(x8)
d_1 = Dropout(0.5)(x9)
x10 = Dense(1700,activation='relu')(d_1)
d_2 = Dropout(0.5)(x10)
x11 = Dense(1700 ,activation='relu')(d_2)
out = Dense(out_size,activation='tanh')(x11)
Что у меня получилось сделать: обученная нейронка научилась сгибать кисть в правильном направлении, но пальцы всегда остаются в одном положении, вне зависимости от фото.
Кстати, поначалу была проблема: нейронка строила всегда одну и ту же модель (абсолютно идентичную). Решил тем, что добавил в выборку фотографии без руки. Выходной слой в таком случае получил ноль на все нейроны.
Да в чем проблема, объясни ты уже!
А проблема в том, что пальцы всегда находятся в одном положении для всех моделей. Сгибается только кисть. Как тут:
Пожалуйста ответе на следующие вопросы, ибо я уже не знаю на что думать.
1. В чем моя ошибка? Что я делаю не так?
2. Быть может стоит задуматься над использованием Convolution3D?
3. Как бы вы решили задачу на моем месте?
Благодарю за внимание.