想像一下,您正在為一個摯愛的人舉辦生日派對。每個人都玩得很開心,音樂在演奏,聚會很吵。突然,該吃生日蛋糕了!如果只要舉手張開,您的智能家居設備會識別該手勢並關閉音樂,使用相同的手勢,您可以調暗燈光。那不是太神奇了嗎?先看看下面的效果。
好了,我們來用python來實現它吧。
▊操作步驟
▶實現思路
我們使用開源計算機視覺庫OpenCV,,該庫可以從屏幕上抓取圖像,然後調整圖像大小並將其轉換為模型可以理解的NumPy數組。我用來轉換數據的方法如下:
X_data = np.array(X_data, dtype = &39;)X_data = np.stack((X_data,) * 3, axis=-1)
簡而言之,一旦相機啟動並運行,您就可以抓取圖片,對其進行變換並從模型中進行預測:
uses webcam for videowhile camera.isOpened(): 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庫。它們都很簡單易用,如下所示:
39;192.168.0.103&39;transitiontime&39;on&39;bri&39;transitiontime&39;on&39;bri& Turn lights onb.set_light(6, on_command)39;192.168.0.104& Playsonos.play()39;Palm&34;Lights on, music on& turn off smart home actions if devices are not responding except ConnectionError: smart_home = False # etc. etc.
當我最終實時測試模型時,我對結果感到非常滿意。我的模型在大多數時間裡都能準確預測我的手勢,並且我能夠使用這些手勢來控制燈光和音樂。
好了,有什麼問題歡迎留言評論,關注我,每天分享一篇技術好文。