YOLO目标检测算法调试过程学习记录

news/2024/7/10 23:00:19 标签: YOLO, 目标检测, 算法

先前已经完成过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_118">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_138">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' ]

随后便可以运行了。

在这里插入图片描述

断点训练

在训练过程中,时常会由于各种原因造成训练中断,针对该问题,YOLO系列算法通过断点训练的方式来恢复训练,以YOLOv5为例,在train.py 文件中指定resume参数为True,将weights参数设置为训练终止前的权重文件路径。

parser.add_argument('--weights', type=str, default='/home/ubuntu/outputs/yolov5/yolov5/runs/train/exp9/weights/last.pt', help='initial weights path')
parser.add_argument('--resume', nargs='?', const=True, default=True, help='resume most recent training')

在这里插入图片描述


http://www.niftyadmin.cn/n/4961456.html

相关文章

plt不显示图片

最近python工程导入yolov5的包后,使用plt发现图片不显示了。 使用 print(matplotlib.get_backend())可以打印看到,在导入前,打印出来的值是 module://backend_interagg 而导入yolov5后,不显示图片时打印出来的值是agg。 所以…

Putty连接登录Linux centos7

一、下载Putty 下载网址 https://www.putty.org/ 安装完成后会有两个重要的软件 Putty是用于连接Linux的客户端 PuTTYgen是通过客户端下载的service.ppk生成本地登录要用到的key 二、运行putty 双击putty.exe可以打开程序(程序小,学习linux可以把该…

Webpack减少打包数量和体积(Umi 3.*中)

在UMI 3.*中配置: export default defineConfig({chunks: [vendors, umi],chainWebpack: function (config: any, { webpack }: any) {config.plugin(chunkPlugin).use(webpack.optimize.LimitChunkCountPlugin, [{maxChunks: 5, // 必须大于或等于 1,此…

c++ qt--信号与槽(一) (第三部分)

c qt–信号与槽(一) (第三部分) 一.用qt自带的方法添加信号槽 1.第一种 1.如何添加 2.在何处进行绑定 2.第二种 1.如何添加 2.在何处进行绑定 而且会在mainwindow.h中添加槽函数的声明,在mainwindow.cpp中添加槽函数的定义 在mainwindow…

C++中提供的一些关于查找元素的函数

C中提供的所有关于查找的函数 std::find(begin(), end(), key) std::find(begin(), end(), key):这个函数用于在一个范围内查找一个等于给定值的元素,返回一个指向该元素的迭代器,如果没有找到则返回范围的结束迭代器。 1.1 例如&#xff…

docker的安装以及基本操作

一.认识docker Docker是一种用于构建、打包和运行应用程序的开源平台。它基于操作系统级虚拟化技术,可以将应用程序和其依赖的库、环境等资源打包到一个可移植的容器中,形成一个轻量级、独立的可执行单元。 开发者在本地编译测试通过的容器可以批量地在…

Spi机制简单解释

Spi机制比较简单,这里解释一下。 例如你现在要写一个基础服务如支付服务。 然后后面你这个服务要应用于其他项目比如农业项目,工业项目,金融项目等。 但是呢,这些个项目早就有着自己的设计代码啥的,现在要接入我们写的…

Linux Kernel的local_irq_enable()和local_irq_disable()函数

代码如下图所示,最终操作的是msr daifset, #3 和 msr daifclr, #3 寄存器。 (include/linux/irqflags.h) #define local_irq_enable() do { raw_local_irq_enable(); } while (0) #define local_irq_disable() do { raw_local_irq_disable(); } while (0)#define ra…