Я новичок в cnn и пытаюсь построить регрессор ограничивающего прямоугольника для моих входных данных. У меня есть видео с несколькими объектами, но я хочу обучать / отслеживать только один конкретный объект. так как у меня есть только один класс, выходные данные моей сети - 4 числа, представляющие верхние левые координаты (x, y) и высоту и ширину. Я сгенерировал данные с моей машиной и сгенерировал связанный CSV-файл. Но когда я пытаюсь запустить код, у меня появляется ошибка, связанная с «acc», поэтому я прокомментировал часть «acc» и запустил код. Однако ошибка вывода вообще не уменьшается, и предопределенные ограничивающие рамки для тестового изображения всегда равны нулю. Я не использовал никакой активации после плотного, потому что я хочу фактические координаты поля во входном изображении. Код, который я использовал, как показано ниже
Я пытался изменить количество эпох, но безрезультатно. И я не вижу никаких других параметров, которые я могу изменить. Я не могу отладить проблему и мне нужна помощь.
# Import libraries
import os,cv2
import numpy as np
import matplotlib.pyplot as plt
import pandas as PD
import CSV
from sklearn.utils import shuffle
from sklearn.model_selection import train_test_split
from keras import backend as K
K.set_image_dim_ordering('th')
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation, Flatten
from keras.layers.convolutional import Convolution2D, MaxPooling2D
from keras.optimizers import SGD,RMSprop,adam
PATH = os.getcwd()
# Define data path
data_path = PATH + '/frames'
data_dir_list = os.listdir(data_path)
img_rows=128
img_cols=128
num_channel=1
num_epoch=20
num_classes = 1
img_data_list=[]
# note I have to give two folder structure for this code to work so "frames/dzire"
for dataset in data_dir_list:
img_list=os.listdir(data_path+'/'+ dataset)
print ('Loaded the images of dataset-'+'{}\n'.format(dataset))
for img in img_list:
input_img=cv2.imread(data_path + '/'+ dataset + '/'+ img )
input_img=cv2.cvtColor(input_img, cv2.COLOR_BGR2GRAY)
input_img_resize=cv2.resize(input_img,(128,128))
img_data_list.append(input_img_resize)
print(img_data_list[0].shape)
img_data = np.array(img_data_list)
img_data = img_data.astype('float32')
img_data /= 255
print (img_data.shape)
if num_channel==1:
if K.image_dim_ordering()=='th':
img_data= np.expand_dims(img_data, axis=1)
print (img_data.shape)
else:
img_data= np.expand_dims(img_data, axis=4)
print (img_data.shape)
else:
if K.image_dim_ordering()=='th':
img_data=np.rollaxis(img_data,3,1)
print (img_data.shape)
#%%
USE_SKLEARN_PREPROCESSING=False
# Define the number of classes
num_classes = 1
num_of_samples = img_data.shape[0]
labels = np.ones((num_of_samples,),dtype='int64')
labels[0:1600]=0
names = ['dzire']
# convert class labels to on-hot encoding
#Y = np_utils.to_categorical(labels, num_classes)
Y = np.zeros((1601,4))
#print(np.shape(Y))
Y[0][:] = [904,661,120,67]
for i in range(1,10):
df = pd.read_csv("dezire_v1_test.csv",skiprows =i-1,nrows = 1)
Y[i][:] = df
#print(df)
#print(np.shape(Y))
#print(Y[0:9][:])
x,y = shuffle(img_data,Y, random_state=2)
# Split the dataset
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=2)
#%%
# Defining the model
input_shape=img_data[0].shape
model = Sequential()
model.add(Convolution2D(32, 3,3,border_mode='same',input_shape=input_shape))
model.add(Activation('relu'))
model.add(Convolution2D(32, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))
model.add(Convolution2D(64, 3, 3))
model.add(Activation('relu'))
#model.add(Convolution2D(64, 3, 3))
#model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(4))
model.compile(loss="mean_squared_error",optimizer="Adam",metrics=[])
model.summary()
model.get_config()
model.layers[0].get_config()
model.layers[0].input_shape
model.layers[0].output_shape
model.layers[0].get_weights()
np.shape(model.layers[0].get_weights()[0])
model.layers[0].trainable
#%%
# Training
hist = model.fit(X_train, y_train, batch_size=16, nb_epoch=num_epoch, verbose=1, validation_data=(X_test, y_test))
from keras import callbacks
filename='model_train_new.csv'
csv_log=callbacks.CSVLogger(filename, separator=',', append=False)
early_stopping=callbacks.EarlyStopping(monitor='val_loss', min_delta=0, patience=0, verbose=0, mode='min')
filepath="Best-weights-my_model-{epoch:03d}-{loss:.4f}"
checkpoint = callbacks.ModelCheckpoint(filepath, monitor='val_loss', verbose=1, save_best_only=True, mode='min')
callbacks_list = [csv_log,early_stopping,checkpoint]
hist = model.fit(X_train, y_train, batch_size=16, nb_epoch=num_epoch, verbose=1, validation_data=(X_test, y_test),callbacks=callbacks_list)
# visualizing losses and accuracy
#train_loss=hist.history['loss']
#val_loss=hist.history['val_loss']
#train_acc=hist.history['acc']
#val_acc=hist.history['val_acc']
#xc=range(num_epoch)
#plt.figure(3,figsize=(7,5))
#plt.plot(xc,train_loss) #xc was giving error so removed it ck
#plt.plot(xc,val_loss)
#plt.plot(num_epoch,train_loss)
#plt.plot(num_epoch,val_loss)
#plt.xlabel('num of Epochs')
#plt.ylabel('loss')
#plt.title('train_loss vs val_loss')
#plt.grid(True)
#plt.legend(['train','val'])
#print plt.style.available # use bmh, classic,ggplot for big pictures
#plt.style.use(['classic'])
#plt.figure(1,figsize=(7,5))
#plt.plot(xc,train_loss) #xc was giving error so removed it ck
#plt.plot(xc,val_loss)
#plt.plot(train_loss)
#plt.plot(val_loss)
#plt.xlabel('num of Epochs')
#plt.ylabel('loss')
#plt.title('train_loss vs val_loss')
#plt.grid(True)
#plt.legend(['train','val'])
#print plt.style.available # use bmh, classic,ggplot for big pictures
#plt.style.use(['classic'])
#plt.figure(2,figsize=(7,5))
#plt.plot(xc,train_acc) #xc was giving error so removed it ck
#plt.plot(xc,val_acc)
#plt.plot(train_acc)
#plt.plot(val_acc)
#plt.xlabel('num of Epochs')
#plt.ylabel('accuracy')
#plt.title('train_acc vs val_acc')
#plt.grid(True)
#plt.legend(['train','val'],loc=4)
#print plt.style.available # use bmh, classic,ggplot for big pictures
#plt.style.use(['classic'])
#%%
# Evaluating the model
#score = model.evaluate(X_test, y_test, show_accuracy=True, verbose=0) #original line
score = model.evaluate(X_test, y_test, verbose=0)
#print('Test Loss:', score[0])
#print('Test accuracy:', score[1])
test_image = X_test[0:1]
#print (test_image.shape)
#plt.imshow(X_test[0])
#plt.show()
print(model.predict(test_image))
print(model.predict_classes(test_image))
print(y_test[0:1])
Ожидаемые результаты - это ограничивающие прямоугольные координаты (x, y, высота, ширина) цели на изображении, которое в данном случае является автомобилем, но фактические результаты всегда [0,0,0,0]