YOLO目标检测算法训练过程学习记录

news2024/11/18 23:36:30

先前已经完成过YOLO系列目标检测算法的调试过程,今天主要是将所有的调试加以总结
这里的conda环境就不再赘述了,直接使用requirement.txt文件的即可,也可以参考YOLOX的配置过程5

数据集处理

YOLOv5有自己的数据集格式,博主的数据集为COCO格式,需要自己转换为YOLO格式。
下面代码需要修改的地方:
COCO标注文件:JSON文件地址

parser.add_argument('--json_path',default='/data/datasets/coco/annotations/instances_train2017.json', type=str,help="input: coco format(json)")

生成的YOLO格式标注文件地址:TXT文件地址

parser.add_argument('--save_path', default='/home/ubuntu/outputs/yolov5/yolov5/train', type=str,help="specify where to save the output dir of labels")

保存的数据集对应地址:train2017.txt

list_file = open(os.path.join(ana_txt_save_path, 'train2017.txt'), 'w')

写入数据集图片地址:

list_file.write('/data/datasets/coco/images/train2017/%s.jpg\n' % (head))

完整代码如下:

import os
import json
from tqdm import tqdm
import argparse

parser = argparse.ArgumentParser()
# 这里根据自己的json文件位置,换成自己的就行
parser.add_argument('--json_path',
                    default='/data/datasets/coco/annotations/instances_train2017.json', type=str,
                    help="input: coco format(json)")
# 这里设置.txt文件保存位置
parser.add_argument('--save_path', default='/home/ubuntu/outputs/yolov5/yolov5/train', type=str,
                    help="specify where to save the output dir of labels")
arg = parser.parse_args()


def convert(size, box):
    dw = 1. / (size[0])
    dh = 1. / (size[1])
    x = box[0] + box[2] / 2.0
    y = box[1] + box[3] / 2.0
    w = box[2]
    h = box[3]
    # round函数确定(xmin, ymin, xmax, ymax)的小数位数
    x = round(x * dw, 6)
    w = round(w * dw, 6)
    y = round(y * dh, 6)
    h = round(h * dh, 6)
    return (x, y, w, h)


if __name__ == '__main__':
    json_file = arg.json_path  # COCO Object Instance 类型的标注
    ana_txt_save_path = arg.save_path  # 保存的路径

    data = json.load(open(json_file, 'r'))
    if not os.path.exists(ana_txt_save_path):
        os.makedirs(ana_txt_save_path)

    id_map = {}  # coco数据集的id不连续!重新映射一下再输出!
    with open(os.path.join(ana_txt_save_path, 'classes.txt'), 'w') as f:
        # 写入classes.txt
        for i, category in enumerate(data['categories']):
            f.write(f"{category['name']}\n")
            id_map[category['id']] = i
    # print(id_map)
    # 这里需要根据自己的需要,更改写入图像相对路径的文件位置。
    list_file = open(os.path.join(ana_txt_save_path, 'train2017.txt'), 'w')
    for img in tqdm(data['images']):
        filename = img["file_name"]
        img_width = img["width"]
        img_height = img["height"]
        img_id = img["id"]
        head, tail = os.path.splitext(filename)
        ana_txt_name = head + ".txt"  # 对应的txt名字,与jpg一致
        f_txt = open(os.path.join(ana_txt_save_path, ana_txt_name), 'w')
        for ann in data['annotations']:
            if ann['image_id'] == img_id:
                box = convert((img_width, img_height), ann["bbox"])
                f_txt.write("%s %s %s %s %s\n" % (id_map[ann["category_id"]], box[0], box[1], box[2], box[3]))
        f_txt.close()
        # 将图片的相对路径写入train2017或val2017的路径
        list_file.write('/data/datasets/coco/images/train2017/%s.jpg\n' % (head))
    list_file.close()

生产的数据集标注文件格式如下:
在这里插入图片描述
在该文件夹下还有数据对应文件val2017.txt,内容如下:
在这里插入图片描述
即数据集结构如下:

images
       train2017
                XXX.jpg
       val2017
                XXX.jpg 
labels
      train2017
            XXX.txt
            train2017.txt
      val2017
            XXX.txt
            val2017.txt

至此,数据集处理完成

YOLOv5调试

数据集处理完成后,训练过程只需要修改对应的参数与文件配置即可。
首先修改coco128.yaml文件,改为下面的样子:

在这里插入图片描述
随后设置我们要用的模型,YOLOv5分为YOLOv5s,YOLOv5m,YOLOv5l,YOLOvx四个版本,性能依次升高,博主选择的是YOLOv5l版本,同时下载YOLOv5l的权重文件。

parser = argparse.ArgumentParser()
parser.add_argument('--weights', type=str, default='/data/programs/yolov5/yolov5l.pt', help='initial weights path')
parser.add_argument('--cfg', type=str, default='/home/ubuntu/outputs/yolov5/yolov5/models/yolov5l.yaml', help='model.yaml path')
parser.add_argument('--data', type=str, default=ROOT / 'data/coco128.yaml', help='dataset.yaml path')

随后修改yolov5l.yaml文件中的类别数:

在这里插入图片描述
随后便可以运行了,这里设置epoch=100,batch-size=16,这里再次吐槽,YOLOX真的耗显存,完事便可以运行了。

在这里插入图片描述

YOLOv7调试

由于先前的数据集配置已经完成,有了yolov5的基础,YOLOv7的调试便顺利许多,首先是修改配置文件,找到train.py,看看其需要哪些文件,修改一下即可:
这里可以选择是否使用权重文件,即weights,如果使用的话训练会明显加快,起始值较高,可能最后也不会有太大变化,若是不使用的话代表从头开始训练,训练可能会慢些,训练时间较长,,此外,YOLOv7还给提供了迁移学习版本,我们使用这个较好。即使用权重yolov7_training.pt

    parser.add_argument('--weights', type=str, default='', help='initial weights path')
    parser.add_argument('--cfg', type=str, default='/home/ubuntu/outputs/yolov5/yolov7/yolov7/cfg/training/yolov7.yaml', help='model.yaml path')
    parser.add_argument('--data', type=str, default='data/coco.yaml', help='data.yaml path')
    parser.add_argument('--hyp', type=str, default='data/hyp.scratch.p5.yaml', help='hyperparameters path')
    parser.add_argument('--epochs', type=int, default=100)

随后修改yolov7.yaml文件,修改num_class=3即可

修改coco.yaml文件

train: /data/datasets/coco/labels/train2017/train2017.txt  # 118287 images
val: /data/datasets/coco/labels/val2017/val2017.txt  # 5000 images
# number of classes
nc: 3
# class names
names: [ 'car',  'bus', 'truck' ]

随后便可以运行了。

在这里插入图片描述

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

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

相关文章

70 # 协商缓存的配置:通过修改时间

对比(协商)缓存 比较一下再去决定是用缓存还是重新获取数据,这样会减少网络请求,提高性能。 对比缓存的工作原理 客户端第一次请求服务器的时候,服务器会把数据进行缓存,同时会生成一个缓存标识符&#…

iOS_Crash报告的组成结构

崩溃报告结构如下,每个部分都包含可帮助定位崩溃位置的信息: 1. Header 描述崩溃发生的环境,包含设备、系统、时间、版本等信息。如: Incident Identifier: 6156848E-344E-4D9E-84E0-87AFD0D0AE7B CrashReporter Key: 76f2fb…

【C++STL基础入门】深入浅出string类insert和appand

文章目录 前言一、插入1.中间插入2.尾巴插入拼接appand 总结 前言 本系列STL是使用vs2022C20版本特性来写的。 在C标准模板库(STL)的众多容器中,string类是处理字符串的重要工具。它提供了丰富的函数和操作符,使得字符串的操作…

真机二阶段之堆叠技术

堆叠技术 --- 可以将多台真实的物理设备逻辑上抽象成一台 思科 -- VPC 华为 -- iStack和CSS 华三 -- IRF 锐捷 -- VSU iStack和CSS的区别: CSS --- 集群 --- 它仅支持将两台支持集群的交换机逻辑上整合成一台设备。 iStack --- 堆叠 --- 可以将多台支持堆叠的交换…

Agile Iteration Velocity

【agile iteration velocity】敏捷速度指的平均速度 第四次迭代结束速度: 76 / 4 19 第五次迭代结束速度: (76 24 ) / 5 100 / 5 20

【地理专题】2023年最新全国A级景区数

数据来源:中国文化和旅游部时间跨度:2023年区域范围:全国范围数据字段: 景区名称;地址;等级;城市;经度;纬度 该图基于自然资源部地图技术审查中心标准地图服务网站下载…

The internal rate of return (IRR)

内部收益率 NPV(Net Present Value)_spencer_tseng的博客-CSDN博客

华为网络篇 OSPF的Silent-Interface-33

难度1复杂度1 目录 一、实验拓扑 二、实验步骤 三、实验过程 总结 一、实验拓扑 二、实验步骤 1.搭建如图所示的网络拓扑; 2.初始化各设备,配置相应的IP地址,测试直连网络的连通性; 3.整个网络配置OSPF协议,查看…

使用预制体画刷在游戏场景中快速布置预制体、粒子特效等

有时候在使用tilemap的时候,会希望在场景中添加更复杂的对象。 在2d-extras中,加入了预制件笔刷(Prefab Brush),可以将游戏物体预制体作为瓦片,来方便的在游戏场景中快速的绘制。可以自动适应游戏物体的位置…

Docker容器:docker镜像的创建及dockerfile

Docker容器:docker镜像的创建及dockerfile案例 一.docker镜像的三种创建方法 创建镜像有三种方法:基于现有镜像创建、基于本地模板创建及基于dockerfile创建 1.基于现有镜像创建 1.1 启动镜像 #首先启动一个镜像,在容器里做修改 docker …

Linux笔试题(1)

1、以长格式列目录时,若文件test的权限描述为:drwxrw-r–,则文件test的类型及文件主的权限是__A____。 A.目录文件、读写执行 B.目录文件、读写 C.普通文件、读写 D.普通文件、读 在这个问题中,我们需要解析文件权限的描述&…

Java面向对象三大特性之多态及综合练习

1.1 多态的形式 多态是继封装、继承之后,面向对象的第三大特性。 多态是出现在继承或者实现关系中的。 多态体现的格式: 父类类型 变量名 new 子类/实现类构造器; 变量名.方法名(); 多态的前提:有继承关系,子类对象是可以赋…

Android11 中 LED 使用-RK3568

文章目录 前言原理图设备树驱动前言 现在我们来学习点亮LED 原理图 然后对应在核心板原理图上查找 Working_LEDEN_H_GPIO0_B7,如下图所示: 那么我们只要控制 GPIO0_B7 即可控制 led 的亮灭。 设备树 leds: leds {compatible = "gpio-leds";work_led: work {gpi…

AgentBench——AI智能体基准测试官方

ModaGPT 简介 排行榜 提交模型 提问 AgentBench是第一个系统性的基准测试,用于评估LLM作为智能体在各种真实世界挑战和8个不同环境中的表现。 Models

shell脚本——文件三剑客之grep

一.grep选项 -A<显示行数>&#xff1a;除了显示符合样式的那一列之外&#xff0c;并显示该行之后的内容&#xff0c;下几行内容&#xff0c;本行也会显示 -B<显示行数>&#xff1a;除了显示符合样式的那一行之外&#xff0c;并显示该行之前的内容&#xff0c;上几行…

回归预测 | MATLAB实现SA-BP模拟退火算法优化BP神经网络多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现SA-BP模拟退火算法优化BP神经网络多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现SA-BP模拟退火算法优化BP神经网络多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本介…

【脚踢数据结构】常见树总结(图码结和版)

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;软件配置等领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff01;送给自己和读者的…

UE4/5Niagara粒子特效之Niagara_Particles官方案例:1.5->2.3

目录 之前的文章&#xff1a; 1.5 Blend Attributes by Value 发射器更新 粒子生成 粒子更新 2.1 Static Beams ​编辑 发射器更新&#xff1a; 粒子生成 粒子更新 2.2 Dynamic Beams 没有开始模拟前的效果是&#xff1a; 开始模拟后的效果是&#xff1a; 发射器更新 …

shell脚本之数组

shell数组 数组和变量 变量&#xff1a;存储单个元素的内存空间 数组&#xff1a;存储多个元素的连续的内存空间&#xff0c;相当于多个变量的集合 数组和索引 索引的编号从0开始&#xff0c;属于数值索引 索引可支持使用自定义的格式&#xff0c;而不仅是数值格式&#xf…

FPGA原理与结构——RAM IP核的使用与测试

目录 一、前言 二、RAM IP核定制 1、RAM IP核 step1 打开vivado工程&#xff0c;点击左侧栏中的IP Catalog step2 在搜索栏搜索RAM&#xff0c;找到Block Memory Generator IP核&#xff1a; 2、IP核定制 step3 Baisc界面定制 step4 端口定制 step5 Other Options st…