我正在为我的最后一年的项目制作一个自动农业机器人。我想在农场旁的小巷中自动移动它。我只是在车辆前使用树莓派图像。我通过pi收集数据,然后将其发送到计算机进行培训。 最初,我只是训练它沿直线运动。由于我的电动机中未使用编码器,因此有可能沿一个方向发散,因此我必须不断给予反馈以保持正确的方向。 示例图像如下,请注意这是黑白图像:enter image description here
我有836幅用于训练的图像和356幅用于验证的图像。当我尝试对其进行训练时,我的模型准确性没有太大提高。我尝试过从完全连接的层到不同的卷积层更改不同的结构,我的训练精度并没有提高太多,也许大多数时候验证精度和验证损失保持不变。
我很困惑为什么会这样,这与我的代码有关,还是我应该在图像上应用计算机视觉技术以使特征更加明显。解决该问题的最佳方法应该是什么。
我的代码如下:
import numpy
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from keras.layers import Flatten
from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D
# fix dimension ordering issue
from keras import backend as K
import numpy as np
import glob
import pandas as pd
from sklearn.model_selection import train_test_split
K.set_image_dim_ordering('th')
# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)
def load_data(path):
print("Loading training data...")
training_data = glob.glob(path)[0]
data=np.load(training_data)
a=data['train']
b=data['train_labels']
s=np.concatenate((a, b), axis=1)
data=pd.DataFrame(s)
data=data.sample(frac=1)
X = data.iloc[:,:-4]
y=data.iloc[:,-4:]
print("Image array shape: ", X.shape)
print("Label array shape: ", y.shape)
# normalize data
# train validation split, 7:3
return train_test_split(X, y, test_size=0.3)
data_path = "*.npz"
X_train,X_test,y_train,y_test=load_data(data_path)
# reshape to be [samples][channels][width][height]
X_train = X_train.values.reshape(X_train.shape[0], 1, 120, 320).astype('float32')
X_test = X_test.values.reshape(X_test.shape[0], 1, 120, 320).astype('float32')
# normalize inputs from 0-255 to 0-1
X_train = X_train / 255.0
X_test = X_test / 255.0
# one hot encode outputs
num_classes = y_test.shape[1]
# define a simple CNN model
def baseline_model():
model = Sequential()
model.add(Conv2D(30, (5, 5), input_shape=(1, 120, 320), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(15, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(50, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))
# Compile model
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
return model
# build the model
model = baseline_model()
# Fit the model
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=10, batch_size=10)
# Final evaluation of the model
scores = model.evaluate(X_test, y_test, verbose=0)
print("CNN Error: %.2f%%" % (100-scores[1]*100))
样本输出:这是最好的输出,具有上面的代码: enter image description here
答案 0 :(得分:0)
我通过更改算法的结构并使用NVIDIA的深度学习汽车算法来解决此问题,从而解决了这个问题。该算法非常健壮,并在其上应用了基本的计算机视觉。您也可以在中型/ youtube上轻松找到玩具车的示例实现。 这篇文章对我真的很有帮助: https://towardsdatascience.com/deeppicar-part-1-102e03c83f2c
此外,该资源也非常有帮助:
https://zhengludwig.wordpress.com/projects/self-driving-rc-car/