本文介绍了如何使用阿里云视觉智能开放平台相关服务的Python SDK,具体包括SDK的获取、安装方法以及SDK代码示例。

说明

阿里云视觉智能开放平台各类目视觉AI能力SDK接入、接口使用或问题咨询等,请通过钉钉群(23109592)加入阿里云视觉智能开放平台咨询群联系我们。

该版本SDK只支持Python3及以上,如不满足请升级Python版本。如必须使用Python2请使用Python老版(不推荐)

准备工作

在安装和使用阿里云SDK前,确保您已经注册阿里云账号并生成访问密钥(AccessKey)。具体操作,请参见创建AccessKey

配置环境变量

配置环境变量ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET

重要
  • 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维,具体操作,请参见创建RAM用户

  • 请不要将AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。

  • Linux和macOS系统配置方法

    1. 在IntelliJ IDEA中打开终端Terminal。

    2. 执行以下命令,配置环境变量。

      <access_key_id>需替换为您RAM用户的AccessKey ID,<access_key_secret>替换为您RAM用户的AccessKey Secret。如果后续需要进行更多权限相关的配置,具体操作请参见使用RAM Policy控制访问权限

      export ALIBABA_CLOUD_ACCESS_KEY_ID=<access_key_id> 
      export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<access_key_secret>
  • Windows系统配置方法

    新建环境变量文件,添加环境变量ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET,并写入已准备好的AccessKey ID和AccessKey Secret。然后重启Windows系统。本操作以Windows 10为例进行说明。

    1. 打开文件资源管理器,在此电脑上右键单击属性。

    2. 在右侧导航栏,单击高级系统配置

    3. 系统属性对话框的高级页签下,单击环境变量

    4. 环境变量对话框中,单击新建(W)image.png

    5. 在弹出的新建系统变量对话框中,添加环境变量ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET,并写入已准备好的AccessKey ID和AccessKey Secret。

    6. 重启Windows系统,使配置生效。

代码示例

本文以RecognizeBankCard为例。

文件在同地域 OSS

说明

每个类目的访问域名与对应地域的开通详情,请参见访问域名

# -*- coding: utf-8 -*-
# 1、这里只是以ocr下的RecognizeBankCard能力为例,其他能力请引入相应类目的包和相关类。包名可参考本文档上方的SDK包名称,能力名可参考对应API文档中的Action参数。例如您想使用通用分割,其文档为https://help.aliyun.com/document_detail/151960.html,可以知道该能力属于分割抠图类目,能力名称为SegmentCommonImage,那么您需要将代码中ocr20191230改为imageseg20191230,将RecognizeBankCard改为SegmentCommonImage。
from alibabacloud_ocr20191230.client import Client
from alibabacloud_ocr20191230.models import RecognizeBankCardRequest
from alibabacloud_tea_util.models import RuntimeOptions
from alibabacloud_tea_openapi.models import Config

'''银行卡示例'''
# 初始化Config
config = Config(
  # 创建AccessKey ID和AccessKey Secret,请参考https://help.aliyun.com/document_detail/175144.html。
  # 如果您用的是RAM用户的AccessKey,还需要为RAM用户授予权限AliyunVIAPIFullAccess,请参考https://help.aliyun.com/document_detail/145025.html。
  # 从环境变量读取配置的AccessKey ID和AccessKey Secret。运行代码示例前必须先配置环境变量。
  access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
  access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
  # 3、访问的域名。注意:这个地方需要求改为相应类目的域名,参考:https://help.aliyun.com/document_detail/143103.html
  endpoint='ocr.cn-shanghai.aliyuncs.com',
  # 访问的域名对应的region
  region_id='cn-shanghai'
)

# 4、初始化Request,这里只是以RecognizeBankCard为例,其他能力请使用相应能力对应的类
request = RecognizeBankCardRequest(image_url='http://viapi-test.oss-cn-shanghai.aliyuncs.com/viapi-3.0domepic/ocr/RecognizeBankCard/yhk1.jpg')
# 初始化RuntimeObject
runtime_option = RuntimeOptions()

try:
  # 初始化Client
  client = Client(config)

  # 5、调用api,注意,recognize_bank_card_with_options需要更换为相应能力对应的方法名。方法名是根据能力名称按照一定规范形成的,如能力名称为SegmentCommonImage,对应方法名应该为segment_common_image_with_options。
  response = client.recognize_bank_card_with_options(request, runtime_option)
  # 获取整体结果
  print(response.body)
  # 获取单个字段,这里只是一个例子,具体能力下的字段需要看具体能力的文档
  print(response.body.data.card_number)
  # tips: 可通过response.body.__dict__查看属性名称
except Exception as error:
  # 获取整体报错信息
  print(error)
  # 获取单个字段
  print(error.code)
  # tips: 可通过error.__dict__查看属性名称
说明

需要修改的地方均在上述代码注释中标明,总结如下:

  1. 引入包的时候,需要引入相应类目的包和相关类。包名可参考上文SDK包名称,能力名称可参考对应API文档中的Action参数。

    例如,您想使用通用分割能力,通过通用分割API文档可知该能力属于分割抠图类目(imageseg20191230),能力名称为SegmentCommonImage,您需要将代码中的ocr20191230改为imageseg20191230,将RecognizeBankCard改为SegmentCommonImage。

  2. 访问的域名一定要修改为相应类目的域名,如果域名类目不匹配会报错InvalidAction.NotFound。关于域名详情,请参见访问域名

  3. Request需要使用相应类目的包和类。

  4. 调用Client的方法时,方法名需要改成对应能力的方法名。方法名是根据能力名称按照一定规范形成的。例如,能力名称为SegmentCommonImage,对应方法名应该为segment_common_image_with_options。

文件在本地或文件不在同一地域 OSS

重要

文件在本地、文件不在同一地域与文件在同地域区别在于需要使用xxxAdvanceRequest,文件是以Stream形式通过image_urlobject参数传入。

# -*- coding: utf-8 -*-
# 1、这里只是以ocr下的RecognizeBankCard能力为例,其他能力请引入相应类目的包和相关类。包名可参考本文档上方的SDK包名称,能力名可参考对应API文档中的Action参数。例如您想使用通用分割,其文档为https://help.aliyun.com/document_detail/151960.html,可以知道该能力属于分割抠图类目,能力名称为SegmentCommonImage,那么您需要将代码中ocr20191230改为imageseg20191230,将RecognizeBankCard改为SegmentCommonImage。
from alibabacloud_ocr20191230.client import Client
from alibabacloud_ocr20191230.models import RecognizeBankCardAdvanceRequest
from alibabacloud_tea_util.models import RuntimeOptions
from alibabacloud_tea_openapi.models import Config
from urllib.request import urlopen
import io

'''银行卡示例'''
# 初始化Config
config = Config(
  # 创建AccessKey ID和AccessKey Secret,请参考https://help.aliyun.com/document_detail/175144.html。
  # 如果您用的是RAM用户的AccessKey,还需要为RAM用户授予权限AliyunVIAPIFullAccess,请参考https://help.aliyun.com/document_detail/145025.html。
  # 从环境变量读取配置的AccessKey ID和AccessKey Secret。运行代码示例前必须先配置环境变量。
  access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
  access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
  # 3、访问的域名。注意:这个地方需要求改为相应类目的域名,参考:https://help.aliyun.com/document_detail/143103.html
  endpoint='ocr.cn-shanghai.aliyuncs.com',
  # 访问的域名对应的region
  region_id='cn-shanghai'
)

# 初始化RuntimeObject
runtime_option = RuntimeOptions()

try:
  # 场景一:文件在本地
  # img = open(r'/tmp/bankCard.png', 'rb')
  # 使用完成之后记得调用img.close()关闭流
  # 场景二,使用任意可访问的url
  url = 'https://viapi-test-bj.oss-cn-beijing.aliyuncs.com/viapi-3.0domepic/ocr/RecognizeBankCard/yhk1.jpg'
  img = io.BytesIO(urlopen(url).read())
  # 4、初始化Request,这里只是以RecognizeBankCard为例,其他能力请使用相应能力对应的类
  request = RecognizeBankCardAdvanceRequest()
  request.image_urlobject = img
  # 初始化Client
  client = Client(config)
  # 5、调用api,注意,recognize_bank_card_advance需要更换为相应能力对应的方法名。方法名是根据能力名称按照一定规范形成的,如能力名称为SegmentCommonImage,对应方法名应该为segment_common_image_advance。
  response = client.recognize_bank_card_advance(request, runtime_option)
  # 获取整体结果
  print(response.body)
  # 获取单个字段,这里只是一个例子,具体能力下的字段需要看具体能力的文档
  print(response.body.data.card_number)
  # tips: 可通过response.body.__dict__查看属性名称
except Exception as error:
  # 获取整体报错信息
  print(error)
  # 获取单个字段
  print(error.code)
  # tips: 可通过error.__dict__查看属性名称
说明

需要修改的地方均在上述代码注释中标明,总结如下:

  1. 引入包的时候,需要引入相应类目的包和相关类。包名可参考上文SDK包名称,能力名称可参考对应API文档中的Action参数。

    例如,您想使用通用分割能力,通过通用分割API文档可知该能力属于分割抠图类目(imageseg20191230),能力名称为SegmentCommonImage,您需要将代码中的ocr20191230改为imageseg20191230,将RecognizeBankCard改为SegmentCommonImage。

  2. 访问的域名一定要修改为相应类目的域名,如果域名类目不匹配会报错InvalidAction.NotFound。关于域名详情,请参见访问域名

  3. Request需要使用相应类目的包和类。

  4. 调用Client的方法时,方法名需要改成对应能力的方法名。方法名是根据能力名称按照一定规范形成的。例如,能力名称为SegmentCommonImage,对应方法名应该为segment_common_image_advance。

常见问题

调用报错如何处理?

如果您的调用出现报错,请先尝试升级SDK包到最新版本,最新版本请参考各类目SDK链接。如果您的程序中同时引入了多个类目的包,也可以先尝试将这些包都升级到最新版本,避免版本之间的包冲突问题。

OpenAPI界面显示的最新包在pypi仓库中找不到如何处理?

如果您发现OpenAPI界面显示的最新版本的包,在pypi仓库中找不到,这是因为新版本的包刚刚发布,仓库同步可能会有延迟,如果遇到版本不存在的情况,请稍后再试或使用pypi仓库中的最新版本。

如何知道request或者response中的参数名?

request和response的参数名是根据文档参数名按照一定规范生成的,比如文档中参数名为ImageURL,生成出来对应的python的参数名为image_url,对应的stream参数名为image_urlobject。建议使用pycharm等IDE,可以直接查看到相关类的源码找到参数名,或者使用request.__dict__或者response.__dict__查看类的属性名。

技术支持

如果以上方法未能解决您的问题,请通过搜索钉钉群号(23109592)加入阿里云视觉智能开放平台咨询群联系我们。届时会有专业的技术人员与您对接解决问题。