MSTAR数据集的SAR图像识别

这几天用Keras做了一个SAR图像识别的CNN,数据集MSTAR,数据集共有10类目标,分别为BMP2(步兵战车,SN_9563),BTR70(装甲运输车,SN_C71),T72(坦克,SN_132),2S1(自行榴弹炮)、BRDM2(装甲侦察车)、BTR60(装甲运输车)、D7(推土机)、T62(坦克)、ZIL131(货运卡车)、ZSU234(自行高炮)。图像大小均为100*100,训练集有2536个图像,成像侧视角为15°;测试集有2636个图像,成像侧视角为17°,这儿不再具体讲解数据集了。
在这里插入图片描述

下面直接说我的网络结构:
输入:100*100的rgb图像(数据集是灰度图像,可以当成rgb图像读取);
(1)卷积层,96个卷积核,卷积核大小为11×11,步长为4,激活函数为 ReLU;
(2)池化层,窗口大小为2,步长为4;
(3)卷积层,256个卷积核,卷积核大小为5×5,步长为1,采用 ReLU函数进行激活;
(4)池化层,窗口大小为3,步长为1。
(5)卷积层,384个卷积核,卷积核大小为3×3,步长为1,采用ReLU函数进行激活;
(6)卷积层,384个卷积核,卷积核大小为3×3、步长为1,采用 ReLU函数进行激活;
(7)卷积层,256个卷积核,卷积核大小为3×3,步长为1,采用ReLU函数进行激活;
(8)池化层,窗口大小为3×3,步长为1;
(9)Flatten层;
(10)全连接层,1024个神经元节点;
(11)Dropout层,0.5;
(12)全连接层,1024个神经元节点;
(13)Dropout层,0.5;
(14)输出层,softmax进行分类,十个神经元节点。

由于训练集只有2500多个图像,直接训练也是可以的,不过最好还是进行一下图像增强,增强泛化能力,对于测试集只用归一化就行了,不能进行其他操作,图像增强详见ImageDataGenerator

# python 3.6.5 + keras 2.1.4
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Dense, Dropout, Flatten
from keras.preprocessing import image
import numpy as np
import os
from keras.preprocessing.image import ImageDataGenerator
from keras.optimizers import SGD
from keras.callbacks import ModelCheckpoint

train_path = '    '  #训练集路径
test_path = '   '    #测试集路径

model = Sequential()
model.add(Conv2D(filters=96, kernel_size=(11, 11),
                 activation='relu',
                 strides=(4, 4),
                 padding='same',
                 input_shape=(100, 100, 3),
                 kernel_initializer='random_uniform',
                 bias_initializer='zeros'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(4, 4)))
model.add(Conv2D(filters=256, kernel_size=(5, 5),
                 activation='relu',
                 padding='same',
                 kernel_initializer='random_uniform',
                 bias_initializer='zeros'))
model.add(MaxPooling2D(pool_size=(3, 3), strides=(1, 1)))
model.add(Conv2D(filters=384, kernel_size=(3, 3),
                 activation='relu',
                 padding='same'))
model.add(Conv2D(filters=384, kernel_size=(3, 3),
                 activation='relu',
                 padding='same',
                 kernel_initializer='random_uniform',
                 bias_initializer='zeros'))
model.add(Conv2D(filters=256, kernel_size=(3, 3),
                 activation='relu',
                 padding='same',
                 kernel_initializer='random_uniform',
                 bias_initializer='zeros'))
model.add(MaxPooling2D(pool_size=(3, 3), strides=(1, 1)))
model.add(Flatten())
model.add(Dense(1024, activation='relu',
                kernel_initializer='random_uniform',
                bias_initializer='zeros'))
model.add(Dropout(0.5))
model.add(Dense(1024, activation='relu',
                kernel_initializer='random_uniform',
                bias_initializer='zeros'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax',
                kernel_initializer='random_uniform',
                bias_initializer='zeros'))
model.summary()

model.compile(optimizer=SGD(lr=5e-4, momentum=0.9),
              loss='categorical_crossentropy',
              metrics=['accuracy'])

img_height, img_width = 100, 100
batch_size = 16
train_datagen = ImageDataGenerator(
    rescale=1. / 255,
    shear_range=0.2,  # 剪切强度(以弧度逆时针方向剪切角度)。
    rotation_range=10.,  # 随机旋转的度数范围
    zoom_range=0.2,  # 随机缩放范围
    horizontal_flip=True)  # 随机水平翻转

test_datagen = ImageDataGenerator(rescale=1. / 255)

# 图片generator
train_generator = train_datagen.flow_from_directory(
    train_path,
    target_size=(img_height, img_width),
    batch_size=batch_size,
    class_mode='categorical',
    classes=['2S1', 'BRDM_2', 'BTR_60', 'D7', 'SN_132', 'SN_9563', 'SN_C71', 'T62', 'ZIL131', 'ZSU_23_4'])

validation_generator = test_datagen.flow_from_directory(
    test_path,
    target_size=(img_height, img_width),
    batch_size=batch_size,
    class_mode='categorical',
    classes=['2S1', 'BRDM_2', 'BTR_60', 'D7', 'SN_132', 'SN_9563', 'SN_C71', 'T62', 'ZIL131', 'ZSU_23_4'])

model_path = '  '#model保存路径
checkpoint = ModelCheckpoint(model_path, monitor='val_acc', verbose=2,
                             save_best_only=True, mode='max')
callbacks_list = [checkpoint]

model.fit_generator(
    train_generator,
    epochs=300,
    validation_data=validation_generator,
    verbose=2,
    callbacks=callbacks_list)

ModelCheckpoint会保存在300个epoch里val_acc最高的model,结果如下:
在这里插入图片描述
可以看到val_acc很高,而且由于网络结构不是很复杂,运行的很快,我用的笔记本跑的。

数据集:
https://download.csdn.net/download/a1367666195/12302537
或者留下邮箱

欢迎留言讨论~


 [1]: 崔福彬,张茜,雷俞承志, 等.基于深度学习的SAR图像目标识别算法[J].长春理工大学学报(自然科学版),2019,42(4):33-36. DOI:10.3969/j.issn.1672-9870.2019.04.009.
 [2]: https://www.jianshu.com/p/06c1710e2132

更多推荐