22年養了一隻很可愛的小狗狗,我其實就一個問題:為啥這麼可愛的狗狗會拉屎撒尿呀?
自從崽崽來了我們家之後,最讓我們頭疼的就是它亂拉、亂尿的問題了,以前會在家裡到處亂來,最近一段時間好了很多,已經只會在廁所拉/尿了。
雖然能都在廁所拉/尿,但是還是很耗費我們的精力。
我們家廁所是這樣的,我們把它的"狗廁所"擺在了廁所裡面,但是它老喜歡在廁所門口拉/尿,最噁心的是,老喜歡尿在這個透明的白箱子旁邊。怎麼訓練才能讓它在自己的廁所上拉/尿呢?
查閱了各種資料後,得出的結論就是,它尿/拉對了得給它獎勵,然後它尿/拉錯了,一定要當場抓獲!並且訓一頓,當場抓獲特別重要!但是,我們家的崽崽可太會了,它每次都能趁我們不注意,悄悄地"溜進"廁所,"迅速"地尿/便完,完美撤退,我們根本就發現不了。這讓我們想當場獎勵,或當場訓斥都沒法做到。
於是,忍無可忍的我只能上高科技了。
要想當場抓獲崽崽幹壞事,就必須及時發現它到廁所去了, 那就得有一個攝像頭一直監控著,並且還能用程式捕獲攝像頭的畫面,
這裡使用了TP-LINK的攝像頭,TP-LINK的攝像頭預設會在本地起一個rtsp的串流伺服器,只需要連上這個地址就能實時獲取到攝像頭捕捉的畫面。
捕捉了畫面之後,還需要用一個模型去做目標檢測,這樣才能識別到崽崽。
這裡直接使用了YOLOv5,這個庫使用COCO資料集做訓練,提供了好幾個不同規模的訓練好的模型,能直接使用。
家裡最容易能提醒到我們的就是小愛音箱了,所以找個辦法能主動讓小愛說話就行了。
經過一番調研,選擇了HomeAssistant來做這個事,使用HomeAssistant裝上Xiaomi MIoT外掛之後,就可以選擇繫結賬號,並且繫結裝置。然後HomeAssistant就能提供API供我們呼叫了。
本來到此應該就圓滿結束了的,但是關於模型,還有一些要展開說說的內容。
一開始我以為咱家的崽崽還算是一條比較"狗"的狗,用訓練好的模型直接去檢測就ok了,誰能想到,由於視角的問題(攝像頭是從上往下看的),崽崽根本就沒被識別,看圖也能發現,崽崽確實不太像狗,像是棉花:
所以我只能自己去訓練一個模型了,
這裡使用了roboflow進行資料的標註,標註起來還挺簡單的,並且最終能很容易地匯出YOLOv5所需的資料格式。
這裡還發生了點小插曲,一開始按照官方教學,就訓練了3個epoch,然後發現模型質量差的不行,mAP也很低,壓根都識別不出來崽崽。
所以就訓練了10個epoch,質量明顯上來了:
雖然訓練了10個epoch後,能完美地識別崽崽了,但是誤識別太多了,可能崽崽就是太像棉花了,所以模型只識別了其毛茸茸的性質,以至於我的睡衣也被當成了崽崽:
所以得把這些圖片也餵給模型,並且這些圖片不做崽崽的標註,這樣,模型如果不小心將我的睡衣識別成了崽崽,就會收到懲罰了。
順便我還標註了一下自己,識別成人,之後可以擴充套件使用。
至此,模型的效果終於不錯了,誤識別也比較少發生了。
最後就是新增一些實用性的功能了
由於我有一臺伺服器,一臺普通電腦(帶GPU),伺服器是7x24開機的,而電腦不是,所以模型就得放在伺服器上,用cpu來做serving,這個時候,serving的效能就不是很夠了,一個圖片需要100ms才能識別完,相當於10FPS。而視訊的輸入是30FPS的,所以肯定沒法直接使用。
這裡我並沒有針對模型的效能進行優化,而且取了個巧,先通過進行兩幀圖片的對比,識別出變化,在有變化產生後再進行模型的確認,所以模型serving的壓力只有在崽崽或者我們進廁所的時候才會產生,而一旦廁所沒有任何動靜,模型自己慢慢就處理完了。
這裡用的演演算法是網上找的程式碼片段,也不確定具體是啥演演算法,反正效果不錯,知道的同學可以補充說明一下:
由於模型還是會有一些誤識別,所以需要記錄下來識別的結果,後續補充資料集,繼續提升模型的效能。我這裡會記錄下識別結果圖和識別前的圖,識別圖可以快速地看結果對錯,原始圖可以用來重新標記。
現在只要崽崽出現在廁所,都能百分百提醒,偶爾人進去的時候會誤提醒,基本滿足了當時的需求。
相應地,崽崽已經很久(哈哈哈,才1天)沒有尿在廁所門口了,它現在能作案的時間只有晚上我們睡覺的時候,這個就沒辦法了。
說一下接下來可以擴充套件的點: