数据来源:
数据来源是unity公司的模拟器,通过自己驾驶录制,会产生图片文件和csv文件 csv文件包括:center、left、right、steering、throttle、brake、speed
我们只需要使用其中的center、left、right三列即可。
csv文件数据格式如下:
图片文件夹如下:
需求分析
通过给定图片和csv文件信息,训练一个model,该model能够通过输入一张图片预测方向盘转角和油门大小。
设计
- 读取csv文件信息,判断csv文件行 == 图片数量 * 3
- 将需要的三列数据提取出来,并shuffle,通过train_test_split分割训练集和验证集
- 设置输入图片大小,根据输入大小构建CNN模型
- ModelCheckpoint保存最优模型、EarlyStopping检测变量、fit_generator训练模型
- 保存model
- 通过model进行test
编码
读取csv文件信息,判断csv文件行 == 图片数量 * 3。
if __name__ == "__main__":
# cvs文件路径
data_path = '/Users/qishi/Documents/car/'
# 打开csv文件
with open(data_path + 'driving_log.csv', 'r') as csvfile:
# 读文件
file_reader = csv.reader(csvfile, delimiter=',')
# 把文件信息放在log列表中
log = []
for row in file_reader:
log.append(row)
# 将列表转化为数组
log = np.array(log)
# 去掉文件第一行
# log = log[0:, :]
# 判断图像文件数量是否等于csv日志文件中记录的数量
ls_imgs = glob.glob(data_path + 'IMG/*.jpg')
assert len(ls_imgs) == len(log) * 3, 'number of images does not match'
将需要的三列数据提取出来,并shuffle,通过train_test_split分割训练集和验证集。
# 使用20%的数据作为测试数据
validation_ratio = 0.2
# 图片大小
shape = (128, 128, 3)
# 每训练一次训练几张图片
batch_size = 32
# 训练次数,之后改为32
nb_epoch = 32
# 图像文件名
x_ = log[:, 0]
# 转角
y_ = log[:, 3].astype(float)
# 油量
z_ = log[:, 4].astype(float)
print(x_.shape)
print(y_.shape)
print(z_.shape)
# 一起洗牌,对应信息不变
x_, y_, z_ = shuffle(x_, y_, z_)
# 训练集和验证集,20%验证,80%测试
# random_state就是为了保证程序每次运行都分割一样的训练集和测试集。否则,同样的算法模型在不同的训练集和测试集上的效果不一样
# 当你用sklearn分割完测试集和训练集,确定模型和初始参数以后,你会发现程序每运行一次,都会得到不同的准确率,无法调参。这个时候就是因为没有加random_state。加上以后就可以调参了
X_train, X_val, y_train, y_val, z_train, z_val = train_test_split(x_, y_, z_, test_size=validation_ratio,
random_state=SEED)
print('batch size: {}'.format(batch_size))
print('Tr