使用CNN从飞镖降落的飞镖板上获取价值

时间:2020-07-05 15:19:01

标签: python tensorflow convolution cnn

我想在python中使用CNN来使用图片从飞镖获取值(或飞镖着陆的字段的值)。

我为飞镖拍了208张照片,每个飞镖都在特定的位置。我想预测下一张图片中的飞镖是否在特定字段中(208张图片代表4类/每组52张)(来自同一字段的单,双和三重代表相同的数字,或者在我们的情况下是同一类别。

sample dart in a field

然后我用类似的图片来测试模型。

当我尝试拟合模型时,我会得到类似的东西

208/208 [==============================] - 3s 15ms/sample - loss: 0.0010 - accuracy: 1.0000 - val_loss: 8.1726 - val_accuracy: 0.2500
Epoch 29/100
208/208 [==============================] - 3s 15ms/sample - loss: 9.8222e-04 - accuracy: 1.0000 - val_loss: 8.6713 - val_accuracy: 0.2500
Epoch 30/100
208/208 [==============================] - 3s 15ms/sample - loss: 8.5902e-04 - accuracy: 1.0000 - val_loss: 9.2214 - val_accuracy: 0.2500
Epoch 31/100
208/208 [==============================] - 3s 15ms/sample - loss: 7.9463e-04 - accuracy: 1.0000 - val_loss: 9.6584 - val_accuracy: 0.2500

当精度达到1时,val_accuracy保持不变,以前的一些模型给我带来了更好的结果,但是却没有比这更好的了。

由于我是该领域的新手,因此我需要一些建议以使我的模型或整个程序更好。

这是我当前的型号_

model = Sequential()
model.add(Conv2D(32, kernel_size=3, activation='relu', input_shape=(640, 480, 3)))

model.add(MaxPooling2D(2, 2))

model.add(BatchNormalization())

model.add(Conv2D(64, kernel_size=3, activation='relu'))

model.add(MaxPooling2D(2, 2))

model.add(Conv2D(128, kernel_size=3, activation='relu'))

model.add(MaxPooling2D(2, 2))

model.add(Conv2D(256, kernel_size=3, activation='relu'))

model.add(MaxPooling2D(2, 2))

model.add(Flatten())

model.add(Dense(512, activation='relu', kernel_initializer='he_uniform'))

model.add(Dense(4, activation='softmax'))

model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])

history = model.fit(X, y, batch_size=16, epochs=100, validation_data=(Xtest,ytest))

和我的示例程序

training_data = []
DATADIR = 'C:/PikadaNew'

dir = sorted(os.listdir(DATADIR), key=len)
def create_training_data():
    for category in dir:  # do dogs and cats
        path = os.path.join(DATADIR,category)
        class_num = dir.index(category) 
        for img in tqdm(os.listdir(path)): 
            try:
                img_array = cv2.imread(os.path.join(path,img))     
                training_data.append([img_array, class_num])      
            except Exception as e: 
                pass          

create_training_data()

DATATESTDIR = 'C:/PikadaNewTest'
dir1 = sorted(os.listdir(DATATESTDIR), key=len)
test_data = []

def create_test_data():
    for category in dir1:
        path = os.path.join(DATATESTDIR,category) 
        class_num = dir1.index(category) 
        for img in tqdm(os.listdir(path)):
            try:
                img_array = cv2.imread(os.path.join(path,img))  # convert to array
                test_data.append([img_array, class_num])                
            except Exception as e:
                pass

create_test_data()

#print(len(training_data))
#print(len(test_data))

X = []
y = []

Xtest = []
ytest = []

for features,label in training_data:
    X.append(features)
    y.append(label)

for features,label in test_data:
    Xtest.append(features)
    ytest.append(label)


X = np.array(X).reshape(-1, 640, 480, 3)
Xtest= np.array(Xtest).reshape(-1, 640, 480, 3)
y = np.array(y)
ytest = np.array(ytest)


y = to_categorical(y)
ytest = to_categorical(ytest)


X = X/255.0
Xtest = Xtest/255.0


X,y = shuffle(X,y)
Xtest,ytest = shuffle(Xtest,ytest)

感谢和抱歉,我希望它可以理解,这是我想要实现的目标 每个建议都非常感谢 萨摩

1 个答案:

答案 0 :(得分:0)

您正面临一个过拟合的问题,因为您的数据太小,模型的复杂性超出了需要。您可以尝试以下操作:

  • 如果可以的话,添加更多数据。
  • 尝试通过删除一些层来简化模型。
  • 向模型添加辍学并使用正则化。
  • 使用更少的纪元。