python识别手势并控制智能家居

想象一下,您正在为一个挚爱的人举办生日派对。每个人都玩得很开心,音乐在演奏,聚会很吵。突然,该吃生日蛋糕了!如果只要举手张开,您的智能家居设备会识别该手势并关闭音乐,使用相同的手势,您可以调暗灯光。那不是太神奇了吗?先看看下面的效果。
python识别手势并控制智能家居

好了,我们来用python来实现它吧。

▊操作步骤

▶实现思路

我们使用开源计算机视觉库OpenCV,,该库可以从屏幕上抓取图像,然后调整图像大小并将其转换为模型可以理解的NumPy数组。我用来转换数据的方法如下:

X_data = np.array(X_data, dtype = 'float32')
X_data = np.stack((X_data,) * 3, axis=-1)
简而言之,一旦相机启动并运行,您就可以抓取图片,对其进行变换并从模型中进行预测:

#starts the webcam, uses it as video source
camera = cv2.VideoCapture(0) #uses webcam for video

while camera.isOpened():
#ret returns True if camera is running, frame grabs each frame of the video feed
ret, frame = camera.read()

k = cv2.waitKey(10)
if k == 32: # if spacebar pressed
frame = np.stack((frame,)*3, axis=-1)
frame = cv2.resize(frame, (224, 224))
frame = frame.reshape(1, 224, 224, 3)
prediction, score = predict_image(frame)


▶提取手势

我所采用的方法是所有与Photoshop一起玩过的人都熟悉的一种方法-背景扣除。这是一件美丽的事!本质上,如果您在手进入场景之前对场景进行拍照,则可以创建一个“遮罩”,该遮罩将删除新图像中除手之外的所有内容。

从图像中减去背景后,便使用二进制阈值使目标手势完全变为白色,而背景变为完全黑色。我之所以选择这种方法,有两个原因:一是使手的轮廓清晰明了,二是使模型更易于在具有不同肤色的用户中推广。这创造了具有说服力的“剪影”式照片,最终我对模型进行了训练。

▶建立一个数据集

我从策略上选择了同样包含在Kaggle数据集中的4个手势,因此以后可以针对这些图像对模型进行交叉验证。我还添加了和平标志,尽管该手势在Kaggle数据集中没有类似物。

在这里,我通过设置网络摄像头并在OpenCV中创建单击绑定来捕获和保存具有唯一文件名的图像,从而构建了数据集。我试图改变框架中手势的位置和大小,以使我的模型更加健壮。我很快就建立了一个包含550个轮廓图像的数据集。是的,您没看错-我拍摄了2700张图像。

▶训练新模型

然后,我使用Keras和TensorFlow构建了卷积神经网络。我从出色的VGG-16预训练模型开始,然后在顶部添加了4个dense层以及一个dropout层。

然后,我采取了非同寻常的步骤,选择对我之前尝试过的原始Kaggle数据集进行交叉验证。这是关键-如果我的模型不能推广到以前从未训练过的其他人的手的图像上,那么它就不会比我的原始模型更好。

为了做到这一点,我对应用于训练数据的每个Kaggle图像应用了相同的变换-背景减法和二进制阈值。这给了他们我模型熟悉的类似“外观”。


▶运行结果

该模型的性能超出了我的预期。它正确地对测试集中的每个手势进行了分类,最终获得了98%的分数以及98%的准确性和准确性分数。这是个好消息!

但是,正如经验丰富的研究人员所知道的那样,在实验室中表现良好但在现实生活中表现不佳的模型并不值钱。最初的模型经历了同样的失败后,我对这种模型在实时手势操作中表现出谨慎的态度感到乐观。

▶整合智能家居

在测试我的模型之前,我想添加另一点改进。我一直是个精明的家庭发烧友,我的愿景一直是仅使用手势来控制Sonos和Philips Hue灯。为了轻松访问Philips Hue和Sonos API,我分别使用了phue和SoCo库。它们都很简单易用,如下所示:

# Philips Hue Settings
bridge_ip = '192.168.0.103'
b = Bridge(bridge_ip)

on_command = {'transitiontime' : 0, 'on' : True, 'bri' : 254}
off_command = {'transitiontime' : 0, 'on' : False, 'bri' : 254}

# Turn lights on
b.set_light(6, on_command)

#Turn lights off
b.set_light(6, off_command)
Using SoCo to control Sonos via the web API was arguably even easier:

sonos_ip = '192.168.0.104'
sonos = SoCo(sonos_ip)

# Play
sonos.play()

#Pause
sonos.pause()


然后,我为不同的手势创建绑定,以使用智能家居设备执行不同的操作:

if smart_home:
if prediction == 'Palm':
try:
action = "Lights on, music on"
sonos.play()
# turn off smart home actions if devices are not responding 
except ConnectionError:
smart_home = False
# etc. etc.


当我最终实时测试模型时,我对结果感到非常满意。我的模型在大多数时间里都能准确预测我的手势,并且我能够使用这些手势来控制灯光和音乐。

{{collectdata}}

网友评论0