TensorImage 是 Image 对象的封装容器类。在 TFLite.support 库中使用图像处理实用程序时,通常会先将变体类型的图像对象转换为 TensorImage。
目前仅支持 RGB 图片,并始终忽略 A 通道。
数据存储详情:TensorImage 对象可能有 2 个潜在的可信来源:Bitmap 或 TensorBuffer。TensorImage 会维护相应状态,并仅在需要时将一种状态转换为另一种状态。TensorImage 的典型用例是首先加载 Bitmap 图片,然后使用 ImageProcessor 对其进行处理,最后获取 TensorBuffer 的底层 ByteBuffer 并将其馈送给 TFLite 解释器。
重要提示:为了获得最佳性能,TensorImage 会尽可能避免复制数据。因此,它对自己的数据没有所有权。调用方不应修改传递给 load(Bitmap) 或 load(TensorBuffer, ColorSpaceType) 的数据对象。
重要提示:并非所有方法都经过证明线程安全。
公共构造函数
|
TensorImage()
初始化一个
TensorImage 对象。 |
|
公共方法
| 静态 TensorImage | |
| 静态 TensorImage |
fromBitmap(位图位图)
|
| 位图 |
getBitmap()
返回此
TensorImage 的 Bitmap 表示法。 |
| ByteBuffer |
getBuffer()
返回此
TensorImage 的 ByteBuffer 表示法(具有预期数据类型)。 |
| ColorSpaceType |
getColorSpaceType()
获取此
TensorImage 的颜色空间类型。 |
| DataType |
getDataType()
获取此
TensorImage 的数据类型。 |
| 整型 |
getHeight()
获取图片高度。
|
| 图片 |
getMediaImage()
返回此
TensorImage 的 Image 表示法。 |
| TensorBuffer |
getTensorBuffer()
返回此
TensorImage 的 TensorBuffer 表示法(具有预期数据类型)。 |
| 整型 |
getWidth()
获取图片宽度。
|
| void | |
| void |
加载(位图位图)
将
Bitmap 图片对象加载到此 TensorImage 中。 |
| void |
load(int[] 像素, int[] shape)
将 int 数组作为 RGB 像素加载到此
TensorImage,表示内部的像素。 |
| void |
加载(float[] pixel, int[] shape)
将浮点数组作为 RGB 像素加载到此
TensorImage 中,表示内部的像素。 |
| void | |
| void |
load(TensorBuffer 缓冲区、ImageProperties imageProperties)
加载
TensorBuffer,其中包含具有特定 ImageProperties 的像素值。 |
| void |
加载(图片图片)
将
Image 对象加载到此 TensorImage 中。 |
继承的方法
公共构造函数
public TensorImage ()
初始化一个 TensorImage 对象。
注意:此 TensorImage 的数据类型为 DataType.UINT8。如果首选其他数据类型,请使用 TensorImage(DataType)。
public TensorImage (DataType dataType)
初始化具有指定数据类型的 TensorImage 对象。
从此 TensorImage 获取 TensorBuffer 或 ByteBuffer 时(例如使用 getTensorBuffer() 和 getBuffer()),数据值将转换为指定的数据类型。
注意:TensorImage 的形状不是固定的。可将其调整为要加载到此 TensorImage 的图片的形状。
参数
| dataType | 生成的 TensorBuffer 的预期数据类型。在 TensorImage 的生命周期内,类型始终固定。如需转换数据类型,请使用 createFrom(TensorImage, DataType) 同时创建副本并转换数据类型。 |
|---|
抛出
| IllegalArgumentException | 如果 dataType 既不是 DataType.UINT8 也不是 DataType.FLOAT32
|
|---|
公共方法
public static TensorImage createFrom (TensorImage src, DataType dataType)
使用所需数据类型创建指定 TensorImage 的深层副本。
参数
| src | 要复制的 TensorImage |
|---|---|
| dataType | 新创建的 TensorImage 的预期数据类型 |
返回
- 一个
TensorImage,其数据从src复制而来,数据类型为dataType
public static TensorImage fromBitmap (位图位图)
public Bitmap getBitmap ()
返回该 TensorImage 的 Bitmap 表示法。
如果存储的数据不是 uint8,则会应用数字类型转换和取值范围限制。
请注意,从 ALPHA_8 位图获取像素的可靠方法是使用 copyPixelsToBuffer。“setPixels()”和“getPixels”等位图方法不起作用。
重要提示:这只是一个引用。请勿修改。出于性能方面的考虑,我们不会在此处创建副本,但如果需要修改,请创建副本。
返回
- 在
ARGB_8888配置(“A”通道始终不透明)或ALPHA_8中引用Bitmap,具体取决于此TensorBuffer的ColorSpaceType。
抛出
| IllegalStateException | 如果 TensorImage 从不加载数据
|
|---|
public ByteBuffer getBuffer ()
返回此 TensorImage 的 ByteBuffer 表示法(具有预期数据类型)。
如果存储的数据与 TensorImage 的数据类型不同,系统就会应用数字类型转换和取值范围限制。
重要提示:这只是一个引用。请勿修改。出于性能方面的考虑,我们不会在此处创建副本,但如果需要修改,请创建副本。
它本质上是 getTensorBuffer().getBuffer() 的快捷方式。
返回
- 对保存图片数据的
ByteBuffer的引用
抛出
| IllegalStateException | 如果 TensorImage 从不加载数据
|
|---|
public ColorSpaceType getColorSpaceType ()
获取此 TensorImage 的颜色空间类型。
抛出
| IllegalStateException | 如果 TensorImage 从不加载数据
|
|---|
public DataType getDataType ()
获取此 TensorImage 的数据类型。
返回
- 一种数据类型。目前仅支持
DataType.UINT8和DataType.FLOAT32。
public int getHeight ()
获取图片高度。
抛出
| IllegalStateException | 如果 TensorImage 从不加载数据 |
|---|---|
| IllegalArgumentException | 在底层数据已损坏时 |
public 图片 getMediaImage ()
返回该 TensorImage 的 Image 表示法。
此方法仅在 TensorImage 由 Image 提供支持时才有效,这意味着您需要先通过 load(Image) 加载 Image。
重要提示:这只是一个引用。请勿修改。出于性能方面的考虑,我们不会在此处创建副本,但如果需要修改,请创建副本。
返回
- 在
ARGB_8888配置(“A”通道始终不透明)或ALPHA_8中引用Bitmap,具体取决于此TensorBuffer的ColorSpaceType。
抛出
| IllegalStateException | 如果 TensorImage 从不加载数据
|
|---|
public TensorBuffer getTensorBuffer ()
返回此 TensorImage 的 TensorBuffer 表示法(具有预期数据类型)。
如果存储的数据与 TensorImage 的数据类型不同,系统就会应用数字类型转换和取值范围限制。
重要提示:这只是一个引用。请勿修改。出于性能方面的考虑,我们不会在此处创建副本,但如果需要修改,请创建副本。
返回
- 对保存图片数据的
TensorBuffer的引用
抛出
| IllegalStateException | 如果 TensorImage 从不加载数据
|
|---|
public int getWidth ()
获取图片宽度。
抛出
| IllegalStateException | 如果 TensorImage 从不加载数据 |
|---|---|
| IllegalArgumentException | 在底层数据已损坏时 |
public void load (TensorBuffer缓冲区, ColorSpaceType colorSpaceType)
加载 TensorBuffer,其中包含具有特定 ColorSpaceType 的像素值。
仅支持 ColorSpaceType.RGB 和 ColorSpaceType.GRAYSCALE。对于其他颜色空间类型,请使用 load(TensorBuffer, ImageProperties)。
注意:如果 buffer 的数据类型与此 TensorImage 的数据类型不匹配,则在调用 getTensorBuffer() 和 getBuffer() 时,系统会应用数字类型转换和限制值。
参数
| 缓存空间 | 要加载的 TensorBuffer。对于 RGB 图片,其形状应为 (h, w, 3) 或 (1, h, w, 3);对于 GRAYSCALE 图片,其形状应为 (h, w) 或 (1, h, w) |
|---|---|
| colorSpaceType |
抛出
| IllegalArgumentException | 如果缓冲区的形状与颜色空间类型不匹配,或者颜色空间类型不受支持 |
|---|
public void load (位图位图)
将 Bitmap 图片对象加载到此 TensorImage 中。
注意:如果 TensorImage 的数据类型不是 DataType.UINT8,则在调用 getTensorBuffer() 和 getBuffer() 时,系统会应用数字类型转换和限制,其中 Bitmap 将转换为 TensorBuffer。
重要提示:加载位图时,请勿再从调用方修改位图。TensorImage 对象将依赖位图。它可能还会修改位图。在此方法中,我们只需保留该位图的引用,即可对其执行零复制方法。如有必要,请使用 bitmap.copy(bitmap.getConfig(), true) 创建副本。
注意:为获得最佳性能,请以相同的形状加载图片,以避免重新分配内存。
参数
| 位图 |
|---|
抛出
| IllegalArgumentException | 如果 bitmap 不在 ARGB_8888 中
|
|---|
public void load (int[] pixel, int[] shape)
将 int 数组作为 RGB 像素加载到此 TensorImage 中,表示内部的像素。
注意:在调用 getTensorBuffer() 和 getBuffer() 时,将应用数字类型转换和取值范围限制,以将值转换为此 TensorImage 的数据类型。
参数
| 像素 | 表示图片的 RGB 像素 |
|---|---|
| shape | 图像的形状,应为 (h, w, 3) 或 (1, h, w, 3) |
抛出
| IllegalArgumentException | 如果形状既不是 (h, w, 3),也不是 (1, h, w, 3) |
|---|
public void load (float[] pixel, int[] shape)
将浮点数组作为 RGB 像素加载到此 TensorImage 中,表示内部的像素。
注意:如果 TensorImage 的数据类型不是 DataType.FLOAT32,则在调用 getTensorBuffer() 和 getBuffer() 时,系统会应用数字类型转换和取值范围限制。
参数
| 像素 | 表示图片的 RGB 像素 |
|---|---|
| shape | 图像的形状,应为 (h, w, 3) 或 (1, h, w, 3) |
抛出
| IllegalArgumentException | 如果形状既不是 (h, w, 3),也不是 (1, h, w, 3) |
|---|
public void load (ByteBuffer缓冲区, ImageProperties imageProperties)
加载 ByteBuffer,其中包含具有特定 ImageProperties 的像素值。
注意:如果 buffer 的数据类型与此 TensorImage 的数据类型不匹配,则在调用 getTensorBuffer() 和 getBuffer() 时,系统会应用数字类型转换和限制值。
参数
| 缓存空间 | |
|---|---|
| imageProperties |
抛出
| IllegalArgumentException | 如果缓冲区空间小于 ImageProperties 中的图片高度、宽度和颜色空间类型所指示的图片大小
|
|---|
public void load (TensorBuffer Buffer, ImageProperties imageProperties)
加载 TensorBuffer,其中包含具有特定 ImageProperties 的像素值。
TensorBuffer 的形状不会用于确定图片的高度和宽度。通过 ImageProperties 设置图片属性。
注意:如果 buffer 的数据类型与此 TensorImage 的数据类型不匹配,则在调用 getTensorBuffer() 和 getBuffer() 时,系统会应用数字类型转换和限制值。
参数
| 缓存空间 | |
|---|---|
| imageProperties |
抛出
| IllegalArgumentException | 如果缓冲区空间小于 ImageProperties 中的图片高度、宽度和颜色空间类型所指示的图片大小
|
|---|
public void load (图片图片)
将 Image 对象加载到此 TensorImage 中。
此方法的主要用途是将 Image 对象作为模型输入加载到 https://www.tensorflow.org/lite/inference_with_metadata/task_library/overview。ImageProcessor 不支持 Image 支持的 TensorImage。
* 如果 image 的 ImageFormat 不是 YUV_420_888,则会抛出 IllegalArgumentException
参数
| 图片 |
|---|