智能禁烟(树莓派 yolo+stm32)

训练模型

数据集

直接从开源数据集网站 roboflow 下载即可,下载时可以选择标签样式

网站:https://universe.roboflow.com/search?q=smoke

image

训练

在服务器完成训练(RTX3090 显卡),文件目录如下(我从 roboflow 下载了 cigarette 和 smoke 两个数据集文件,然后下载了 yolov8n.pt 放入文件夹,新建了 code 文件夹用于存放代码):

.
└── dataset
    ├── cigarette
       ├── Cigarette.v3i.yolov9.zip
       ├── code
       ├── data.yaml
       ├── README.dataset.txt
       ├── README.roboflow.txt
       ├── test
       ├── train
       ├── valid
       └── yolov8n.pt
    └── smoke
        ├── code
        ├── data.yaml
        ├── README.dataset.txt
        ├── README.roboflow.txt
        ├── smaoking.v3i.yolov9.zip
        ├── test
        ├── train
        └── yolov8n.pt

10 directories, 10 files

code/train.py 文件内容如下

from ultralytics import YOLO

# Load a model
model = YOLO('../yolov8n.pt')  # load a pretrained model (recommended for training)

# Train the model
results = model.train(data='../data.yaml', epochs=100, imgsz=640)

在服务器终端执行

#数据集存放在dataset文件夹中,用docker配置,该镜像已有pytorch和cuda驱动
docker run -it -d --gpus all --privileged \
    -v /dataset:/yolov8 \
    --name pytorch_pytorch \
    pytorch/pytorch:latest

docker exec -it yolov8 bash
apt update
pip install ultralytics
cd /yolov8/cigarette/code
python3 train.py

训练好后会得到权重文件和过程文件,如下图所示(最重要的是 best.pt 文件)

image

部署(树莓派)

树莓派基础配置和使用

镜像烧录(开启 SSH、配置 wifi)

  • 参考微雪的教程 烧录树莓派镜像到 SD 卡,同时开启 SSH 和 WiFi(教程中包括相关基础知识,没接触过树莓派需要先过一遍,了解基本常识),

    注意:记得按照教程,开启 SSH 并配置 wifi,后续有用

  • 连接树莓派(以下方案任选一个即可,上一步已经配置了 wifi,树莓派启动后会自动连接 wifi)

  • 然后参考教程更新源(依据教程,查看树莓派版本,再进一步选择相应的源)

    **********树莓派替换镜像源(终极版!)*********

安装项目所需依赖

关闭外部管理警告

参考 https://www.yaolong.net/article/pip-externally-managed-environment/

#python版本必须替换为你的实际版本,请到/usr/lib/查看
sudo mv /usr/lib/python3.11/EXTERNALLY-MANAGED /usr/lib/python3.11/EXTERNALLY-MANAGED.bk

opencv、yolov8、pytorch

参考 https://blog.csdn.net/qq_44231797/article/details/133270195

sudo apt-get install python3-opencv --fix-missing
sudo pip install ultralytics
pip3 install torch torchvision torchaudio

测试

将训练好的权重文件,即上文提到的 best.pt 文件,放入树莓派。如何传输文件请参考上文{树莓派基础配置和使用}

请先完成前面所说的各项工作

用 vnc 连接树莓派,开始编写测试代码(也可以直接将我提供的树莓派代码文件,放进树莓派任意位置,然后运行/code/ultralytics/code/test.py)

from ultralytics import YOLO
import cv2
import serial
import time

def send_serial_data(data, port='/dev/ttyUSB0', baudrate=9600):
    try:
        # 打开串口
        ser = serial.Serial(port, baudrate)
        time.sleep(2)  # 等待串口初始化完成

        ser.write(data.encode())  # 发送数据
        print("已发送:", data)

        # 关闭串口
        ser.close()
    except serial.SerialException:
        print("无法打开串口,请检查串口是否正确连接。")


# 加载YOLO模型
model = YOLO("../model/train3/weights/best.pt")

# 打开摄像头
cap = cv2.VideoCapture(0)

# 设置摄像头分辨率为640x480
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 160)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 120)

while True:
    # 读取视频流中的一帧
    ret, frame = cap.read()
    if not ret:
        break
  
    # 对当前帧进行目标检测
    results = model.predict(source=frame,conf=0.1,show=True)#调用模型预测,conf是可信度,show代表是否显示

    #提取出检测信息里的阈值,阈值不为空就是检测到了
    print("--------------box--------------------")
    results = results[0].boxes
    start_index = str(results).find("conf")#提取字段开头
    end_index = str(results).find("data")#提取字段结尾
    extracted_info = str(results)[start_index+len("conf")+10:end_index-3]#获得检测阈值列表
    # 使用正则表达式提取阈值
    if len(extracted_info)>2:
        print("检测到对象,阈值为:", extracted_info)  
        send_serial_data('1', '/dev/ttyUSB0', 115200)  # 根据实际情况修改串口地址和波特率
    else:
        print("未检测到对象")
        send_serial_data('0', '/dev/ttyUSB0', 115200)  # 根据实际情况修改串口地址和波特率
    print("----------------------------------")
    # 调用函数,传入要发送的数据、串口地址和波特率
  

# 释放摄像头资源并关闭窗口
cap.release()
cv2.destroyAllWindows()

结果如下:

dca8d661896c9c7bde49fcc52a4f9cb

STM32

硬件:STM32F103C8T6、1.44 寸 TFT 液晶屏、有源蜂鸣器、DHT11 温湿度传感器、烟雾传感器

image

DHT11 温湿度传感器

基本思路参考如下:

https://blog.csdn.net/weixin_52988524/article/details/127603488

需要跟随教程完成配置操作,代码可以不用管

最终 DHT11 连接 PB12 引脚

蜂鸣器

基本思路参考如下(图省事,用的有源蜂鸣器,跟 LED 没区别了):
https://blog.csdn.net/weixin_52988524/article/details/124082430

需要跟随教程完成配置操作,代码可以不用管

最终蜂鸣器接 PB5 引脚

烟雾传感器

基本思路参考如下(图省事,用的传感器 DO 口,跟按键没区别了):

https://blog.csdn.net/weixin_52988524/article/details/125231680(读取红外避障 DO 的)

https://blog.csdn.net/weixin_52988524/article/details/124082430(也可以参考按键)

需要跟随教程完成配置操作,代码可以不用管

最终烟雾传感器接 PB8 引脚(这个和教程里不同)

TFT 显示屏

基本思路参考如下(注意我配置的引脚和教程中不同):

https://blog.csdn.net/lwb450921/article/details/124250361

引脚说明引脚不能改改了跑不了我踩坑了
TFT   stm32f103c8t6
GND 	接地
VCC		电源
SCL		PA5
SDA		PA7
RES		PB0
DC		PB1
CS		PA4
BL		PB10

image

串口通信

基本思路参考如下(讲解很细致,完美无缺):

https://www.bilibili.com/video/BV1Na4y1T7VQ/?spm_id_from=333.788&vd_source=0da482e1d715b9a8f77b5626ba60fcd0

3eba186af2a010da0d43a4a65751196

合并项目

代码链接:https://pan.baidu.com/s/1yJC1dm9vJDiSvgXqix

测试效果

​​

  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    75 引用 • 146 回帖 • 1 关注
  • 树莓派
    22 引用 • 23 回帖 • 1 关注
  • 香烟
    2 引用 • 55 回帖
1 操作
Zhangshanshan 在 2024-03-06 02:50:59 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...