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)中,它通常与标签类控制标签(如RectangleLabels、PolygonLabels、Choices等)配合使用:控制标签负责接收标注结果,<Image>负责展示待标注的图片素材。
使用该标签时需要注意两个关键事实:
- 适用数据类型:图片(images)。
value字段可以指向任务数据 JSON 中保存图片 URL 的字段,也可以指向 CSV 等外部数据源中存储图片路径的列。 - 坐标存储方式:当你通过该标签标注图像区域(如矩形框、多边形)时,标注结果中的坐标以图片原始尺寸的百分比保存,取值范围 0–100,而不是像素绝对值。这种设计保证了标注结果与显示缩放、屏幕分辨率无关,无论标注员在界面上如何缩放图片,落盘的数据坐标始终指向图片自身的相对位置。
从源码结构看,该标签的前端实现位于 web/libs/editor/src/tags/object/Image/Image.js,其ImageModel通过types.compose组合了属性模型、ObjectBase、MultiItemObjectBase(多图场景)、AnnotationMixin、ImageEntityMixin以及坐标换算工具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指向的字段本身就是数组(例如存放多张图片的字段),从ImageModel的images视图(见 Image.js)可以看到其行为:值为数组时按数组处理,否则包装成单元素数组。
三、完整参数参考
下表为<Image>标签支持的全部参数(依据 includes/tags/image.md 整理,并与 Image.js 中的 MST 属性模型核对,[param]表示可选参数):
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
name | string | (必填) | 元素名称,供控制标签通过toName关联 |
value | string | (必填) | 包含图片路径或 URL 的数据字段名 |
[valueList] | string | 引用一个保存图片 URL 列表的变量,用于多图/多页标注 | |
[smoothing] | boolean | 跟随用户设置 | 是否启用图像平滑渲染 |
[width] | string | "100%" | 图片宽度 |
[maxWidth] | string | "750px" | 图片最大宽度 |
[zoom] | boolean | false | 是否允许用鼠标滚轮缩放图片 |
[negativeZoom] | boolean | false | 是否允许将图片缩小到原始尺寸以下 |
[zoomBy] | float | 1.1 | 每次缩放的倍率因子 |
[grid] | boolean | false | 是否显示网格 |
[gridSize] | number | 30 | 网格大小 |
[gridColor] | string | "#EEEEF4" | 网格颜色(hex),透明度固定 0.15 |
[zoomControl] | boolean | false | 是否在工具栏显示缩放控制 |
[brightnessControl] | boolean | false | 是否在工具栏显示亮度控制 |
[contrastControl] | boolean | false | 是否在工具栏显示对比度控制 |
[rotateControl] | boolean | false | 是否在工具栏显示旋转控制 |
[crosshair] | boolean | false | 是否显示十字准星光标 |
[horizontalAlignment] | left|center|right | left | 图片水平对齐方式 |
[verticalAlignment] | top|center|bottom | top | 图片垂直对齐方式 |
[defaultZoom] | auto|original|fit | fit | 图片在视口内的初始缩放方式(保持比例) |
[crossOrigin] | none|anonymous|use-credentials | none | 图片的 CORS 跨域行为配置 |
注意:文档表格给出的默认值与源码模型中的默认值存在少数差异(如
zoom、zoomControl、maxWidth在源码中默认分别为true、true、"100%"),上表以官方文档为准,实际生效值以当前版本编辑器源码为准。
参数背后的源码行为
从源码看,几个参数并非简单的“开关”,而是直接参与渲染与交互逻辑:
width/maxWidth/ 对齐方式:属性模型定义了width(默认"100%")、maxwidth(默认"100%")等,渲染层在 ImageView/Image.jsx 中据此计算画布尺寸;horizontalAlignment与verticalAlignment则通过alignmentOffset视图(Image.js)换算成画布内的偏移量,实现左/中/右、上/中/下对齐。zoom/negativeZoom/zoomBy:zoom控制滚轮缩放是否可用;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)在数组模式下为每张图片创建一个ImageEntity(id为图片名#序号),单图模式则创建序号为 0 的单个实体。 - 预加载(preload):
preloadImages会以IMAGE_PRELOAD_COUNT = 3为窗口,对当前图片前后的若干图片做预加载,避免标注员切换页面时等待加载(Image.js)。 - 结果归属:
afterResultCreated会把新创建的标注区域打上item_index = currentImage标记(Image.js),从而区分标注属于哪一张子图;regs视图也按item_index过滤出当前图片对应的区域(MultiItemObjectBase.js)。 - 序列化附加信息:
createSerializedResult在导出结果时会附带original_width、original_height、image_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),仅供参考