Label Studio 的 Image 标签(`<Image>`)完全指南:图像标注界面配置、参数详解与多图分割实战
2026/9/13 4:52:25 网站建设 项目流程

Label Studio 的 Image 标签(<Image>)完全指南:图像标注界面配置、参数详解与多图分割实战

【免费下载链接】label-studioLabel Studio is a multi-type data labeling and annotation tool with standardized output format项目地址: https://gitcode.com/GitHub_Trending/la/label-studio

<Image>是 Label Studio 前端编辑器中用于在标注界面展示图片的核心对象标签(object tag),几乎所有计算机视觉标注任务(目标检测、多边形分割、图像分类、关键点等)都以它作为画面载体。本文基于 Image 标签官方文档 及其参数参考 includes/tags/image.md,结合前端编辑器源码(Image.js、ImageEntity.js、MultiItemObjectBase.js)与仓库内置标注模板,系统讲解该标签的每个配置参数、坐标存储机制、多图(valueList)标注用法,并给出可直接复制到项目中的配置示例,帮助你构建真正可用的图像标注界面。

一、<Image>标签是什么

<Image>标签在标注页面上显示一张图片,是 Label Studio 中所有图像标注任务的基础展示组件。在标签配置(labeling config)中,它通常与标签类控制标签(如RectangleLabelsPolygonLabelsChoices等)配合使用:控制标签负责接收标注结果,<Image>负责展示待标注的图片素材。

使用该标签时需要注意两个关键事实:

  • 适用数据类型:图片(images)。value字段可以指向任务数据 JSON 中保存图片 URL 的字段,也可以指向 CSV 等外部数据源中存储图片路径的列。
  • 坐标存储方式:当你通过该标签标注图像区域(如矩形框、多边形)时,标注结果中的坐标以图片原始尺寸的百分比保存,取值范围 0–100,而不是像素绝对值。这种设计保证了标注结果与显示缩放、屏幕分辨率无关,无论标注员在界面上如何缩放图片,落盘的数据坐标始终指向图片自身的相对位置。

从源码结构看,该标签的前端实现位于 web/libs/editor/src/tags/object/Image/Image.js,其ImageModel通过types.compose组合了属性模型、ObjectBaseMultiItemObjectBase(多图场景)、AnnotationMixinImageEntityMixin以及坐标换算工具CoordsCalculations,最终以Registry.addTag("image", ImageModel, HtxImage)注册为类型名为image的内置标签。

二、最小可用配置:显示一张图片

最简单的用法是让<Image>从任务数据的某个字段中取图片地址并显示在界面上:

<View> <!-- 从 JSON 的 url 字段或 CSV 的 url 列中取图片地址 --> <Image name="image" value="$url" rotateControl="true" zoomControl="true"></Image> </View>

对应任务数据形如:

{ "data": { "url": "https://images.example.com/sample.jpg" } }

其中:

  • name是元素名称,也是后续控制标签通过toName关联该图片的标识;
  • value="$url"表示从数据字段url中读取图片地址;
  • rotateControl="true"在工具栏显示旋转按钮;
  • zoomControl="true"在工具栏显示缩放/平移工具。

如果value指向的字段本身就是数组(例如存放多张图片的字段),从ImageModelimages视图(见 Image.js)可以看到其行为:值为数组时按数组处理,否则包装成单元素数组。

三、完整参数参考

下表为<Image>标签支持的全部参数(依据 includes/tags/image.md 整理,并与 Image.js 中的 MST 属性模型核对,[param]表示可选参数):

参数类型默认值说明
namestring(必填)元素名称,供控制标签通过toName关联
valuestring(必填)包含图片路径或 URL 的数据字段名
[valueList]string引用一个保存图片 URL 列表的变量,用于多图/多页标注
[smoothing]boolean跟随用户设置是否启用图像平滑渲染
[width]string"100%"图片宽度
[maxWidth]string"750px"图片最大宽度
[zoom]booleanfalse是否允许用鼠标滚轮缩放图片
[negativeZoom]booleanfalse是否允许将图片缩小到原始尺寸以下
[zoomBy]float1.1每次缩放的倍率因子
[grid]booleanfalse是否显示网格
[gridSize]number30网格大小
[gridColor]string"#EEEEF4"网格颜色(hex),透明度固定 0.15
[zoomControl]booleanfalse是否在工具栏显示缩放控制
[brightnessControl]booleanfalse是否在工具栏显示亮度控制
[contrastControl]booleanfalse是否在工具栏显示对比度控制
[rotateControl]booleanfalse是否在工具栏显示旋转控制
[crosshair]booleanfalse是否显示十字准星光标
[horizontalAlignment]left|center|rightleft图片水平对齐方式
[verticalAlignment]top|center|bottomtop图片垂直对齐方式
[defaultZoom]auto|original|fitfit图片在视口内的初始缩放方式(保持比例)
[crossOrigin]none|anonymous|use-credentialsnone图片的 CORS 跨域行为配置

注意:文档表格给出的默认值与源码模型中的默认值存在少数差异(如zoomzoomControlmaxWidth在源码中默认分别为truetrue"100%"),上表以官方文档为准,实际生效值以当前版本编辑器源码为准。

参数背后的源码行为

从源码看,几个参数并非简单的“开关”,而是直接参与渲染与交互逻辑:

  • width/maxWidth/ 对齐方式:属性模型定义了width(默认"100%")、maxwidth(默认"100%")等,渲染层在 ImageView/Image.jsx 中据此计算画布尺寸;horizontalAlignmentverticalAlignment则通过alignmentOffset视图(Image.js)换算成画布内的偏移量,实现左/中/右、上/中/下对齐。
  • zoom/negativeZoom/zoomByzoom控制滚轮缩放是否可用;negativeZoom决定能否缩小到 100% 以下;zoomBy作为倍率因子参与handleZoom中的currentZoom * zoomBy/currentZoom / zoomBy计算(Image.js)。源码中还内置了平滑滚轮缩放:通过指数公式Math.exp(val * ZOOM_INTENSITY)计算单次缩放量,并将单次滚轮事件的缩放变化限制在 ±30%(MAX_ZOOM_CHANGE_PER_EVENT),防止一次滚动缩放过猛。
  • defaultZoom"fit"(适配视口)、"original"(原始尺寸)、"auto"三种取值对应源码中的sizeToFit/sizeToOriginal/sizeToAuto三个动作(Image.js),它们在图片加载完成(updateImageSize)后按需调用。
  • crossOrigin:除"none"外的取值会传递给图片加载器并作用于<img>标签,用于解决跨域图片绘制到 Canvas 时被“污染”的问题;源码中imageCrossOrigin视图(Image.js)会把"none"归一化为"anonymous"传给加载器。
  • grid/gridSize/gridColor:控制画布上的辅助网格,网格颜色为十六进制色值、固定透明度 0.15,主要用于辅助精确定位。

四、多图标注:用valueList处理多张图片 / 多页文档

当单个任务需要标注多张图片(例如多页 PDF 逐页切片、同一物体的多视角图像)时,使用valueList参数引用一个图片 URL 数组:

<View> <!-- 从 JSON 的 images 字段或 CSV 的 images 列中读取图片 URL 列表 --> <Image name="image" valueList="$images" rotateControl="true" zoomControl="true"></Image> </View>

对应任务数据(含注释中的示例):

<!-- { "data": { "images": [ "https://images.unsplash.com/photo-1556740734-7f3a7d7f0f9c?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1950&q=80", "https://images.unsplash.com/photo-1556740734-7f3a7d7f0f9c?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1950&q=80" ] } } -->

多图能力由MultiItemObjectBase混入(mixin)提供,其定义明确注释了“首个使用valueList参数的场景就是多图分割(Multi-Image Segmentation)”(见 MultiItemObjectBase.js)。从源码可以确认以下机制:

  • isMultiItem判定:只要配置了valuelist属性即视为多图模式(MultiItemObjectBase.js),因此多图模式与单图模式可以共存于同一个标签配置中,仅凭是否提供valueList参数切换。
  • 实体(entity)创建createImageEntities(Image.js)在数组模式下为每张图片创建一个ImageEntityid图片名#序号),单图模式则创建序号为 0 的单个实体。
  • 预加载(preload)preloadImages会以IMAGE_PRELOAD_COUNT = 3为窗口,对当前图片前后的若干图片做预加载,避免标注员切换页面时等待加载(Image.js)。
  • 结果归属afterResultCreated会把新创建的标注区域打上item_index = currentImage标记(Image.js),从而区分标注属于哪一张子图;regs视图也按item_index过滤出当前图片对应的区域(MultiItemObjectBase.js)。
  • 序列化附加信息createSerializedResult在导出结果时会附带original_widthoriginal_heightimage_rotation,多图场景下额外附加item_index(Image.js),方便下游还原标注位置。

实战模板:多页文档标注

仓库内置的计算机视觉模板 multipage-documents/config.yml 就是valueList的典型落地场景——把 PDF 每一页渲染成一张图片,然后在页面上框选文本区域:

<View> <RectangleLabels name="rectangles" toName="pdf" showInline="true"> <Label value="Title" background="green" /> <Label value="Date" background="blue" /> <Label value="Author" background="gold"/> <Label value="Organization" background="pink"/> <Label value="Amount" background="red"/> </RectangleLabels> <Image valueList="$pages" name="pdf"/> </View>
{ "pages": [ "https://htx-pub.s3.amazonaws.com/demo/images/demo_stock_purchase_agreement/0001.jpg", "https://htx-pub.s3.amazonaws.com/demo/images/demo_stock_purchase_agreement/0002.jpg", "https://htx-pub.s3.amazonaws.com/demo/images/demo_stock_purchase_agreement/0003.jpg" ] }

注意这里的要点:RectangleLabels通过toName="pdf"绑定<Image>valueList="$pages"指向数据字段pages(一个 URL 数组),标注员翻页框选时,每条矩形标注都会被记录到对应的item_index页面上。

五、图像标注的完整配置示例

仅展示图片并不构成标注任务,<Image>必须与一个或多个控制标签组合。以下是仓库内置模板 image-classification/config.yml 的图像分类示例:

<View> <Image name="image" value="$image"/> <Choices name="choice" toName="image"> <Choice value="Adult content"/> <Choice value="Weapons" /> <Choice value="Violence" /> </Choices> </View>

若要做区域级标注(目标检测),将Choices换成RectangleLabels即可:

<View> <Image name="image" value="$image" zoomControl="true" zoom="true"/> <RectangleLabels name="label" toName="image"> <Label value="Person" background="#ff0000"/> <Label value="Car" background="#00ff00"/> </RectangleLabels> </View>

配置时可以按需叠加本文第三节中的显示参数,例如:

<View> <Image name="image" value="$url" zoom="true" negativeZoom="false" zoomBy="1.5" zoomControl="true" brightnessControl="true" contrastControl="true" rotateControl="true" grid="true" gridSize="50" gridColor="#FF0000" crosshair="true" horizontalAlignment="center" verticalAlignment="center" defaultZoom="fit" ></Image> </View>

六、标注坐标的存储与换算机制

理解<Image>标签,还需理解其坐标体系。源码中定义了三级坐标及换算(Image.js):

  • 画布坐标(canvas):标注员在屏幕上实际看到的像素坐标,会随缩放、平移、旋转而变化;
  • 内部坐标(internal):以RELATIVE_STAGE_WIDTH/RELATIVE_STAGE_HEIGHT为基准的归一化舞台坐标,用于在区域与图片之间解耦;
  • 图片坐标(image):以图片naturalWidth/naturalHeight为基准的原始图片坐标。

标注事件发生时,event()会把屏幕坐标先经fixZoomedCoords扣除缩放变换,再换算为内部坐标交给工具管理器处理(Image.js);而最终导出的区域结果坐标是相对图片原始尺寸的百分比(0–100),这正是文档开头强调的存储规则。ImageEntity中维护的naturalWidth/naturalHeight(图片解码后的真实像素尺寸)是这一切换算的基准,也是导出结果中original_width/original_height的取值来源(ImageEntity.js)。

此外,图片的加载与缓存由 ImageEntity.js 管理:通过全局imageCache去重加载、跟踪下载进度、失败后自动重试一次(setError中的恢复逻辑),并在实体销毁时通过releaseImage释放缓存引用(ImageEntity.js),避免内存泄漏。

七、常见问题与使用建议

  • 图片加载失败怎么办crossOrigin保持默认即可满足多数场景;若图片来自跨域 CDN 且需要配合 Canvas 处理(如掩码标注),按需设置为anonymous。源码在加载失败时会自动重试一次并移除可能损坏的缓存项(ImageEntity.js)。
  • 缩放范围:单次滚轮缩放的倍率由zoomBy控制,negativeZoom="true"才能缩小到 100% 以下;源码中还硬性限制了滚轮单次缩放变化不超过 30%,避免误触导致画面剧烈跳动。
  • 多图标注的数据结构:务必保证valueList指向的字段是字符串数组;标注结果中每个区域会携带item_index,区分图片来源,下游解析时不要遗漏该字段。
  • 更多模板:仓库 label_studio/annotation_templates/computer-vision 目录下还有多边形分割、语义分割、关键点、OCR、目标检测等大量可参考的图像标注模板,均以<Image>为底图,可直接对照学习其参数组合。

【免费下载链接】label-studioLabel Studio is a multi-type data labeling and annotation tool with standardized output format项目地址: https://gitcode.com/GitHub_Trending/la/label-studio

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询