YOLO5-1 使用YOLO5检测 水面漂浮物记录

参考:

量化剪枝:YOLO落地部署,一文尽览YOLOv5最新剪枝、量化进展


一 数据集

robflow 漂浮物数据集:buoy Computer Vision Dataset by ai

二 YOLO5管网

yolo5 :https://github.com/ultralytics/yolov5 

克隆代码:

git clone https://github.com/ultralytics/yolov5  # clone
cd yolov5
pip install -r requirements.txt  # install

三 模型训练

import torch

# 检查是否有可用的GPU
if torch.cuda.is_available():
    print("GPU is available.")
else:
    print("GPU is not available.")
python train.py --img 640 --epochs 3 --data coco128.yaml --weights yolov5s.pt

四 调整参数

调参适应场景和优化效果:

--weights: 初始权重文件的路径,默认值是 ROOT / 'yolov5s.pt'。
--data: 数据集配置文件 dataset.yaml 的路径,默认值是 ROOT / 'data/coco128.yaml'。

--epochs: 总的训练轮数,默认值是 100。

--batch-size: 所有 GPU 上的总批量大小,-1 表示自动确定,默认值是 16。

--imgsz: 训练和验证图像大小(像素),默认值是 640。

--device: 指定使用的设备,如 'cuda:0' 表示使用第一个 GPU,'cpu' 表示使用 CPU。

--project: 保存结果的项目路径,默认值是 ROOT / 'runs/train'

--name: 保存结果的名称,默认值是 'exp'。

python train.py --img 640 --epochs 3 --data ../float_data/data.yaml --weights yolov5s.pt --device cuda:0

# 使用V100的训练参数
python train.py --data coco.yaml --epochs 300 --weights '' --cfg yolov5n.yaml  --batch-size 128

五 模型加载和解读

使用torch.hub.load()加载我们训练好的模型,如下,通过torch.hub.load进行加载模型,将图片导入,得到的results。可以通过results.pandas().xyxy[0]解读,结果是个张量,前四列为目标框的左上角和右下角,confidence为置信度,class为类别编号,name为类别名称。


1 识别摄像头

import torch
from utils.torch_utils import prune
import cv2
import time
import torch

model = torch.hub.load('../yolov5', 'custom', path='./runs/train/exp2/weights/best.pt', source='local')

model.eval()

model.conf = 0.4

cap = cv2.VideoCapture(0)
fps_time = time.time()

while True:
    ret, frame = cap.read()
    frame = cv2.flip(frame, 1)
    img_cvt = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

    results = model(img_cvt)
    # print(results.pandas().xyxy[0].to_numpy())# tensor-to-numpy
    results_ = results.pandas().xyxy[0].to_numpy()
    i = 0
    for box in results_:
        l, t, r, b = box[:4].astype('int')
        confidence = str(round(box[4] * 100, 2)) + "%"
        cls_name = box[6]

        if cls_name == "person":
            i += 1
        cv2.rectangle(frame, (l, t), (r, b), (0, 255, 0), 2)
        cv2.putText(frame, cls_name + "-" + confidence, (l, t), cv2.FONT_ITALIC, 1, (255, 0, 0), 2)
    cv2.putText(frame, "person:" + str(i), (10, 20), cv2.FONT_ITALIC, 1, (0, 0, 0), 2)

    now = time.time()
    fps_txt = 1 / (now - fps_time)
    fps_time = now

    cv2.putText(frame, str(round(fps_txt, 2)), (50, 50), cv2.FONT_ITALIC, 1, (0, 255, 0), 2)

    cv2.imshow("result", frame)
    if cv2.waitKey(10) & 0xFF == ord("q"):
        break

cap.release()
cv2.destroyAllWindows()

2 识别指定文件夹图片

import glob
import cv2
import time
import torch
from utils.torch_utils import prune

# 从本地目录加载自定义的YOLOv5模型
model = torch.hub.load('../yolov5', 'custom', path='./runs/train/exp2/weights/best.pt', source='local')

# model.eval()

# 设置置信度阈值
# model.conf = 0.4

# 图片文件夹路径
folder_path = '../float_data/valid/images/'

# 获取文件夹中所有图片的路径
image_paths = glob.glob(folder_path + '*.jpg')

for image_path in image_paths:
    frame = cv2.imread(image_path)
    img_cvt = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

    # 进行目标检测
    results = model(img_cvt)
    print(f'img_name_result,name:{image_path},results:{results}\n')

    # 将结果转换为numpy数组
    results_ = results.pandas().xyxy[0].to_numpy()
    i = 0

    # 处理并在图像上绘制边界框
    for box in results_:
        i += 1
        l, t, r, b = box[:4].astype('int')
        confidence = str(round(box[4] * 100, 2)) + "%"
        cls_name = box[6]
        cv2.rectangle(frame, (l, t), (r, b), (0, 255, 0), 2)
        # cv2.putText(frame, cls_name + "-" + confidence, (l, t), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)
        cv2.putText(frame, 'floating' + "-" + confidence, (l, t), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)
    cv2.putText(frame, "floating number:  " + str(i), (30, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)

    # 显示图片
    cv2.imshow("result", frame)
    if cv2.waitKey(10000) & 0xFF == ord("q"):
        continue

cv2.destroyAllWindows()

六 量化,剪枝,知识蒸馏

量化剪枝效果不好,直接选用了一个小一点的模型,重新进行了训练。

神经网络剪枝 最初是在Optimal Brain Damage和Optimal Brain Surgeon中提出的。它们都依赖于二阶泰勒展开来估计剪枝的参数重要性。也就是说,在这些方法中,Hessian矩阵应该部分或完全地被计算。然而,其他标准可以用于识别参数的重要性,也称为显著性。

6.1. 剪枝的显著性标准

显著性标准是指根据网络的某些特性或属性来确定神经网络中 个别权重、神经元、滤波器 或一组权重的重要性或相关性的度量或指标。

6.2. 剪枝的粒度

剪枝的粒度 定义了对模型的哪种参数 进行剪枝。广义上,剪枝可以以结构化或非结构化的方式进行。

6.3 量化

神经网络量化旨在用 比其原始精度(通常为32位单精度浮点数FP32)更少的位数表示深度神经网络的 权重和激活。这一过程在尽量保持模型性能/准确性的同时完成。通过利用更快的硬件整数指令,量化可以减小模型的大小并提高推理时间。

在[A survey of quantization methods for efficient neural network inference]中,Gholami等人对神经网络量化的不同方面进行了调查,其中包括这一主题的理论细节。在这里,作者将简要介绍和讨论关键要点。不失一般性,作者解释量化概念时使用一个实际的有限变量,它可以表示神经网络中的权重或激活。

一旦模型被量化,它可以使用虚伪量化(也称为模拟量化)或仅整数量化(也称为定点量化)进行部署。在前者中,权重和激活以低精度存储,但从加法到矩阵乘法的所有操作都在浮点精度下执行。虽然这种方法在浮点运算之前和之后需要不断的解量化和量化,但它有利于模型的准确性。

6.4 剪枝挑战和未来方向

与常规CNN不同,对YOLOv5进行剪枝面临一些挑战,因为其复杂且高度优化的深度神经网络架构。YOLOv5使用CSP-Darknet53神经网络架构作为Backbone网络,使用PANet作为neck,两者都由许多卷积层紧密连接和连接组成。此外,Backbone网络和neck之间的互连增加了模型的复杂性。总体而言,这些层的结构复杂性妨碍了在不对网络整体性能产生不利影响的情况下移除不必要的滤波器。否则,与连接相关的特征图的空间分辨率将不匹配。因此,在剪枝YOLOv5之前需要进行一些补偿。例如,[Pruned-yolo: Learning efficient object detector using model pruning]不考虑剪枝上采样层、连接层和YOLOv5的head。

量化的问题,尽管与YOLO无关,从FP32到INT8的量化不是一种平滑的转换,如果梯度景观比较恶劣,可能会阻碍结果的最优性。此外,使用PTQ实现低位(<4位)精度几乎是不可能的,因为它很可能会破坏模型的性能。

七 调整选用模型

python train.py --img 2048 --data ../float_data/data.yaml --weights yolov5m.pt --device cuda:0 --batch-size 2  --workers 12 --epochs 500  # 41M  第三次训练

原模型太大,使用较小的预训练模型,效果好像差不多,从验证数据效果来看。

### YOLO水面漂浮物识别方面的研究内容 #### 数据收集与预处理 为了构建有效的YOLO模型用于水面漂浮物识别,首要任务是从监控摄像头获取高质量的数据集。这些图像应覆盖各种天气条件下的河流或湖泊场景,并包含不同类型和尺寸的漂浮物体。通过标注工具标记出每张图片中的目标对象位置及其类别标签,从而创建适合训练神经网络的数据实体模型[^1]。 #### 模型架构设计 基于YOLO系列算法的特点,在水面漂浮物检测领域通常会选择性能优越版本如YOLOv8作为基础框架来改进适应特定应用场景的需求。此过程涉及调整输入分辨率、锚框比例以及其他超参数设置以优化对于小型且密集分布的目标检测效果[^2]。 #### 特征增强方法应用 考虑到实际环境中光照变化大等因素可能影响视觉特征提取质量的问题,研究人员会采用多种手段强化模型鲁棒性。例如引入数据扩增技术随机改变样本外观属性;或是融合多源感知信息(热成像/红外线),使得即使是在恶劣条件下也能保持较高水平的表现能力[^3]。 #### 实时性和准确性平衡考量 由于此类系统往往部署于户外无人值守站点长期运行,因此除了追求高精度外还需兼顾计算资源利用率及响应速度之间的权衡关系。一方面可以通过轻量化改造减少不必要的复杂度;另一方面则借助硬件加速器支持快速推理流程,确保能够在第一时间发出预警信号以便采取相应措施[^4]。 ```python import torch from yolov5 import detect # 假设使用的是YOLOv5库 def process_frame(frame): results = model(frame) detections = [] for *xyxy, conf, cls in reversed(results.xyxy[0]): label = f'{names[int(cls)]} {conf:.2f}' plot_one_box(xyxy, frame, label=label, color=colors(int(cls)), line_thickness=3) return frame ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值