调用华为云API实现图像标签识别

1.作者介绍

李鑫悦,女,西安工程大学电子信息学院,2025级研究生

研究方向:机器视觉与人工智能

电子邮件:2651450120@qq.com

郭政,男,西安工程大学电子信息学院,2025级研究生,张宏伟人工智能课题组

研究方向:机器视觉与人工智能

电子邮件:1225301905@qq.com

2.华为智能云API是什么?

2.1 API的基本概念

API(Application Programming Interface,应用程序编程接口)是程序之间进行数据交互和功能调用的桥梁。通过API,用户程序可以按照规定的接口格式向服务端发送请求,并接收服务端返回的处理结果。

在本项目中,Python程序通过API将待识别图片发送到华为云图像识别服务;云端完成图片内容分析后,将识别标签、标签类型和置信度等结果返回给本地程序。

2.2华为智能云API

华为智能云API是华为云提供的应用程序编程接口,开发者可以通过代码直接调用华为云已封装的AI能力,而不需要从零开始训练复杂的算法模型。

本项目使用的"图像标签"功能属于华为云图像识别Image服务。该服务已将图像识别模型封装为可调用接口,开发者只需要按照接口要求上传图片Base64编码或图片URL,即可获得识别结果。接口输入支持image和url二选一。

2.3图像标签识别

本项目不自行训练模型,而是调用华为云已训练好的图像识别模型。其基本流程为:输入图片后进行必要的预处理,云端模型提取图像特征,将特征与已有类别进行匹配,最后输出多个可能标签及其对应置信度。基本流程如下:

2.4应用场景

图像标签识别可以将图片中的场景、物体或属性转化为结构化标签,适用于需要理解图片内容的业务场景。

  • 智能相册管理:根据图像标签自动归类照片,例如人物、动物、室内、建筑、自然风景等。
  • 图片检索与分类:通过标签建立索引,实现"按内容找图"或批量整理图片库。
  • 内容推荐与广告匹配:根据图像中出现的物体或场景判断用户兴趣,辅助推荐系统生成个性化内容。
  • 机器视觉教学与实验:在不训练模型的情况下快速体验云端图像识别流程,理解API调用、认证和结果解析方法。

3.实验过程

3.1 创建华为云API账号实现调用

华为云图像标签识别服务需要先在服务列表中开通,API Explorer可用于在线调试,并会自动填充project_id。完整调用流程如下:

  1. 注册华为云账号并完成实名认证。

  2. 进入控制台,在服务列表中搜索"图像识别Image",开通"图像标签"服务。

  3. 进入"我的凭证",新增访问密钥并获取AK(Access Key ID)和SK(Secret Access Key)。

  4. 注意:AK/SK是访问云服务的重要凭证,不能直接公开到论文、PPT、代码仓库或截图中。实际开发时建议使用环境变量或配置文件进行管理。

  5. 进入API Explorer,选择图像识别Image服务中的RunImageTagging接口。

  6. 在线调试成功后,将AK/SK、Region和project_id配置到Python程序中进行本地调用。

3.2 Python调用代码

Python程序的核心步骤包括读取本地图片、转换为Base64、使用AK/SK完成认证、构造RunImageTaggingRequest请求、调用run_image_tagging()接口并解析输出结果。

导入 os 模块,用于处理文件路径、判断文件是否存在、读取环境变量等

import os

导入 sys 模块,用于接收命令行参数

例如:python huawei_image_tagging.py "图片路径"

import sys

导入 base64 模块,用于将图片文件转换为 Base64 编码字符串

华为云图像标签识别接口支持通过 Base64 的方式上传图片

import base64

从 PIL 图像处理库中导入 Image 类

用于打开图片、转换图片格式、压缩图片尺寸等

from PIL import Image

导入华为云 SDK 中的 BasicCredentials 类

用于通过 AK/SK 进行身份认证

from huaweicloudsdkcore.auth.credentials import BasicCredentials

导入华为云 SDK 中的异常处理模块

用于捕获 API 调用失败时返回的错误信息

from huaweicloudsdkcore.exceptions import exceptions

导入图像识别服务相关类

ImageClient:图像识别客户端

RunImageTaggingRequest:图像标签识别请求对象

ImageTaggingReq:图像标签识别请求体对象

from huaweicloudsdkimage.v2 import ImageClient, RunImageTaggingRequest, ImageTaggingReq

导入图像识别服务的区域配置类

用于指定华为云服务所在区域

from huaweicloudsdkimage.v2.region.image_region import ImageRegion

设置调用华为云图像识别服务的区域

cn-north-4 表示华北-北京四

注意:该区域必须与自己在华为云控制台开通图像识别服务的区域保持一致

REGION = "cn-north-4"

def compress_image(input_path):

"""

功能:

对输入图片进行压缩处理,使其更适合上传到华为云图像识别接口。

原因:

  1. 图片文件过大时,Base64 编码后字符串会很长,可能导致请求失败或页面卡顿;

  2. 图片分辨率过高会增加上传和识别时间;

  3. 部分 PNG 或 RGBA 格式图片直接保存为 JPG 时可能报错,因此需要先转换为 RGB 格式。

参数:

input_path:原始图片路径

返回值:

output_path:压缩后的图片路径

"""

构造压缩后图片的保存路径

os.path.dirname(input_path) 表示获取原图所在文件夹

compressed_for_huawei.jpg 是压缩后图片的文件名

output_path = os.path.join(

os.path.dirname(input_path),

"compressed_for_huawei.jpg"

)

使用 PIL 打开原始图片

img = Image.open(input_path)

判断图片模式是否为 RGB

如果图片是 PNG、RGBA 等格式,可能包含透明通道

JPG 格式不支持透明通道,因此需要先转换为 RGB

if img.mode != "RGB":

img = img.convert("RGB")

设置图片最大边长为 1024 像素

这样既能保留图片主要信息,又可以降低图片大小

max_size = 1024

按比例缩小图片

thumbnail() 会保持图片宽高比例,不会强制拉伸图片

例如原图为 4000×3000,会被压缩到最大边长不超过 1024

img.thumbnail((max_size, max_size))

将压缩后的图片保存为 JPG 格式

quality=75 表示压缩质量为 75,数值越大质量越高,文件也越大

img.save(output_path, "JPEG", quality=75)

计算原始图片大小,单位转换为 MB

original_size = os.path.getsize(input_path) / 1024 / 1024

计算压缩后图片大小,单位转换为 MB

compressed_size = os.path.getsize(output_path) / 1024 / 1024

输出原始图片大小

print(f"原图大小:{original_size:.2f} MB")

输出压缩后图片大小

print(f"压缩后大小:{compressed_size:.2f} MB")

输出压缩后图片的保存路径

print(f"压缩后图片:{output_path}")

返回压缩后的图片路径,供后续 Base64 编码使用

return output_path

def image_to_base64(image_path):

"""

功能:

将图片文件转换为 Base64 编码字符串。

原因:

华为云图像标签识别接口的 image 参数要求传入图片的 Base64 编码内容。

因此,本地图片在发送给接口之前需要先转换为 Base64 格式。

参数:

image_path:图片路径

返回值:

图片的 Base64 字符串

"""

以二进制读取模式打开图片文件

"rb" 表示 read binary,即读取二进制文件

with open(image_path, "rb") as f:

f.read() 读取图片的二进制内容

base64.b64encode() 将二进制数据编码为 Base64

decode("utf-8") 将字节类型转换为字符串类型

return base64.b64encode(f.read()).decode("utf-8")

def run_image_tagging(image_path):

"""

功能:

调用华为云图像标签识别 API,对输入图片进行识别,

并输出识别到的标签、标签类型和置信度。

参数:

image_path:待识别图片的本地路径

"""

从系统环境变量中读取华为云 AK

AK 即 Access Key ID,用于标识用户身份

ak = os.getenv("HUAWEICLOUD_SDK_AK")

从系统环境变量中读取华为云 SK

SK 即 Secret Access Key,相当于密钥,需要妥善保管

sk = os.getenv("HUAWEICLOUD_SDK_SK")

判断是否成功读取 AK 和 SK

如果没有设置环境变量,则无法完成身份认证

if not ak or not sk:

print("错误:没有读取到 AK 或 SK。")

print("请先在终端中设置:")

Windows PowerShell 中设置 AK 的示例命令

print('$env:HUAWEICLOUD_SDK_AK="你的AK"')

Windows PowerShell 中设置 SK 的示例命令

print('$env:HUAWEICLOUD_SDK_SK="你的SK"')

如果密钥不存在,直接结束函数,避免继续执行导致报错

return

判断输入的图片路径是否存在

如果路径错误或文件不存在,则无法读取图片

if not os.path.exists(image_path):

print(f"错误:图片不存在:{image_path}")

图片不存在时直接结束函数

return

调用 compress_image() 函数压缩图片

返回压缩后的图片路径

compressed_path = compress_image(image_path)

将压缩后的图片转换为 Base64 编码字符串

image_base64 = image_to_base64(compressed_path)

创建华为云认证对象

BasicCredentials 用 AK 和 SK 对请求进行身份认证

credentials = BasicCredentials(ak, sk)

创建华为云图像识别服务客户端

new_builder() 用于构建客户端对象

with_credentials(credentials) 设置认证信息

with_region(ImageRegion.value_of(REGION)) 设置服务区域

build() 完成客户端创建

client = ImageClient.new_builder() \

.with_credentials(credentials) \

.with_region(ImageRegion.value_of(REGION)) \

.build()

创建图像标签识别请求对象

该对象用于封装一次 API 调用请求

request = RunImageTaggingRequest()

设置请求体参数

ImageTaggingReq 用于封装图像标签识别接口所需参数

request.body = ImageTaggingReq(

image 参数传入图片的 Base64 编码

image=image_base64,

language="zh" 表示返回中文标签

如果设置为 "en",则返回英文标签

language="zh",

threshold 表示置信度阈值

只有置信度高于该值的标签才会返回

这里设置为 85,表示只返回置信度较高的识别结果

threshold=85,

limit 表示最多返回的标签数量

这里设置为 6,表示最多输出 6 个识别标签

limit=6

)

try:

调用华为云图像标签识别接口

run_image_tagging() 会将请求发送到华为云服务器

华为云完成识别后返回 response 结果

response = client.run_image_tagging(request)

如果程序执行到这里,说明接口调用成功

print("\n调用成功!")

输出接口返回的 HTTP 状态码

一般 200 表示请求成功

print("状态码:", response.status_code)

输出识别结果标题

print("\n识别结果:")

print("-" * 40)

判断返回结果中是否包含标签信息

response.result 表示识别结果主体

response.result.tags 表示识别出的标签列表

if response.result and response.result.tags:

遍历识别到的标签列表

enumerate(..., start=1) 表示从 1 开始编号

for index, item in enumerate(response.result.tags, start=1):

输出标签序号和标签名称

print(f"{index}. 标签:{item.tag}")

输出标签类型

例如:自然风景、人物、动物、交通工具等

print(f" 类型:{item.type}")

输出置信度

置信度越高,说明模型认为该标签越准确

print(f" 置信度:{item.confidence}")

输出分隔线,便于查看多个识别结果

print("-" * 40)

else:

如果接口调用成功但没有返回标签,说明图片内容可能不明显

或者 threshold 设置过高,导致标签被过滤

print("没有识别到标签。")

捕获华为云 SDK 请求异常

当 Region 错误、服务未开通、AK/SK 错误、图片格式不符合要求时,可能进入该异常

except exceptions.ClientRequestException as e:

print("\n调用失败:")

输出 HTTP 状态码

print("状态码:", e.status_code)

输出请求 ID,便于在华为云后台排查问题

print("请求ID:", e.request_id)

输出华为云返回的错误码

print("错误码:", e.error_code)

输出具体错误信息

print("错误信息:", e.error_msg)

Python 程序入口

当该文件被直接运行时,下面的代码才会执行

如果该文件被其他 Python 文件导入,则下面的代码不会自动执行

if name == "main":

判断命令行参数数量

sys.argv[0] 是当前 Python 文件名

sys.argv[1] 才是用户输入的图片路径

因此,如果参数数量小于 2,说明用户没有输入图片路径

if len(sys.argv) < 2:

print("请在运行时输入图片路径,例如:")

给出运行示例

注意:Windows 路径中通常包含反斜杠,因此这里使用原始字符串 r''

print(r'python .\huawei_image_tagging.py "C:\Users\26514\Desktop\test\14.png"')

else:

获取用户在命令行中输入的图片路径

image_path = sys.argv[1]

调用图像标签识别函数

run_image_tagging(image_path)

3.3 实验结果

程序运行后,接口会对输入图片返回多个候选标签。每个标签通常包含标签名称tag、标签类型type以及置信度confidence。PPT中的实验结果表明,本地图片经过Base64编码并提交到云端后,能够得到结构化识别结果。

从结果形式看,图像标签识别不是只返回单一类别,而是输出多个可能标签及其置信度,因此更适合用于图片检索、图片内容理解和多标签分类场景。

3.4 问题分析

相关推荐
枫叶丹48 小时前
【HarmonyOS 6.0】Enterprise Space Kit:空间管理服务深入解析
开发语言·华为·harmonyos
lqj_本人8 小时前
鸿蒙PC:marktext-develop鸿蒙适配全记录
华为·harmonyos
Python私教8 小时前
鸿蒙 Agent Framework Kit:FunctionComponent 把智能体嵌进 ArkTS 页面
华为·harmonyos
Dream-Y.ocean9 小时前
[鸿蒙三方库适配实战] 图像处理框架 G‘MIC CLI 的 OpenHarmony 平台迁移实践
图像处理·华为·harmonyos
cd_949217219 小时前
鸿蒙系统一键关闭抖音推送通知的完整教程(2026最新)
华为·harmonyos
搞科研的小刘选手10 小时前
【大连市计算机学会主办】第三届图像处理、智能控制与计算机工程国际学术会议(IPICE 2026)
图像处理·人工智能·深度学习·算法·计算机·数据挖掘·智能控制
人月神话-Lee10 小时前
【图像处理】高斯模糊——最优雅的模糊算法
图像处理·人工智能·算法·ios·ai编程·swift
nashane10 小时前
HarmonyOS 6学习:动画流畅与截图性能的双重优化实战
学习·华为·harmonyos
richard_yuu10 小时前
# 鸿蒙个人中心与设置模块实战|隐私数据管控、用户中心闭环与合规收尾
华为·harmonyos