0.前言
前一篇用样本数33000在随机和按顺序的情况下进行训练网络,最后在按顺序的情况下得到了95%的准确率和极低的loss值,暂时网络训练到这里,如后期需要再提升精度,只需要增加训练样本即可。
顺带一提,训练完网络之后,保存训练模型的代码是:
pathSaveModel = "./saveModelResult"
if os.path.exists(pathSaveModel):
pass
else:
os.mkdir(pathSaveModel)
jsonName = pathSaveModel + "/architecture_" + configName + ".json"
weightName = pathSaveModel +"/weights_" + configName + ".h5"
#logFile.write("jsonName=%s\n" % jsonName)
#logFile.write("weightName=%s\n" % weightName)
#save net
json_string = model.to_json()
open(jsonName,'w').write(json_string)
model.save_weights(weightName)
1.正文
本篇博客用以记载测试该网络可用性的过程,记名为testModel.py的文件,用来实现测试网络的功能。
由于目的是为了预测出透视投影变换的内外参数,所以用预测值减去真实的值,画出直方图来表示网络的准确与否。
1.1 随机选择样本进行测试
代码如下:
"""
test the net model, input parameter is sampleNums;
randomFileName: is the list, save the selected file name
testData: save the position message
"""
def testModel(sampleNums, dataFormat):
print("sampleNums=", sampleNums)
dataSourceDir = './ResultData/'
dataLabelDir = './ResultLabel/'
dataSourceNameLst = os.listdir("./ResultData")
randomFileName = random.sample(dataSourceNameLst, sampleNums)
#print(randomFileName)
randomFileToLabelName = []
for dataName in randomFileName:
charTIndex = dataName.index("t")
charPIndex = dataName.index(".")
midIndex = dataName[charTIndex+1:charPIndex]
labelTmpName = 'Result_label' + midIndex + '.csv'
randomFileToLabelName.append(labelTmpName)
if dataFormat == 2:
testData = np.empty((sampleNums, 2, rowColTotalNum))
elif dataFormat == 1:
testData = np.empty((sampleNums, rowColTotalNum*2))
testData_label = np.empty((sampleNums, 5))
#print(randomFileToLabelName)
#read the csv file, get the pos
for fileIterIndex in range(sampleNums):
#print(fileIterIndex)
#get sample data
posXLst = []
posYLst = []
with open(dataSourceDir+randomFileName[fileIterIndex], "r") as file:
reader = csv.reader(file)
for item in reader:
itemX = item[0]
itemY = item[1]
if itemX[0] == "[" and itemY[0] == "[":
itemX = itemX[2:-2]
itemY = itemY[2:-2]
posXLst.append(float(itemX))
posYLst.append(float(itemY))
else:
itemXY = [float(XY) for XY in item]
posXLst.append(itemXY[0])
posYLst.append(itemXY[1])
#print("xLst len =", len(posXLst))
#print("yLst len =", len(posYLst))
if dataFormat == 2:
testData[fileIterIndex, 0, :] = posXLst
testData[fileIterIndex, 1, :] = posYLst
elif dataFormat == 1:
posXYLst = []
for rowColIndex in range(rowColTotalNum):
posXYLst.append(posXLst[rowColIndex])
posXYLst.append(posYLst[rowColIndex])
testData[fileIterIndex, :] = posXYLst
#print("testData.shape", testData.shape)
#get label data
with open(dataLabelDir+randomFileToLabelName[fileIterIndex], "r") as labelFile:
labelReader = csv.reader(labelFile)
for item in labelReader:
#print("item=", item)
#print("float item=", float(item[0]))
testData_label[fileIterIndex, 0] = float(item[0])
testData_label[fileIterIndex, 1] = float(item[1])
testData_label[fileIterIndex, 2] = float(item[2])
testData_label[fileIterIndex, 3] = float(item[3])
testData_label[fileIterIndex, 4] = float(item[4])
#print(testData_label)
if dataFormat == 2:
testData = testData.reshape(sampleNums, 858)
通过以上代码即可加载测试样本,接着使用上文保存的网络模型,进行预测。
#data get done, test model
model = model_from_json(open('./saveModelResult/samplesNum33000dataFormat1Random0.json').read())
model.load_weights('./saveModelResult/samplesNum33000dataFormat1Random0.h5')
predictValueArray = model.predict(testData, verbose=0)
预测出结果之后,进行直方图的绘制。
def plotHist(figName, differLst, binsNum):
fig = plt.figure(figName)
plt.title("different hist")
plt.xlabel("differentValue")
plt.hist(differLst, bins=binsNum, histtype='bar')
plt.show()
传入三个值,第一个值是绘制的图片名, 第二个是得到的差的list, 第三个是bins的值,取与样本数一致。
2.结果展示
测试样本数为11000,pitch, roll, heading, dx, dy 依次结果如下:
3.后期任务
以上实现了神经网络预测,测试网络。接下来的任务就是根据预测到的5个值,以及进网络的变形坐标值, 逆映射到世界坐标,然后统计偏差值。
任务总结:
1)找寻透视投影变换的逆变换资料
2)进行编程,实现逆变换的功能
3)编写计算偏置的代码,画出直方图或者其他来可视化最后的结果
预期两天时间完成,白天要练车,好烦啊。。。。