我正在keras的CNN上工作,以获得照片中模特所穿的边框。据我所知,每张照片都包含(确切地)我假设的模型所穿的裙子,我可以在预训练模型(我尝试过VGG16和ResNet)上添加一些密集层,并训练它获得4个输出。 然而,每个时期(对于训练和验证数据)损失函数几乎保持不变,当我想用模型预测边界框时,我得到的框几乎是[0,0,0,0](几乎意味着值非常小,如1e-7)。 我已经尝试过更改优化器,学习等等但似乎没有任何工作。
我怀疑我的方法是轻松和天真的方式,我必须看看更复杂的本地化方式,如Faster-RCNN,但这种复杂性不仅超出了我的能力(你可以看到),而且网络的目的。所以我希望也许你可以帮助我。
感谢提前!!
代码: 设置模型:
def getModel_Segmentation(input_shape=(300,300,3),border_mode='same',activation='relu',retrain_layers=0,neurons_dense_layer=4096):
model=VGG16(weights="imagenet",include_top=False,input_shape=input_shape)
for i in range(len(model.layers) - retrain_layers):
model.layers[i].trainable=False
x=Flatten()(model.output)
x = Dense(64, activation='relu', name='fc1')(x)
x = Dense(64, activation='relu', name='fc2')(x)
x = Activation(activation)(x)
x = BatchNormalization()(x)
x = Dropout(0.25)(x)
x = Dense(4, activation='softmax', name='predictions')(x)
return Model([model.input],x)
编译:
def l2loss(y_true,y_pred):
return tf.sqrt(tf.reduce_sum(tf.square(tf.subtract(y_true,y_pred))))
model=generateModel_Segementation()
model.compile(loss=l2loss,optimizer=SGD(),metrics=['accuracy'])
获取数据,如果我是,我认为我错了: (我的csv文件包含picturename.jpg; x0; y0; x1; y1,我知道图片的保存位置)
def preprocess(img):
VGG_MEAN = [103.939, 116.779, 123.68]
out = np.copy(img) * 255
out = out[:, :, [2,1,0]] # swap channel from RGB to BGR
out[:,:,0] -= VGG_MEAN[0]
out[:,:,1] -= VGG_MEAN[1]
out[:,:,2] -= VGG_MEAN[2]
return out
x_pictures=[]
x_segments=[]
f=open(training_picture_labels)
fr=csv.reader(f,delimiter=";")
for i in fr:
try:
img=load_img(training_picture_path+"/"+i[0])
x_segments.append(np.array([i[1],i[2],i[3],i[4]]))
x=img_to_array(img)
x=preprocess(x)
x_pictures.append(x)
except:
pass
traingen=ImageDataGenerator(fill_mode="constant")
#same with y_pictures and y_segments for validation data
训练模型:
model.fit_generator(traingen.flow(x=np.array(x_pictures),
y=np.array(x_segments),
batch_size=64),validation_data=valgen.flow(x=np.array(y_pictures),
y=np.array(y_segments)),epochs=50,steps_per_epoch=50,verbose=1)