我正在为我的毕业设计制作一个自动化农业机器人。我希望它能在农田内的车道上自动行驶。我仅使用树莓派前置摄像头来采集数据,然后将数据发送到我的电脑进行训练。最初,我只训练它在直线上行驶。由于我没有在电机上使用编码器,因此它可能在某一方向上偏离,所以我必须不断地提供反馈以保持在正确的路径上。样本图像如下,请注意这是黑白图像:enter image description here
我有836张图片用于训练,356张用于验证。当我尝试训练时,我的模型准确率没有显著提高。我尝试了不同的结构,从全连接层到不同的卷积层,我的训练准确率没有显著提高,而且验证准确率和验证损失大多数时候保持不变。
我很困惑为什么会这样,这是我的代码问题吗,还是应该对图像应用计算机视觉技术,以便特征更加明显。解决这个问题的更好方法是什么?
我的代码如下:
import numpyfrom keras.models import Sequentialfrom keras.layers import Densefrom keras.layers import Dropoutfrom keras.layers import Flattenfrom keras.layers.convolutional import Conv2Dfrom keras.layers.convolutional import MaxPooling2D# fix dimension ordering issuefrom keras import backend as Kimport numpy as npimport globimport pandas as pdfrom sklearn.model_selection import train_test_splitK.set_image_dim_ordering('th')# fix random seed for reproducibilityseed = 7numpy.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-1X_train = X_train / 255.0X_test = X_test / 255.0# one hot encode outputsnum_classes = y_test.shape[1]# define a simple CNN modeldef 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 modelmodel = baseline_model()# Fit the modelmodel.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=10, batch_size=10)# Final evaluation of the modelscores = model.evaluate(X_test, y_test, verbose=0)print("CNN Error: %.2f%%" % (100-scores[1]*100))
样本输出:这是上述代码的最佳输出:enter image description here
回答:
我通过更改算法结构并使用NVIDIA的深度学习汽车算法解决了这个问题。这个算法非常稳健,并且还应用了基本的计算机视觉技术。你可以在Medium/Youtube上轻松找到针对玩具车的样本实现。这篇文章对我非常有帮助:https://towardsdatascience.com/deeppicar-part-1-102e03c83f2c
此外,这个资源也非常有帮助:
https://zhengludwig.wordpress.com/projects/self-driving-rc-car/