---
comments: true
---
# 开放词汇分割产线使用教程
## 1. 开放词汇分割产线介绍
开放词汇分割是一项图像分割任务,旨在根据文本描述、边框、关键点等除图像以外的信息作为提示,分割图像中对应的物体。它允许模型处理广泛的对象类别,而无需预定义的类别列表。这项技术结合了视觉和多模态技术,极大地提高了图像处理的灵活性和精度。开放词汇分割在计算机视觉领域具有重要应用价值,尤其在复杂场景下的对象分割任务中表现突出。本产线同时提供了灵活的服务化部署方式,支持在多种硬件上使用多种编程语言调用。本产线目前不支持对模型的二次开发,计划在后续支持。
通用开放词汇分割产线中包含了开放词汇分割模块,您可以根据下方的基准测试数据选择使用的模型。
如果您更注重模型的精度,请选择精度较高的模型;如果您更在意模型的推理速度,请选择推理速度较快的模型;如果您关注模型的存储大小,请选择存储体积较小的模型。
| 参数 |
参数说明 |
参数类型 |
可选项 |
默认值 |
input |
待预测数据,支持多种输入类型,必填 |
Python Var|str|list |
- Python Var:如
numpy.ndarray 表示的图像数据
- str:如图像文件或者PDF文件的本地路径:
/root/data/img.jpg;如URL链接,如图像文件或PDF文件的网络URL:示例;如本地目录,该目录下需包含待预测图像,如本地路径:/root/data/(当前不支持目录中包含PDF文件的预测,PDF文件需要指定到具体文件路径)
- List:列表元素需为上述类型数据,如
[numpy.ndarray, numpy.ndarray],[\"/root/data/img1.jpg\", \"/root/data/img2.jpg\"],[\"/root/data1\", \"/root/data2\"]
|
None |
prompt_type |
模型推理时使用的提示类型 |
str |
- box:使用边界框作为提示词输入, 如果设置为
box, 输入的prompt需要是list[list[float, float, float, float]]的形式
- point:使用点作为提示词输入, 如果设置为
point, 输入的prompt需要是list[list[float, float]]的形式
|
无 |
prompt |
模型推理时具体使用的提示 |
list[list[float]] |
- list[list[float]]:需要根据
prompt_type的具体类型设置
|
无 |
(3)对预测结果进行处理,每个样本的预测结果均为对应的Result对象,且支持打印、保存为图片、保存为`json`文件的操作:
API参考
对于服务提供的主要操作:
- HTTP请求方法为POST。
- 请求体和响应体均为JSON数据(JSON对象)。
- 当请求处理成功时,响应状态码为
200,响应体的属性如下:
| 名称 |
类型 |
含义 |
logId |
string |
请求的UUID。 |
errorCode |
integer |
错误码。固定为0。 |
errorMsg |
string |
错误说明。固定为"Success"。 |
result |
object |
操作结果。 |
| 名称 |
类型 |
含义 |
logId |
string |
请求的UUID。 |
errorCode |
integer |
错误码。与响应状态码相同。 |
errorMsg |
string |
错误说明。 |
服务提供的主要操作如下:
对图像进行目标分割。
POST /open-vocabulary-segmentation
| 名称 |
类型 |
含义 |
是否必填 |
image |
string |
服务器可访问的图像文件的URL或图像文件内容的Base64编码结果。 |
是 |
prompt |
array |
预测使用的提示。 |
是 |
promptType |
string |
预测使用的提示类型。 |
是 |
- 请求处理成功时,响应体的
result具有如下属性:
| 名称 |
类型 |
含义 |
masks |
array |
分割的预测结果。 |
maskInfos |
array |
和masks字段中的元素一一对应,记录masks中对应分割结果所使用的对应prompt。 |
image |
string |
分割结果图。图像为JPEG格式,使用Base64编码。 |
注意:考虑到网络传输, masks字段中记录的分割结果经过rle编码结果, 实际使用时需要使用pycocotools.mask.decode做对应的解码即可获得原始的分割结果。
detectedObjects中的每个元素为一个object,具有如下属性:
| 名称 |
类型 |
含义 |
label |
string |
生成mask所使用的prompt类别。 |
prompt |
array |
prompt数组。 |
result示例如下:
{
'masks': [rle_mask1, rle_mask2, rle_mask3]
'mask_infos': [
{'label': 'box_prompt', 'prompt': [112.9, 118.4, 513.8, 382.1]},
{'label': 'box_prompt', 'prompt': [4.6, 263.6, 92.2, 336.6]},
{'label': 'box_prompt', 'prompt': [592.4, 260.9, 607.2, 294.2]}
]
}
多语言调用服务示例
Python
import base64
import requests
API_URL = "http://localhost:8080/open-vocabulary-segmentation" # 服务URL
image_path = "./open_vocabulary_segmentation.jpg"
output_image_path = "./out.jpg"
# 对本地图像进行Base64编码
with open(image_path, "rb") as file:
image_bytes = file.read()
image_data = base64.b64encode(image_bytes).decode("ascii")
payload = {
"image": image_data, # Base64编码的文件内容或者图像URL
"promptType": "box",
"prompt": [[112.9,118.4,513.8,382.1],[4.6,263.6,92.2,336.6],[592.4,260.9,607.2,294.2]]
}
# 调用API
response = requests.post(API_URL, json=payload)
# 处理接口返回数据
assert response.status_code == 200
result = response.json()["result"]
image_base64 = result["image"]
image = base64.b64decode(image_base64)
with open(output_image_path, "wb") as file:
file.write(base64.b64decode(result["image"]))
print(f"Output image saved at {output_image_path}")