def preprocess_image(img):
img = image.load_img(img, target_size=(299, 299))
img = image.img_to_array(img)
img = img / 255.0
return img
def preprocess_image(image):
image = tf.io.read_file(image)
image = tf.image.decode_jpeg(image, channels=3)
image = tf.image.resize_with_pad(image, 227, 227)
image = image / 255.0
return image
tf.keras.utils.image_dataset_from_directory(
directory,
labels='inferred',
label_mode='int',
class_names=None,
color_mode='rgb',
batch_size=32,
image_size=(256, 256),
shuffle=True,
seed=None,
validation_split=None,
subset=None,
interpolation='bilinear',
follow_links=False,
crop_to_aspect_ratio=False,
**kwargs
)
如果你的目录结构是:
main_directory/ ...class_a/ ......a_image_1.jpg ......a_image_2.jpg ...class_b/ ......b_image_1.jpg ......b_image_2.jpg
然后调用
image_dataset_from_directory(main_directory, labels='inferred')
将返回 a ,它会tf.data.Dataset从子目录class_a
和中生成批量图像class_b
,以及标签 0 和 1(0 对应于class_a
1,1 对应于class_b
)。支持的图像格式:jpeg、png、bmp、gif。动画 gif 被截断到第一帧。
directory |
数据所在的目录。如果labels 是“推断”,它应该包含子目录,每个子目录都包含一个类的图像。否则,目录结构将被忽略。 |
labels |
“推断”(从目录结构生成标签)、无(无标签)或与目录中找到的图像文件数量相同大小的整数标签的列表/元组。标签应根据图像文件路径的字母数字顺序排序(通过Python 获得)。 os.walk(directory) |
label_mode |
|
class_names |
仅当“标签”是“推断”时才有效。这是类名的显式列表(必须与子目录的名称匹配)。用于控制类的顺序(否则使用字母数字顺序)。 |
color_mode |
“灰度”、“rgb”、“rgba”之一。默认值:“RGB”。图像是否将转换为具有 1、3 或 4 个通道。 |
batch_size |
数据批次的大小。默认值:32。如果None ,则不会对数据进行批处理(数据集将产生单个样本)。 |
image_size |
从磁盘读取图像后调整图像大小的大小。默认为. 由于管道处理必须具有相同大小的批量图像,因此必须提供这一点。 (256, 256) |
shuffle |
是否打乱数据。默认值:真。如果设置为 False,则按字母数字顺序对数据进行排序。 |
seed |
用于洗牌和转换的可选随机种子。 |
validation_split |
0 到 1 之间的可选浮点数,保留用于验证的数据的一部分。 |
subset |
“培训”或“验证”之一。仅在设置时使用。 validation_split |
interpolation |
字符串,调整图像大小时使用的插值方法。默认为bilinear . 支持bilinear , nearest , bicubic , area , lanczos3 , lanczos5 , gaussian , mitchellcubic . |
follow_links |
是否访问符号链接指向的子目录。默认为假。 |
crop_to_aspect_ratio |
如果为 True,则调整图像大小而不会出现纵横比失真。当原始纵横比与目标纵横比不同时,将裁剪输出图像,以返回与目标纵横比匹配的图像中(大小为 )的最大可能窗口。默认情况下 ( ),可能不会保留纵横比。 image_size crop_to_aspect_ratio=False |
**kwargs |
旧版关键字参数。 |
Returns
一种tf.data.Dataset对象。
|
关于标签格式的规则:
label_mode
是int
,则标签是int32
形状张量 (batch_size,)
。label_mode
是binary
,标签是float32
形状为 1 和 0 的张量(batch_size, 1)
。label_mode
是categorial
,标签是一个float32
形状张量(batch_size, num_classes)
,表示类索引的 one-hot 编码。关于生成图像中通道数的规则:
color_mode
是grayscale
,则图像张量中有 1 个通道。color_mode
是rgb
,则图像张量中有 3 个通道。color_mode
是rgba
,则图像张量中有 4 个通道。贪婪地按分数的降序选择边界框的子集。
tf.image.non_max_suppression(
boxes,
scores,
max_output_size,
iou_threshold=0.5,
score_threshold=float('-inf'),
name=None
)
修剪掉与先前选定的框在联合上具有高交集(IOU)重叠的框。边界框以[y1,x1,y2,x2]的形式提供,其中(y1,x1)和(y2,x2)是框角的任何对角线对的坐标,坐标可以提供为标准化(即位于间隔[0,1])或绝对坐标。请注意,此算法与原点在坐标系中的位置无关。该算法对坐标系的正交变换和平移是不变的;因此,坐标系的平移或反射会导致算法选择相同的框。此操作的输出是一组整数,索引到表示选定框的边界框的输入集合中。然后,可以使用tf获得与所选索引相对应的边界框坐标。收集操作。例如:
selected_indices = tf.image.non_max_suppression(
boxes, scores, max_output_size, iou_threshold)
selected_boxes = tf.gather(boxes, selected_indices)
参数 |
|
---|---|
boxes |
Tensor 形状 为 的二维浮点数。 [num_boxes, 4] |
scores |
一个 1-DTensor 形状的浮点数,表示对应于每个框(每行框)的单个分数。 [num_boxes] |
max_output_size |
一个标量整数Tensor ,表示要通过非最大抑制选择的最大框数。 |
iou_threshold |
一个 0-D 浮点张量,表示用于决定框相对于 IOU 是否重叠过多的阈值。 |
score_threshold |
一个 0-D 浮点张量,表示根据分数决定何时移除框的阈值。 |
name |
操作的名称(可选)。 |
return |
|
---|---|
selected_indices |
一个 1-D 整数Tensor 形状,[M] 表示从框张量中选择的索引,其中. M <= max_output_size |
tf.gather()
该接口的作用:就是抽取出params的第axis维度上在indices里面所有的index
tf.gather(
params,
indices,
validate_indices=None,
name=None,
axis=0
)
数说明:
params: A Tensor.
indices: A Tensor. types必须是: int32, int64. 里面的每一个元素大小必须在 [0, params.shape[axis])范围内.
axis: 维度。沿着params的哪一个维度进行抽取indices
返回的是一个tensor
tf.gather和tf.gather_nd都是从tensor中取出index标注的部分,不同之处在于,gather一般只使用一个index来标注,而gather_nd可以使用多个index。
tf.image.crop_and_resize(
image,
boxes,
box_indices,
crop_size,
method='bilinear',
extrapolation_value=0.0,
name=None
)
从输入图像张量中提取裁剪,并使用双线性采样或最近邻采样(可能随着纵横比变化)将它们调整为由 指定的常见输出大小crop_size
。crop_to_bounding_box
这比从输入图像中提取固定大小切片并且不允许调整大小或纵横比更改的操作更通用 。
crops
从输入image
中的边界框位置定义的位置返回张量boxes
。裁剪后的框都被调整大小(使用双线性或最近邻插值)到一个固定的 size = [crop_height, crop_width]
. 结果是一个 4-D 张量 [num_boxes, crop_height, crop_width, depth]
。调整大小是角对齐的。特别是,如果boxes = [[0, 0, 1, 1]]
,该方法将给出与使用tf.compat.v1.image.resize_bilinear()或 tf.compat.v1.image.resize_nearest_neighbor()(取决于method
参数)与 相同的结果align_corners=True
。
参数 |
|
---|---|
image |
一个 4-D 张量 shape 。两者都需要积极。 [batch, image_height, image_width, depth] image_height image_width |
boxes |
一个二维张量 shape 。张量的第 - 行指定图像中框的坐标,并以归一化坐标指定。的归一化坐标值映射到 处的图像坐标,因此归一化图像高度的区间映射到图像高度坐标中。我们确实允许> ,在这种情况下,采样裁剪是原始图像的上下翻转版本。宽度尺寸的处理方式类似。允许超出范围的归一化坐标,在这种情况下,我们使用外推输入图像值。 [num_boxes, 4] i box_ind[i] [y1, x1, y2, x2] y y * (image_height - 1) [0, 1] [0, image_height - 1] y1 y2 [0, 1] extrapolation_value |
box_indices |
具有 int32 值 的一维形状张量。的值指定第 -th 框引用的图像。 [num_boxes] [0,batch) box_ind[i] i |
crop_size |
2 个元素的一维张量,. 所有裁剪的图像块都将调整为此大小。不保留图像内容的纵横比。两者都需要 积极。 size = [crop_height, crop_width] crop_height crop_width |
method |
一个可选字符串,指定调整大小的采样方法。它可以是"bilinear" 或"nearest" 并且默认为"bilinear" 。目前支持两种采样方法:双线性和最近邻。 |
extrapolation_value |
一个可选的float . 默认为. 适用时用于外推的值。 0.0 |
name |
操作的名称(可选)。 |
recall |
|
---|---|
一个 4-D 张量 shape 。 [num_boxes, crop_height, crop_width, depth] |
keras.backend.int_shape(x)
返回张量或变量的尺寸,作为 int 或 None 项的元组。
参数
返回
整数元组(或 None 项)。
例子
>>> from keras import backend as K
>>> inputs = K.placeholder(shape=(2, 4, 5))
>>> K.int_shape(inputs)
(2, 4, 5)
>>> K.int_shape(inputs)[2]
5
>>> val = np.array([[1, 2], [3, 4]])
>>> kvar = K.variable(value=val)
>>> K.int_shape(kvar)
(2, 2)
keras.backend.image_data_format()
返回默认图像数据格式约定 ('channels_first' 或 'channels_last')。
返回
一个字符串,'channels_first'
或 'channels_last'
例子
>>> keras.backend.image_data_format()
'channels_first'
tf.keras.applications.imagenet_utils.preprocess_input(
x, data_format=None, mode='caffe'
)
预处理编码一批图像的张量或 Numpy 数组。
tf.keras.applications.imagenet_utils.preprocess_input(
x, data_format=None, mode='caffe'
)
使用示例applications.MobileNet:
tf.keras.applications.imagenet_utils.preprocess_input(
x, data_format=None, mode='caffe'
)
i = tf.keras.layers.Input([None, None, 3], dtype = tf.uint8)
x = tf.cast(i, tf.float32)
x = tf.keras.applications.mobilenet.preprocess_input(x)
core = tf.keras.applications.MobileNet()
x = core(x)
model = tf.keras.Model(inputs=[i], outputs=[x])
image = tf.image.decode_png(tf.io.read_file('file.png'))
result = model(image)
参数 |
|
---|---|
x |
具有 3 个颜色通道的浮点或 a 、3D 或 4D,其值在 [0, 255] 范围内。如果数据类型兼容,则预处理数据将覆盖输入数据。为了避免这种行为,可以使用。 numpy.array tf.Tensornumpy.copy(x) |
data_format |
图像张量/数组的可选数据格式。默认为无,在这种情况下使用全局设置 tf.keras.backend.image_data_format()(除非您更改它,否则默认为“channels_last”)。 |
mode |
“caffe”、“tf”或“torch”之一。默认为“caffe”。
|
return:
numpy.arrayh或者
tf.Tensor()r类型为float32
在使用keras的时候,一般使用model.fit()来传入训练数据,fit()接受多种类型的数据:
1.数组类型(如numpy等)。
2.dataset类型
3.python generator,但是限制比较多,一般要在编写python generator的平 台下运行模型
4.tensorflow.keras.utils.Sequence,和python generator差不多,但是限制较少,可迁移性更好
from skimage.io import imread
from skimage.transform import resize
import numpy as np
import math
# Here, `x_set` is list of path to the images
# and `y_set` are the associated classes.
class CIFAR10Sequence(Sequence):
def __init__(self, x_set, y_set, batch_size):
self.x, self.y = x_set, y_set
self.batch_size = batch_size
def __len__(self):
return math.ceil(len(self.x) / self.batch_size)
def __getitem__(self, idx):
batch_x = self.x[idx * self.batch_size:(idx + 1) *
self.batch_size]
batch_y = self.y[idx * self.batch_size:(idx + 1) *
self.batch_size]
return np.array([
resize(imread(file_name), (200, 200))
for file_name in batch_x]), np.array(batch_y)
init():初始化类。
len():返回batch_size的个数,也就是完整跑一遍数据要运行运行模型多少次。
getitem():返回一个batch_size的数据(data,label)
on_epoch_end():每个epoch结束后如何执行
tf.keras.utils.OrderedEnqueuer(
sequence, use_multiprocessing=False, shuffle=False
)
参数:
sequence |
一个tf.keras.utils.data_utils.Sequence 对象。 |
use_multiprocessing |
如果为 True,则使用多处理,否则使用线程 |
shuffle |
是否在每个 epoch 开始时打乱数据 |
方法:
如果是None
则跳过数据。
队列中的下一个元素组成为 (inputs, targets)或
(inputs, targets, sample_weights)
is_running()
start(
workers=1, max_queue_size=10
)
启动线程处理程序
workers |
线程数 |
max_queue_size |
队列大小(满时,线程可以使用阻塞put() ) |
stop(
timeout=None
)
如有必要,停止运行线程并等待它们退出。
应该由调用start()
.
timeout |
等待的最长时间thread.join() |