通过图像中的模型预测头部姿势,以获得以滚转(roll)、俯仰(pitch)和张口(yawn)形式的输出,但结果不够准确。数据集总共有5500张图像
-
应有的数值:
- 滚转: 0.67°
- 俯仰: -4.89°
- 张口: 22.57°
-
我的模型的数值:
- 滚转: 356.10°
- 俯仰: 1036.82°
- 张口: 532.35°
`
#opening the dataseta,b,c,d = pkl.load(open('samples.pkl', 'rb'))#concatenating the 2 arraysx = np.concatenate((a,b), axis=0)y = np.concatenate((c,d), axis=0)#Assigning degrees to roll pitch and yawroll, pitch, yaw = y[:, 0], y[:, 1], y[:, 2]#test and train divisionx_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=2)x_val, x_test, y_val, y_test = train_test_split(x_test, y_test, test_size=0.2, random_state=2)print(x_train.shape, y_train.shape)print(x_val.shape, y_val.shape)print(x_test.shape, y_test.shape)#standazing the test and train setsstd = StandardScaler()std.fit(x_train)x_train = std.transform(x_train)x_val = std.transform(x_val)x_test = std.transform(x_test)BATCH_SIZE = 64EPOCHS = 100#model of cnnmodel = Sequential()model.add(Dense(units=20, activation='relu', kernel_regularizer='l2', input_dim=x.shape[1]))model.add(Dense(units=10, activation='relu', kernel_regularizer='l2'))model.add(Dense(units=3, activation='linear'))print(model.summary())#compiling the modelcallback_list = [EarlyStopping(monitor='val_loss', patience=25)]model.compile(optimizer='adam', loss='mean_squared_error',metrics=['accuracy'])hist = model.fit(x=x_train, y=y_train, validation_data=(x_val, y_val), batch_size=BATCH_SIZE, epochs=EPOCHS, callbacks=callback_list)model.save('model.h5')
`
回答:
首先,从图像中预测头部姿势并不是一个简单的回归问题,实际上,这是一个需要计算机视觉方法的计算机视觉问题。
你的模型是一个简单的多层感知机(MLP),对于给定的问题表现不会很好。
我给你一些建议,你仍然需要通过实验来确定哪个方法有效。
- 不要使用MLP,而是从卷积神经网络(ConvNet)开始。这里有一个简单的用于回归的CNN模型。
model = Sequential()model.add(Conv2D(32, (3, 3), padding='same', input_shape=x_train.shape[1:]))model.add(Activation('relu'))model.add(Conv2D(32, (3, 3)))model.add(Activation('relu'))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Dropout(0.25))model.add(Conv2D(64, (3, 3), padding='same'))model.add(Activation('relu'))model.add(Conv2D(64, (3, 3)))model.add(Activation('relu'))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Dropout(0.25))model.add(Flatten())model.add(Dense(512))model.add(Activation('relu'))model.add(Dropout(0.5))model.add(Dense(3))
-
如果模型过拟合,删除Flatten层,使用全局池化层。
-
尝试标准化你的输出。不要盲目地进行回归,使用最小-最大归一化将滚转和俯仰的范围调整到0-1。在这种情况下,最后一层使用sigmoid激活函数。
这里有一篇论文,可以帮助你了解基本概念并开始建立一个基准模型:https://aip.scitation.org/doi/pdf/10.1063/1.4982509