【发布时间】:2016-11-09 04:36:27
【问题描述】:
这是我第一次使用卷积神经网络和 Tensorflow。
我正在尝试实现一个能够从数字视网膜图像中提取血管的卷积神经网络。我正在使用公开的Drive database(图片为 .tif 格式)。
由于我的图像非常大,我的想法是将它们分成大小为 28x28x1 的子图像(“1”是绿色通道,我唯一需要的)。为了创建训练集,我从每张图像中迭代地随机裁剪一个 28x28 的批次,并在该集上训练网络。
现在,我想在数据库中的一张大图像上测试我训练有素的网络(也就是说,我想将网络应用于一个完整的眼睛)。由于我的网络是在大小为 28x28 的子图像上训练的,因此想法是将眼睛分成“n”个子图像,将它们传递给网络,重新组合它们并显示结果,如图 1 所示:
我尝试使用一些功能,例如:
tf.extract_image_pathces 或 tf.train.batch,但我想知道这样做的正确方法是什么。
下面是我的代码的 sn-p。我卡住的功能是split_image(image)
import numpy
import os
import random
from PIL import Image
import tensorflow as tf
BATCH_WIDTH = 28;
BATCH_HEIGHT = 28;
NUM_TRIALS = 10;
class Drive:
def __init__(self,train):
self.train = train
class Dataset:
def __init__(self, inputs, labels):
self.inputs = inputs
self.labels = labels
self.current_batch = 0
def next_batch(self):
batch = self.inputs[self.current_batch], self.labels[self.current_batch]
self.current_batch = (self.current_batch + 1) % len(self.inputs)
return batch
#counts the number of black pixel in the batch
def mostlyBlack(image):
pixels = image.getdata()
black_thresh = 50
nblack = 0
for pixel in pixels:
if pixel < black_thresh:
nblack += 1
return nblack / float(len(pixels)) > 0.5
#crop the image starting from a random point
def cropImage(image, label):
width = image.size[0]
height = image.size[1]
x = random.randrange(0, width - BATCH_WIDTH)
y = random.randrange(0, height - BATCH_HEIGHT)
image = image.crop((x, y, x + BATCH_WIDTH, y + BATCH_HEIGHT)).split()[1]
label = label.crop((x, y, x + BATCH_WIDTH, y + BATCH_HEIGHT)).split()[0]
return image, label
def split_image(image):
ksizes_ = [1, BATCH_WIDTH, BATCH_HEIGHT, 1]
strides_ = [1, BATCH_WIDTH, BATCH_HEIGHT, 1]
input = numpy.array(image.split()[1])
#input = tf.reshape((input), [image.size[0], image.size[1]])
#input = tf.train.batch([input],batch_size=1)
split = tf.extract_image_patches(input, padding='VALID', ksizes=ksizes_, strides=strides_, rates=[1,28,28,1], name="asdk")
#creates NUM_TRIALS images from a dataset
def create_dataset(images_path, label_path):
files = os.listdir(images_path)
label_files = os.listdir(label_path)
images = [];
labels = [];
t = 0
while t < NUM_TRIALS:
index = random.randrange(0, len(files))
if files[index].endswith(".tif"):
image_filename = images_path + files[index]
label_filename = label_path + label_files[index]
image = Image.open(image_filename)
label = Image.open(label_filename)
image, label = cropImage(image, label)
if not mostlyBlack(image):
#images.append(tf.convert_to_tensor(numpy.array(image)))
#labels.append(tf.convert_to_tensor(numpy.array(label)))
images.append(numpy.array(image))
labels.append(numpy.array(label))
t+=1
image = Image.open(images_path + files[1])
split_image(image)
train = Dataset(images, labels)
return Drive(train)
【问题讨论】:
-
我认为您的意思是补丁而不是批处理,这令人困惑。
标签: python dataset tensorflow image-segmentation