Я делаю автономного сельскохозяйственного робота для моего проекта последнего года. Я хочу передвигаться автономно по переулкам в сторону фермы. Я просто использую изображение малины пи перед моим автомобилем. Я собираю свои данные через pi, а затем отправляю их на мой компьютер для обучения. Первоначально я только что обучил его двигаться по прямой. Поскольку я не использовал энкодеры в своих двигателях, существует вероятность того, что они расходятся в одном направлении, поэтому я должен постоянно давать им обратную связь, чтобы оставаться на правильном пути. Пример изображения выглядит следующим образом. Обратите внимание, что это черно-белое изображение: введите описание изображения здесь
У меня 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))
Пример вывода: Это лучший вывод, и он соответствует приведенному выше коду: введите описание изображения здесь