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 sourcecamera = cv2。VideoCapture(0) #uses webcam for videowhile 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)

▶提取手勢

python訓練和識別手勢控制智慧家居

我所採用的方法是所有與Photoshop一起玩過的人都熟悉的一種方法-背景扣除。這是一件美麗的事!本質上,如果您在手進入場景之前對場景進行拍照,則可以建立一個“遮罩”,該遮罩將刪除新影象中除手之外的所有內容。

從影象中減去背景後,便使用二進位制閾值使目標手勢完全變為白色,而背景變為完全黑色。我之所以選擇這種方法,有兩個原因:一是使手的輪廓清晰明瞭,二是使模型更易於在具有不同膚色的使用者中推廣。這創造了具有說服力的“剪影”式照片,最終我對模型進行了訓練。

▶建立一個數據集

python訓練和識別手勢控制智慧家居

我從策略上選擇了同樣包含在Kaggle資料集中的4個手勢,因此以後可以針對這些影象對模型進行交叉驗證。我還添加了和平標誌,儘管該手勢在Kaggle資料集中沒有類似物。

在這裡,我透過設定網路攝像頭並在OpenCV中建立單擊繫結來捕獲和儲存具有唯一檔名的影象,從而構建了資料集。我試圖改變框架中手勢的位置和大小,以使我的模型更加健壯。我很快就建立了一個包含550個輪廓影象的資料集。是的,您沒看錯-我拍攝了2700張影象。

▶訓練新模型

然後,我使用Keras和TensorFlow構建了卷積神經網路。我從出色的VGG-16預訓練模型開始,然後在頂部添加了4個dense層以及一個dropout層。

然後,我採取了非同尋常的步驟,選擇對我之前嘗試過的原始Kaggle資料集進行交叉驗證。這是關鍵-如果我的模型不能推廣到以前從未訓練過的其他人的手的影象上,那麼它就不會比我的原始模型更好。

為了做到這一點,我對應用於訓練資料的每個Kaggle影象應用了相同的變換-背景減法和二進位制閾值。這給了他們我模型熟悉的類似“外觀”。

python訓練和識別手勢控制智慧家居

▶執行結果

該模型的效能超出了我的預期。它正確地對測試集中的每個手勢進行了分類,最終獲得了98%的分數以及98%的準確性和準確性分數。這是個好訊息!

但是,正如經驗豐富的研究人員所知道的那樣,在實驗室中表現良好但在現實生活中表現不佳的模型並不值錢。最初的模型經歷了同樣的失敗後,我對這種模型在實時手勢操作中表現出謹慎的態度感到樂觀。

▶整合智慧家居

在測試我的模型之前,我想新增另一點改進。我一直是個精明的家庭發燒友,我的願景一直是僅使用手勢來控制Sonos和Philips Hue燈。為了輕鬆訪問Philips Hue和Sonos API,我分別使用了phue和SoCo庫。它們都很簡單易用,如下所示:

# Philips Hue Settingsbridge_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 onb。set_light(6, on_command)#Turn lights offb。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)# Playsonos。play()#Pausesonos。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。

當我最終實時測試模型時,我對結果感到非常滿意。我的模型在大多數時間裡都能準確預測我的手勢,並且我能夠使用這些手勢來控制燈光和音樂。

好了,有什麼問題歡迎留言評論,關注我,每天分享一篇技術好文。