训练模型
数据集
直接从开源数据集网站 roboflow 下载即可,下载时可以选择标签样式
网站:https://universe.roboflow.com/search?q=smoke
训练
在服务器完成训练(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 文件)
部署(树莓派)
树莓派基础配置和使用
镜像烧录(开启 SSH、配置 wifi)
-
参考微雪的教程 烧录树莓派镜像到 SD 卡,同时开启 SSH 和 WiFi(教程中包括相关基础知识,没接触过树莓派需要先过一遍,了解基本常识),
注意:记得按照教程,开启 SSH 并配置 wifi,后续有用
-
连接树莓派(以下方案任选一个即可,上一步已经配置了 wifi,树莓派启动后会自动连接 wifi)
-
最简单的方案:给树莓派外接键盘、鼠标、显示器;把树莓派当成一台电脑使用
-
获取树莓派 ip 地址
由于我们烧录镜像时,已经设置过连接的 wifi,可以直接登录路由器管理界面查看树莓派的 IP 地址
也可以用 ip 扫描软件 Advanced IP Scanner 来获取(电脑需要和树莓派连接相同的 wifi)
-
用 VScode 的 remote ssh
VSCODE 远程开发树莓派_vscode ssh orangepi-CSDN 博客
连接后,直接将文件拖进 VScode 中树莓派的文件夹即可
-
mobaxterm 连接树莓派
-
ssh
linux 指令熟的话,直接 ssh 就行
-
VNC(本文由于需要用到视觉,建议用 VNC)
-
-
然后参考教程更新源(依据教程,查看树莓派版本,再进一步选择相应的源)
安装项目所需依赖
关闭外部管理警告
参考 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()
结果如下:
STM32
硬件:STM32F103C8T6、1.44 寸 TFT 液晶屏、有源蜂鸣器、DHT11 温湿度传感器、烟雾传感器
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
串口通信
基本思路参考如下(讲解很细致,完美无缺):
合并项目
代码链接:https://pan.baidu.com/s/1yJC1dm9vJDiSvgXqix
测试效果
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于