图像算子使用概述

更新时间:
复制 MD 格式

Python DataFrame API 提供图像校验、编解码、变换、过滤、检测、质量评分等算子。本文主要介绍图像算子的调用方式、数据类型、错误处理和运行时参数。

使用限制

仅实时计算引擎 VVR 11.8 及以上版本支持。

使用方法

使用说明

在基于 Dataframe API 开发 Python 作业时,图像算子统一从pyflink.multimodal.operators 中导入,图像处理相关依赖已经内置,使用内置算子时,用户无需在作业中引入额外依赖。

from pyflink.dataframe import col
from pyflink.multimodal.operators import image_metadata, image_decode

result = df.with_column(
    "metadata",
    image_metadata(col("image")),
)

调用方式

算子可以在传入列的同时配置参数,传递的参数需要使用 keyword 方式指定。

from pyflink.dataframe import col
from pyflink.multimodal.operators import image_resize

result = df.with_column(
    "resized",
    image_resize(
        col("image"),
        width=512,
        height=512,
        method="lanczos"
    )
)

也可以先创建配置好的算子,再应用到一个或多个列:

resize = image_resize(
    width=512,
    height=512,
    method="lanczos",
)

result = df.with_column(
    "resized",
    resize(col("image")),
)

算子清单

分类

算子

说明

编解码

image_decode

将原始图像字节解码为 DataType.image()

image_encode

将解码后的图像编码为压缩字节或 Data URL。

编码转换

image_compress

将编码图像字节重新压缩。

image_convert_format

转换编码格式。

类型转换

image_convert_mode

转换图像模式。

image_to_tensor

将图像转换为定形状 float32 Tensor。

尺寸与裁剪

image_resize

缩放到指定尺寸。

image_rescale

按比例缩放。

image_crop

裁剪图像区域。

image_crop_black_border

检测并裁剪黑边。

图像增强

image_flip

翻转图像。

image_blur

模糊处理。

image_adjust_color

调整亮度、对比度和饱和度。

图像背景处理

image_remove_background

移除图像背景。

有效性检查

is_valid_image

判断图片是否通过有效性检查。

属性提取

image_metadata

提取图像宽度、高度、通道数、模式等。

image_aspect_ratio

计算宽高比。

image_sharpness

使用拉普拉斯方差计算图像清晰度。

image_hash

计算图像 phash。

数据过滤

image_size_filter

按图像像素尺寸过滤。

image_shape_filter

按图像宽高比过滤。

image_file_size_filter

按图像文件大小过滤。

检测与识别

image_detect_objects

使用 YOLO 检测目标物体。

image_segment

使用 FastSAM 生成图像分割掩码。

image_ocr

使用 EasyOCR 从图像中提取文字。

image_detect_subplot

判断图像是否为拼接图并返回子图数量。

人脸处理

image_face_detect

检测人脸并返回边界框。

image_face_count

统计图像中的人脸数量。

image_face_blur

对人脸区域进行模糊处理。

向量与相似度

image_embedding

从图像生成 CLIP 嵌入向量。

image_text_similarity

计算图像与文本之间的 CLIP 余弦相似度。

质量评分

image_quality_score

计算综合质量评分。

image_nsfw_score

评估 NSFW 内容风险。

image_aesthetic_score

评估图像美学质量。

image_watermark_score

评估图像包含水印的风险。

数据类型说明

图像数据形态

数据形态

DataFrame 类型

说明

编码图像

DataType.binary()

JPEG、PNG、WebP 等图片文件字节。

解码图像

DataType.image()

内置类型,用于表示解码后的图像表示,大部分图像内置算子的输入或输出。

图像 Tensor

DataType.tensor(...)

内置类型,image_to_tensor 返回的定形状 float32 Tensor,常用作为模型推理的输入。

Data URL

DataType.string()

image_encode(output="data_url") 返回图像 base64 编码字符串。

  • 不同函数接受的数据形态不同,请以各函数的参数表为准。

  • 大部分图像处理函数的输入类型为 DataType.image,如果数据源中的是编码图片字节,通常需要先调用 image_decode 进行解码。只有部分边界函数支持 DataType.binary 或同时支持两种输入。

  • 图像编码相关函数通常支持以下编码格式:JPEGPNGTIFFWEBPBMPGIF

内置类型 IMAGE

DataType.image 表示解码后的图像,包含像素数据,以及宽度、高度和图像模式三项元数据,不保留原文件的 JPEG、PNG 等编码格式。

以下算子负责在编码字节与 IMAGE 之间转换:

  • image_decode:将编码图片 DataType.binary 解码为 DataType.image

  • image_encode:将 DataType.image 编码为图片 DataType.binary 或 Data URL DataType.string

图像预览

预览解码图像

DataType.image 编码为 Data URL 后,可将结果作为浏览器图片地址使用。

from pyflink.multimodal.operators import image_encode

result = df.with_column(
    "preview_url",
    image_encode(
        col("image"),
        format="JPEG",
        quality=85,
        output="data_url"  # 选择 data_url
    )
)

返回值格式如下:

data:image/jpeg;base64,...

预览编码图像

编码图像 DataType.binary 需要先转换为包含正确 MIME 类型的 Base64 Data URL,才能作为浏览器图片地址使用,目前应先调用 image_decode,然后再进行 image_encode

空值与错误处理

场景

配置方式

图片字节无法解码或超过像素限制时抛出异常

image_decode(on_error="raise")(Python 算子默认行为)

图片字节无法解码或超过像素限制时返回空值

image_decode(on_error="null")

轻量检查图片是否有效

is_valid_image(...)

说明:is_valid_image 只检查容器头和基础属性是否合法,不保证完整图片一定可以被解码

模型类算子的运行参数

算子支持配置、传递如下 Python 运行参数,具体不同算子支持不同的参数组合,使用详情可见具体的算子介绍章节。

参数

类型

说明

batch_size

Optional[int]

Pandas UDF 的 Arrow 批量大小。None 使用框架默认值。

model_sharing

Optional[str]

本地模型权重的共享方式,支持 process 和 shared 两种模式。

num_gpus

Optional[float]

算子 SLOT 申请的 GPU 数量。

gpu_type

Optional[str]

GPU 类型标签,如 A10,具体配置需要参考用户实际使用的 GPU 规格。

concurrency

Optional[int]

UDF 并发数。None 表示使用框架默认值。

Pipeline 示例

以下示例解码图片、过滤解码失败的数据、统一尺寸,并生成图像元数据和编码字节。

from pyflink.dataframe import col
from pyflink.multimodal.operators import (
    image_decode,
    image_encode,
    image_metadata,
    image_resize,
)

decoded = (
    df.with_column(
        "image",
        image_decode(
            col("image_bytes"),
            on_error="null",
            mode="RGB",
            concurrency=5
        )
    )
    .filter(col("image").is_not_null)
)

resized = decoded.with_column(
    "image_512",
    image_resize(
        col("image"),
        width=512,
        height=512,
        method="lanczos"
    )
)

result = (
    resized
    .with_column(
        "metadata",
        image_metadata(col("image_512")),
    )
    .with_column(
        "resized_image_bytes",
        image_encode(
            col("image_512"),
            format="JPEG",
            quality=85
        )
    )
)

相关文档