yolov5实战全部流程

news2025/1/11 4:09:50

本科生阶段除了在中等以上的985和某些特定的CS强项院校,无意愿研究生学习的本科生是不建议学习人工智能这一专业的,保研学生也许可以在实验室打工推荐信学习接触到此类事件,此项blog主要是对yolov5的实践性项目,yolov5作为最具有代表性的yolo版本,即便是2024年上半年清华的yolov10,也难掩他的独特光辉,在此不对yolov1到yolov5的版本迭代和算法更替进行详细的解说和阐述,只进行实际项目演练

环境安装

   •  Miniconda
   •  下载地址:Index of /anaconda/miniconda/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
   •  pypi国内源:
   •       pypi | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
•  Pytorch
   •官方网站:PyTorch
•  YoloV5
   • Github地址:ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite (github.com)

其实不一定要miniconda,anaconda就ok,因为是更全的工具库,我在opencv就下了anaconda,不再换成轻量级的anaconda,miniconda选择py38 22.11.1-1这个稳定版本

如果C盘有空间,最好安装在C盘,且安装目录中不要有中文                                                         勾选将其添加到PATH                                                                                                                        在conda的cmd中conda create -n yolov8 python=3.8      版本过高会有些包装不上

pytorch的安装

如果没有Nvidia显卡,选择cpu版本即可

对于Nvidia显卡,在windows搜索‘英伟达控制面板’,点击左下角的系统信息显示如下

表明CUDA 12.2 146 

根据你的显卡,选择较新版本,这里如果大家有报错的话可以看看是不是开了代理(梯子),开了代理记得把代理关了,轻量级的训练不用下载CUDA,而且你的显卡也基本上不怎么样

按照如下操作,若和下图一样即可表明ok

yolov5在github

打开右侧的release页面下载后打开requirement.txt

修改numpy==1.20.3,Pillow==8.3.0,把torch和torchvision两行注释掉即可

在yolov5的文件夹打开cmd,输入conda activate yolov5,然后pip install -r requirements.txt

python detect.py,会显示一些基本信息,安装yolov5s.pt,根据提示

模型检测

weights:训练好的模型文件

 通过cmd输入python detect.py --weights yolov5s.pt

其他的文件可以提前下好放在yolo文件夹中,

source:检测的目标,图片,文件夹,屏幕,摄像头等

python detect.py --weights yolov5s.pt --source data/images/bus.jpg

就出来了         接下来对屏幕实时监测

python detect.py --weights yolov5s.pt --source screen

conf-thres判断置信度阈值

iou-thres相反的

各种各样的参数 

jupyter实现一个界面

新建一个hub_detect.ipynb

import torch

# Model  
model = torch.hub.load("./", "yolov5s", source="local")

#Images
img = "./data/images/zidane.jpg"

# Inference
results = model(img)

# Results
results.show()

构建自定义数据集

图片进行识别

教程:超详细从零开始yolov5模型训练_yolo训练-CSDN博客d

就是如上面说说即可

视频动态识别

 

我们在文件夹这种创建datasets,里面一个视频,一个ipynb文件对视频进行opencv抽帧,把抽出的图片放在images文件夹

终端输入labelimg,点击opendir,选择images,changes save dir中,选择同级的labels文件夹

把pascal-C点一下变成yolo,save保存,打开上面view,打开autosave自动保存

右键create box,发现闪退不停,通过此方法是否解决?闪退是因为版本3.8和3.11不匹配 需要重新下载Unable to draw annotations on Windows · Issue #811 · HumanSignal/labelImg (github.com)

换用labelme,相同的pip install labelme,同样的方法,标注daitu和mingren

labelimg标注后是JSON文件,和yolo的txt不同

jsonTOtxt未测试

import json
import os
import glob
import os.path as osp


def labelme2yolov2Seg(jsonfilePath="", resultDirPath="", classList=["YiBiao", "ZhiZhen"]):
    """
    此函数用来将labelme软件标注好的数据集转换为yolov5_7.0sege中使用的数据集
    :param jsonfilePath: labelme标注好的*.json文件所在文件夹
    :param resultDirPath: 转换好后的*.txt保存文件夹
    :param classList: 数据集中的类别标签
    :return:
    """
    # 0.创建保存转换结果的文件夹
    if(not os.path.exists(resultDirPath)):
        os.mkdir(resultDirPath)

    # 1.获取目录下所有的labelme标注好的Json文件,存入列表中
    jsonfileList = glob.glob(osp.join(jsonfilePath, "*.json"))
    print(jsonfileList)  # 打印文件夹下的文件名称

    # 2.遍历json文件,进行转换
    for jsonfile in jsonfileList:
        # 3. 打开json文件
        with open(jsonfile, "r") as f:
            file_in = json.load(f)

            # 4. 读取文件中记录的所有标注目标
            shapes = file_in["shapes"]

            # 5. 使用图像名称创建一个txt文件,用来保存数据
            with open(resultDirPath + "\\" + jsonfile.split("\\")[-1].replace(".json", ".txt"), "w") as file_handle:
                # 6. 遍历shapes中的每个目标的轮廓
                for shape in shapes:
                    # 7.根据json中目标的类别标签,从classList中寻找类别的ID,然后写入txt文件中
                    file_handle.writelines(str(classList.index(shape["label"])) + " ")

                    # 8. 遍历shape轮廓中的每个点,每个点要进行图像尺寸的缩放,即x/width, y/height
                    for point in shape["points"]:
                        x = point[0]/file_in["imageWidth"]  # mask轮廓中一点的X坐标
                        y = point[1]/file_in["imageHeight"]  # mask轮廓中一点的Y坐标
                        file_handle.writelines(str(x) + " " + str(y) + " ")  # 写入mask轮廓点

                    # 9.每个物体一行数据,一个物体遍历完成后需要换行
                    file_handle.writelines("\n")
            # 10.所有物体都遍历完,需要关闭文件
            file_handle.close()
        # 10.所有物体都遍历完,需要关闭文件
        f.close()

if __name__ == "__main__":
    jsonfilePath = "E:\\yolo\\yolov5-master\\datasets\\labelme\\json"  # 要转换的json文件所在目录
    resultDirPath = "E:\\yolo\\yolov5-master\\datasets\\labelme\\txt"  # 要生成的txt文件夹
    labelme2yolov2Seg(jsonfilePath=jsonfilePath, resultDirPath=resultDirPath, classList=["YiBiao", "ZhiZhen"])

Sign in to Roboflow 我们选择在线平台roboflow来直接标记,生成txt,方法如下

深度学习(10)之Roboflow 使用详解:数据集标注、训练 及 下载-CSDN博客

yolov5模型训练

·images:存放图片
 ·train:训练集图片
·val:验证集图片
·labels:存放标签
·train:训练集标签文件,要与训练集图片名称一一对应
·val:验证集标签文件,要与验证集图片名称一一对应

data文件夹里面,把coco128.yaml复制一份在源地址,改名bvn.yaml

11行后面所有修改如下

path: ./datasets  # dataset root dir
train: images/train  # train images (relative to 'path') 128 images
val: images/val  # val images (relative to 'path') 128 images
test:  # test images (optional)

# Classes
names:
  0: daitu
  1: mingren
  

train.py第439行,

parser.add_argument('--data', type=str, default=ROOT / 'data/bvn.yaml', help='dataset.yaml path')

运行train.py

报错了,截图如下

咨询了chatgpt,只要添加代码即可
在train.py添加以下代码即可

import os
os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'
#####上面是临时

常见问题

Arial.ttf字体文件无法下载
·手动下载,放到对应的位置,windows下的目录是:~/AppData/Roaming/Ultralytics
·页面文件太小,无法完成操作
·调整训练参数中的workers,设置为1
·修改虚拟内存,将环境安装位置所在的盘,设置一个较大的参数.'Upsample' object has no attribute 'recompute scale_factor'
·pytorch版本过高导致,可以选择降版本,1.8.2目前是不会报错的版本
·如不想降低版本,可以修改pytorch源码,打开报错的unsampling.py,删除recompute_scale_factor这个参数

训练成功!(指返回值为0)

在weights中有best和bad.pt对应最好和最坏模型。有一个很长的文件,是一个日志

在pycharm终端输入

tensorboard --logdir runs

即可跳转到6006的端口

 labels.png文件也有一些数据results.csv,result.png是整合的一些数据

cmd中  python detect.py --weights runs/train/exp3/weights/best.pt --source datasets/BVN.MP4 --view-img

其实效果还将就,但是结果告诉我要标注清晰一些,否则容易重合结果,5555

Pyside6实现GUI界面

终端输入

pip install pyside6
然后
where python

D:\anaconda\Lib\site-packages\PySide6 

main windows后点击创建,托两个label,调好合适的大小位置,push button获得按钮

右侧alignment换成水平中心对齐,勾选scaledconpents

改改便于记住的文件名保存

把他右键compile QT UI uic编译出来得到py文件

添加base_ui.py,把ui_main_window.py添加计入,内容如下

import cv2
import sys
import torch
from PySide6.QtWidgets import QMainWindow, QApplication, QFileDialog
from PySide6.QtGui import QPixmap, QImage
from PySide6.QtCore import QTimer

from ui_main_window import Ui_MainWindow


def convert2QImage(img):
    height, width, channel = img.shape
    return QImage(img, width, height, width * channel, QImage.Format_RGB888)


class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)
        self.model = torch.hub.load("./", "custom", path="runs/train/exp3/weights/best.pt", source="local")
        self.timer = QTimer()
        self.timer.setInterval(1)
        self.video = None
        self.bind_slots()

    def image_pred(self, file_path):
        results = self.model(file_path)
        image = results.render()[0]
        return convert2QImage(image)

    def open_image(self):
        print("点击了检测图片!")
        self.timer.stop()
        file_path = QFileDialog.getOpenFileName(self, dir="./datasets/images/train", filter="*.jpg;*.png;*.jpeg")
        if file_path[0]:
            file_path = file_path[0]
            qimage = self.image_pred(file_path)
            self.input.setPixmap(QPixmap(file_path))
            self.output.setPixmap(QPixmap.fromImage(qimage))

    def video_pred(self):
        ret, frame = self.video.read()
        if not ret:
            self.timer.stop()
        else:
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            self.input.setPixmap(QPixmap.fromImage(convert2QImage(frame)))
            results = self.model(frame)
            image = results.render()[0]
            self.output.setPixmap(QPixmap.fromImage(convert2QImage(image)))

    def open_video(self):
        print("点击了检测视频!")
        file_path = QFileDialog.getOpenFileName(self, dir="./datasets", filter="*.mp4")
        if file_path[0]:
            file_path = file_path[0]
            self.video = cv2.VideoCapture(file_path)
            self.timer.start()

    def bind_slots(self):
        self.det_image.clicked.connect(self.open_image)
        self.det_video.clicked.connect(self.open_video)
        self.timer.timeout.connect(self.video_pred)


if __name__ == "__main__":
    app = QApplication(sys.argv)

    window = MainWindow()
    window.show()

    app.exec()

其实是一个pyqt,有cppqt基础的应该可以不知道为什么只能看 ? 

原来是缺一个文件

Gradio搭建演示Web GUI

·Gradio是一个开源的Python库,用于构建机器学习演示和Web应用
·内置丰富的组件,并且实现了前后端的交互逻辑,无需额外编写代码

pip install gradio

 书写gradio_demo.py

import torch
import gradio as gr

model = torch.hub.load("./", "custom", path="runs/train/exp3/weights/best.pt", source="local")

title = "基于Gradio的YOLOv5演示项目"

desc = "这是一个基于Gradio的YOLOv5演示项目,非常简洁,非常方便!"

base_conf, base_iou = 0.25, 0.45

def det_image(img, conf_thres, iou_thres):
    model.conf = conf_thres
    model.iou = iou_thres
    return model(img).render()[0]

gr.Interface(inputs=["image", gr.Slider(minimum=0, maximum=1, value=base_conf), gr.Slider(minimum=0, maximum=1, value=base_iou)],
             outputs=["image"],
             fn=det_image,
             title=title,
             description=desc,
             live=True,
             examples=[["./datasets/images/train/30.jpg", base_conf, base_iou], ["./datasets/images/train/60.jpg", 0.3, base_iou]]).launch(share=True)

直接填写image做了一个映射,本质上调了gr.Image()组件

运行后可能会有点卡,最后examples是list

在launch设定这里,换成true,那么就会把服务放在公网上

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python 函数 封装

封装 函数的参数是:变量 def 函数(参数):print(参数)if __name__ __main__:函数(参数)函数(参数2)函数的参数是: 字典 import requests# 定义一个字典 data {} 地址 "https://webdriveruniversity.com/" 请求方法 getdata["url"…

【数据结构】选择题错题集

这里注意原本p后面也是有节点的。 这里只有遍历前面的链表找到尾节点连接即可。 快排是交换排序。 不要想象只有这两个节点,还有其他节点省略了。 筛选法就是向下调整算法。用向下调整建堆从最后一个节点的父亲开始。 这里错位相减法是乘4,所以最后要除三…

超详细!外婆都能看懂的Stable Diffusion入门教程,AI绘画SD零基础入门到精通教程!

一、前言 如今的AI绘画界有两大最强工具,一个是Midjourney ,一个是StableDiffusion。Midjourney生成图片的质量非常高,可问题就是 Midjourney 的图片怎么精准的控制,或者是不改变某个物体的情况下更换背景等等,实在是…

虚拟化数据恢复—断电导致虚拟机目录项被破坏的数据恢复案例

虚拟化数据恢复环境: 某品牌服务器(部署VMware EXSI虚拟机)同品牌存储(存放虚拟机文件)。 虚拟化故障: 意外断电导致服务器上某台虚拟机无法正常启动。查看虚拟机配置文件发现这台故障虚拟机除了磁盘文件以…

视频监控平台是如何运作的?EasyCVR视频汇聚平台的高效策略与实践

随着科技的飞速发展,视频监控平台在社会安全、企业管理、智慧城市构建等领域发挥着越来越重要的作用。一个高效的视频监控平台,不仅依赖于先进的硬件设备,更离不开强大的视频处理技术作为支撑。这些平台集成了多种先进的视频技术,…

长短期记忆网络和UKF的结合|Python代码例程

结合长短期记忆网络(LSTM)和无迹卡尔曼滤波器(UKF)的技术在机器人导航和状态估计中具有广泛的应用前景。 文章目录 结合LSTM和UKF的背景结合LSTM和UKF的优势应用实例研究现状Python代码示例结合LSTM和UKF的背景 长短期记忆网络(LSTM)是一种特殊的递归神经网络(RNN),…

51单片机-IIC实验1-AT24C02数据存储(实战1)

本实验主要是针对IIC的具体案例进行实战,主要利用支持IIC通信的芯片AT24C02进行与51单片机构成通信。51(AT89C52)本身不带有IIC通信,所以,我们需要给51写一个IIC时序,以便与支持IIC协议的AT24C02数据存储芯…

逆向学习系列(三)Charles配合Drony的使用(真机)

在抓包中,有时可能出现无法抓包的情况,这时,可以尝试使用Drony转发抓包。 一、安装Drony 将电脑上的Drony_1.3.154_APKPure.apk复制粘贴进真机的Download文件夹中。在真机上找到这个apk,点击安装。 二、在VMOS中安装Drony 在真…

【Petri网导论学习笔记】Petri网导论入门学习(四)

Petri网导论入门学习(四) Petri 网导论学习笔记(4)1.2 标识网与网系统定义 1.8定义 1.9例 1.4存在空标识网的几种情况1.2 小结1.2学习完应达到的要求 Petri 网导论学习笔记(4) 如需学习转载请注明原作者并附…

55页可编辑PPT | 集团制造企业数字化转型顶层设计方案

这份PPT文档是一份关于集团制造企业数字化转型的顶层业务设计方案。文档详细介绍了企业在后ERP时代面临的挑战,以及如何通过Oracle解决方案来实现数字化转型。 数字化转型的三大要点集中在满足利益相关者的期望,以企业价值为核心引领业务模式的创新&…

DHCP协议原理大全与全局地址、接口地址池、中继代理三种方式配置

DHCP协议原理与配置 1.DHCP动态主机配置协议 原理:通过配置DHCP服务器给主机自动分配IP地址; 优点;1)可以动态学习或者获取IP地址及网络参数; 2)减少人工配置数量 3)减少ip抵制冲突; 4)采用客户端/服务器通信模式,报文基于UDP,服务器端端口号67。客户端端口号68…

AS608指纹识别模块(上位机操作)

目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 3.工作原理:模块指令格式 4.工作原理:模块应答格式 5.工作原理步骤 三、程序设计 四、实验效果 五、资料获取 项目分享 一、介绍 AS608模块采用了国内著名指纹识别芯片公司杭州晟元芯片技…

灵活连接,无限可能—探索EtherCAT的拓扑艺术

EtherCAT技术具备快速响应和高效率的特点,在工业自动化领域显得至关重要,其灵活的拓扑结构是其核心优势,支持多样化的网络布局,无需交换机或集线器,简化布线,降低成本,提高系统可靠性和灵活性。…

【AI大模型】ChatGPT模型原理介绍(上)

目录 🍔 什么是ChatGPT? 🍔 GPT-1介绍 2.1 GPT-1模型架构 2.2 GPT-1训练过程 2.2.1 无监督的预训练语言模型 2.2.2 有监督的下游任务fine-tunning 2.2.3 整体训练过程架构图 2.3 GPT-1数据集 2.4 GPT-1模型的特点 2.5 GPT-1模型总结…

2024年PMP我可以自学通过考试吗?

作为PMP考试的老考生,我想提醒一下,PMP考试费用很高,初次考试费用为3900元(重考费用为2500元)。如果你想自学PMP,一定要三思而后行。首先要问问自己是否符合以下几种情况: 1. 有相关的工作经验…

软考中级哪个科目比较简单,只为拿证?

软考不仅仅是为了拿证,选考科目也很重要。我建议你考虑软考中级的系统集成项目管理工程师。这个职称是由国家人力资源和社会保障部、工业和信息化部领导进行的国家级考试,通过考试后可以获得相应的证书。 1、通过率高 系统集成项目管理工程师属于中级职…

JDBC笔记

文章目录 准备MySQL数据的建立和建表 idea 建工程和模块设置属性配置文件编写JDBC代码URL的设置JDBC 代码配置文件 准备MySQL 数据的建立和建表 idea 建工程和模块 设置属性配置文件 编写JDBC代码 URL的设置 JDBC 代码 package com.yanyu;import java.sql.*; import java.util…

喜报 | 博睿数据荣获“绿色领导力董秘标杆之星”、“信息技术服务创新标杆之星”

9月12日,2024年中国国际服务贸易交易会在北京国家会议中心和首钢园区拉开序幕。作为服贸会的重要组成部分,9月12日下午,经济观察报经观传媒联合北京国际经济管理技术促进会、中国国际经济合作学会对外交流合作委员会在国家会议中心举办了“20…

YOLOv8改进 | 模块缝合 | C2f 融合RFAConv和CBAM注意力机制 【二次融合 小白必备】

秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录 :《YOLOv8改进有效…

【数据结构-一维差分】力扣1854. 人口最多的年份

给你一个二维整数数组 logs ,其中每个 logs[i] [birthi, deathi] 表示第 i 个人的出生和死亡年份。 年份 x 的 人口 定义为这一年期间活着的人的数目。第 i 个人被计入年份 x 的人口需要满足:x 在闭区间 [birthi, deathi - 1] 内。注意,人不…