很快我发现128x128的patch在cpu上慢得无法接受。对各项参数进行调整之后,我生成了新的训练集。
新训练集是64x64黑白图像,其中50%的图像有无人机,50%的图像没有。在训练“图像中有没有无人机”分类器的过程中,我发现如果这个比例不是50%,比如说有无人机的图像占70%,会导致模型朝“所有图片中都有无人机”的方向收敛,因为预测“全都有无人机”的error(0.3)低于随机预测的error(0.5)。
图像背景大多为天空,少部分为景物。
训练采用tensorflow后端 + keras前端,小规模的CNN,图像上下左右翻转作为数据增强,目前训练集(2500)和测试集(500)的accuracy都超过了0.83。肉眼识别率还没做,但是可以感受一下。
图中灰色的表示判断正确,红色的表示判断错误。从训练结果来看,天空背景下准确率较高,花草树木背景下准确率较低。
下面是所用的网络结构(keras):
model = Sequential()
model.add(Convolution2D(16, 7, 7, #border_mode='same',
input_shape=X_train.shape[1:]))
model.add(Activation('relu'))
model.add(Convolution2D(32, 5, 5, #border_mode='same',
input_shape=X_train.shape[1:]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Convolution2D(32, 7, 7))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Convolution2D(64, 7, 7))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(4, 4)))
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(16))
model.add(Activation('relu'))
model.add(Dropout(0.1))
model.add(Dense(nb_classes))
model.add(Activation('softmax'))