前言
(可参考小北之前的博客)
人工智能和机器学习2 (复旦大学计算机科学与技术实践工作站)python调用百度AI、获取token,并利用opencv绘制分析图,做简单判断-CSDN博客
https://blog.csdn.net/Zhiyilang/article/details/140794422
在现代科技的推动下,人工智能(AI)和机器学习(ML)逐渐成为各行各业的重要工具。百度AI开放平台作为全球领先的人工智能服务平台,为开发者提供了包括语音、图像、自然语言处理(NLP)等多项技术支持。本篇博客笔记旨在分享如何利用Python调用百度AI获取人体关键点数据,并使用OpenCV对结果进行可视化和简单分析。这不仅是对AI技术的实际应用,也是对机器学习领域的一次有益探索。
实时人体关键点识别并绘制
直接进入正题:
新建learn5.py
import cv2
利用python开启自己的摄像头(cv2)
今天小北要带着友友们做一个简易的车辆识别功能,那么首先呢就是要开启摄像头是吧,嘻嘻嘻~
简明摘要:利用Python的cv2库开启和操作摄像头。通过示例代码展示了如何读取摄像头视频流,实时显示图像,并设置热键q退出程序。在代码中,cv.waitKey(1)&0xFF==ord('q')的条件用于检测用户是否按下q键,以关闭程序。
直接上源码:
# -*- coding:utf8 -*-
# 导入cv2库
import cv2 as cv
# 打开摄像头
cap = cv.VideoCapture(0)
while (True):
# 开始用摄像头读数据,返回hx为true则表示读成功,frame为读的图像
hx, frame = cap.read()
# 如果hx为Flase表示开启摄像头失败,那么就输出"read vido error"并退出程序
if hx is False:
# 打印报错
print('read video error')
# 退出程序
exit(0)
# 显示摄像头图像,其中的video为窗口名称,frame为图像
cv.imshow('video', frame)
# 监测键盘输入是否为q,为q则退出程序
if cv.waitKey(1) & 0xFF == ord('q'): # 按q退出
break
# 释放摄像头
cap.release()
# 结束所有窗口
cv.destroyAllWindows()
(以小北的拯救者2022y7000p摄像头为例)
通过设备管理器打开摄像头:
首先,你可以尝试通过设备管理器来打开摄像头。在Windows操作系统中,设备管理器可以控制硬件设备,包括摄像头。按下Win+X键,选择设备管理器,然后在设备列表中找到“图像设备”或“摄像头”选项。右键点击摄像头设备,选择“启用”来打开摄像头。如果摄像头设备显示黄色感叹号,表示驱动程序有问题,你需要更新或重新安装驱动程序。
NumPy 简述
NumPy 是一个 Python 库,用于高效处理大型多维数组和矩阵,提供了大量的数学函数工具。其核心是
ndarray
对象,这是一个固定大小的、同类型元素组成的数组。举个栗子:
import numpy as np # 创建一个一维数组 arr = np.array([1, 2, 3, 4, 5]) # 显示数组 print(arr) # 输出: [1 2 3 4 5] # 数组的形状 print(arr.shape) # 输出: (5,) 表示这是一个一维数组,有5个元素 # 计算数组的和 print(np.sum(arr)) # 输出: 15 # 创建一个二维数组(例如,3x2矩阵) matrix = np.array([[1, 2], [3, 4], [5, 6]]) # 显示二维数组 print(matrix) # 数组切片(取第二行) print(matrix[1, :]) # 输出: [3 4] # 使用NumPy进行数学运算(例如,矩阵乘法) result = np.dot(matrix, matrix.T) # 矩阵与其转置的乘积 print(result)
在这个例子中,我们首先导入了 NumPy 库并简称为
np
。然后,我们创建了一个一维数组arr
并展示了它的内容、形状以及元素之和。接着,我们创建了一个二维数组(矩阵)matrix
,展示了它的内容,并展示了如何通过切片操作获取矩阵的第二行。最后,我们使用了 NumPy 的np.dot
函数来执行矩阵乘法,计算了matrix
与其转置(matrix.T
)的乘积,并打印了结果。这个简洁的例子展示了 NumPy 在处理数组和矩阵方面的基本功能。
打开通义千问(提前注册好账号)
通义tongyi.ai_你的全能AI助手-通义千问 (aliyun.com)https://tongyi.aliyun.com/qianwen/
提问:python实现显示摄像头画面?(对比我们写的代码作比较,进行纠正和改进)
继续提问:怎么把摄像头中的画面转化为base64格式,我先搞上传给百度AI接口?
用imencode:
用numpy和opencv:
完整代码:
# -*- coding:utf8 -*-
import requests
def login(apiKey, secretKey):
url = 'https://aip.baidubce.com/oauth/2.0/token' # 接口的HTTP地址
url += f'?grant_type=client_credentials&client_id={apiKey}&client_secret={secretKey}' # 在地址后面携带账号密码参数信息
headers = { # HTTP请求的头部信息
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.post(url, headers=headers, data='') # 执行HTTP POST请求
result = response.json() # 将结果转为字典格式并存入result
# print(result) # 打印返回结果
if 'access_token' in result: # 根据返回信息判断是否登录成功 如果成功则会含有access_token
token = result['access_token'] # 从字典中拿到所需的access_token信息
print('登录成功:', token)
return token
else:
print('登录失败')
return ''
access_token = login('xxxxxxxxxxxxxxxxxxxxxxx', 'xxxxxxxxxxxxxxxxxxxxxxxx')
if not access_token:
exit(0)
跑一下login.py文件(也就是learn2.py)————<登录成功:....>
实时人体关键点识别并绘制.py完整代码:
# -*- coding:utf8 -*-
import time
import cv2
import base64
import requests
import json
from threading import Thread
def login(apiKey, secretKey):
url = 'https://aip.baidubce.com/oauth/2.0/token' # 接口的HTTP地址
url += f'?grant_type=client_credentials&client_id={apiKey}&client_secret={secretKey}' # 在地址后面携带账号密码参数信息
headers = { # HTTP请求的头部信息
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.post(url, headers=headers, data='') # 执行HTTP POST请求
result = response.json() # 将结果转为字典格式并存入result
# print(result) # 打印返回结果
if 'access_token' in result: # 根据返回信息判断是否登录成功 如果成功则会含有access_token
token = result['access_token'] # 从字典中拿到所需的access_token信息
print('登录成功:', token)
return token
else:
print('登录失败')
return ''
access_token = login('xxxxxxxxxxxxxxxxxxx', 'xxxxxxxxxxxxxxxxxxxxxxxx')
if not access_token:
exit(0)
def draw_person(image, result):
ss = 0.4 # 显示点的置信度阈值
lines = [ # 编写需要绘制的连线列表
'left_ear,left_eye,nose,right_eye,right_ear',
'left_wrist,left_elbow,left_shoulder,neck,right_shoulder,right_elbow,right_wrist',
'nose,neck',
'left_hip,right_hip',
'left_shoulder,left_hip,left_knee,left_ankle',
'right_shoulder,right_hip,right_knee,right_ankle',
]
if result is None:
return image
if 'person_info' not in result:
return image
for info in result['person_info']: # 循环绘制每一个人
bp = info['body_parts']
for l in lines:
ks = l.split(',')
for i in range(len(ks) - 1):
v1, v2 = bp[ks[i]], bp[ks[i + 1]]
c1, c2 = (int(v1['x']), int(v1['y'])), (int(v2['x']), int(v2['y']))
if v1['score'] > ss and v2['score'] > ss: # 当两个点都存在时绘制中间的连线
cv2.line(image, c1, c2, (255, 120, 120), 3) # 绘制中间连线
for k in bp: # 循环绘制每一个点
v = bp[k]
if v['score'] > ss:
c = (int(v['x']), int(v['y']))
cv2.circle(image, c, 5, (120, 255, 120), -1) # 绘制一个点
return image
result = None
def update(frame):
global result
_, img_encoded = cv2.imencode('.jpg', frame)
img_base64 = str(base64.b64encode(img_encoded))[2:-1]
request_url = 'https://aip.baidubce.com/rest/2.0/image-classify/v1/body_analysis' # 人体关键点的接口地址
request_url += '?access_token=' + access_token # 在地址后携带登录凭证信息
data = {'image': img_base64} # 根据接口要求格式 组成字典
headers = {'Content-Type': 'application/x-www-form-urlencoded'} # HTTP请求的头部信息
response = requests.post(request_url, data=data, headers=headers) # 执行HTTP POST请求
if not response:
print('网络连接错误')
return
result = response.json() # 将请求结果转为字典格式并存储在变量
# print(json.dumps(result, indent=4)) # 转换为更清晰带缩进格式的文本并打印
if 'person_num' not in result: # 判断是否成功识别
print(json.dumps(result, indent=4)) # 转换为更清晰带缩进格式的文本并打印
print('接口请求失败')
result = None
return
print('检测成功 人数:', result['person_num'])
cap = cv2.VideoCapture(0)
t = time.time()
while True:
ret, frame = cap.read()
if not ret:
print('画面读取失败')
exit(0)
if time.time() - t > 0.55:
Thread(target=update, args=(frame,)).start()
t = time.time()
if result is not None:
draw_person(frame, result)
cv2.imshow('video', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
代码最终结果展示:(一人)
(多人)
该代码实现了一个基于百度AI开放平台的人体关键点检测功能。它使用Python的cv2
(OpenCV库)来捕获视频流(通常是来自摄像头的实时视频),并通过百度AI的人体关键点检测API来分析视频中的每一帧,识别出人体并标记出关键点(如头部、眼睛、耳朵、四肢等)。然后,它使用OpenCV在视频帧上绘制出这些关键点和它们之间的连线,以便直观地展示人体的姿态。
作用
- 实时人体姿态识别:通过摄像头实时捕获视频,并立即分析每一帧中的人体姿态。
- 关键点标记:在视频帧上标记出人体的关键点,如眼睛、鼻子、四肢等。
- 姿态可视化:通过绘制关键点和它们之间的连线,将人体的姿态以图形化的方式展示出来。
前景
- 智能安防:在监控系统中集成人体姿态识别功能,可以自动检测异常行为,如跌倒、入侵等。
- 运动分析:在体育训练、健身等领域,分析运动员或健身者的动作是否标准,提供反馈和指导。
- 人机交互:在游戏、虚拟现实等领域,通过识别用户的姿态来控制游戏角色或虚拟环境。
- 健康监测:在医疗领域,监测老年人的日常活动,预防跌倒等意外事件。
应用场景
- 智能健身房:通过摄像头捕捉健身者的动作,实时分析并给出动作指导,提高训练效果。
- 老年人看护:在老年人居住的环境中安装摄像头,实时监测老年人的活动状态,预防跌倒等意外。
- 体育训练:在体育训练中,教练可以通过视频分析运动员的动作,找出不足并进行针对性训练。
- 安全监控:在公共场所如机场、火车站等安装监控系统,通过人体姿态识别技术检测异常行为,提高安全性。
- 虚拟现实游戏:在游戏中,玩家可以通过自己的姿态来控制游戏角色,增加游戏的沉浸感和互动性。
注意事项
- 隐私保护:在使用摄像头捕获视频时,需要确保遵守相关法律法规,尊重用户的隐私权。
- 网络稳定性:由于该应用依赖于网络请求,因此需要确保网络连接的稳定性,避免因网络问题导致的功能失效。
- 性能优化:在处理视频流时,需要注意性能优化,避免因为处理速度过慢而导致视频卡顿或延迟。
车辆识别:
(example1.png)
车辆检测_机动车检测_智能识别图中机动车辆类型位置-百度AI开放平台 (baidu.com)
https://ai.baidu.com/tech/vehicle/detect?tn=39042058_34_oem_dg&ie=utf-8![](https://i-blog.csdnimg.cn/direct/a9e702da6dbe442599d7592e3536f6a8.png)
完整代码:
# encoding:utf-8
import requests
import base64
import json
from login import login
'''
车辆检测
平台链接 https://ai.baidu.com/tech/vehicle/detect
'''
access_token = login('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')
if not access_token: # 登录失败则退出程序
exit()
request_url = 'https://aip.baidubce.com/rest/2.0/image-classify/v1/vehicle_detect' # 车辆识别的接口地址
request_url += '?access_token=' + access_token # 在地址后携带登录凭证信息
f = open('example1.png', 'rb') # 读取本地文件 地址填写图片路径(若与python程序在同一文件夹下可以直接写文件名) rb表示只读模式且以字节形式读取
img = base64.b64encode(f.read()) # 将图片字节信息转为base64格式的文本信息
data = {'image': img} # 根据接口要求格式 组成字典
headers = {'Content-Type': 'application/x-www-form-urlencoded'} # HTTP请求的头部信息
response = requests.post(request_url, data=data, headers=headers) # 执行HTTP POST请求
if not response:
print('网络连接错误')
exit()
result = response.json() # 将请求结果转为字典格式并存储在变量
print(json.dumps(result, indent=4)) # 转换为更清晰带缩进格式的文本并打印
if 'vehicle_num' not in result: # 判断是否成功识别
print('接口请求失败')
exit()
car_number = result['vehicle_num']['car']
if car_number == 0: # 判断图片中是否有车
print('图片中没有车')
else:
print(f'图片中有{car_number}辆车')
上述代码实现了一个基于百度AI开放平台的车辆检测功能。它首先通过调用login
函数(该函数未在代码段中给出,但假设它负责从百度AI平台获取access_token
)来获取访问API所需的令牌。然后,它读取本地的一张图片文件(example1.png
),将图片转换为Base64编码的字符串,并通过HTTP POST请求发送到百度AI的车辆检测API。API返回的结果被解析为JSON格式,并用于判断图片中是否包含车辆以及车辆的数量。
作用
- 车辆检测:自动识别并计算图片中的车辆数量。
- 图像处理:将图片文件转换为Base64编码的字符串,以便通过网络发送。
- API交互:与百度AI的车辆检测API进行交互,发送请求并接收响应。
前景
随着智能交通系统的快速发展,车辆检测技术在交通监控、停车管理、智能城市等多个领域具有广泛的应用前景。该技术可以辅助交通管理部门进行车辆流量监控、违章停车检测等工作,也可以为智能停车系统提供车辆识别与计数功能,提升交通管理效率和用户体验。
应用场景
- 交通监控:在主要道路、十字路口等关键位置安装摄像头,通过车辆检测技术实时监测交通流量,及时发现并处理交通拥堵、事故等问题。
- 智能停车:在停车场内安装摄像头,通过车辆检测技术自动识别进出车辆,实现无人值守的智能停车管理,提高停车效率。
- 安全监控:在公共场所、敏感区域等安装摄像头,结合车辆检测技术进行异常行为检测,如非法停车、车辆盗窃等。
- 智能城市规划:通过大规模部署的车辆检测系统收集交通数据,为城市规划部门提供数据支持,优化交通布局,缓解交通压力。
注意事项
- API访问限制:注意百度AI平台对API访问频率和请求次数的限制,避免因为频繁请求而被封禁。
- 数据安全:在处理和传输图像数据时,应遵守相关法律法规,确保数据安全与隐私保护。
- 性能优化:对于大规模应用,需要考虑图像处理的效率和实时性,可能需要对算法进行优化或采用更高效的硬件设备。
同上:SDK调用实现ASR(语音识别)和TTS(语音合成)
完整代码:(语音识别)
# encoding:utf-8
from aip import AipSpeech
'''
语音识别(ASR)
平台链接 https://ai.baidu.com/tech/speech/asr
'''
client = AipSpeech('xxxxxxxxx', 'xxxxxxxxxxxxxxxxxx', 'xxxxxxxxxxxxxxxxxxxxx')
file_data = open('audio.m4a', 'rb').read()
response = client.asr(file_data, 'm4a', 16000)
print(response)
text = ' '.join(response['result'])
print('识别结果:', text)
(语音合成)
# encoding:utf-8
from aip import AipSpeech
'''
语音合成(TTS)
平台链接 https://ai.baidu.com/tech/speech/tts_online
'''
client = AipSpeech('xxxxxxxxx', 'xxxxxxxxxxxxxxxxxx', 'xxxxxxxxxxxxxxxxxxxxx')
result = client.synthesis('上海今天气温36℃', 'zh', 1)
if not isinstance(result, dict):
open('audio.mp3', 'wb').write(result)
print('合成完成')
else:
print('合成失败')
print(result)
代码功能概述
上述代码展示了如何使用百度AI开放平台的语音合成(TTS, Text-To-Speech)和语音识别(ASR, Automatic Speech Recognition)功能。通过调用百度AI的AipSpeech
SDK,代码实现了将文本转换为语音(TTS)和将语音文件转换为文本(ASR)的功能。
语音合成(TTS)
- 功能:将输入的文本("上海今天气温36℃")转换为语音文件(MP3格式)。
- 作用:广泛应用于需要语音输出的场景,如智能客服、有声读物、导航播报等。
- 前景:随着智能设备的普及和人机交互需求的增加,TTS技术将在更多领域得到应用,提供更加自然流畅的语音交互体验。
- 应用场景:
- 智能家居:通过语音播报天气、新闻等信息。
- 车载导航:提供语音导航指令。
- 虚拟助手:如Siri、小爱同学等,将文本信息转换为语音与用户交流。
语音识别(ASR)
- 功能:将语音文件(M4A格式)转换为文本信息。
- 作用:实现人机交互中的语音输入,将用户的语音指令或说话内容转换为计算机可处理的文本数据。
- 前景:随着AI技术的不断发展,ASR的准确率不断提高,将推动更多基于语音的应用场景落地,如语音输入、语音搜索等。
- 应用场景:
- 语音输入:在智能手机、平板电脑等设备中,通过语音输入代替传统的键盘输入。
- 语音搜索:在搜索引擎中使用语音搜索功能,快速获取所需信息。
- 智能客服:通过ASR技术,实现与用户的语音交互,提供更加便捷的客服服务。
代码实现细节
- TTS部分:通过
client.synthesis
方法将文本转换为语音文件,并将结果写入到audio.mp3
文件中。如果转换成功,会打印“合成完成”,否则打印错误信息。 - ASR部分:首先读取本地的M4A语音文件,然后通过
client.asr
方法将语音文件转换为文本。asr
方法返回一个字典,其中包含识别结果。通过遍历结果列表并拼接成字符串,得到最终的识别文本。
注意事项
- 在使用百度AI的SDK之前,需要先在百度AI开放平台注册账号,并创建相应的应用以获取
APP_ID
、API_KEY
和SECRET_KEY
。 - 确保语音文件的格式和采样率与
asr
方法的要求相匹配,否则可能会影响识别效果。 - 语音合成和识别的准确性受多种因素影响,包括语音质量、背景噪音、文本内容等。在实际应用中,可能需要根据具体场景进行调优。