目标检测算法,Yolov7本地化部署标注、训练(二)

news2024/9/20 1:12:46

安全帽检测、口罩检测、行为检测、目标物体检测,随着深度学习和计算机视觉技术的不断发展,目标检测成为了研究热点之一。YOLOv7作为YOLO系列的新成员,以其高效和准确的性能受到了广泛关注。本文将介绍如何在本地部署并利用YOLOv7完成目标检测推理。

YOLOV7本地安装和部署,请看我的上一篇文章:目标检测算法,Yolov7本地化部署使用(一)

一、创建目录结构

1.在yolov7目录下,创建一个名为VOCData的目录。
在VOCData目录中,创建VOCTest、VOCTrainVal两个目录。
在这两个目录下,分别创建Annotations、JPEGImages、ImageSets目录。
在这两个ImageSets目录下,分别创建Main目录。

整体结构如下:
---yolov7
    --VOCData
        --VOCTest
            --Annotations
            --ImageSets
                --Main
            --JPEGImages

        --VOCTrainVal
            --Annotations
            --ImageSets
                --Main
            --JPEGImages
    

二、准备标注的样本数据

将我们的图片放置yolov7/VOCTrainVal/JPEGImages/中

三、安装标注工具:labellmg

在我们的conda环境或Python环境中,运行安装命令:pip install  labellmg

四、启动标注工具: labellmg

在我们的conda环境或Python环境中,运行启动命令:labelimg

五、界面讲解

 

六、设置所需默认目录:

七、快捷键:

八、标注:

一直画框、标注、画框、标注,直至所有图片全部标注完成。

九、查看标注结果:

十、准备训练数据

首先拆分训练集、验证集和测试集。

       在yolov7/VOCData/目录下,创建一个名为split.py文件,将下面代码拷贝进去。

import os
import random
 
xmlfilepath = r'../VOCData/VOCTrainVal/Annotations/'  # xml文件的路径,这里可以改为绝对路径
saveBasePath = r'../VOCData/VOCTrainVal/ImageSets/'  # 生成的txt文件的保存路径,这里可以改为绝对路径
 
trainval_percent = 0.9 # 训练验证集占整个数据集的比重(划分训练集和测试验证集)
train_percent = 0.9  # 训练集占整个训练验证集的比重(划分训练集和验证集)
total_xml = os.listdir(xmlfilepath)
num = len(total_xml)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)
 
print("train and val size", tv)
print("traub suze", tr)
ftrainval = open(os.path.join(saveBasePath, 'Main/trainval.txt'), 'w')
ftest = open(os.path.join(saveBasePath, 'Main/test.txt'), 'w')
ftrain = open(os.path.join(saveBasePath, 'Main/train.txt'), 'w')
fval = open(os.path.join(saveBasePath, 'Main/val.txt'), 'w')
 
for i in list:
    name = total_xml[i][:-4] + '\n'
    if i in trainval:
        ftrainval.write(name)
        if i in train:
            ftrain.write(name)
        else:
            fval.write(name)
    else:
        ftest.write(name)
 
ftrainval.close()
ftrain.close()
fval.close()
ftest.close()

 十一、运行这个split.py文件。

在我们的conda环境或Python环境中,通过cd命令,切换至yolov7/VOCData/目录中,运行启动命令:python .\split.py

十二、查看运行结果:

在yolov7/VOCData/VOCTrainVal/ImageSets/Main/目录中,可以看到test.txt、train.txt、trainval.txt,val.txt

在yolov7/VOCData/VOCTest/ImageSets/Main目录中,可以看到test.txt,如果没有,就手动把yolov7/VOCData/VOCTrainVal/ImageSets/Main/下的test.txt拷贝至当前目录中。

十三、数据格式转换: 

因为YOLO用的是txt格式的训练文件,所以需要将我们标注为xml的标注文件通过Python代码转换为相应的txt文本。

     在yolov7/VOCData/目录下,创建一个名为voc_label.py文件,将下面代码拷贝进去。 

import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join
import  shutil
 
sets=[('TrainVal', 'train'), ('TrainVal', 'val'), ('Test', 'test')]

#修改为你自己训练的分类信息
classes =["mask_weared_incorrect","with_mask","without_mask"]
 
def convert(size, box):
    dw = 1./size[0]
    dh = 1./size[1]
    x = (box[0] + box[1])/2.0
    y = (box[2] + box[3])/2.0
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x*dw
    w = w*dw
    y = y*dh
    h = h*dh
    return (x,y,w,h)
 
def convert_annotation(year, image_set, image_id):
    in_file = open('VOC%s/Annotations/%s.xml'%(year, image_id))
    out_file = open('VOC%s/labels/%s_%s/%s.txt'%(year, year, image_set, image_id), 'w',encoding='utf-8')
    tree=ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)
 
    for obj in root.iter('object'):
        difficult = obj.find('difficult').text
        cls = obj.find('name').text
        if cls not in classes or int(difficult) == 1:
            continue
        cls_id = classes.index(cls)
        xmlbox = obj.find('bndbox')
        b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
        bb = convert((w,h), b)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
 
def copy_images(year,image_set, image_id):
    in_file = 'VOC%s/JPEGImages/%s.jpg'%(year, image_id)
    out_flie = 'VOC%s/images/%s_%s/%s.jpg'%(year, year, image_set, image_id)
    shutil.copy(in_file, out_flie)
 
wd = getcwd()
 
for year, image_set in sets:
    if not os.path.exists('VOC%s/labels/%s_%s'%(year,year, image_set)):
        os.makedirs('VOC%s/labels/%s_%s'%(year,year, image_set))
    if not os.path.exists('VOC%s/images/%s_%s'%(year,year, image_set)):
        os.makedirs('VOC%s/images/%s_%s'%(year,year, image_set))
    image_ids = open('VOC%s/ImageSets/Main/%s.txt'%(year, image_set)).read().strip().split()
    list_file = open('VOC%s/%s_%s.txt'%(year, year, image_set), 'w')
    for image_id in image_ids:
        list_file.write('%s/VOC%s/images/%s_%s/%s.jpg\n'%(wd, year, year, image_set, image_id))
        convert_annotation(year, image_set, image_id)
        copy_images(year, image_set, image_id)
 
    list_file.close()
 
 
 

 十四、运行这个voc_label.py文件。

在我们的conda环境或Python环境中,通过cd命令,切换至yolov7/VOCData/目录中,运行启动命令:python .\voc_label.py

十五、查看运行结果:

在yolov7/VOCData/VOCTrainVal/labels/TrainVal_train/目录中,可以看到转换后的txt文件。

 

十六、创建自己的数据集

     在yolov7/VOCData/目录下,创建一个名为trainData.yaml文件,将下面代码拷贝进去。 

# 上面那三个txt文件的位置
train: ./VOCData/VOCTrainVal/TrainVal_train.txt
val: ./VOCData/VOCTrainVal/TrainVal_val.txt
test: ./VOCData/VOCTest/Test_test.txt
# number of classes
nc: 3  # 修改为自己的类别数量
# class names
names: ["第一个标签", "第二个标签","第三个标签"]   # 自己来的类别名称  0 ,1 , 2  

十七、修改训练参数:

     打开yolov7/train.py文件,修改训练参数:

--weights代表权重,可以使用默认权重,也可以不用预训练权重,也可以使用官方提供的训练权重yolov7_training.pt

--data代表数据集,这块就写入咱们刚才制作的数据集的位置就可以了,可以使用相对路径,也可以使用绝对路径

--batch-size代表大小,这个根据个人电脑情况调整,一般为2 - 16不等,均为偶数--resume继续训练,如果因为断电或者其他不可抗力因素导致训练终止,将此处的default改为True,便可以接着上一次的训练。

十八、 开始训练:

在我们的conda环境或Python环境中,通过cd命令,切换至yolov7/目录中,运行启动命令:python .\train.py

十九、意外BUG:

如果在Windows运行报错:UnicodeDecodeError: 'gbk' codec can't decode byte 0x9A in position 233: illegal multibyte sequence, 请参考:【Python】解决UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0x9A in position xxx: illegal multibyte_unicodedecodeerror: 'gbk' codec can't decode byte -CSDN博客

二十、使用自己训练的模型进行推理检测:

自己训练好的模型文件在,yolov7/runs/train/exp${流水号}/,比如我的 yolov7/runs/train/exp13/,你可以看到训练结果分析之类的一系列数据,最后在当前目录下的weights目录中找到模型文件:best.pt、last.pt

将 last.pt或base.pt拷贝至yolov7/目录下,修改同目录下(yolov7/)detect.py文件,让他检测时使用我们自己训练的模型last.pt 或base.pt

二十一、开始运行程序:

在我们的conda环境或Python环境中,通过cd命令,切换至yolov7/目录中,运行启动命令:python .\detect.py

二十二、查看结果:

在 yolov7/runs/detect/exp${流水号}/,比如我的 yolov7/runs/train/exp2/,你可以最新的检测结果了。至此,你已完成YOLOV7的训练任务了。

本文参考:YOLOv7保姆级教程(个人踩坑无数)----训练自己的数据集-CSDN博客 

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

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

相关文章

StormBamboo 入侵 ISP 并滥用不安全的软件更新机制

关键要点 StormBamboo 成功入侵了一家互联网服务提供商 (ISP),以毒害目标组织的 DNS 响应。不安全的软件更新机制旨在在运行 macOS 和 Windows 的受害者机器上秘密安装恶意软件。StormBamboo 部署的恶意软件包括 MACMA 恶意软件的新变种。对 MACMA 最新版本的分析表…

Python学习入门实验

(1)掌握python数字类型的使用方法 (2)掌握将数学表达式转换成python语言表达式的方法及注意 (3)掌握有关运算符号的特殊要求 (4)掌握输入、输出函数的使用方法 (5&am…

Python与netCDF数据之全面解析空间偏相关分析详解

概要 在气象学、海洋学、环境科学等领域,netCDF(Network Common Data Form)是一种常用的数据格式,用于存储和共享多维科学数据。偏相关分析(Partial Correlation Analysis)是一种统计方法,用于研究多个变量之间的关系,同时控制其他变量的影响。本文将详细介绍如何使用…

VTK-vtkStructuredGrid学习

vtkStructuredGrid是具有规则拓扑和不规则几何的数据集。可以理解为单元格顺序沿着坐标轴排列,但是每个单元格可以不一样。看了很多文字解释,感觉不清楚,直接用图解验证: 1.使用CAD随意绘制个网格草图 2.获取这些点信息&#xff…

Sealos 就是小团队的神器

作者:阳明。Kubernetes 布道师,公众号 K8s 技术圈主理人 最近我们新开发了一个项目 fastclass.cn,这个项目是一个独立开发者的学习网站,我们的目标是帮助你使用 Figma、Python、Golang、React、VUE、Flutter、ChatGPT 等设计构建真…

【linux】linux中如何通过systemctl来创建和管理服务

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

【网络】从零认识IPv4

目录 IP地址定义 网络标识和主机标识 子网掩码 IPv4地址的分类 全局地址和私有地址 个人主页:东洛的克莱斯韦克-CSDN博客 IP地址定义 IP是网络中每台设备的唯一标识符,用于识别和定位计算机、服务器、路由器等设备,以便它们能够在网络上…

VictoriaMetrics快速入门

文章目录 Multitenancy集群部署启动vmstorage服务启动vminsert服务启动 vmselect服务 配置使用集群大小调整和可伸缩性grafana展示参考资料 VictoriaMetrics是快速,经济高效且可扩展的时间序列数据库。它可以用作Prometheus的长期远程存储。 VictoriaMetrics集群包含…

鸿蒙开发5.0【同页面内的点击操作响应时延问题】分析思路案例

1. 场景导入 同页面内点击操作时延是指,应用内手指点击从离开屏幕开始,到页面发生变化的时间。常见场景包括点击后界面元素变化,弹出弹窗或者loading动画等场景。 2. 性能指标 2.1 性能衡量起始点介绍 1.点击操作响应时延的性能衡量的起点…

GitLab-CI/CD指南

由于公司没有运维,写go服务时各个环境编译部署还是略显麻烦,由于代码管理使用的是 gitlab,所以决定使用 gitlab 自带的 CI/CD 来做自动编译和部署,这样每次提交代码以后就可以自动部署到服务器上了。 gitlab 本身只有 CI/CD 的接…

金蝶云星辰V1与旺店通·企业版对接集成采购入库单查询(列表+详情)连通创建其他入库单(其他)

金蝶云星辰V1与旺店通企业版对接集成采购入库单查询(列表详情)连通创建其他入库单(其他) 接入系统:金蝶云星辰V1 金蝶云星辰基于金蝶云苍穹云原生PaaS平台构建,聚焦小型企业在线经营和数字化管理,提供财务云、税务云、…

操作系统中的进程:深入解析与理解

文章目录 一、什么是进程?🤔二、进程的特性 🌟三、进程的组成 🧩四、进程的状态与转换 🔄🔀五、进程的调度与管理 🔧🔀六、代码示例(C)创建进程进程等待&…

scanf中%c前加不加空格的区别

%c前加空格可以让scanf跳过空白字符&#xff08;如空格、制表符、换行符等&#xff09;&#xff0c;直接读取非空白字符。如果不加空格就会读取空白字符。 可以用两段测试客官有无慧根的程序来说明这个问题&#xff0c;测试代码如下&#xff1a; #include <stdio.h> in…

Ubuntu22.04安卓编译环境搭建及so库编译

1.配置Android-ARM64开发环境工具链: vim ~/.profile 或者 ~/.bashrc 或者 /etc/profile 编辑环境变量文件 输入下面内容 export CROSS_TRIPLE=aarch64-linux-android export CROSS_ROOT=/usr/${CROSS_TRIPLE} export ANDROID_NDK=${CROSS_ROOT} export AS=${CROSS_ROOT}…

【人工智能】数据集合集!

本文将为您介绍10个经典、热门的数据集&#xff0c;希望对您在选择适合的数据集时有所帮助。 点击蓝字 关注我们 1 Habitat Platform 发布方&#xff1a; Facebook AI Research西蒙菲莎大学佐治亚理工学院Facebook Reality LabsIntel LabsUniversity of California, Berkeley…

1- 关键字static

文章目录 1 前言2 static修饰局部变量2.1 局部变量无static修饰2.2 局部变量有static修饰 3 static修饰全局变量 1 前言 在C语言中&#xff0c;static是用来修饰变量和函数的&#xff1a; 修饰局部变量 - 称为静态局部变量修饰全局变量 - 称为静态全局变量修饰函数 - 称为静态…

django空巢老人志愿服务系统-计算机毕业设计源码58726

摘 要 随着社会老龄化问题日益突出&#xff0c;空巢老人群体的关注和关怀日益重要。本研究设计并实现了基于Python的空巢老人志愿服务系统&#xff0c;旨在利用技术手段提供更多关爱和支持给空巢老人群体。 该系统结合Python编程语言的灵活性和易用性&#xff0c;实现了慈善捐赠…

HCIE杭州考试分享

考试过程&#xff1a; 首先提醒大家关注一下天气&#xff0c;我去杭州没看天气&#xff0c;去了一直下雨&#xff0c;鞋子也湿了&#xff1b;27号早上七点多到的杭州&#xff0c;雨一直下&#xff0c;去了直奔网吧上机&#xff0c;最后的机时&#xff0c;早饭和晚饭都在网吧吃…

Linux多线程间通信机制(互斥锁、条件变量、信号量,读写锁)同步与异步(二)

原文链接&#xff1a;https://blog.csdn.net/weixin_55796564/article/details/119699146 一、概述 本章介绍了线程同步的几种不同的方法&#xff0c;包括互斥锁、条件变量、自旋锁以及读写锁&#xff0c;当然&#xff0c;除此之外&#xff0c;线程同步的方法其实还有很多&…

如何获取设备消息?

一、什么是消息&#xff1f; 消息是设备向萤石云平台传输的带有特定内容的信息&#xff0c;大部分消息由设备端主动产生&#xff0c;并且上报到平台。举个例子&#xff0c;设备开启画面变化检测&#xff0c;当设备画面产生变化&#xff0c;设备就会产生报警&#xff08;画面…