Tensor类将被用于承载任意模态的通用数据,实现通用数据的创建、管理以及数据复制等操作。
| 属性名 | 类型 | 说明 | 备注 |
|---|---|---|---|
| device | str | Tensor所在设备。 | 默认为"cpu"。 |
| dtype | DataType | Tensor数据类型。 | 默认为DataType.FLOAT32。 |
| shape | list | Tensor的维度信息。 | 默认为空list。 |
| format | TensorFormat | Tensor数据排布类型。 | 默认为TensorFormat.ND。 |
| nbytes | int | Tensor数据占用字节数。 | 默认为0。 |
设置数据排布格式。
set_format(tensor_format: TensorFormat)| 参数名 | 数据类型 | 可选/必选 | 说明 |
|---|---|---|---|
| tensor_format | TensorFormat | 必选 | 输入需要设置的排布格式。支持ND、NHWC和NCHW。若设置为NHWC或者NCHW,需要确保tensor的shape有四维。 |
from mm import Tensor, TensorFormat
tensor = Tensor()
tensor.set_format(TensorFormat.ND)深拷贝Tensor实例对象为新的Tensor实例。
clone()-> Tensor| 数据类型 | 说明 |
|---|---|
| Tensor | 新的Tensor实例。 |
from mm import Tensor
tensor = Tensor()
tensor_new = tensor.clone()将Numpy数组转化为Tensor对象。
from_numpy(nd_array: numpy.ndarray) -> Tensor:| 参数名 | 数据类型 | 可选/必选 | 说明 |
|---|---|---|---|
| nd_array | numpy.ndarray | 必选 |
|
| 数据类型 | 说明 |
|---|---|
| Tensor | 通过numpy.ndarray创建的Image实例。 |
[!NOTE] 说明 构造后的Tensor对象与numpy.ndarray共享数据,数据的生命周期由numpy.ndarray对象维护。
from mm import Tensor
import numpy as np
arr = np.zeros((1024, 768, 3), dtype=np.uint8)
tensor = Tensor.from_numpy(arr)将Tensor对象转化为Numpy数组。
numpy()-> np.ndarray| 数据类型 | 说明 |
|---|---|
| numpy.ndarray | 转换后的Numpy数组。 |
[!NOTE] 说明
- Tensor对象转换为numpy.ndarray对象,转换后的numpy.ndarray与Tensor共享数据,数据的生命周期由Tensor对象维护。
- Tensor所处的device必须为CPU。
from mm import Tensor
import numpy as np
arr = np.zeros((1024, 768, 3), dtype=np.uint8)
tensor = Tensor.from_numpy(arr)
arr_new = tensor.numpy()将torch.Tensor张量转化为Tensor对象。
from_torch(torch_tensor: torch.Tensor) -> Tensor:| 参数名 | 数据类型 | 可选/必选 | 说明 |
|---|---|---|---|
| torch_tensor | torch.Tensor | 必选 |
|
| 数据类型 | 说明 |
|---|---|
| Tensor | 通过torch.Tensor创建的Tensor对象。 |
[!NOTE] 说明 构造后的Tensor对象与torch.Tensor共享数据,数据的生命周期由torch.Tensor对象维护。
from mm import Tensor
import torch
tensor = torch.zeros((1024, 768, 3), dtype=torch.uint8)
mm_tensor = Tensor.from_torch(tensor)将Tensor对象转化为torch.Tensor张量。
torch()-> torch.Tensor| 数据类型 | 说明 |
|---|---|
| torch.Tensor | 转换后的torch.Tensor张量。 |
[!NOTE] 说明
- Tensor对象转换为torch.Tensor对象,转换后的torch.Tensor与Tensor共享数据,数据的生命周期由Tensor对象维护。
- Tensor所处的device必须为CPU。
from mm import Tensor
import torch
tensor = torch.zeros((1024, 768, 3), dtype=torch.uint8)
mm_tensor = Tensor.from_torch(tensor)
torch_tensor = mm_tensor.torch()Tensor类成员函数,使用均值和标准差对当前对象进行归一化。给定n个通道的均值:(mean[1],...,mean[n])和标准差:(std[1],..,std[n]),此变换将对当前对象的每个通道进行归一化,即output[channel] = (src[channel] - mean[channel]) / std[channel],其中src为当前Tensor对象。
def normalize(mean: list[float], std: list[float], device_mode: DeviceMode = DeviceMode.CPU)-> Tensor| 参数名 | 数据类型 | 可选/必选 | 说明 |
|---|---|---|---|
| mean | list[float] | 必选 | 均值数组,长度必须为3,参数范围为[0, 1]。 |
| std | list[float] | 必选 | 标准差数组,长度必须为3,参数范围大于0,小于3.4028235e38。 |
| device_mode | DeviceMode | 可选 | 运行的模式,当前仅支持CPU。 |
| 数据类型 | 说明 |
|---|---|
| Tensor | 转换后的Tensor对象。 |
[!NOTE] 说明
- Tensor对象的format仅支持NCHW或NHWC,N仅支持1,C仅支持3。
- Tensor对象的数据类型仅支持Float32。
- Tensor对象所处的device必须为CPU。
from mm import Tensor
import torch
tensor = torch.zeros((1024, 768, 3), dtype=torch.uint8)
mm_tensor = Tensor.from_torch(tensor)
mean = [0.1, 0.1, 0.1]
std = [0.1, 0.1, 0.1]
dst_mm_tensor = tensor.normalize(mean, std)Image类将被用于承载图像数据,实现通用图像的创建、管理以及数据复制等操作。
| 属性名 | 类型 | 说明 |
|---|---|---|
| device | str | Image所在设备。仅支持cpu。 |
| dtype | DataType | Image数据类型。仅支持DataType.UINT8。 |
| size | list | Image的大小。 |
| format | ImageFormat | Image数据图像格式。 |
| nbytes | int | Image数据占用字节数。 |
| height | int | Image的高度。 |
| width | int | Image的宽度。 |
通过指定路径创建Image。
open(path:str | bytes, device:str | bytes = b'cpu')| 参数名 | 数据类型 | 可选/必选 | 说明 |
|---|---|---|---|
| path | str | bytes | 必选 |
|
| device | str | bytes | 可选 | 设备类型,目前只支持cpu且默认为cpu。 |
| 数据类型 | 说明 |
|---|---|
| Image | 通过路径创建的新Image实例。 |
from mm import Image
img= Image.open("/home/test.jpg", "cpu")从Numpy数组转化为Image实例。
from_numpy(
nd_array: numpy.ndarray,
image_format: ImageFormat,
device: str | bytes = b"cpu"
) -> Image:| 参数名 | 数据类型 | 可选/必选 | 说明 |
|---|---|---|---|
| nd_array | numpy.ndarray | 必选 | 输入的Numpy数组。需满足以下条件:
|
| image_format | ImageFormat | 必选 | 图像格式,支持RGB、BGR、BGR_PLANAR和RGB_PLANAR,输入的类型需与numpy的数据维度对应。 |
| device | str | bytes | 可选 | 设备类型,目前只支持cpu且默认为cpu。 |
| 数据类型 | 说明 |
|---|---|
| Image | 通过numpy.ndarray创建的Image实例。 |
[!NOTE] 说明 构造后的Image对象与numpy.ndarray共享数据,数据的生命周期由numpy.ndarray对象维护。
from mm import Image, ImageFormat
import numpy as np
arr = np.zeros((1024, 768, 3), dtype=np.uint8)
img = Image.from_numpy(arr, ImageFormat.RGB, "cpu")将Image实例对象转换为Numpy数组。
numpy()-> numpy.ndarray| 数据类型 | 说明 |
|---|---|
| numpy.ndarray | 转换后的Numpy数组。 |
[!NOTE] 说明
- 输出ndarray形状根据图像格式决定: 当Image实例对象格式为RGB和BGR时为[H, W, 3];当format为RGB_PLANAR和BGR_PLANAR时为[3, H, W]。
- Image所处的device必须为CPU。
from mm import Image
import numpy as np
img = Image.open("/home/test.jpg", "cpu")
arr = img.numpy()深拷贝Image实例对象为新的Image实例。
from_torch(
torch_tensor: torch.Tensor,
image_format: ImageFormat,
device: str | bytes = b"cpu"
) -> Image:| 参数名 | 数据类型 | 可选/必选 | 说明 |
|---|---|---|---|
| torch_tensor | torch.Tensor | 必选 | 输入的pytorch张量。需满足以下条件:
|
| image_format | ImageFormat | 必选 | 支持RGB、BGR、BGR_PLANAR和RGB_PLANAR,输入的类型需与torch.Tensor的数据维度对应。 |
| device | str | bytes | 可选 | 设备类型,目前只支持cpu且默认为cpu。 |
[!NOTE] 说明 构造后的Image对象与torch.Tensor共享数据,数据的生命周期由torch.Tensor对象维护。
| 数据类型 | 说明 |
|---|---|
| Image | 通过torch.Tensor创建的Image实例。 |
from mm import Image, ImageFormat
import torch
tensor = torch.zeros((1024, 768, 3), dtype=torch.uint8)
img = Image.from_torch(tensor, ImageFormat.RGB, "cpu")将Image实例对象转换为torch Tensor张量。
torch()-> torch.Tensor| 数据类型 | 说明 |
|---|---|
| torch.Tensor | 转换后的torch张量。 |
[!NOTE] 说明
- 输出Tensor形状根据图像格式决定: 当Image实例对象format为RGB和BGR时为[H, W, 3],当format为BGR_PLANAR和RGB_PLANAR时为[3, H, W]。
- Image所处的device必须为CPU。
from mm import Image
import torch
img = Image.open("/home/test.jpg", "cpu")
tensor = img.torch()将PIL图像对象转换为Image对象。
from_pillow(pillow_image: PIL.Image.Image) -> Image| 参数名 | 数据类型 | 可选/必选 | 说明 |
|---|---|---|---|
| pillow_image | PIL.Image.Image | 必选 | 输入Pillow Image对象,且其mode属性仅支持"L"(灰度图)、"RGB"(RGB图像)和"RGBA"(包含透明度的RGB图像)。 |
| 数据类型 | 说明 |
|---|---|
| Image | 构建的Image对象。 |
from mm import Image
from PIL import Image as PImage
import numpy as np
img_np = np.random.randint(0, 255, size=(1, 400, 400, 3), dtype=np.uint8)
img_pil = PImage.fromarray(img_np[0])
img_mm = Image.from_pillow(img_pil)将Image对象转换为PIL图像对象。
pillow()-> PIL.Image.Image| 数据类型 | 说明 |
|---|---|
| PIL.Image.Image | 转换后的Pillow图像实例。 |
[!NOTE] 说明
- 输出PIL.Image.Image dtype需与Image实例对象保持一致,当前仅支持uint8。
- 输出PIL的Image实例对象mode为“RGB”。
- Image所处的device必须为CPU。
from mm import Image
from PIL import Image as PImage
pillow_image = PImage.open("/home/test.jpg")
img = Image.from_pillow(pillow_image)
pillow_image_new = img.pillow()深拷贝Image实例对象为新的Image实例。
clone()-> Image| 数据类型 | 说明 |
|---|---|
| Image | 通过深拷贝创建的新Image实例。 |
from mm import Image
img = Image.open("/home/test.jpg", "cpu")
img_copy = img.clone()对Image实例对象进行缩放操作。
resize(size: Tuple[int, int], interpolation: Interpolation, device_mode: DeviceMode) -> "Image"| 参数名 | 数据类型 | 可选/必选 | 说明 |
|---|---|---|---|
| size | Tuple[int, int] | 必选 | resize之后的图像宽高。size需为两维,第1维是width,第2维是height,且宽和高均应在[10, 8192]区间内。 |
| interpolation | Interpolation | 必选 | resize插值算法,当前仅支持BICUBIC。 |
| device_mode | DeviceMode | 可选 | resize运行的模式,当前仅支持CPU。 |
| 数据类型 | 说明 |
|---|---|
| Image | resize操作后获得的新Image实例。 |
[!NOTE] 说明 当前仅支持图像格式为RGB或BGR,数据格式为UINT8,各元素值范围在[0,255]。
from mm import Image, DeviceMode, Interpolation
img = Image.open("/home/test.jpg", "cpu")
img_resize = img.resize((10,10), Interpolation.BICUBIC, DeviceMode.CPU)对Image实例对象进行裁剪操作。
crop(top: int, left: int, height: int, width: int, device_mode: DeviceMode) -> "Image":| 参数名 | 数据类型 | 可选/必选 | 说明 |
|---|---|---|---|
| top | int | 必选 | 裁剪的上起始坐标。从0取值,(top+height)不能超过原图高度。 |
| left | int | 必选 | 裁剪的左起始坐标。从0取值,(left+width)不能超过原图宽度。 |
| height | int | 必选 | 裁剪区域高度,范围为[10, 原图高度-top]。 |
| width | int | 必选 | 裁剪区域宽度,范围为[10, 原图宽度-left]。 |
| device_mode | DeviceMode | 可选 | crop运行的模式,当前仅支持CPU。 |
| 数据类型 | 说明 |
|---|---|
| Image | crop操作后获得的新Image实例。 |
[!NOTE] 说明 当前仅支持图像格式为RGB或BGR,数据格式为UINT8,各元素值范围在[0,255]。
from mm import Image, DeviceMode
img = Image.open("/home/test.jpg", "cpu")
img_crop = img.crop(10, 10, 10, 10, DeviceMode.CPU)对Image实例对象进行[0,255]至[0.0, 1.0]缩放,以及格式转换能力(HWC->CHW)。
[!NOTE] 说明 当前仅支持图像格式为RGB或BGR,数据格式为UINT8,各元素值范围在[0,255]。 输出的Tensor实例数据类型默认为DataType.FLOAT32。
def to_tensor(target_format: TensorFormat = TensorFormat.NCHW, device_mode: DeviceMode = DeviceMode.CPU) -> "Tensor":| 参数名 | 数据类型 | 可选/必选 | 说明 |
|---|---|---|---|
| target_format | TensorFormat | 可选 | 转换后Tensor实例的格式,支持NHWC和NCHW,默认值为NCHW。 |
| device_mode | DeviceMode | 可选 | 运行的模式,当前仅支持CPU。 |
| 数据类型 | 说明 |
|---|---|
| Tensor | 操作后获得的Tensor实例。 |
from mm import Image, TensorFormat, DeviceMode
img = Image.open("/home/test.jpg", "cpu")
dst_tensor = img.to_tensor(TensorFormat.NCHW, DeviceMode.CPU)用户注册日志级别与日志回调函数。
日志注册函数。
register_log_conf(min_level: LogLevel, callback: Callable[[LogLevel, str, str, int, str], None])| 参数名 | 类型 | 可选/必选 | 说明 |
|---|---|---|---|
| min_level | LogLevel | 必选 | 最小日志级别,只有大于等于该级别的日志才会输出。不允许传入None。 |
| callback | Callable[[LogLevel, str, str, int, str], None] | 必选 | 日志回调函数,传入None时使用内部默认的日志输出函数。 |
[!CAUTION] 注意 在日志回调函数中抛异常会触发C++侧抛出异常,引起程序coredump,建议在回调中捕获异常并处理。
from mm import register_log_conf, LogLevel
def custom_log_handler(level: LogLevel, file: str, func: str, line: int, msg: str) -> None:
print(f"[custom][{level}] {file}:{line} ({func}) - {msg}")
register_log_conf(LogLevel.ERROR, custom_log_handler)将传入的视频文件解码,并返回Image对象列表。
def video_decode(video_path: str | bytes, device: str | bytes, frame_indices: set = None, sample_num: int = -1) -> list:| 参数名 | 数据类型 | 可选/必选 | 说明 |
|---|---|---|---|
| video_path | str | bytes | 必选 | 解码视频路径,当前仅支持mp4格式文件,分辨率支持480P-4K。 |
| device | str | bytes | 必选 | 解码设备,当前仅支持cpu。 |
| frame_indices | set | 可选 | 期望解码的视频帧ID。 |
| sample_num | int | 可选 | 期望解码后获取的总帧数。 |
| 数据类型 | 说明 |
|---|---|
| list[Image] | 解码后的Image对象列表。格式为RGB,数据类型为uint8。 |
[!NOTE] 说明
- 期望解码的视频帧ID取值范围为[0, 视频总帧数-1),默认为空集合,参数优先级高于期望解码后获取的总帧数。该参数意为目标解码的帧ID集合。
- 期望解码后获取的总帧数取值范围为(0, 视频总帧数],默认值为-1,最终解码ID集合为通过视频帧总数计算等间隔抽取。
- 若frame_indices和sample_num均未指定,会返回失败。
- 分辨率支持说明:目前支持的视频帧宽高为[480, 480] - [4096, 4096]。
- 输入的路径必须是有效的,且长度不超过4096,路径中不能包含软链接,且文件权限不得超过640,User/Group/Others的权限分别不得超过6、4、0。
from mm import video_decode
file_path = "test.mp4"
mm_images = video_decode(file_path, "cpu", [], 32)使用均值和标准差对Tensor对象进行归一化。给定n个通道的均值:(mean[1],...,mean[n])和标准差:(std[1],..,std[n]),此变换将对输入Tensor对象的每个通道进行归一化,即output[channel] = (src[channel] - mean[channel]) / std[channel]。
def normalize(src: Tensor, mean: list[float], std: list[float], device_mode: DeviceMode = DeviceMode.CPU)-> Tensor| 参数名 | 数据类型 | 可选/必选 | 说明 |
|---|---|---|---|
| src | Tensor | 必选 | 输入Tensor实例。 |
| mean | list[float] | 必选 | 均值数组,长度必须为3,参数范围为[0, 1]。 |
| std | list[float] | 必选 | 方差数组,长度必须为3,参数范围为[0,3.4028235e38]。 |
| device_mode | DeviceMode | 可选 | 运行的模式,当前仅支持CPU。 |
| 数据类型 | 说明 |
|---|---|
| Tensor | 转换后的Tensor对象。 |
[!NOTE] 说明
- 输入Tensor对象的format仅支持NCHW或NHWC,N仅支持1,C仅支持3。
- 输入Tensor对象的数据类型仅支持Float32。
- Tensor对象所处的device必须为CPU。
from mm import Tensor
import torch
tensor = torch.zeros((1024, 768, 3), dtype=torch.uint8)
mm_tensor = Tensor.from_torch(tensor)
mean = [0.1, 0.1, 0.1]
std = [0.1, 0.1, 0.1]
dst_mm_tensor = normalize(mm_tensor, mean, std, DeviceMode.CPU)使用音频加载接口,对给定的音频实现加载。支持对单音频文件加载以及对批量音频的并行加载,支持开关重采样。
def load_audio(audio_inputs: Union[str, List[str]], sr: Optional[int] = None)
-> Union[Tuple[Tensor, int], List[Tuple[Tensor, int]]]| 参数名 | 数据类型 | 可选/必选 | 说明 |
|---|---|---|---|
| audio_inputs | Union[str, List[str]] | 必选 | 输入单音频路径 / 多音频所在目录 / 音频列表。 |
| sr | Optional[int] | 可选 | 若用户指定重采样率,则按该采样率进行重采样,否则不进行重采样。 |
| 数据类型 | 说明 |
|---|---|
| Union[Tuple[Tensor, int], List[Tuple[Tensor, int]]] | 单音频返回(音频tensor数据, 采样率),多音频返回(音频tensor数据,采样率)列表。 |
[!NOTE] 说明
- 输入音频仅支持wav文件。
- 可加载音频文件的范围为[1,128]。
- 用户输入的采样率必须为[1,64000]范围内的正整数。
- 多通道音频会自动转换为单通道音频。
from mm import load_audio
single_audio_path = "/path/to/speech.wav"
audio_file_paths = ["/path/to/audio1.wav", "/path/to/audio2.wav"]
audio_directory = "/path/to/audio_dir"
waveform, sr = load_audio(single_audio_path)
batch_from_filelist = load_audio(audio_file_paths)
batch_from_directory = load_audio(audio_directory)