基于百度飞桨PaddlePaddle模型训练的手势识别模型控制音乐播放器

基于百度飞桨paddle模型训练的手势识别模型控制音乐播放器

  • 前言
  • 一、什么是百度飞桨PaddlePaddle?
    • 一.1 飞桨AI Studio
  • 二、实际使用
    • 1.配置虚拟环境
    • 2.安装
  • 三、实战
  • 四、 效果展示:
  • 总结


前言

随着机器学习深度学习的爆火,百度近期推出了百度飞桨模型,秉承着玩玩看看的想法基于百度飞桨模型做了一套代码。目前实现的功能是识别5种手势,控制音乐播放器的开始关闭上一首下一首以及暂停。在开始之前,不得不说,百度飞桨的社区有待壮大。


一、什么是百度飞桨PaddlePaddle?

PaddlePaddle简介:
(PArallel Distributed Deep LEarning 并行分布式深度学习)
飞桨(PaddlePaddle)以百度多年的深度学习技术研究和业务应用为基础,是中国首个自主研发、功能完备、 开源开放的产业级深度学习平台,集深度学习核心训练和推理框架、基础模型库、端到端开发套件和丰富的工具组件于一体。目前,飞桨累计开发者265万,服务企业10万家,基于飞桨开源深度学习平台产生了34万个模型。飞桨助力开发者快速实现AI想法,快速上线AI业务。帮助越来越多的行业完成AI赋能,实现产业智能化升级。

百度飞桨使用指南
特别指出:百度飞桨研究了多套模型,如
PaddleNLP自然语言处理模型库与PaddleCV视觉模型库,仅基于本项目我采用了PaddlePaddle模型而已。关于其它可移步官网。

一.1 飞桨AI Studio

这是目前我找到的,可以在线跑模型的唯一一个网站(如果各位有知道其他的欢迎评论)每周可以 领取(白嫖)一定时间的算力卡,用来在线跑模型,另外这也是一个学习社区,内部有许多基于百度飞桨的课程供大家参考学习,学习完成还可以领取算力卡。
大家直接百度搜索飞桨AI Studio即可 我不再附上链接(因为之前写爬虫附链接太多被官方大大提醒了)

二、实际使用

1.配置虚拟环境

学python嘛,虚拟环境必不可少,环境的坑我是踩了一次又一次(我恨啊),继上次我整理文件结果格式化了我的电脑以后我谨慎了很多。近期对于手上的许多项目基本上是一个项目一个虚拟环境。在使用过程中可以完全隔绝环境污染等问题,但是也出现了另一个问题。python以大量的第三方库而出名,所以使用一套虚拟环境稍微整理一下就小几个G,对于电脑又是一种负担。所以一定要随用随清理。
对于虚拟环境的配置我在其它博客中已经提到。没有看过的朋友务必创建一个虚拟环境再进行下一步。少壮不整理,老大修bug。
袁六加.:linux和windows下虚拟环境的配置

2.安装

代码如下(示例):
个人感觉官方文档还是非常良心的 ,进入官网后点击菜单栏的安装 选择自己的环境 如笔者环境 windows10 python pip 无GPU (所以选择cpu)
基于百度飞桨PaddlePaddle模型训练的手势识别模型控制音乐播放器_第1张图片
进入虚拟环境复制命令即可

安装验证:

import paddle
paddle.utils.run_check()

运行出现
PaddlePaddle is installed successfully!
证明安装成功
测试实例:
基于百度飞桨PaddlePaddle模型训练的手势识别模型控制音乐播放器_第2张图片

三、实战

飞桨AI Studio内部有大量数据集可供选择下载
数据集选择:
数据集我使用的是现成的,文件解压后内部有十种手势,一种大概200张笔者采用了其中的12345手势。
基于百度飞桨PaddlePaddle模型训练的手势识别模型控制音乐播放器_第3张图片
关于训练本人训练了150层cnn实际上在训练到110层左右时损失函数就已经准确到小数点后三位了,本人电脑没有GPU,挂着跑了三天三夜(哭死)。模型最后跑完了准确度还是非常不错的。
在投入使用的时候采用opencv进行了一个简单的中值滤波,以及镜像反转并框定区域对指定区域保存其图片传递给模型进行手势识别。在音乐播放方面采用了pygame。
在以上方式投入使用时会出现播放音乐则视频进程卡死现象。基于此状况采用了多线程的方式进行优化,最后的效果是比较流畅的。

核心代码概览

训练代码:

EPOCH_NUM = 150
print('开始训练...')
model_save_dir = r"E:\deeplearning_finger\model_cnn"

for pass_id in range(EPOCH_NUM):
    # 进行训练
    train_cost = 0
    for batch_id, data in enumerate(train_reader()):
        # 遍历train_reader的迭代器,并为数据加上索引batch_id
        train_cost, train_acc = exe.run(
            program=fluid.default_main_program(),  # 运行主程序
            feed=feeder.feed(data),  # 喂入一个batch的数据
            fetch_list=[avg_cost, accuracy])  # fetch均方误差和准确率

        all_train_iter = all_train_iter + BATCH_SIZE
        all_train_iters.append(all_train_iter)
        all_train_costs.append(train_cost[0])
        all_train_accs.append(train_acc[0])

        if batch_id % 10 == 0:  # 每10次batch打印一次训练、误差、准确率
            print("\nPass %d, batch %d, Cost %f, Acc %f" %
                  (pass_id, batch_id, train_cost[0], train_acc[0]))
    # 开始测试
    test_accs = []  # 测试的损失值
    test_costs = []  # 测试的准确率
    # 每训练一轮 进行一次测试
    for batch_id, data in enumerate(test_reader()):  # 遍历test_reader
        test_cost, test_acc = exe.run(program=fluid.default_main_program(),  # #运行测试主程序
                                      feed=feeder.feed(data),  # 喂入一个batch的数据
                                      fetch_list=[avg_cost, accuracy])  # fetch均方误差、准确率
        test_accs.append(test_acc[0])  # 记录每个batch的误差
        test_costs.append(test_cost[0])  # 记录每个batch的准确率

    # 求测试结果的平均值
    test_cost = (sum(test_costs) / len(test_costs))  # 每轮的平均误差
    test_acc = (sum(test_accs) / len(test_accs))  # 每轮的平均准确率
    print('Test:%d, Cost:%0.5f, ACC:%0.5f' % (pass_id, test_cost, test_acc))

识别代码:

while (cap.isOpened()):

    # print(finger_num)
    if finger_num == '1':
        cv2.putText(frame, '1', (0, 50), font, 2, (0, 0, 255), 3, cv2.LINE_AA)
        # pygame.mixer.music.stop()
        if pygame.mixer.music.get_busy():
            pass
        else:
            pygame.mixer.music.stop()
            music = pygame.mixer.music.load(songs_list[index])
            # print(songs_list[index])
            pygame.mixer.music.play()
    elif finger_num == '2':
        cv2.putText(frame, '2', (0, 50), font, 2, (0, 0, 255), 3, cv2.LINE_AA)
        pygame.mixer.music.pause()
    elif finger_num == '3':
        cv2.putText(frame, '3', (0, 50), font, 2, (0, 0, 255), 3, cv2.LINE_AA)
        if index >= len(songs_list) - 1:
            pass
        else:
            pygame.mixer.music.stop()  # 暂停音乐意为无论播放什么都中断
            music = pygame.mixer.music.load(songs_list[index])
            pygame.mixer.music.play()
            index += 1

    elif finger_num == '4' or canny_num == '4':
        cv2.putText(frame, '4', (0, 50), font, 2, (0, 0, 255), 3, cv2.LINE_AA)
        if index <= 0:
            pass

        else:

            music = pygame.mixer.music.load(songs_list[index])
            pygame.mixer.music.play()
            index -= 1
    elif finger_num == '5':
        cv2.putText(frame, '5', (0, 50), font, 2, (0, 0, 255), 3, cv2.LINE_AA)
        pygame.mixer.music.stop()
        stop_thread(t5)
        cv2.destroyAllWindows()
        cap.release()
        # 键盘Esc键退出
    else:
        pass

如需完整代码请私信我

四、 效果展示:

基于百度飞桨的手势识别控制音乐


总结

以上就是今天全部内容,如有问题欢迎批评指正。

你可能感兴趣的:(python,教程,paddlepaddle,百度,人工智能)