请将 Raspberry Pi 和 pico 放入冰箱

转发: Please Fridge with RaspberryPi & pico
项目介绍
项目目的
通过识别用户冰箱中的物品、推荐可能的烹饪菜单并提供相关烹饪视频,减少食物浪费并促进各种烹饪活动。




主要特点和组件
Raspberry Pi 和 Pi 相机
捕获冰箱中的物品并使用对象识别来识别成分。
物体识别系统
使用 YOLOv5 准确识别图像中的成分。
开放人工智能API
根据公认的食材推荐可能的菜肴。
YouTube 抓取模块
自动搜索并获取与建议菜单相关的烹饪视频的 YouTube 链接。
电报通知系统
在 Telegram 消息中向用户发送菜单推荐和 YouTube 视频链接。
预期效益
- 通过有效利用冰箱中的剩余成分来减少食物浪费。
- 帮助用户轻松尝试不同的菜肴,增加烹饪的兴趣和享受。
项目实施步骤
Raspberry PI 和 Pico 设置
树莓派 4

我们利用 Raspberry Pi 来驱动我们的 AI 模型并创建数据。
从 Raspberry 主页,您可以将 Raspbian 操作系统保存到 SD 卡、启动它并安装必要的模块。
您可以通过上面的链接安装摄像头模块。
硬件连接
- 启用串行接口:运行 sudo raspi-config 并选择“接口选项”>“串行”以启用硬件串行。
- 编写Python代码或其他可以通过串口发送和接收数据的代码。
树莓派 Pico (W5100S-EVB-Pico)

Pico 通信并接收 Raspberry Pi 4 推断的数据,并利用以太网通信使用 chatGPT 进行菜单推荐。
连接以太网、供电并设置 UART 以与 Raspberry 4 通信。
硬件连接
将 Raspberry Pi 4 的 GPIO 引脚 14 (TX) 连接到 Pico 的 UART RX 引脚。
将 Raspberry Pi 4 的 GPIO 引脚 15 (RX) 连接到 Pico 的 UART TX 引脚。
将两块板的 GND 引脚相互连接。
YOLOv5(目标检测)

我们检测目标冰箱。 显然,对象对象化中的快速参考系有利于实时检测,但我们只需对象化并唯一化类值即可创建数据。
1. 为了创建对象检测模型,我首先创建了一个数据集。 通过爬行,我构建了与食品成分或容器相关的图像数据集。 我花了大约 5 个小时为照片中的每个对象元素绘制边界框。

2. 我们使用 YOLOv5n.pt 纳米模型进行训练。 原因是轻。 然后,我们切换到 Onnx TFLite。 不过容量本身并没有太大的区别,参考速度也没有什么不同,所以我们使用了YOLOv5n模型。
YOLOv5 Train.ipynb
# pt to onnx to -> TFlite file
!pip3 install tensorflow==2.3.1
!pip install -r requirements.txt
!python3 export.py --weights result.pt --img 418 --batch 1 --include onnx tflite
3. 使用 Raspberry Pi 进行对象识别 4. 使用适当的代码创建引用。 我使用了RaspCam,因此我将其设置为“0”(即数据)的RaspCam输入源部分并进行推理。 然后,我仅对参数中通过 save-txt 检测到的对象的类值和边界框坐标进行后处理,并将数据发送到 Pico。


我们已经在main.py文件中编写了适当的预处理代码,我们可以用它来发送数据到pico。我们还编写了UART通信。(作者是韩国人,所以有代码来预处理标签值 韩国人。)
from machine import UART
import time
import sys
uart = UART(0, 115200)
while True:
if uart.any():
data = uart.readline()
print("Received:", data.decode().strip())
sys.stdout.write(data.decode())
#Data received by Pico
# Received : [Kimchi,Tofu,Pork]
详细代码我已经上传到github了。
聊天 GPT 食谱
利用 UART 通信,我们从 Raspberry Pi 4 到 Raspberry Pi Pico 进行通信,并将对象表达式中的类值分配给 pico。

#GPT prompt
while True:
if uart.any():
data = uart.readline().decode("utf-8").strip() # Read data and decode to string
prompt = f"{data} Can you recommend a menu I can make with the above ingredients? "
print(prompt)
response = send_prompt_to_chatGPT(prompt)
print(f"Received from UART: {data}")
print(f"ChatGPT Response: {response}")
utime.sleep(0.1)
从 Open AI 主页获取 api 键值,对其进行分配,然后通过在提示“您能推荐一个我可以使用上述成分查询制作的菜单吗”之前插入数据列表来向 GPT 提出问题。
结果

如上所示,GPT 会通过简单的菜谱提出菜单建议。
双向通讯
我通过 UART 通信将数据从 Raspberry Pi 发送到 Pico,所以我想我也可以接收它。
Pico代码添加
starred_section = extract_starred_section(response)
if starred_section:
uart.write(starred_section.encode("utf-8"))
print(f"Sent to Raspberry Pi 4: {starred_section}")
树莓派4代码添加
if ser.in_waiting >0:
received_data = ser.readline(0.decode().strip()
received_data = received_data +"Recipe" # recipe serch
YouTube 抓取
我们将使用上面的菜单来抓取和搜索 YouTube 以收集链接。
(我是韩国人,所以我会相应地进行预处理。您可以根据自己的语言进行预处理。)
常用表达

提示所建议的菜单处于一个不明确的位置,无法爬行,所以我要求它打印出来,前后都带有*。 爬网将利用正则表达式来提取 *{data}* 等数据。
I wanted to crawl on the Raspberry Pi Pico, but the library could not be installed due to capacity issues, so I used the two-way communication back to the Raspberry Pi to crawl.😂
爬取代码
!pip install youtube_dl
import yt_dlp as youtube_dl
def fetch_youtube_link(query):
ydl_opts = {
'default_search': 'ytsearch',
'quiet': True,
'format': 'bestaudio/best',
'noplaylist': True
}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
result = ydl.extract_info(query, download=False)
if 'entries' in result:
video = result['entries'][0]
else:
video = result
video_url = f"https://www.youtube.com/watch?v={video['id']}"
return video_url, video['title']
if __name__ == "__main__":
query = input("Enter a search query for YouTube: ") # user query
url, title = fetch_youtube_link(query)
print(f"Title: {title}")
print(f"URL: {url}")
结果

这就是获取我想要的标题和标题的抓取方式。首先,我在我的电脑上验证了代码。
电报通知系统
首先,注册 Telegram 并将“BotFather”添加为好友。 和 /newbot 创建机器人并接收令牌。


如果您看到这样的令牌,则您的机器人已创建。 我们向机器人发送一条消息“你好”

api.telegram.org/bot{"your_tokens"}/getUpdates
如果您访问上面的网页,您将看到您发送的消息和您的信息的 JSON 文件。 从那里,您可以保存您的 ID 并检查消息是否已成功发送。

就这样,您就可以使用 Telegram 了。 现在是时候用代码来实现它了!
如果您不确定,请查看上面的链接!🔥
代码
import requests
def send_telegram_message(chat_id, text):
bot_token = "YOUR_BOT_TOKEN"
send_text = f'https://api.telegram.org/bot{bot_token}/sendMessage?chat_id={chat_id}&text={text}'
response = requests.get(send_text)
return response.json()
#examples
send_telegram_message("5795970252", "hi , im kdb") #Put the data received from pico in text
结果


YouTube 标题和链接已发送至 Telegram。 我们可以轻松地使用家里的食材进行烹饪,并通过观看 YouTube 视频获得推荐。
完成项目
- 如果你有GPU资源,你的AI模型将快速引用它们
- 利用云通信将使您的项目更加完整。
- 有很多双向沟通的好例子。
为了这个项目,我在应用现有的人工智能技术方面做了很多努力。 我试图减轻模型的重量,但并没有太大的区别,但这似乎是我们要学习的作业,而且这是一个有意义的项目,因为我获得了很多关于整个通信理论芯片的知识。 硬件。
对于数据或代码问题,请联系hyun030508@icloud.com。
GitHub 来源
本文介绍了一种基于RaspberryPi和pico的冰箱智能管理系统,通过对象识别技术(如YOLOv5)监控冰箱内物品,提供个性化菜单推荐和烹饪视频链接,旨在减少食物浪费并促进烹饪兴趣。

84

被折叠的 条评论
为什么被折叠?



