- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我第一次使用卷积神经网络和 Tensorflow。
我正在尝试实现一个能够从数字视网膜图像中提取血管的卷积神经网络。我正在使用公开的 Drive database (图像为 .tif 格式)。
由于我的图像非常大,我的想法是将它们分成大小为 28x28x1 的子图像(“1”是绿色 channel ,我唯一需要的)。为了创建训练集,我从每个图像中迭代随机裁剪 28x28 批处理,并在此集上训练网络。
现在,我想在数据库中的一张大图像上测试我训练过的网络(也就是说,我想将网络应用于完整的眼睛)。由于我的网络是在大小为 28x28 的子图像上进行训练的,因此想法是将眼睛分成“n”个子图像,将它们传递给网络,重新组装它们并显示结果,如图 1 所示:
我尝试使用一些函数,例如:tf.extract_image_pathces
或 tf.train.batch
,但我想知道执行此操作的正确方法是什么。
下面是我的代码片段。我陷入困境的函数是 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)
最佳答案
您可以结合使用 reshape
和 transpose
调用将图像剪切成图 block ,而无需使用循环:
def split_image(image3, tile_size):
image_shape = tf.shape(image3)
tile_rows = tf.reshape(image3, [image_shape[0], -1, tile_size[1], image_shape[2]])
serial_tiles = tf.transpose(tile_rows, [1, 0, 2, 3])
return tf.reshape(serial_tiles, [-1, tile_size[1], tile_size[0], image_shape[2]])
其中 image3
是 3 维张量(例如图像),tile_size
是一对值[H, W]
指定图 block 的大小。输出是形状为[B, H, W, C]
的张量。在您的情况下,调用将是:
tiles = split_image(image, [28, 28])
产生形状为[B, 28, 28, 1]
的张量。您还可以通过反向执行以下操作从图 block 重新组合原始图像:
def unsplit_image(tiles4, image_shape):
tile_width = tf.shape(tiles4)[1]
serialized_tiles = tf.reshape(tiles4, [-1, image_shape[0], tile_width, image_shape[2]])
rowwise_tiles = tf.transpose(serialized_tiles, [1, 0, 2, 3])
return tf.reshape(rowwise_tiles, [image_shape[0], image_shape[1], image_shape[2]])
其中 tiles4
是形状 [B, H, W, C]
的 4D 张量,image_shape
是原始形状图像。在您的情况下,调用可能是:
image = unsplit_image(tiles, tf.shape(image))
请注意,只有当图像大小可以被图 block 大小整除时,这才有效。如果不是这种情况,您需要将图像填充到最接近的图 block 尺寸倍数:
def pad_image_to_tile_multiple(image3, tile_size, padding="CONSTANT"):
imagesize = tf.shape(image3)[0:2]
padding_ = tf.to_int32(tf.ceil(imagesize / tile_size)) * tile_size - imagesize
return tf.pad(image3, [[0, padding_[0]], [0, padding_[1]], [0, 0]], padding)
你会这么称呼:
image = pad_image_to_tile_multiple(image, [28,28])
然后将图 block 重新组装成图像后,通过拼接去除 paddig:
image = image[0:original_size[0], 0:original_size[1], :]
关于python - Tensorflow 入门 - 将图像分割为子图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38235643/
实际上我只需要用JAVA编写一个简单的程序来将MySQL INSERTS行转换为CSV文件(每个mysql表等于一个CSV文件) 在JAVA中使用正则表达式是最好的解决方案吗? 我的主要问题是如何正确
我有一个 txt 文件,其格式为: Key:value Key:value Key:value ... 我想将所有键及其值放入我创建的 hashMap 中。如何让 FileReader(file) 或
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度的了解。包括尝试的解决方案、为什么它们不起作用以及预期结果
我每周都会从我的主机下载数据库的备份。它生成一个 .sql 文件,当前大小约为 800mb。此 .sql 文件包含 44 个表。 有什么方法可以通过某些软件将 .sql 文件与所有表分开,以便单独导出
在 iOS 4.0 及更高版本中,有没有一种方法可以在不将整个图像加载到内存的情况下对 CGImage 进行分割?我试图做的是*以编程方式*分割图像,以便在使用大图像的 CATiledLayer 应用
我的 .split() 函数有问题,我有以下字符串: var imageUrl = "Images\Products\randomImage.jpg"; 我想用字符“\”分割,但是,这种情况发生了:
是否可以使用正则表达式将字符串拆分两次?例如,假设我有字符串: example=email@address.com|fname|lname 如何拆分结果为: email@address.com,fna
我正在寻找一种在线程系统(主从)中使用数组的解决方案,它允许我通过用户输入在多个线程上划分矩阵的计算,并将其通过 1 个主线程引导到多个从属线程,这些从属线程计算矩阵的 1 个字段。 我尝试运用我的知
我建立了一个系统来分割包含手写符号的二值图像并对它们进行分类(专门用于音乐)。我知道有商业应用程序可以执行此操作,但这是我尝试将其作为一个项目从头开始。 为了简单起见,假设我的整个图像中有两个元素:
我正在尝试找到一种可接受的复杂性的有效方法 检测图像中的对象,以便将其与周围环境隔离 将该对象分割成它的子部分并标记它们,这样我就可以随意获取它们 我进入图像处理世界已经 3 周了,我已经阅读了很多算
我有一组3D 空间中的点。下图是一个示例: 我想把这些点变成一个面。我只知道点的 X、Y 和 Z 值。例如,查看下图,它显示了从 3D 空间中的点生成的人脸网格。 我在谷歌上搜索了很多,但我找到的是一
我有一个字符串 String placeStr="place1*place2*place3"我想获取包含 place1、place2、place3 的数组,如下所示: String[] places=
我在 Python 中有一个类似于 google.com 的字符串,我想将其分成两部分:google 和 .com。问题是我有一个 URL,例如 subdomain.google.com,我想将其拆分
朋友需要对一个pdf文件进行分割,在网上查了查发现这个pypdf2可以完成这些操作,所以就研究了下这个库,并做一些记录。首先pypdf2是python3版本的,在之前的2版本有一个对应pypdf库。
伙计们,这是一个难以解决的问题,因为它涉及很多硬件细节,所以我想把它放到 EE.SE,但它的主要重点是编程,所以我决定坚持在这里。 我最近怀旧(以及渴望回到 CPU 内在函数),所以我决定自制一个 8
给定 haskell 中的排序列表,我如何获得分段列表,其中连续数字位于同一列表中。例如,如果我有一个排序列表 [1,2,3,4,7,8,10,12,13,15] 结果将是 [[1,2,3 ,4],[
如果我添加三个分割 View ,如下图所示,第三个分割 View (称为 splitView-3)将自动为该分割 View 中的自定义 View 生成约束,例如 customview1 的 Heigh
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 6 年前。 Improve th
如何为馈送给映射器的文件的每一行提供相同文件的拆分? 基本上我想做的是 for each line in file-split { for each line in file{
带有Snappy压缩功能的ORC文件是否可拆分成条形? 据我所知,Snappy Compressed File是不可拆分的。 但我在博客中读到,快速压缩的文件可以在 strip 上拆分。 真的吗? 最
我是一名优秀的程序员,十分优秀!