Python 基于CNN的地标定位

Python 基于CNN的地标定位,python,keras,deep-learning,neural-network,Python,Keras,Deep Learning,Neural Network,我试图在Keras中使用CNN对图像进行地标定位 我有800个图像,我在320x240中调整它们的大小,并在0和1之间对它们进行规格化。我的注释位于一个XML文件中,我将它们放入一个CSV文件中,然后为图像和注释创建一个.npy文件 我使用Adam优化器,其学习率=0.001。损失是一个自定义rmse,度量是mae # RMSE from keras import backend def rmse(y_true, y_pred): return backend.sqrt(backend.

我试图在Keras中使用CNN对图像进行地标定位

我有800个图像,我在320x240中调整它们的大小,并在0和1之间对它们进行规格化。我的注释位于一个XML文件中,我将它们放入一个CSV文件中,然后为图像和注释创建一个.npy文件

我使用Adam优化器,其
学习率=0.001
。损失是一个
自定义rmse
,度量是
mae

# RMSE
from keras import backend
def rmse(y_true, y_pred):
    return backend.sqrt(backend.mean(backend.square(y_pred - y_true)))
我试过
批量大小=32,50,60,70
。激活函数是
relu
,除了最后一个密集层中没有任何内容,因为这是一个回归问题

这是我的CNN架构:

Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 240, 320, 32)      320       
_________________________________________________________________
batch_normalization_1 (Batch (None, 240, 320, 32)      128       
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 120, 160, 32)      9248      
_________________________________________________________________
batch_normalization_2 (Batch (None, 120, 160, 32)      128       
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 60, 80, 64)        18496     
_________________________________________________________________
batch_normalization_3 (Batch (None, 60, 80, 64)        256       
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 30, 40, 64)        36928     
_________________________________________________________________
batch_normalization_4 (Batch (None, 30, 40, 64)        256       
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 15, 20, 64)        36928     
_________________________________________________________________
batch_normalization_5 (Batch (None, 15, 20, 64)        256       
_________________________________________________________________
conv2d_6 (Conv2D)            (None, 8, 10, 64)         36928     
_________________________________________________________________
batch_normalization_6 (Batch (None, 8, 10, 64)         256       
_________________________________________________________________
flatten_1 (Flatten)          (None, 5120)              0         
_________________________________________________________________
dense_1 (Dense)              (None, 512)               2621952
_________________________________________________________________
dense_2 (Dense)              (None, 256)               131328
_________________________________________________________________
dense_3 (Dense)              (None, 136)               34952
没有池层,因为conv层中的图像大小减少了
strips=2

136是我的x,y坐标输出

结果总是与此相似,我在25-30个时期后停止学习,因为val_损失在44岁左右保持稳定:

Train on 661 samples, validate on 166 samples

Epoch 1/500
 - 71s - loss: 139.1782 - mae: 135.1071 - val_loss: 157.1107 - val_mae: 154.2357
Epoch 2/500
 - 72s - loss: 52.8662 - mae: 43.3649 - val_loss: 157.6703 - val_mae: 154.7970
Epoch 3/500
 - 68s - loss: 31.2599 - mae: 24.8241 - val_loss: 157.5264 - val_mae: 154.6493
Epoch 4/500
 - 68s - loss: 26.4959 - mae: 20.9077 - val_loss: 157.2360 - val_mae: 154.3627
Epoch 5/500
 - 69s - loss: 23.6135 - mae: 18.6571 - val_loss: 157.1423 - val_mae: 154.2634
Epoch 6/500
 - 69s - loss: 22.0984 - mae: 17.4924 - val_loss: 157.0344 - val_mae: 154.1478
Epoch 7/500
 - 68s - loss: 20.1804 - mae: 16.0166 - val_loss: 156.7843 - val_mae: 153.9042
Epoch 8/500
我假设模型是过度拟合的。我还尝试在前两个密集层之后添加一个衰减层,但结果仍然相同


如何改进我的模型?

您是否在进行数据扩充(图像上的小随机更改,使数据集更加多样化)。除了批量大小(lr…),您还可以尝试更改其他超参数。你可以从预先训练的网络中推断出第一层。您还可以尝试改进您的数据集sizeNo,我没有做数据扩充,因为我不知道如何使用点坐标执行它。我没有改变其他超参数(只有批量大小和损失函数——我也使用了MSE,但它非常高)。我在哪里可以找到一个预训练的网络?如果你的注释只是坐标,你可以裁剪图像的一个子部分并调整注释以匹配新的裁剪,你也可以翻转或旋转图像,同时对注释进行同样的操作,由于预处理过程中的随机性,您认为改进我的模型只需要增加数据集大小吗?