【深度学习】YOLOv5,烟雾和火焰,目标检测,防火检测,森林火焰检测

文章目录

  • 数据收集和数据标注
  • 查看标注好的数据的脚本
  • 下载yolov5
  • 创建 dataset.yaml
  • 训练参数
  • 开始训练
  • yolov5n训练
  • 训练后的权重下载
  • gradio部署

数据收集和数据标注

搜集数据集2w张。

pip install labelme
labelme
然后标注矩形框和类别。

下载数据请看这里:

https://qq742971636.blog.csdn.net/article/details/137999662

三个标签,各个标签的数量:

火焰框28852个
烟雾框26716个
其他红旗71个框
在这里插入图片描述

查看标注好的数据的脚本

输入图片路径和标签路径可以一张一张浏览照片:

import os
import cv2
import numpy as np# 图像和标签文件夹路径
image_folder = r'F:\BaiduNetdiskDownload\fireandsmoke_last\fireandsmoke_last\images_choose'
label_folder = r'F:\BaiduNetdiskDownload\fireandsmoke_last\fireandsmoke_last\labels'# 定义类别颜色(这里假设有两个类别,你可以根据实际情况扩展)
class_colors = [(0, 255, 0), (0, 0, 255), (255, 0, 0)]
class_name = ['fire', 'smoke']
# 获取文件夹中的所有图像文件
image_files = [f for f in os.listdir(image_folder) if f.endswith('.jpg') or f.endswith('.png')]# 遍历图像文件
for image_file in image_files:image_path = os.path.join(image_folder, image_file)label_path = os.path.join(label_folder, os.path.splitext(image_file)[0] + '.txt')# 检查是否存在标签文件if os.path.exists(label_path):# 读取图像image = cv2.imread(image_path)# 读取标签内容with open(label_path, 'r') as file:lines = file.readlines()class_id_all = []# 遍历标签行for line in lines:values = line.split()class_id = int(values[0])x_center = float(values[1]) * image.shape[1]y_center = float(values[2]) * image.shape[0]width = float(values[3]) * image.shape[1]height = float(values[4]) * image.shape[0]# 计算边界框的左上角和右下角坐标x1 = int(x_center - width / 2)y1 = int(y_center - height / 2)x2 = int(x_center + width / 2)y2 = int(y_center + height / 2)# 获取当前类别的颜色color = class_colors[class_id]# 在图像上绘制矩形框和类别标签数字cv2.rectangle(image, (x1, y1), (x2, y2), color, 2)cv2.putText(image, class_name[class_id], (x1, y1 + 15), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)class_id_all.append(class_id)# if 2 not in class_id_all:#     continue# 等比缩放到最长边为800max_size = 800if image.shape[0] > image.shape[1]:scale = max_size / image.shape[0]else:scale = max_size / image.shape[1]image = cv2.resize(image, (int(image.shape[1] * scale), int(image.shape[0] * scale)))# 显示图像cv2.imshow('Image', image)# 等待按键输入,按下任意键跳到下一张图cv2.waitKey(0)cv2.destroyAllWindows()

比如:
在这里插入图片描述
在这里插入图片描述

下载yolov5

下载yolov5

git clone https://github.com/ultralytics/yolov5.git
cd yolov5/

创建环境:

conda create -n py310_yolov5 python=3.10 -y
conda activate py310_yolov5

装一个可以用的torch:


# CUDA 11.8
conda install pytorch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 pytorch-cuda=11.8 -c pytorch -c nvidia

取消这2个:
在这里插入图片描述

然后安装一些别的包:

pip install -r requirements.txt  # install

随后更多内容参考官网这里的训练指导:

https://docs.ultralytics.com/zh/yolov5/tutorials/train_custom_data/#before-you-start

创建 dataset.yaml

创建文件:

cd yolov5/data
cp coco128.yaml fire_smoke.yaml

将fire_smoke.yaml修改为这样:


path: /ssd/xiedong/fireandsmoke_last/
train: images
val: images
test: # test images (optional)# Classes
names:0: fire1: smoke2: other

训练参数

使用python train.py --help查看训练参数:

# python train.py --help
警告 ⚠️ Ultralytics 设置已重置为默认值。这可能是由于您的设置存在问题或最近 Ultralytics 包更新导致的。
使用 'yolo settings' 命令或查看 '/home/xiedong/.config/Ultralytics/settings.yaml' 文件来查看设置。
使用 'yolo settings key=value' 命令来更新设置,例如 'yolo settings runs_dir=path/to/dir'。更多帮助请参考 https://docs.ultralytics.com/quickstart/#ultralytics-settings。
用法: train.py [-h] [--weights WEIGHTS] [--cfg CFG] [--data DATA] [--hyp HYP] [--epochs EPOCHS] [--batch-size BATCH_SIZE] [--imgsz IMGSZ] [--rect] [--resume [RESUME]][--nosave] [--noval] [--noautoanchor] [--noplots] [--evolve [EVOLVE]] [--evolve_population EVOLVE_POPULATION] [--resume_evolve RESUME_EVOLVE][--bucket BUCKET] [--cache [CACHE]] [--image-weights] [--device DEVICE] [--multi-scale] [--single-cls] [--optimizer {SGD,Adam,AdamW}] [--sync-bn][--workers WORKERS] [--project PROJECT] [--name NAME] [--exist-ok] [--quad] [--cos-lr] [--label-smoothing LABEL_SMOOTHING] [--patience PATIENCE][--freeze FREEZE [FREEZE ...]] [--save-period SAVE_PERIOD] [--seed SEED] [--local_rank LOCAL_RANK] [--entity ENTITY] [--upload_dataset [UPLOAD_DATASET]][--bbox_interval BBOX_INTERVAL] [--artifact_alias ARTIFACT_ALIAS] [--ndjson-console] [--ndjson-file]选项:-h, --help            显示帮助信息并退出--weights WEIGHTS     初始权重路径--cfg CFG             模型配置文件路径--data DATA           数据集配置文件路径--hyp HYP             超参数路径--epochs EPOCHS       总训练轮数--batch-size BATCH_SIZE所有 GPU 的总批量大小,-1 表示自动批处理--imgsz IMGSZ, --img IMGSZ, --img-size IMGSZ训练、验证图像大小(像素)--rect                矩形训练--resume [RESUME]     恢复最近的训练--nosave              仅保存最终检查点--noval               仅验证最终轮次--noautoanchor        禁用 AutoAnchor--noplots             不保存绘图文件--evolve [EVOLVE]     为 x 代演进超参数--evolve_population EVOLVE_POPULATION加载种群的位置--resume_evolve RESUME_EVOLVE从上一代演进恢复--bucket BUCKET       gsutil 存储桶--cache [CACHE]       图像缓存 ram/disk--image-weights       在训练时使用加权图像选择--device DEVICE       cuda 设备,例如 00,1,2,3 或 cpu--multi-scale         图像大小变化范围为 +/- 50%--single-cls          将多类数据作为单类训练--optimizer {SGD,Adam,AdamW}优化器--sync-bn             使用 SyncBatchNorm,仅在 DDP 模式下可用--workers WORKERS     最大数据加载器工作进程数(每个 DDP 模式中的 RANK)--project PROJECT     保存到项目/名称--name NAME           保存到项目/名称--exist-ok            存在的项目/名称正常,不增加--quad                四通道数据加载器--cos-lr              余弦学习率调度器--label-smoothing LABEL_SMOOTHING标签平滑 epsilon--patience PATIENCE   EarlyStopping 耐心(未改善的轮次)--freeze FREEZE [FREEZE ...]冻结层:backbone=10, first3=0 1 2--save-period SAVE_PERIOD每 x 轮保存检查点(如果 < 1 则禁用)--seed SEED           全局训练种子--local_rank LOCAL_RANK自动 DDP 多 GPU 参数,不要修改--entity ENTITY       实体--upload_dataset [UPLOAD_DATASET]上传数据,"val" 选项--bbox_interval BBOX_INTERVAL设置边界框图像记录间隔--artifact_alias ARTIFACT_ALIAS要使用的数据集 artifact 版本--ndjson-console      将 ndjson 记录到控制台--ndjson-file         将 ndjson 记录到文件

开始训练

多卡训练:

python -m torch.distributed.run --nproc_per_node 4 train.py --weights yolov5m.pt --data fire_smoke.yaml --batch-size 300  --epochs 50 --img 640 --sync-bn --name fm0423 --cos-lr --device 0,1,2,3

正常启动训练:

在这里插入图片描述

少量图片损坏不用管:

在这里插入图片描述

我的数据集很难,是野外数据,可见刚开始指标并不好:

在这里插入图片描述
训练结束:

在这里插入图片描述

yolov5n训练

多卡训练:

python -m torch.distributed.run --nproc_per_node 4 train.py --weights yolov5n.pt --data fire_smoke.yaml --batch-size 1200  --epochs 50 --img 640 --sync-bn --name fm0423_yolov5n_ --cos-lr --device 0,1,2,3

模型太小,yolov5n的效果欠佳了:

在这里插入图片描述

训练后的权重下载

yolov5m的训练结果文件:

在这里插入图片描述

yolov5n的训练结果文件:
在这里插入图片描述

权重下载请看这里:

https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2

gradio部署

import gradio as gr
import time
import torch
from PIL import Imagedef detect_objects(img):time1 = time.time()# Run inferenceresults = model(img)time2 = time.time()print(f"Time taken for inference: {time2 - time1:.2f} seconds")# Print JSONprint(results.pandas().xyxy[0].to_json(orient="records"))results.render()im_pil = Image.fromarray(results.ims[0])return im_pil# Model loading
model = torch.hub.load('/data/xiedong/eff_train/yolov5-master','custom',path='./best.pt',source='local',device='cuda:0',force_reload=True)inputs = gr.Image(label="Input Image", type="pil")
outputs = gr.Image(label="Output Image with Detections", type="pil")title = "Object Detection App"
description = "Upload an image, and the app will detect objects in the image."# examples = ["ok.jpg"]
# 当前目录的jpg文件
import osfiles = os.listdir()
examples = [f for f in files if f.endswith(".jpg")]gr.Interface(detect_objects, inputs, outputs, title=title, description=description, examples=examples).launch(server_name="0.0.0.0", server_port=7873)

部署后打开网页即可尝试:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/314358.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图像处理之Retinex算法(C++)

图像处理之Retinex算法&#xff08;C&#xff09; 文章目录 图像处理之Retinex算法&#xff08;C&#xff09;前言一、单尺度Retinex&#xff08;SSR&#xff09;1.原理2.代码实现3.结果展示 二、多尺度Retinex&#xff08;MSR&#xff09;1.原理2.代码实现3.结果展示 三、带色…

【01-机器学习入门:理解Scikit-learn与Python的关系】

文章目录 前言Python与机器学习Scikit-learn简介Scikit-learn与Python的关系使用Scikit-learn进行机器学习结语 前言 在当今的数据科学和人工智能领域&#xff0c;机器学习已经成为了一个不可或缺的组成部分。而对于那些刚刚踏入这一领域的新手来说&#xff0c;理解机器学习的基…

线性代数 --- 矩阵的对角化以及矩阵的n次幂

矩阵的对角化以及矩阵的n次幂 &#xff08;特征向量与特征值的应用&#xff09; 前言&#xff1a; 在上一篇文章中&#xff0c;我记录了学习矩阵的特征向量和特征值的学习笔记&#xff0c;所关注的是那些矩阵A作用于向量x后&#xff0c;方向不发生改变的x(仅有尺度的缩放)。线…

Xilinx 7系列中clock IP核通过AXI4-Lite接口实现动态重新配置

当选择了动态重配置&#xff08;Dynamic Reconfiguration&#xff09;选项时&#xff0c;AXI4-Lite接口将默认被选中用于重新配置时钟组件。动态重新配置可以通过AXI4-Lite接口实现了Clocking Wizard IP核的时钟组件MMCM/PLL的动态重新配置。 如果需要直接访问MMCM/PLL的DRP寄…

C++ 头文件/宏冲突问题解决?如何解决?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

SpringBoot + kotlin 协程小记

前言&#xff1a; Kotlin 协程是基于 Coroutine 实现的&#xff0c;其设计目的是简化异步编程。协程提供了一种方式&#xff0c;可以在一个线程上写起来像是在多个线程中执行。 协程的基本概念&#xff1a; 协程是轻量级的&#xff0c;不会创建新的线程。 协程会挂起当前的协…

【软件】ERETCAD-Env:在轨空间环境3D动态仿真软件

文章介绍了Extreme-environment Radiation Effect Technology Computer-Aided Design – Environment (ERETCAD-Env)软件&#xff0c;文章的介绍和展示了ERETCAD-Env软件的功能和特点&#xff0c;这是一款用于动态模拟在轨卫星所处空间环境的计算机辅助设计软件。强调了该软件在…

如何在CentOS本地搭建DataEase数据分析服务并实现远程查看数据分析

文章目录 前言1. 安装DataEase2. 本地访问测试3. 安装 cpolar内网穿透软件4. 配置DataEase公网访问地址5. 公网远程访问Data Ease6. 固定Data Ease公网地址 前言 DataEase 是开源的数据可视化分析工具&#xff0c;帮助用户快速分析数据并洞察业务趋势&#xff0c;从而实现业务…

pycharm远程连接server

1.工具–部署–配置 2.部署完成后&#xff0c;将现有的项目的解释器设置为ssh 解释器。实现在远端开发 解释器可以使用/usr/bin/python3

怎么排查K8S容器当中的Java程序内存泄露问题

今天早上发现生产线其中的一个服务在凌晨的时候突然重启了&#xff0c;内存突然从1G升到1.8G&#xff0c;CPU使用量从0.1升到了0.28&#xff0c;说明在这个时间点&#xff0c;内存突增达到了限额以上&#xff0c;服务重启了。因为这个服务布署了多节点&#xff0c;这次重启对业…

12 c++版本的坦克大战

前言 呵呵 这大概是 大学里面的 c 贪吃蛇了吧 有一些 面向对象的理解, 但是不多 这里 具体的实现 就不赘述, 仅仅是 发一下代码 以及 具体的使用 坦克大战 #include<iostream> #include<windows.h> #include<conio.h> #include<ctime> #include…

jvm(JVM快速入门、stack栈、堆、GC垃圾回收、Arthas)

文章目录 1. JVM快速入门1.1. 结构图1.2. 类加载器ClassLoader1.3. 执行引擎Execution Engine1.4. 本地接口Native Interface1.5. Native Method Stack1.6. PC寄存器(程序计数器)1.7. Method Area方法区 2. stack栈3. 堆3.1. 堆体系概述3.1.1. 新生区3.1.2. 老年代3.1.3. 永久代…

分类预测 | Matlab实现CNN-GRU-SAM-Attention卷积门控循环单元融合空间注意力机制的数据分类预测

分类预测 | Matlab实现CNN-GRU-SAM-Attention卷积门控循环单元融合空间注意力机制的数据分类预测 目录 分类预测 | Matlab实现CNN-GRU-SAM-Attention卷积门控循环单元融合空间注意力机制的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现CNN-GRU…

Visual Studio 对 C++ 头文件和模块的支持

在 C 编程领域&#xff0c;头文件和模块的管理有时候确实比较令人头疼。但是&#xff0c;有许多工具和功能可以简化此过程&#xff0c;提高效率并减少出错的可能性。下面是我们为 C 头文件和模块提供的几种工具的介绍。 构建明细 通过菜单栏 Build > Run Build Insights&a…

基于Rust的多线程 Web 服务器

构建多线程 Web 服务器 在 socket 上监听 TCP 连接解析少量的 HTTP 请求创建一个合适的 HTTP 响应使用线程池改进服务器的吞吐量优雅的停机和清理注意&#xff1a;并不是最佳实践 创建项目 ~/rust ➜ cargo new helloCreated binary (application) hello package~/rust ➜ma…

maven-依赖管理

依赖配置 https://mvnrepository.com/?__cf_chl_rt_tkvRzDsumjmJ_HF95MK4otu9XluVRHGqAY5Wv4UQYETR8-1714103058-0.0.1.1-1557 <dependencies><dependency><groupId></groupId><artifactId></artifactId><version></version>…

Day4 商品管理

Day4 商品管理 这里会总结构建项目过程中遇到的问题&#xff0c;以及一些个人思考&#xff01;&#xff01; 学习方法&#xff1a; 1 github源码 文档 官网 2 内容复现 &#xff0c;实际操作 项目源码同步更新到github 欢迎大家star~ 后期会更新并上传前端项目 编写品牌服务 …

Java集合相关的List、Set、Map基础知识

目录 一、集合介绍 二、List 三、Map HashMap的数据结构 如何理解红黑树 四、set 一、集合介绍 在Java中&#xff0c;集合是一种用于存储对象的数据结构&#xff0c;它提供了一种更加灵活和强大的方式来处理和操作数据。Java集合框架提供了一系列接口和类&#xff0c;用…

表格的单元格合并和表头的合并——vxe-table

vxe-table的官网&#xff1a;https://vxetable.cn/#/table/advanced/mergeCell在你的项目中下载安装完成后&#xff0c;先在main.js文件中引入&#xff1a; import VXETable from vxe-table import vxe-table/lib/style.css Vue.use(VXETable)一、单元格合并 效果图&#xff…

Linux驱动开发——(七)Linux阻塞和非阻塞IO

目录 一、阻塞和非阻塞IO简介 二、等待队列 2.1 等待队列头 2.2 等待队列项 2.3 将队列项添加/移除等待队列头 2.4 等待唤醒 2.5 等待事件 三、轮询 四、驱动代码 4.1 阻塞IO 4.2 非阻塞IO 一、阻塞和非阻塞IO简介 IO指的是Input/Output&#xff0c;也就是输入/输…