加入收藏 | 设为首页 | 会员中心 | 我要投稿 厦门网 (https://www.xiamenwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 移动互联 > 正文

程序员深夜用Python跑神经网络,只为用中二动作关掉台灯

发布时间:2019-07-24 23:11:44 所属栏目:移动互联 来源:啤酒泡泡、曹培信编译
导读:对于上了床就再也不想下来的人来说,关灯成为睡觉前面临的最大挑战! 然而这一届网友永远不会让人失望,他们开发出了各种关灯大法: 当然少不了憨豆先生最简单粗暴的关灯方式: 然而,一个来自意大利拉不勒斯的小哥哥,决定利用舞步(身体姿势)来控制自己
副标题[/!--empirenews.page--]

程序员深夜用Python跑神经网络,只为用中二动作关掉台灯

对于上了床就再也不想下来的人来说,关灯成为睡觉前面临的最大挑战!

然而这一届网友永远不会让人失望,他们开发出了各种关灯大法:

程序员深夜用Python跑神经网络,只为用中二动作关掉台灯 程序员深夜用Python跑神经网络,只为用中二动作关掉台灯

当然少不了憨豆先生最简单粗暴的关灯方式:

程序员深夜用Python跑神经网络,只为用中二动作关掉台灯

然而,一个来自意大利拉不勒斯的小哥哥,决定利用“舞步”(身体姿势)来控制自己家的灯,整个过程利用一个神经网络实现,就像这样:

程序员深夜用Python跑神经网络,只为用中二动作关掉台灯 程序员深夜用Python跑神经网络,只为用中二动作关掉台灯

下面是小哥哥写的教程,文摘菌在不改变原意的基础上进行了编译。

在今天的文章里,我将手把手教大家训练一个神经网络模型,用来识别摄像头拍下的“舞步”,从而控制灯的开关。

我们将在已有的OpenPose深度学习模型之上建立我们自己的模型来识别身体的位置,然后,我们会建立一些样本来代表各种身体的各种姿态。

当我们建立好舞步(包括嘻哈超人舞步、T-Pose舞步)和其他身体姿态的样本后,我们会清理数据集,然后利用这些样例训练我们的神经网络。

当神经网络训练好之后,我们会用它来控制灯光。

今天的文章包括很多步骤,不过,所有的代码都在Github上,上面还包括了我已经搜集到的原始数据样例。

GitHub链接:

https://github.com/burningion/dab-and-tpose-controlled-lights

编写“编写软件”的软件:怎样训练你的神经网络?

程序员深夜用Python跑神经网络,只为用中二动作关掉台灯

首先就是数据——大量数据。

我们今天即将采用的神经网络模型卡内基梅隆大学的团队也曾经使用过,他们用自己的全景数据集来训练该模型。该数据集包括五个半小时的视频,视频中包含了150万个手动添加的代表人体骨骼位置的标签。

整个全景工作室的圆屋顶上装有500个摄像头,所有摄像头都对准人,从不同角度记录他们的动作。

这个全景工作室用构造训练数据集几乎是完美的,很方便进行计算机视觉的实验。

程序员深夜用Python跑神经网络,只为用中二动作关掉台灯

今天,我们将在他们的工作基础之上开始我们的工作。

首先我们会用他们的工具来创建一个很小的数据集。我们最终的神经网络只会使用171个姿态,包括记录的嘻哈超人舞步、T-Pose舞步和其他姿态。每一个姿态样例都是从卡耐基梅隆大学已有的工作中提取出来的。

神经网络的一个好处就是你可以使用别人已经建成的模型,然后加入一些新的神经网络层,以此来扩展该模型。这个过程被称之为迁移学习,因此我们可以用有限的资源来进行迁移学习。

从技术上来说,我们不会在这个项目中使用迁移学习,因为我们会对OpenPose的工作做一些细微的修改,然后创建一个独立的神经网络。

那么问题来了,我们该如何获取数据呢?

写一个程序并利用OpenCV来收集带标签的数据

使用OpenPose的成果,我们得到了25个代表人体骨骼架构的标签。我们可以写一个程序来控制网络摄像头,在图像上运行OpenPose,然后将动作与键盘上的按键相对应。

程序员深夜用Python跑神经网络,只为用中二动作关掉台灯

也就是说,我们做出一个T-Pose的动作,然后在键盘上点击m键,那么这个动作就被归到T-Pose那一类里。我们按照这个方法去添加171个不同的姿势,这样一来,我们就有数据训练神经网络了。以下是用于数据收集的代码的示例:

  1. # create lists for dab, tpose, other examplesdabs = []tposes = []other = []fps_time = 0# loop forever, reading webcam each timewhile True: ret_val, frame = vs.read() datum.cvInputData = frame opWrapper.emplaceAndPop([datum]) # need to be able to see what's going on image = datum.cvOutputData cv2.putText(image, "FPS: %f" % (1.0 / (time.time() - fps_time)), (10, 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) cv2.imshow("Openpose", image) fps_time = time.time() # quit with a q keypress, b or m to save data key = cv2.waitKey(1) & 0xFF if key == ord("q"): break elif key == ord("b"): print("Dab: " + str(datum.poseKeypoints)) dabs.append(datum.poseKeypoints[0]) elif key == ord("m"): print("TPose: " + str(datum.poseKeypoints)) tposes.append(datum.poseKeypoints[0]) elif key == ord("/"): print("Other: " + str(datum.poseKeypoints)) other.append(datum.poseKeypoints[0])# write our data as numpy binary files# for analysis laterdabs = np.asarray(dabs)tposes = np.asarray(tposes)other = np.asarray(other)np.save('dabs.npy', dabs)np.save('tposes.npy', tposes)np.save('other.npy', other) 

然后用NumPy的数组来储存特征,并用np.save函数把特征保存为二进制文件以便后续使用。我个人倾向于使用Jupyter notebook来观察和处理数据。

当数据收集好之后,我们可以观察并清理数据以便更好地去训练模型。

观察数据、清理数据以及使用数据训练模型

(编辑:厦门网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读