草庐IT

如何用智能地教狗狗上厕所

boydfd 2023-03-28 原文

背景

22年养了一只很可爱的小狗狗,我其实就一个问题:为啥这么可爱的狗狗会拉屎撒尿呀?


自从崽崽来了我们家之后,最让我们头疼的就是它乱拉、乱尿的问题了,以前会在家里到处乱来,最近一段时间好了很多,已经只会在厕所拉/尿了。

虽然能都在厕所拉/尿,但是还是很耗费我们的精力。

我们家厕所是这样的,我们把它的"狗厕所"摆在了厕所里面,但是它老喜欢在厕所门口拉/尿,最恶心的是,老喜欢尿在这个透明的白箱子旁边。怎么训练才能让它在自己的厕所上拉/尿呢?

查阅了各种资料后,得出的结论就是,它尿/拉对了得给它奖励,然后它尿/拉错了,一定要当场抓获!并且训一顿,当场抓获特别重要!但是,我们家的崽崽可太会了,它每次都能趁我们不注意,悄悄地"溜进"厕所,"迅速"地尿/便完,完美撤退,我们根本就发现不了。这让我们想当场奖励,或当场训斥都没法做到。

于是,忍无可忍的我只能上高科技了。

场景分析+技术实现

画面捕捉

要想当场抓获崽崽干坏事,就必须及时发现它到厕所去了, 那就得有一个摄像头一直监控着,并且还能用程序捕获摄像头的画面,

这里使用了TP-LINK的摄像头,TP-LINK的摄像头默认会在本地起一个rtsp的串流服务器,只需要连上这个地址就能实时获取到摄像头捕捉的画面。

目标检测

捕捉了画面之后,还需要用一个模型去做目标检测,这样才能识别到崽崽。

这里直接使用了YOLOv5,这个库使用COCO数据集做训练,提供了好几个不同规模的训练好的模型,能直接使用。

提醒

家里最容易能提醒到我们的就是小爱音箱了,所以找个办法能主动让小爱说话就行了。

经过一番调研,选择了HomeAssistant来做这个事,使用HomeAssistant装上Xiaomi MIoT插件之后,就可以选择绑定账号,并且绑定设备。然后HomeAssistant就能提供API供我们调用了。

整体架构图

目标检测模型相关的细节

本来到此应该就圆满结束了的,但是关于模型,还有一些要展开说说的内容。

模型的通用性

一开始我以为咱家的崽崽还算是一条比较"狗"的狗,用训练好的模型直接去检测就ok了,谁能想到,由于视角的问题(摄像头是从上往下看的),崽崽根本就没被识别,看图也能发现,崽崽确实不太像狗,像是棉花:

所以我只能自己去训练一个模型了,

这里使用了roboflow进行数据的标注,标注起来还挺简单的,并且最终能很容易地导出YOLOv5所需的数据格式。

模型的训练

这里还发生了点小插曲,一开始按照官方教程,就训练了3个epoch,然后发现模型质量差的不行,mAP也很低,压根都识别不出来崽崽。

所以就训练了10个epoch,质量明显上来了:

模型的优化

虽然训练了10个epoch后,能完美地识别崽崽了,但是误识别太多了,可能崽崽就是太像棉花了,所以模型只识别了其毛茸茸的性质,以至于我的睡衣也被当成了崽崽:



所以得把这些图片也喂给模型,并且这些图片不做崽崽的标注,这样,模型如果不小心将我的睡衣识别成了崽崽,就会收到惩罚了。

顺便我还标注了一下自己,识别成人,之后可以扩展使用。

至此,模型的效果终于不错了,误识别也比较少发生了。

实用性提升

最后就是添加一些实用性的功能了

模型serving性能差

由于我有一台服务器,一台普通电脑(带GPU),服务器是7x24开机的,而电脑不是,所以模型就得放在服务器上,用cpu来做serving,这个时候,serving的性能就不是很够了,一个图片需要100ms才能识别完,相当于10FPS。而视频的输入是30FPS的,所以肯定没法直接使用。

这里我并没有针对模型的性能进行优化,而且取了个巧,先通过进行两帧图片的对比,识别出变化,在有变化产生后再进行模型的确认,所以模型serving的压力只有在崽崽或者我们进厕所的时候才会产生,而一旦厕所没有任何动静,模型自己慢慢就处理完了。

这里用的算法是网上找的代码片段,也不确定具体是啥算法,反正效果不错,知道的同学可以补充说明一下:

  1. 计算帧间的距离(Pythagorean distance)
  2. 在计算出来的距离矩阵上应用高斯模糊
  3. 使用一定的阈值进行过滤
  4. 计算标准差
  5. 标准差大于一定的阈值,认为检测到了运动,输出信息

记录下模型的结果

由于模型还是会有一些误识别,所以需要记录下来识别的结果,后续补充数据集,继续提升模型的性能。我这里会记录下识别结果图和识别前的图,识别图可以快速地看结果对错,原始图可以用来重新标记。

控制通知的时机

  1. 一旦发现崽崽后,不需要一直报告,可以隔一段时间再报告(意味着模型也可以隔一段时间再识别,顺便能节约一下计算资源),这里我设置了20秒。
  2. 晚上不能吵我们睡觉,所以有静默时间,这里设置了23点开始到7点结束。

效果

现在只要崽崽出现在厕所,都能百分百提醒,偶尔人进去的时候会误提醒,基本满足了当时的需求。

相应地,崽崽已经很久(哈哈哈,才1天)没有尿在厕所门口了,它现在能作案的时间只有晚上我们睡觉的时候,这个就没办法了。

下一步

说一下接下来可以扩展的点:

  1. 通过ONNX来提升模型serving的性能,之前测试过,在cpu做serving的前提下,ONNX可以将serving的性能提升好几倍,当然那是1年前的做的实验了,不确定现在还适应不,是一个值得尝试的方向。
  2. 加入狗厕所识别的功能,这样可以捕获狗厕所的信息和崽崽的信息进行匹配,如果是在狗厕所上,那么无需触动警报
  3. 可以搞个姿势识别的模型,发现崽崽尿/便对了,便对了就能识别出来,这样就能给予奖励了
  4. 再搞一个自动投喂的机器,可以远程控制投喂,这样一旦识别出来尿/便对了,就直接投喂好吃的零食,这样人就可以完全不用管了。

有关如何用智能地教狗狗上厕所的更多相关文章

  1. ruby-on-rails - 如何用不同的用户运行nginx主进程 - 2

    A/ctohttp://wiki.nginx.org/CoreModule#usermaster进程曾经以root用户运行,是否可以以不同的用户运行nginxmaster进程? 最佳答案 只需以非root身份运行init脚本(即/etc/init.d/nginxstart),就可以用不同的用户运行nginxmaster进程。如果这真的是你想要做的,你将需要确保日志和pid目录(通常是/var/log/nginx&/var/run/nginx.pid)对该用户是可写的,并且您所有的listen调用都是针对大于1024的端口(因为绑定(

  2. ruby - 如何用递增的值填充数组 Ruby - 2

    我正在尝试解决http://projecteuler.net/problem=1.我想创建一个方法,它接受一个整数,然后创建一个包含它前面的所有整数的数组,并将整数本身作为数组中的值。以下是我目前所拥有的。代码不起作用。defmake_array(num)numbers=Array.newnumcount=1numbers.eachdo|number|numbers 最佳答案 (1..num).to_a是您在Ruby中需要做的全部。1..num将创建一个Range对象,以1开始并以任意值num结束是。Range对象有to_a方法通过

  3. ruby - 如何用 Nokogiri 解析连续的标签? - 2

    我有这样的HTML代码:Label1Value1Label2Value2...我的代码不起作用。doc.css("first").eachdo|item|label=item.css("dt")value=item.css("dd")end显示所有首先标记,然后标记标签,我需要“标签:值” 最佳答案 首先,您的HTML应该有和中的元素:Label1Value1Label2Value2...但这不会改变您解析它的方式。你想找到s并遍历它们,然后在每个你可以使用next_element得到;像这样:doc=Nokogiri::HTML(

  4. ruby-on-rails - 如何用 has_many 保存数据 :through - 2

    我在游戏和帐户模型之间存在多对多关系,如下所示:classAccount:destroyhas_many:games,:through=>:account_gamesendclassGame:destroyhas_many:accounts,:through=>:account_gamesendclassAccountGame现在我知道让我们说我想创建一个类似这样的记录:@account=Account.new(params[:user])@account.games但是我应该如何在执行此操作时更新AccountGame中的某些属性?假设AccountGame有一些名为score的字段

  5. 玩以太坊链上项目的必备技能(初识智能合约语言-Solidity之旅一) - 2

    前面一篇关于智能合约翻译文讲到了,是一种计算机程序,既然是程序,那就可以使用程序语言去编写智能合约了。而若想玩区块链上的项目,大部分区块链项目都是开源的,能看得懂智能合约代码,或找出其中的漏洞,那么,学习Solidity这门高级的智能合约语言是有必要的,当然,这都得在公链``````以太坊上,毕竟国内的联盟链有些是不兼容Solidity。Solidity是一种面向对象的高级语言,用于实现智能合约。智能合约是管理以太坊状态下的账户行为的程序。Solidity是运行在以太坊(Ethereum)虚拟机(EVM)上,其语法受到了c++、python、javascript影响。Solidity是静态类型

  6. 智能客服 | 浅谈人工智能聊天机器人ChatGPT - 2

    2022年底,OpenAI的预训练模型ChatGPT给人工智能领域的爱好者和研究人员留下了深刻的印象和启发,他展现的惊人能力将人工智能的研究和应用热度推向高潮,网上也充斥着和ChatGPT的各种聊天,他可以作诗、写小说、写代码、讨论疫情问题等。下面就是一些他的神回复:人命关天的坑: 写歌,留给词作者的机会不多了。。。 回答人类怎么样面对人工智能: 什么是ChatGPT?借用网上的一段介绍,ChatGPT是由人工智能研究实验室OpenAI在2022年11月30日发布的全新聊天机器人模型,一款人工智能技术驱动的自然语言处理工具。它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动

  7. ruby - 如何用 YARD 记录一个不返回任何内容的方法 - 2

    我有这样的方法defself.import(file_name,opts={})我正在尝试用YARD记录下来。然而,这是一种100%副作用的方法(我知道,我知道,副作用,呃!)。但是对于此方法的用户,实际上没有任何类型的返回对象,但是YARD生成如下签名:+(Object)import(file_name,opts={})有什么办法可以告诉yardimport方法什么都不返回吗?我可以告诉它返回nil,但这不是一回事 最佳答案 所有方法都会返回一些东西,void关键字可能就是您要查找的内容。#@return[void]defmeth

  8. 基于python的短视频智能推荐/django的影视网站/视频推荐系统 - 2

    摘要本论文主要论述了如何使用Python技术开发一个短视频智能推荐,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述短视频智能推荐的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程,对系统进行各个阶段分析设计。 短视频智能推荐的主要使用者分为管理员和用户,实现功能包括管理员:首页、个人中心、用户管理、热门视频管理、用户上传管理、系统管理,用户:首页、个人中心、用户上传管理、我的收藏管理,前台首页;首页、热门视频、用户上传、公告信息、个人中心、后台管理等功能。由于本网站的功能模块设计比较全面,所以使得整个短视频智能推荐信

  9. ruby - 如何用 ruby​​ 1.9.2 编译 vim - 2

    我尝试重新编译支持ruby​​的vim,因为我注意到vim仍在使用1.8.7(这是SnowLeopard上的默认ruby​​版本)。Ruby1.9.2通过rvm安装。编译时./configure--enable-rubyinterp--enable-gui=no--disable-nls--enable-cscope--prefix=/Users/madhatter我从make中得到以下错误:ld:librarynotfoundfor-lruby.1.9.1collect2:ldreturned1exitstatusmake[1]:***[vim]Error1make:***[firs

  10. 【毕业设计】基于单片机的智能温控农业大棚系统 - 物联网 stm32 - 2

    文章目录1简介2绪论2.1课题背景与目的3系统设计详细设计描述3.2硬件部分温度测量电路其他电路部分3.3软件部分主程序子系统程序温湿度程序流程键盘显示子程序3.4实现效果3.5部分相关代码4最后1简介Hi,大家好,这里是丹成学长,今天向大家介绍一个单片机项目基于单片机的智能温控农业大棚系统大家可用于课程设计或毕业设计单片机-嵌入式毕设选题大全及项目分享:https://blog.csdn.net/m0_71572576/article/details/1254090522绪论2.1课题背景与目的近年来我国的温室控制取得了长足的进步,首先在温室群控制方面,进行了初步的探索和理论研究,其次在温室

随机推荐