Keras CNN没有学会预测边界框

时间:2018-03-13 17:45:15

标签: python tensorflow neural-network deep-learning keras

我正在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)

0 个答案:

没有答案