人工智能和机器学习4 (复旦大学计算机科学与技术实践工作站)利用百度AI实现视频关键点实时标注、Python多线程调用、车辆识别、SDK调用实现ASR(语音识别)和TTS(语音合成)

5 篇文章 0 订阅
3 篇文章 0 订阅

前言

(可参考小北之前的博客)

人工智能和机器学习2 (复旦大学计算机科学与技术实践工作站)python调用百度AI、获取token,并利用opencv绘制分析图,做简单判断-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/Zhiyilang/article/details/140794422

       在现代科技的推动下,人工智能(AI)和机器学习(ML)逐渐成为各行各业的重要工具。百度AI开放平台作为全球领先的人工智能服务平台,为开发者提供了包括语音、图像、自然语言处理(NLP)等多项技术支持。本篇博客笔记旨在分享如何利用Python调用百度AI获取人体关键点数据,并使用OpenCV对结果进行可视化和简单分析。这不仅是对AI技术的实际应用,也是对机器学习领域的一次有益探索。

百度AI开放平台-全球领先的人工智能服务平台百度AI开放平台提供全球领先的语音、图像、NLP等多项人工智能技术,开放对话式人工智能系统、智能驾驶系统两大行业生态,共享AI领域最新的应用场景和解决方案,帮您提升竞争力,开创未来。icon-default.png?t=N7T8https://ai.baidu.com/

 实时人体关键点识别并绘制

直接进入正题:

新建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)icon-default.png?t=N7T8https://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在视频帧上绘制出这些关键点和它们之间的连线,以便直观地展示人体的姿态。

作用

  • 实时人体姿态识别:通过摄像头实时捕获视频,并立即分析每一帧中的人体姿态。
  • 关键点标记:在视频帧上标记出人体的关键点,如眼睛、鼻子、四肢等。
  • 姿态可视化:通过绘制关键点和它们之间的连线,将人体的姿态以图形化的方式展示出来。

前景

  • 智能安防:在监控系统中集成人体姿态识别功能,可以自动检测异常行为,如跌倒、入侵等。
  • 运动分析:在体育训练、健身等领域,分析运动员或健身者的动作是否标准,提供反馈和指导。
  • 人机交互:在游戏、虚拟现实等领域,通过识别用户的姿态来控制游戏角色或虚拟环境。
  • 健康监测:在医疗领域,监测老年人的日常活动,预防跌倒等意外事件。

应用场景

  1. 智能健身房:通过摄像头捕捉健身者的动作,实时分析并给出动作指导,提高训练效果。
  2. 老年人看护:在老年人居住的环境中安装摄像头,实时监测老年人的活动状态,预防跌倒等意外。
  3. 体育训练:在体育训练中,教练可以通过视频分析运动员的动作,找出不足并进行针对性训练。
  4. 安全监控:在公共场所如机场、火车站等安装监控系统,通过人体姿态识别技术检测异常行为,提高安全性。
  5. 虚拟现实游戏:在游戏中,玩家可以通过自己的姿态来控制游戏角色,增加游戏的沉浸感和互动性。

注意事项

  • 隐私保护:在使用摄像头捕获视频时,需要确保遵守相关法律法规,尊重用户的隐私权。
  • 网络稳定性:由于该应用依赖于网络请求,因此需要确保网络连接的稳定性,避免因网络问题导致的功能失效。
  • 性能优化:在处理视频流时,需要注意性能优化,避免因为处理速度过慢而导致视频卡顿或延迟。

车辆识别:

 (example1.png)

车辆检测_机动车检测_智能识别图中机动车辆类型位置-百度AI开放平台 (baidu.com)icon-default.png?t=N7T8https://ai.baidu.com/tech/vehicle/detect?tn=39042058_34_oem_dg&ie=utf-8

完整代码:

# 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进行交互,发送请求并接收响应。

前景

随着智能交通系统的快速发展,车辆检测技术在交通监控、停车管理、智能城市等多个领域具有广泛的应用前景。该技术可以辅助交通管理部门进行车辆流量监控、违章停车检测等工作,也可以为智能停车系统提供车辆识别与计数功能,提升交通管理效率和用户体验。

应用场景

  1. 交通监控:在主要道路、十字路口等关键位置安装摄像头,通过车辆检测技术实时监测交通流量,及时发现并处理交通拥堵、事故等问题。
  2. 智能停车:在停车场内安装摄像头,通过车辆检测技术自动识别进出车辆,实现无人值守的智能停车管理,提高停车效率。
  3. 安全监控:在公共场所、敏感区域等安装摄像头,结合车辆检测技术进行异常行为检测,如非法停车、车辆盗窃等。
  4. 智能城市规划:通过大规模部署的车辆检测系统收集交通数据,为城市规划部门提供数据支持,优化交通布局,缓解交通压力。

注意事项

  • 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_IDAPI_KEYSECRET_KEY
  • 确保语音文件的格式和采样率与asr方法的要求相匹配,否则可能会影响识别效果。
  • 语音合成和识别的准确性受多种因素影响,包括语音质量、背景噪音、文本内容等。在实际应用中,可能需要根据具体场景进行调优。
  • 12
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Stitch .

欢迎各位家人来白嫖

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值