如何改进深度神经网络以处理更大的输入图像?
How to improve deep neural network to work with bigger input image?
我正在尝试使用深度神经网络检测图像上的路标(基于 the tflearn example):
dataset_file = [path_to_dataset_file]
X, Y = image_preloader(dataset_file, image_shape=(32, 32), mode='file',
categorical_labels=True, normalize=True)
X, Y = shuffle(X, Y)
network = input_data(shape=[None, 32, 32, 3])
network = conv_2d(network, 32, 3, activation='relu')
network = max_pool_2d(network, 2)
network = conv_2d(network, 64, 3, activation='relu')
network = conv_2d(network, 64, 3, activation='relu')
network = fully_connected(network, 512, activation='relu')
network = dropout(network, 0.5)
network = fully_connected(network, 2, activation='softmax')
network = regression(network)
model = tflearn.DNN(network, tensorboard_verbose=0)
model.fit(X, Y, n_epoch=1000, show_metric=True)
它在处理小图像 (32 x 32px) 时效果非常好,但我想改进我的网络以处理更大的图像(500 x 500px 或更大,如果可能),背景中有路标,在角落等。尝试 运行 shape=[None, 500, 500, 3] 的代码杀死了我的电脑:)
我是这么想的(伪代码):
SIZE_GOOD_ENOUGH = 32
def try_detect(image):
if image_too_small(image): # image is too small when width
return FALSE # or height < SIZE_GOOD_ENOUGH
resized_image = image.resize_to(SIZE_GOOD_ENOUGH, SIZE_GOOD_ENOUGH)
result = detect_with_DNN(resized_image) # returns TRUE if detected
if result:
return TRUE
smaller_images_list = cut_into_pieces(image) # list of smaller images
for smaller_image in smaller_images_list:
result = try_detect(smaller_image) # recursion
if result:
return TRUE
return FALSE
...或类似的东西,但我仍然想要更大的 SIZE_GOOD_ENOUGH,因为一些调整大小的路标即使对我来说也很难辨认。有没有什么方法可以改进我的网络以更好地处理(例如)200 x 200 像素的图像?对我来说更好意味着 "do not kill my GPU" 并且结果的准确度仍然 > 0.9。可能是我的conv_2d/max_pool_2d没选好?如果有任何建议,我将不胜感激。
为了减少 GPU 内存使用,您可以在网络开始时减少更多特征图的空间大小。为了训练更大的网络,需要一个4G内存以上的GPU,或者几个GPU。
还有一点,我假设32x32的例子以路标为中心,而500x500的图像是道路场景,而不仅仅是路标。在这种情况下,你最好做一些像物体检测这样的事情。
我正在尝试使用深度神经网络检测图像上的路标(基于 the tflearn example):
dataset_file = [path_to_dataset_file]
X, Y = image_preloader(dataset_file, image_shape=(32, 32), mode='file',
categorical_labels=True, normalize=True)
X, Y = shuffle(X, Y)
network = input_data(shape=[None, 32, 32, 3])
network = conv_2d(network, 32, 3, activation='relu')
network = max_pool_2d(network, 2)
network = conv_2d(network, 64, 3, activation='relu')
network = conv_2d(network, 64, 3, activation='relu')
network = fully_connected(network, 512, activation='relu')
network = dropout(network, 0.5)
network = fully_connected(network, 2, activation='softmax')
network = regression(network)
model = tflearn.DNN(network, tensorboard_verbose=0)
model.fit(X, Y, n_epoch=1000, show_metric=True)
它在处理小图像 (32 x 32px) 时效果非常好,但我想改进我的网络以处理更大的图像(500 x 500px 或更大,如果可能),背景中有路标,在角落等。尝试 运行 shape=[None, 500, 500, 3] 的代码杀死了我的电脑:)
我是这么想的(伪代码):
SIZE_GOOD_ENOUGH = 32
def try_detect(image):
if image_too_small(image): # image is too small when width
return FALSE # or height < SIZE_GOOD_ENOUGH
resized_image = image.resize_to(SIZE_GOOD_ENOUGH, SIZE_GOOD_ENOUGH)
result = detect_with_DNN(resized_image) # returns TRUE if detected
if result:
return TRUE
smaller_images_list = cut_into_pieces(image) # list of smaller images
for smaller_image in smaller_images_list:
result = try_detect(smaller_image) # recursion
if result:
return TRUE
return FALSE
...或类似的东西,但我仍然想要更大的 SIZE_GOOD_ENOUGH,因为一些调整大小的路标即使对我来说也很难辨认。有没有什么方法可以改进我的网络以更好地处理(例如)200 x 200 像素的图像?对我来说更好意味着 "do not kill my GPU" 并且结果的准确度仍然 > 0.9。可能是我的conv_2d/max_pool_2d没选好?如果有任何建议,我将不胜感激。
为了减少 GPU 内存使用,您可以在网络开始时减少更多特征图的空间大小。为了训练更大的网络,需要一个4G内存以上的GPU,或者几个GPU。
还有一点,我假设32x32的例子以路标为中心,而500x500的图像是道路场景,而不仅仅是路标。在这种情况下,你最好做一些像物体检测这样的事情。