45元的WIFI攝像頭應用之YOLO人體識別聯動智能家居

如果大家對智能家居比較感興趣的話,一定知道阻礙智能家居自動化發展的一個大問題就是,房間裡有沒有人,如果有人,那人究竟在做些什麼,系統又該如何調整環境的照明,溫度甚至安防。

在很長的時間裡,我們檢測人體都依靠兩類設備,一類是熱釋電紅外傳感器,例如Aqara/小米人體傳感器:

45元的WIFI攝像頭應用之YOLO人體識別聯動智能家居

說明裡面已經說的很清楚了,檢測人或寵物移動,所以不動肯定是檢測不到的,很多人都把這鍋扔給小米背,但實際上,不管是哪個品牌,都做不到靜止檢測。還有一類叫做微波傳感器,例如最近在智能家居玩家群裡討論的很熱烈的靜止人體傳感器:

45元的WIFI攝像頭應用之YOLO人體識別聯動智能家居

這個傳感器號稱可以檢測靜止人體,不過在企業官方的文檔中明確寫道:動態探測距離 6-8 米,靜態探測距離最大2 米; 而其靜態探測是檢測人的微小動作,例如呼吸啥的。並且安裝位置要與人體平行:

45元的WIFI攝像頭應用之YOLO人體識別聯動智能家居

大家其實也可以看出來,這個號稱靜止人體檢測的玩意,實際上也就是個動作傳感器,只是靈敏度非常高罷了。先不說安裝問題,微波傳感器的靈敏度高了之後,電風扇,空調,任何輕微動作都可能觸傳感器動作。

除了這兩種外,本站值友@blindlight正在實驗利用無線信號來檢測人體,參考文檔:

45元的WIFI攝像頭應用之YOLO人體識別聯動智能家居

大概意思是用一圈WIFI設備把房間圍起來,然後實時監測各個節點的WIFI信號變化,來推斷哪裡有人。聽上去不是啥難事,但是實際上應用起來還是要動些腦筋,我表示能看懂意思,但是抱歉,我做不來,相信看文的各位大部分人也搞不定,所以這裡介紹一個大家都能玩的玩意——YOLO。

一、YOLO簡介

大道理不說,其實我也不懂,這裡大家只要知道YOLO的全稱是You only look once,也就是你就看了一眼,看了一眼怎麼了呢,看了眼就知道是什麼了,這是一個基於深度學習方法的端到端實時目標檢測系統。其主要特點一是快,二是安裝使用簡單,在ubuntu下只需要4條命令就可以開始工作。以下片段來自CSDN @泉偉

45元的WIFI攝像頭應用之YOLO人體識別聯動智能家居

不過根據他文中的介紹,他使用的配置為1080Ti,使用YOLO v3原始權重,Resize以後的圖片大小為608*608,檢測速度可以達到20幀每秒。當然,如果使用tiny權重的話速度會快很多。除了人之外,YOLO還能檢測其他常見物體,例如寵物:

45元的WIFI攝像頭應用之YOLO人體識別聯動智能家居

不過說實話,如果只是檢測有沒有人的話,即使不用1080TI,開一臺PC我都覺得有些浪費。所以這篇的主旨其實是利用樹莓派來實現靜態圖片的檢測。

二、樹莓派安裝darknet-nnpack

之前說了,如果在ubuntu上安裝YOLO的話只需要3條命令:

git clone https://github.com/pjreddie/darknetcd darknetmake

然後下載權重文件,權重文件分兩個版本,一個是標準的,一個是輕量(Tiny)的:

wget https://pjreddie.com/media/files/yolov3.weights(標準版)wget wget https://pjreddie.com/media/files/yolov3-tiny.weights(TINY版)

一般來說,標準版的檢測準確率會高很多,但是非常非常慢(2400G單線程虛擬機下檢測一張大約要30秒+),沒有GPU加速是沒有應用價值的,所以日常CPU使用都使用TINY版的權重(2400G單線程虛擬機下檢測一張大約要2秒+),雖然準確率差了一些,但是找找人啊,貓狗也已經足夠。但是標準版的Dakrnet在樹莓派3b上面跑的話即使是tiny權重,也要40秒左右一張,顯然是沒有任何實用價值的。所以如果在樹莓派上運行的話,我們需要針對無GPU並且ARM芯片進行優化過的darknet-nnpack。通過它來運行YOLO,我們能將tiny的識別速度提高到1秒/張左右,雖然依舊做不了實時檢測,但是考慮到無論是硬件成本,還是運行成本(電費),樹莓派都是性價比之選。

45元的WIFI攝像頭應用之YOLO人體識別聯動智能家居

當然,根據此表,X86平臺使用darknet-nnpack也能獲得非常不錯的優化速度。而安裝只要參照darknet-nnpack的github頁面一步步做下去就好,這裡就不再複製粘帖了,全程無坑,而在下載weights文件時我們只要下載tiny版的就好:

wget wget https://pjreddie.com/media/files/yolov3-tiny.weights

全部完成後我們可以利用自帶圖片測試下:

./darknet detector test cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights data/person.jpg
45元的WIFI攝像頭應用之YOLO人體識別聯動智能家居
45元的WIFI攝像頭應用之YOLO人體識別聯動智能家居

運行速度不錯,1.1秒就完成了識別,只是load weights還需要3-4秒,總體上在5秒左右。這裡值得說明的是,命令的默認參數是輸出準確率超過25%的物體,我們可以根據自身環境來調整參數:

./darknet detector test cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights data/person.jpg -thresh 0.1

例如這個就是輸出準確率10%以上的物體。

三、接入攝像頭

這裡我使用的是上一篇原創提到的45元的ESP32-CAM攝像頭模塊。當然,你要是其他攝像頭,只要能獲取到靜態JPG文件也都可以使用,這個攝像頭沒有夜視,視角也比較小,如果有大範圍以及夜間檢測需求的話其實並不是很合適。不過這裡要提醒的是,紅外補光攝得的黑白圖像YOLO的識別率會進一步降低。調整好攝像頭角度,確保人在廚房的每個角落,YOLO都能把人找出來。

45元的WIFI攝像頭應用之YOLO人體識別聯動智能家居

這個攝像頭最大的好處是,可以直接通過http獲取JPG靜態圖像,所以我這做了個批處理文件,首先是獲取靜態影像到指定文件夾,然後運行detector來進行識別:

45元的WIFI攝像頭應用之YOLO人體識別聯動智能家居

當然,這樣只是跑程序識別,結果並不會輸出到其他系統,所以我又拼拼湊湊搞了個PY文件,對結果進行分析,數輸出結果裡面有幾個person:

45元的WIFI攝像頭應用之YOLO人體識別聯動智能家居

然後將person數量傳送給domoticz變量:

45元的WIFI攝像頭應用之YOLO人體識別聯動智能家居

最後就是應用了,因為不是實時檢測,所以用來自動化開燈啥的是不可能了,但是配合小米紅外做到更快的自動關燈還是非常方便的,例如原先我們都是設定人體傳感器檢測到幾分鐘後無人關燈,現在就可以配合這個變量,在人體傳感器檢測到無人時去查看攝像頭檢測到的結果,如果是0就直接關燈,不用再等待幾分鐘。

當然,本篇的YOLO只是利用其現成的庫做的簡單應用,並沒有完全展示出YOLO的威力。深入應用的話可以自行訓練得到模型,來判斷更多的內容,例如你是在看電視,玩手機,還是睡覺等等。或者垃圾倒沒倒,碗有沒有洗啥的。

相關推薦

推薦中...