如何用智慧地教狗狗上廁所

boydfd發表於2023-01-08

背景

22年養了一隻很可愛的小狗狗,我其實就一個問題:為啥這麼可愛的狗狗會拉屎撒尿呀?

崽崽1
崽崽2

自從崽崽來了我們家之後,最讓我們頭疼的就是它亂拉、亂尿的問題了,以前會在家裡到處亂來,最近一段時間好了很多,已經只會在廁所拉/尿了。

雖然能都在廁所拉/尿,但是還是很耗費我們的精力。

我們家廁所是這樣的,我們把它的"狗廁所"擺在了廁所裡面,但是它老喜歡在廁所門口拉/尿,最噁心的是,老喜歡尿在這個透明的白箱子旁邊。怎麼訓練才能讓它在自己的廁所上拉/尿呢?

廁所

查閱了各種資料後,得出的結論就是,它尿/拉對了得給它獎勵,然後它尿/拉錯了,一定要當場抓獲!並且訓一頓,當場抓獲特別重要!但是,我們家的崽崽可太會了,它每次都能趁我們不注意,悄悄地"溜進"廁所,"迅速"地尿/便完,完美撤退,我們根本就發現不了。這讓我們想當場獎勵,或當場訓斥都沒法做到。

於是,忍無可忍的我只能上高科技了。

場景分析+技術實現

畫面捕捉

要想當場抓獲崽崽幹壞事,就必須及時發現它到廁所去了, 那就得有一個攝像頭一直監控著,並且還能用程式捕獲攝像頭的畫面,

這裡使用了TP-LINK的攝像頭,TP-LINK的攝像頭預設會在本地起一個rtsp的串流伺服器,只需要連上這個地址就能實時獲取到攝像頭捕捉的畫面。

目標檢測

捕捉了畫面之後,還需要用一個模型去做目標檢測,這樣才能識別到崽崽。

這裡直接使用了YOLOv5,這個庫使用COCO資料集做訓練,提供了好幾個不同規模的訓練好的模型,能直接使用。

提醒

家裡最容易能提醒到我們的就是小愛音響了,所以找個辦法能主動讓小愛說話就行了。

經過一番調研,選擇了HomeAssistant來做這個事,使用HomeAssistant裝上Xiaomi MIoT外掛之後,就可以選擇繫結賬號,並且繫結裝置。然後HomeAssistant就能提供API供我們呼叫了。

homeassistant

整體架構圖

架構

目標檢測模型相關的細節

本來到此應該就圓滿結束了的,但是關於模型,還有一些要展開說說的內容。

模型的通用性

一開始我以為我們家的崽崽還算是一條比較"狗"的狗,用訓練好的模型直接去檢測就ok了,誰能想到,由於視角的問題(攝像頭是從上往下看的),崽崽根本就沒被識別,看圖也能發現,崽崽確實不太像狗,像是棉花:

cotton dog

所以我只能自己去訓練一個模型了,

這裡使用了roboflow進行資料的標註,標註起來還挺簡單的,並且最終能很容易地匯出YOLOv5所需的資料格式。

annotation

模型的訓練

這裡還發生了點小插曲,一開始按照官方教程,就訓練了3個epoch,然後發現模型質量差的不行,mAP也很低,壓根都識別不出來崽崽。

3-map

所以就訓練了10個epoch,質量明顯上來了:

10-map

模型的最佳化

雖然訓練了10個epoch後,能完美地識別崽崽了,但是誤識別太多了,可能崽崽就是太像棉花了,所以模型只識別了其毛茸茸的性質,以至於我的睡衣也被當成了崽崽:

zai-error1
zai-error2
zai-error3

所以得把這些圖片也餵給模型,並且這些圖片不做崽崽的標註,這樣,模型如果不小心將我的睡衣識別成了崽崽,就會收到懲罰了。

順便我還標註了一下自己,識別成人,之後可以擴充套件使用。

至此,模型的效果終於不錯了,誤識別也比較少發生了。

實用性提升

最後就是新增一些實用性的功能了

模型serving效能差

由於我有一臺伺服器,一臺普通電腦(帶GPU),伺服器是7x24開機的,而電腦不是,所以模型就得放在伺服器上,用cpu來做serving,這個時候,serving的效能就不是很夠了,一個圖片需要100ms才能識別完,相當於10FPS。而影片的輸入是30FPS的,所以肯定沒法直接使用。

這裡我並沒有針對模型的效能進行最佳化,而且取了個巧,先透過進行兩幀圖片的對比,識別出變化,在有變化產生後再進行模型的確認,所以模型serving的壓力只有在崽崽或者我們進廁所的時候才會產生,而一旦廁所沒有任何動靜,模型自己慢慢就處理完了。

這裡用的演算法是網上找的程式碼片段,也不確定具體是啥演算法,反正效果不錯,知道的同學可以補充說明一下:

  1. 計算幀間的距離(Pythagorean distance)
  2. 在計算出來的距離矩陣上應用高斯模糊
  3. 使用一定的閾值進行過濾
  4. 計算標準差
  5. 標準差大於一定的閾值,認為檢測到了運動,輸出資訊

記錄下模型的結果

由於模型還是會有一些誤識別,所以需要記錄下來識別的結果,後續補充資料集,繼續提升模型的效能。我這裡會記錄下識別結果圖和識別前的圖,識別圖可以快速地看結果對錯,原始圖可以用來重新標記。

comparing

控制通知的時機

  1. 一旦發現崽崽後,不需要一直報告,可以隔一段時間再報告(意味著模型也可以隔一段時間再識別,順便能節約一下計算資源),這裡我設定了20秒。
  2. 晚上不能吵我們睡覺,所以有靜默時間,這裡設定了23點開始到7點結束。

效果

現在只要崽崽出現在廁所,都能百分百提醒,偶爾人進去的時候會誤提醒,基本滿足了當時的需求。

相應地,崽崽已經很久(哈哈哈,才1天)沒有尿在廁所門口了,它現在能作案的時間只有晚上我們睡覺的時候,這個就沒辦法了。

下一步

說一下接下來可以擴充套件的點:

  1. 透過ONNX來提升模型serving的效能,之前測試過,在cpu做serving的前提下,ONNX可以將serving的效能提升好幾倍,當然那是1年前的做的實驗了,不確定現在還適應不,是一個值得嘗試的方向。
  2. 加入狗廁所識別的功能,這樣可以捕獲狗廁所的資訊和崽崽的資訊進行匹配,如果是在狗廁所上,那麼無需觸動警報
  3. 可以搞個姿勢識別的模型,發現崽崽尿/便對了,便對了就能識別出來,這樣就能給予獎勵了
  4. 再搞一個自動投餵的機器,可以遠端控制投餵,這樣一旦識別出來尿/便對了,就直接投餵好吃的零食,這樣人就可以完全不用管了。

相關文章