上个月,一位不请自来的客人(却深受我喜爱)每天都会造访我家门口。它是一只流浪猫,自信得如同皇室成员,出现的时间又像悬疑惊悚片般神秘莫测。每次相遇,它都会直勾勾地盯着我,喵喵叫着,仿佛在说:“我的仆人,你在哪里?你难道忘了喂养我的神圣职责了吗?”
这还用说吗?我爱猫。我一直都爱猫。
所以,作为这位猫主子的忠实臣民,我总会尽可能地给它提供食物。我家里的猫咪皮卡,是个姜黄色的小家伙,脑瓜里只有一个活跃的脑细胞,脾气却像个CEO。它总是拒绝吃超过一小时的剩饭剩菜。
自然而然地,我开始把没动过的食物放在外面给这位虎斑绅士。它每次都会把盘子舔得干干净净。但有个小问题。它从来不会在固定的时间出现,而我也没有固定的时间能发现它。
一只饥饿的猫如何“劫持”了我的工程师大脑
事情是这样的。我可能在开会,也可能正埋头调试某个奇怪的异步函数,而与此同时,这只猫正静静地坐在外面等着开饭。如果我碰巧打开了门,那就太好了;否则,它就会离开。
现在,皮卡是只室内猫,备受宠爱和保护,我们可不敢冒险让它被这位街头访客传染上什么病。所以让流浪猫进来是绝对不行的。但我也无法忍受它饿着肚子在外面等。
就在这时,我软件工程师的头脑开始运转了。
问题陈述
我手头有一台闲置的树莓派3B+。它正积着灰,默默地评判着我当初买它“是为了某个项目”的举动。好吧,那个“某个时候”已经到了。
我的树莓派3B+
问题很简单:“我如何能在不在现场的情况下知道猫咪何时会出现在我家门口?”
这成了这个看似荒谬却又让我深感满足的项目——猫咪检测系统。
目标是:
检测猫咪何时出现在外面。
立即通知我,以便我能喂它。
最终,收集足够的数据来了解它的日常习惯,并预测它的到达时间。
高级设计
以下是我为初始架构设计的设计图,
听起来有些夸张?可能是吧。但你要是曾被猫咪像责备你未能完成宇宙使命般喵喵叫过,你就不会这么想了。
我先是在树莓派上安装了一个小摄像头。我决定不采用视频流,因为,唉,可怜的树莓派的处理能力就像一只吃饱了午后大餐的困猫。所以我把它配置成定期拍摄静态图像。
每张拍摄的图像都会通过一个专门为猫咪调优的轻量级目标检测模型进行处理。当检测到猫咪时,系统会通过Telegram发送警报(当然,我希望收到一条“检测到猫咪!”的提示音和信息)(而无需费心搭建整个客户端应用)。
为了测试,我的质量保证工程师显然是皮卡。它多次跳到摄像头前,摆出姿势,就像是在为《猫咪时尚》杂志封面试镜。
一旦我确认模型足够准确,我就把设备设置在门口附近,藏在干粮容器里面。为了保持无线连接,我把它连接到一个移动电源上,使设置变得便携且简约。
为了测试目的,我把整个设置用纸包起来,暂时放在食物容器里面(把食物和它隔开),以后会把它移到一个专门的顶部支架上。我把它藏起来了,因为这是一个公共走廊
系统每隔几秒就会悄悄地拍一张照片,在本地进行处理,每当发现我的毛茸茸的朋友在外面时,就会通知我。
最后,在运行了一段时间后,我在Telegram上收到了一个提示,
摄像头没有合适的垂直支架,所以我不得不把它倒着安装。结果,每张照片都是倒着的——但谢天谢地,我们的毛茸茸的朋友还是能被顺利发现。(后来我在程序上把图像翻转了过来)
最后,为了这个系统的最终目的,当我收到通知时,我满心欢喜地匆匆走出去,看到我们的虎斑小子坐在鞋架上的垫子上,然后我喂了它。
以下是一些猫咪和这个“艺术品”一起玩耍的瞬间,
我所学到的东西
现在,在大家太过印象深刻之前,让我们明确一点,这远非一个生产级别的系统。这是一个为了一个目的而自制的手工设置——检测我的流浪猫,确保它不会饿肚子。
但关键在于。我从这个小小的周末项目中收获颇丰。
从我的猫咪检测系统中学到的经验
1. 需求激发创造力。我并没有计划要建立一个宠物监控系统,但饥饿(和内疚)是强大的动力。
2. 保持简单。有时候,定期拍照比实时运行带有大型语言模型(LLMs)的繁重消息队列更有效。你不需要用大炮打蚊子。
3. 耐心测试。让皮卡反复在摄像头前走来走去本身就是一种体验。它对镜头比对逻辑更感兴趣。
4. 接受不完美的设置。我没有最好的摄像头或完美的电源,但系统运行得足够好。
5. 数据会讲故事。一周后,我大致可以预测流浪猫何时会出现。它的日程安排比我之前在一些公司里的开发者站立会议还要规律。
完整系统运行中
关于工具的一些说明
以下是我用来构建这个猫咪护理的小型系统所用的工具:
树莓派3B+ —— 设置背后的“小脑瓜”,我用了这个,但建议新购买的人选择内存更大(>4GB)的新款设备,比如树莓派4
树莓派摄像头模块 —— 用于拍摄静态图像,关于这个摄像头模块,我想说一件事。如果你想在印度预算内找到性价比高的Pi摄像头,别再找了,我经过一番研究后选择了这个,相信我,这款Raspberry Pi摄像头板模型是350卢比以内最好的。
超快闪存 —— 用于存储操作系统和临时数据。
内存卡读卡器 —— 用于从MacBook上刷写树莓派
移动电源 —— 因为户外插座对猫咪来说可不安全
YOLO目标检测模型 —— 轻量级的预训练猫咪检测模型
https://arxiv.org/abs/1506.02640
Telegram API —— 向我的手机发送实时通知
就是这样——一个让我的生活和猫咪的生活都变得更轻松的简单系统。
以下是设置和代码
首先,我必须设置一个隔离的Python环境,
Run these commands in order:# Make sure venv module is installedsudo apt install python3-venv -y# Create a virtual environment (any folder name is fine)python3 -m venv ~/catenv# Activate the venvsource ~/catenv/bin/activate# Now you can safely install Python packagespip install requests schedule# now our shell prompt changes to:(catenv) username@pie_host:~ $# Now we're inside an isolated environment where pip install works normally.
必须一开始就做好这件事,因为根据我的经验,全局环境有时会导致问题,比如PEP 668行为。
现在我们来写代码,
拍摄图像
首先,安装摄像头模块并重启,然后在终端上通过ssh连接到树莓派,然后做以下操作,
我们可以确保系统是最新的:
sudo apt update && sudo apt full-upgrade -y
然后我们安装rpicam
https://github.com/raspberrypi/rpicam-apps
sudo apt updatesudo apt install rpicam-apps -y
这将给我们提供:
rpicam-hello
rpicam-still
rpicam-vid
rpicam-jpeg
检查它是否正常工作,
rpicam-still -o test.jpg
会出现这样的日志,并且会拍摄一张图像
现在,如果你使用ssh访问树莓派,为了将图像传输到有显示器的不同设备上,我们可以在系统的另一个标签页中运行以下命令,它会要求输入树莓派设备的密码。
scp roy@MY_IP:/home/roy/test.jpg ~/Desktop/# Note - To get current directory, pwd# to get raspberry's IP, hostname -I
检查图像是否正确,并调整角度,现在我们编写脚本的照片拍摄组件代码,
def capture_photo():"""Captures a photo using the Raspberry Pi camera."""output_dir = "/home/roy/photos"os.makedirs(output_dir, exist_ok=True)photo_path = os.path.join(output_dir, f"photo_{timestamp}.jpg")os.system(f"rpicam-still -t 1000 -o {photo_path}")return photo_path
上面的脚本会拍摄一张照片并保存到临时路径。
图像分析
首先,我尝试在Pi上本地使用TensorFlow Lite模型和OpenCV Haar级联,但由于设备性能较弱且相当老旧,运行并不流畅。我的Pi配置如下:
然后我在树莓派3B上使用了YOLOv8 ONNX来构建一个小型的基于视觉的脚本,因为它是一个非常轻量级的模型,可以完全离线运行,每分钟拍摄一张图像,在本地检测目标,如果发现猫咪就给我发送一个Telegram警报。
这是一个超级轻量的设置,展示了边缘人工智能的强大之处——实时目标检测,无需云端。
以下是我的代码,
Gist链接(不能在这里嵌入,因为有点大)
https://gist.github.com/iamparthaonline/7d1b293c82cfc04fc919553e0823b751
在这篇文章中我没有涉及模型的内部工作原理。
由于图像质量、光线和分辨率都不是很好,而且模型对于这种质量的图像来说非常轻量,所以它有一些误报和漏报。
因此,我正在编写一个云服务,将更大的模型托管在上面,并通过REST/grpc使用。
目前,我使用了perplexity现有的sonar-pro模型来做这部分(我从Airtel优惠中得到了专业版),对于图像托管,我使用了临时云存储;也可以使用Cloudinary或S3。
图像上传和Telegram消息发送函数非常简单,然后我设置了每分钟运行一次的cron作业,
# ---- SCHEDULER ----schedule.every(1).minutes.do(job)print(" Cat detection running every 1 minute...")while True:schedule.run_pending()time.sleep(1)
就这样。现在运行,
python3 cat-v6.py
系统正在检测外面的猫咪
当猫咪遇见编码者的心
这并不是要打造什么花哨或复杂的东西。这是关于用我最擅长的技术来解决一个小而有意义的问题。
有时候,我们把创新想得太复杂了,认为它必须大规模地改变世界。但说实话,即使是一个能让一个生命变得更好,或者在这个案例中,让一只猫咪不那么饿的小项目——也是值得努力的。
整个经历也让我回想起我最初为什么爱上构建/工程。这是将想法(或者与猫咪有关的随机情感时刻)变成真实且功能性的东西的能力。这是我们猫咪检测系统的几张快照:
最后
系统现在默默地履行着它的职责。每当流浪猫出现时,我都会收到一条Telegram消息。我查看摄像头画面,微笑,拿起食物,走出去迎接我的小朋友,它仍然喵喵叫着,好像它拥有这个地方一样。
另一方面,皮卡对它在这一切中的助手角色相当自豪,或者也许它只是嫉妒我在喂别人。很难说。
官方网站:https://edatec.cn/zh/cm0
淘宝店铺:https://edatec.taobao.com/
166