文章目录
- 数据收集和数据标注
- 查看标注好的数据的脚本
- 下载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 设备,例如 0 或 0,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)
部署后打开网页即可尝试: