调用百度智能云API实现货币识别
1.作者介绍
卢美琳,女,西安工程大学电子信息学院,2024级研究生
研究方向:机器视觉与人工智能
电子邮件:2251081972@qq.com
王子谦,男,西安工程大学电子信息学院,2024级研究生,张宏伟人工智能课题组
研究方向:机器视觉与人工智能
电子邮件:1523018430@qq.com
2.百度智能云API货币识别接口介绍
2.1 图像识别接口介绍
组合服务接口提供一个API接口,同时调用多个模型服务。支持图像识别的多个接口:通用物体和场景识别、图像单主体检测、动物识别、植物识别、果蔬识别、自定义菜品识别-检索、菜品识别、红酒识别、地标识别、图像多主体检测等12个模型服务的调用。可通过入参灵活指定需要调用的模型服务,传入图像,返回指定模型的识别结果。
该请求用于通用物体及场景识别,即对于输入的一张图片(可正常解码,且长宽比适宜),输出图片中的多个物体及场景标签。
2.2 接口使用说明
- 组合服务接口根据请求参数确定要使用的模型服务类型,具体的请求参数和
- 返回结果见下方描述。
- 图像识别相关接口同时提供独立的服务接口,针对每个模型的出入参,可参
- 考百度AI开放平台官网每个独立服务接口的文档。
2.2.1 请求示例
HTTP方法:POST
请求URL: https://aip.baidubce.com/api/v1/solution/direct/imagerecognition/combination
URL参数:
参数 | 值 |
access_token | 通过API Key和Secret Key获取的access_token,参考“Access Token获取” |
Header如下:
参数 | 值 |
Content-Type | application/json;charset=utf-8 |
2.2.2 请求参数
Body中放置请求参数,参数详情如下:
参数 | 类型 | 是否必须 | 说明 |
image | string | 是 | 图像数据,base64编码,示例如:/9j/4AAQSkZJRgABAQEPMpJkR0FdXVridlPy/9k= |
imgUrl | string | 否 | 图像Url,和image参数二选一,不需要urlEncode,示例如:https://aip.bdstatic.com/portal-pc-node/dist/1591263471100/images/technology/imagerecognition/general/1.jpg |
scenes | array | 是 | 指定本次调用的模型服务,以字符串数组表示。元素含义如下:advanced_general:通用物体和场景识别;object_detect:图像单主体检测;multi_object_detect:图像多主体检测;animal:动物识别;plant:植物识别;ingredient:果蔬识别;dish_search:自定义菜品识别-检索;dishs:菜品识别;red_wine:红酒识别;currency:货币识别;landmark:地标识别。示例如:“scenes”:[“currency”,”animal”,”plant”] |
sceneConf | jsonObject | 否 | 对特定服务,支持的个性化参数,若不填则使用默认设置。jsonObject说明:key为要设置入参的服务类型,可取值同scenes字段,例如:advanced_general:通用物体和场景识别;object_detect:图像单主体检测。value为各模型服务个性化参数,详情请参照下文或百度AI开放平台官网“图像识别具体接口文档” |
2.2.3 返回参数
字段 | 类型 | 是否必须 | 说明 |
log_id | uint64 | 是 | 唯一的log id,用于问题定位。 |
result | object | 是 | 返回结果json串,其内包含要调用的各个模型服务的返回结果。 |
advanced_general | object | 否 | 「通用物体和场景识别」服务返回结果。请参照“通用物体和场景识别接口文档” |
object_detect | object | 否 | 「图像单主体检测」服务返回结果。请参照“图像单主体检测接口文档” |
multi_object_detect | object | 否 | 「图像多主体检测」服务返回结果。请参照“图像多主体检测接口文档” |
animal | object | 否 | 「动物识别」服务返回结果。请参照“动物识别接口文档” |
plant | object | 否 | 「植物识别」服务返回结果。请参照“植物识别接口文档” |
ingredient | object | 否 | 「果蔬识别」服务返回结果。请参照“果蔬识别接口文档” |
dish_search | object | 否 | 「自定义菜品识别-检索」服务返回结果。请参照“自定义菜品识别-检索接口文档” |
dishs | object | 否 | 「菜品识别」服务返回结果。请参照“菜品识别接口文档” |
red_wine | object | 否 | 「红酒识别」服务返回结果。请参照“红酒识别接口文档” |
currency | object | 否 | 「货币识别」服务返回结果。请参照“货币识别接口文档” |
landmark | object | 否 | 「地标识别」服务返回结果。请参照“地标识别接口文档” |
3.调用百度云API流程
步骤一:搜索百度智能云,注册登录百度智能云,并进行实名认证。
步骤二:点击控制台进入总览界面,点击左上角九个点。
步骤三:点击左上角九个点进入产品导览,选择人工智能里面的图像识别,进去签署知情同意书。
步骤四:实名认证后,创建应用。
步骤五:实名认证后,创建应用,点击应用列表,获取App ID、API Key和Secret Key。
4.代码实现
4.1 完整代码
from aip import AipImageClassify
""" 你的 APPID AK SK """
APP_ID = '你的APP_ID'
API_KEY = '你的API_KEY'
SECRET_KEY = '你的SECRET_KEY'
client = AipImageClassify(APP_ID, API_KEY, SECRET_KEY)
""" 读取图片 """
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()
image = get_file_content('输入你的图片路径') # path为测试图片路径,例如C:/Users/啦啦啦/Desktop/10.jpg
""" 如果有可选参数 """
options = {}
options["top_num"] = 5 # 最多返回的结果数
""" 调用通用物体识别 """
result = client.advancedGeneral(image, options)
""" 处理返回结果 """
if "error_code" in result:
print("API 调用失败,错误信息:", result)
else:
print("API 调用成功,识别结果:")
if "result" in result:
for item in result["result"]:
print("识别出的物体名称:", item["keyword"], "置信度:", item["score"])
else:
print("未识别到物体")
4.1.1 测试货币
100元识别
10元识别
古币识别
4.1.2 问题与分析
问题一:报错
分析问题原因:py36环境中没有安装aip库。
解决办法:在py36虚拟环境中安装baidu-aip库。
问题二:显示调用失败
分析问题原因:不能调用货币识别或者没有权限访问货币识别API。
解决办法:调用通用物体和场景识别接口API。
问题三:识别出的置信度最高的与输入图片中物体不对应,输入古钱币的图片,输出置信度最高的是蚁鼻钱。
分析问题原因:可能是由于图像特征与模型训练数据中的某些类别相似或者图片背景复杂或光线不佳,导致模型误判。
解决办法:换张高清图片,截取想要识别的那个物体。
4.2 改进
上述代码只输出了识别出的物体名称和置信度,还想输出对应识别结果的百科词条名称,页面链接,图片链接和内容描述,因此对上述代码做出改进。
4.2.1 完整代码
import urllib.request
import base64
import json
import requests
from bs4 import BeautifulSoup
# client_id 为官网获取的AK, client_secret 为官网获取的SK
client_id = '你的API_KEY'
client_secret = '你的SECRET_KEY'
# 获取token
def get_token():
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + client_id + '&client_secret=' + client_secret
request = urllib.request.Request(host)
request.add_header('Content-Type', 'application/json; charset=UTF-8')
response = urllib.request.urlopen(request)
token_content = response.read()
if token_content:
token_info = json.loads(token_content)
token_key = token_info['access_token']
return token_key
# 通用物体识别
# filename: 图片名(本地存储包括路径)
def object_recognition(filename):
request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v2/advanced_general"
# 二进制方式打开图片文件
with open(filename, 'rb') as f:
img = base64.b64encode(f.read())
params = {
'image': img,
'with_face': 0 # 是否包含人脸,0表示不包含
}
params = urllib.parse.urlencode(params).encode("utf-8")
access_token = get_token()
request_url = request_url + "?access_token=" + access_token
request = urllib.request.Request(url=request_url, data=params)
request.add_header('Content-Type', 'application/x-www-form-urlencoded')
response = urllib.request.urlopen(request)
content = response.read()
if content:
content = content.decode('utf-8')
data = json.loads(content)
# 解析识别结果
results = data['result']
for result in results:
keyword = result['keyword']
score = result['score']
print(f'物体名称: {keyword}, 置信度: {score}')
# 获取百度百科词条信息
baike_info = get_baike_info(keyword)
if baike_info:
print(f'百度百科词条名称: {baike_info["baike_name"]}')
print(f'百度百科内容描述: {baike_info["baike_content"]}')
print(f'百度百科页面链接: {baike_info["baike_url"]}')
if baike_info["baike_image_url"]:
print(f'百度百科图片链接: {baike_info["baike_image_url"]}')
else:
print('百度百科图片链接: 无图片链接')
else:
print('未找到对应的百度百科词条信息')
return results
# 获取百度百科词条信息
import requests
from bs4 import BeautifulSoup
def get_baike_info(keyword):
# 对关键词进行 URL 编码
encoded_keyword = urllib.parse.quote(keyword)
url = f'https://baike.baidu.com/item/{encoded_keyword}'
try:
# 发送HTTP请求
response = requests.get(url)
response.encoding = 'utf-8' # 显式指定编码
# 使用BeautifulSoup解析HTML
soup = BeautifulSoup(response.text, 'html.parser')
# 检查是否存在百科词条
error_page = soup.find('div', class_='errorBox')
if error_page:
print(f'未找到关键词 "{keyword}" 的百度百科词条')
return None
# 获取百科词条名称
title_tag = soup.find('h1')
if not title_tag:
print(f'未找到百科词条名称: {keyword}')
return None
baike_name = title_tag.text.strip()
# 获取百科页面链接
baike_url = url
# 获取百科内容描述
# 使用百度百科的API接口获取描述
api_url = f'https://baike.baidu.com/api/openapi/BaikeLemmaCardApi?scope=103&format=json&appid=379020&bk_key={encoded_keyword}'
api_response = requests.get(api_url)
api_response.encoding = 'utf-8'
api_data = api_response.json()
if api_data and 'abstract' in api_data:
baike_content = api_data['abstract']
else:
baike_content = '无描述信息'
# 获取百科图片链接
image_tags = soup.find_all('img') # 查找所有图片标签
baike_image_url = None
for tag in image_tags:
if tag.get('src') and 'bkimg.cdn.bcebos.com' in tag['src']: # 检查图片URL是否包含百度百科的域名
baike_image_url = tag['src']
break
return {
'baike_name': baike_name,
'baike_content': baike_content,
'baike_url': baike_url,
'baike_image_url': baike_image_url
}
except Exception as e:
print(f'获取百度百科信息失败: {e}')
return None
# 测试
if __name__ == '__main__':
filename = '输入你的图片路径' # 替换为你的图片路径,例如C:/Users/啦啦啦/Desktop/100.webp
object_recognition(filename)
4.2.2 测试货币
5.参考链接
调用百度API实现菜品识别_百度菜品识别-CSDN博客
【攻略】百度货币识别API,搞定防诈骗的应用小程序-CSDN博客