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")),
)
算子清单
|
分类 |
算子 |
说明 |
|
编解码 |
将原始图像字节解码为 |
|
|
将解码后的图像编码为压缩字节或 Data URL。 |
||
|
编码转换 |
将编码图像字节重新压缩。 |
|
|
转换编码格式。 |
||
|
类型转换 |
转换图像模式。 |
|
|
将图像转换为定形状 float32 Tensor。 |
||
|
尺寸与裁剪 |
缩放到指定尺寸。 |
|
|
按比例缩放。 |
||
|
裁剪图像区域。 |
||
|
检测并裁剪黑边。 |
||
|
图像增强 |
翻转图像。 |
|
|
模糊处理。 |
||
|
调整亮度、对比度和饱和度。 |
||
|
图像背景处理 |
移除图像背景。 |
|
|
有效性检查 |
判断图片是否通过有效性检查。 |
|
|
属性提取 |
提取图像宽度、高度、通道数、模式等。 |
|
|
计算宽高比。 |
||
|
使用拉普拉斯方差计算图像清晰度。 |
||
|
计算图像 phash。 |
||
|
数据过滤 |
按图像像素尺寸过滤。 |
|
|
按图像宽高比过滤。 |
||
|
按图像文件大小过滤。 |
||
|
检测与识别 |
使用 YOLO 检测目标物体。 |
|
|
使用 FastSAM 生成图像分割掩码。 |
||
|
使用 EasyOCR 从图像中提取文字。 |
||
|
判断图像是否为拼接图并返回子图数量。 |
||
|
人脸处理 |
检测人脸并返回边界框。 |
|
|
统计图像中的人脸数量。 |
||
|
对人脸区域进行模糊处理。 |
||
|
向量与相似度 |
从图像生成 CLIP 嵌入向量。 |
|
|
计算图像与文本之间的 CLIP 余弦相似度。 |
||
|
质量评分 |
计算综合质量评分。 |
|
|
评估 NSFW 内容风险。 |
||
|
评估图像美学质量。 |
||
|
评估图像包含水印的风险。 |
数据类型说明
图像数据形态
|
数据形态 |
DataFrame 类型 |
说明 |
|
编码图像 |
|
JPEG、PNG、WebP 等图片文件字节。 |
|
解码图像 |
|
内置类型,用于表示解码后的图像表示,大部分图像内置算子的输入或输出。 |
|
图像 Tensor |
|
内置类型, |
|
Data URL |
|
|
-
不同函数接受的数据形态不同,请以各函数的参数表为准。
-
大部分图像处理函数的输入类型为
DataType.image,如果数据源中的是编码图片字节,通常需要先调用image_decode进行解码。只有部分边界函数支持DataType.binary或同时支持两种输入。 -
图像编码相关函数通常支持以下编码格式:
JPEG、PNG、TIFF、WEBP、BMP、GIF。
内置类型 IMAGE
DataType.image 表示解码后的图像,包含像素数据,以及宽度、高度和图像模式三项元数据,不保留原文件的 JPEG、PNG 等编码格式。
以下算子负责在编码字节与 IMAGE 之间转换:
-
image_decode:将编码图片DataType.binary解码为DataType.image; -
image_encode:将DataType.image编码为图片DataType.binary或 Data URLDataType.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。
空值与错误处理
|
场景 |
配置方式 |
|
图片字节无法解码或超过像素限制时抛出异常 |
|
|
图片字节无法解码或超过像素限制时返回空值 |
|
|
轻量检查图片是否有效 |
|
说明:is_valid_image 只检查容器头和基础属性是否合法,不保证完整图片一定可以被解码
模型类算子的运行参数
算子支持配置、传递如下 Python 运行参数,具体不同算子支持不同的参数组合,使用详情可见具体的算子介绍章节。
|
参数 |
类型 |
说明 |
|
|
|
Pandas UDF 的 Arrow 批量大小。 |
|
|
|
本地模型权重的共享方式,支持 process 和 shared 两种模式。 |
|
|
|
算子 SLOT 申请的 GPU 数量。 |
|
|
|
GPU 类型标签,如 A10,具体配置需要参考用户实际使用的 GPU 规格。 |
|
|
|
UDF 并发数。 |
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
)
)
)