基于深度学习的目标检测:Ubuntu系统+YOLOv7环境搭建+训练自己的数据集+推理(detect) ——(2)训练+推理篇

上一篇文章我们完成了YOLOv7环境的配置,接下来我们来介绍怎么标注、训练、推理。

1 训练自己的数据集

关于数据集的获取方式主要有两种,分别是获取网上开源数据集,另一个就是自己标注,我只讲怎么自己标注数据集。

1.1 标注数据集

首先我们需要安装一个用来标注图片的软件:Labelimg

第一步:我们需要为这个软件创建一个虚拟环境(参考上一篇文章)。

conda create -n labelimg python=3.12

创建完成之后使用如下命令进入虚拟环境。

conda activate labelimg

第二步:虚拟环境准备完成之后,开始安装Labelimg,使用pip安装,命令如下。

pip install labelimg

等待加载过程完毕,我们的Labelimg也就安装完成了

然后直接输入labelimg就可以打开操作页面,具体一些按键操作我已经在图中标注出来了。

“Open”是打开单个图像,“Open Dir” 打开图像文件夹,"Change Save Dir"图像保存的路径,“Next Image” 切换到下一张图像,“Prev Image”切换到上一张图像,“Verify Image”校验图像,“Save”保存图像,这里可以选择我们的保存格式,因为我们是使用YOLO,所以可以先试试直接保存问YOLO格式,如果出现问题再尝试进行格式的转换,“Create RectBox”画标注框一个,“Duplicate RectBox”重复标注框,“Delete RectBox”删除标注框,“Zoom In”放大图像,“Zoom Out” 缩小图像,“Fit Window”图像适用窗口,“Fit Width”图像适应宽度。

一般操作的顺序:open/open dir→create rectbox  →输入类别名称 →change save dir→ 改变保存格式→Save。最后在保存文件的路径下生成.txt文件,.txt文件的名字是和标注照片的名字一样的。

这样当我们标注完成之后,就会得到一个包含照片和.txt文件的文件夹,下一步我们就是需要将其划分成为我们训练所要求的格式。

1.2 数据集划分

未划分前你的文件夹中照片与.txt文件混合在一起。

我们先将照片与标签文件分开,然后使用代码随机划分未train和val,具体结构如下:

划分代码如下,这个代码是我自己在AI的帮助下写的,不一定适合所有人,如果不合适自己可以再去找AI帮助或者在评论区留言咱们互相帮助。我这里的划分比例是按训练集和验证集8:2。

import os
import random
import shutil

def find_image(label_file, image_dir):
    """
    在指定目录中查找与 label_file 对应的图片文件(支持 jpg、png、jpeg、webp)

    :param label_file: 标注文件名(.txt)
    :param image_dir: 图片存放目录
    :return: 匹配的图片路径(如果找到),否则返回 None
    """
    base_name = os.path.splitext(label_file)[0]  # 获取文件名(不含扩展名)
    extensions = ['.jpg', '.png', '.jpeg', '.webp']  # 支持的图片格式

    for ext in extensions:
        image_path = os.path.join(image_dir, base_name + ext)
        if os.path.exists(image_path):
            return image_path  # 找到匹配的图片文件

    return None  # 没有找到匹配的图片

def split_images_and_labels(image_dir, label_dir, train_image_dir, test_image_dir, train_label_dir, test_label_dir, train_ratio=0.8):
    """
    将 YOLO 数据集中的图片和标注文件随机分配到训练集和测试集中

    :param image_dir: 存放原始图片文件的目录
    :param label_dir: 存放原始标注文件的目录
    :param train_image_dir: 用于存放训练集图片的目录
    :param test_image_dir: 用于存放测试集图片的目录
    :param train_label_dir: 用于存放训练集标注文件的目录
    :param test_label_dir: 用于存放测试集标注文件的目录
    :param train_ratio: 训练集所占比例,默认80%
    """
    # 获取所有标注文件列表
    label_files = [f for f in os.listdir(label_dir) if f.endswith(".txt")]

    # 打乱文件顺序
    random.shuffle(label_files)

    # 根据比例划分数据集
    total_files = len(label_files)
    train_count = int(total_files * train_ratio)

    train_labels = label_files[:train_count]
    test_labels = label_files[train_count:]

    # 创建目标目录(如果不存在)
    os.makedirs(train_image_dir, exist_ok=True)
    os.makedirs(test_image_dir, exist_ok=True)
    os.makedirs(train_label_dir, exist_ok=True)
    os.makedirs(test_label_dir, exist_ok=True)

    # 复制标注文件和对应的图片到训练集
    for label_file in train_labels:
        image_path = find_image(label_file, image_dir)  # 查找对应图片
        if image_path:
            shutil.copy(image_path, os.path.join(train_image_dir, os.path.basename(image_path)))
        shutil.copy(os.path.join(label_dir, label_file), os.path.join(train_label_dir, label_file))

    # 复制标注文件和对应的图片到测试集
    for label_file in test_labels:
        image_path = find_image(label_file, image_dir)  # 查找对应图片
        if image_path:
            shutil.copy(image_path, os.path.join(test_image_dir, os.path.basename(image_path)))
        shutil.copy(os.path.join(label_dir, label_file), os.path.join(test_label_dir, label_file))

    print(f"已将 {train_count} 个标注文件及其图片分配到训练集,{total_files - train_count} 个标注文件及其图片分配到测试集。")

# 假设标注文件存放在 'labels/' 目录,图片存放在 'images/' 目录
image_directory = "C:/Users/123/Desktop/HTSRP-D/images"#修改为你自己的路径
label_directory = "C:/Users/123/Desktop/HTSRP-D/labels"

# 假设训练集和测试集标注文件和图片的目标目录
train_image_directory = "C:/Users/123/Desktop/HTSRP-D/train/images" #都修改为你自己的路径
val_image_directory = "C:/Users/123/Desktop/HTSRP-D/val/images"
train_label_directory = "C:/Users/123/Desktop/HTSRP-D/train/labels"
val_label_directory = "C:/Users/123/Desktop/HTSRP-D/val/labels"

# 调用函数进行数据集划分
split_images_and_labels(image_directory, label_directory, train_image_directory, test_image_directory, train_label_directory, test_label_directory)

划分完成之后,我们数据集准备工作也就完成了,下面就是训练前的参数以及一些代码的修改。

1.3 训练

这里我默认你们已经下载完成了YOLOv7的源码和所有权重。

第一步:修改ymal文件

在yolov7-main/data下有一个coco.yaml文件,这是用来指定训练数据集的文件。

我是直接复制一个副本然后重命名为myyolo.yaml。

然后打开这个yaml文件,进行修改

# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: /home/sci/XXA/datasets/HTSRP-D/train/images  # 1123 images这里是你的train文件路径
val: /home/sci/XXA/datasets/HTSRP-D/val/images # 281 images这是val文件路径,根据你的数据集路径修改
#test: ./coco/test-dev2017.txt  # 20288 of 40670 images, submit to ,https://competitions.codalab.org/competitions/20794因为我不用test所以直接#了

# number of classes
nc: 2#你的标签数量,比如你只有猫和狗,那就是2

# class names
names: [ 'cat', 'dog' ]#这里修改为你的标签名称

第二步:放入权重

将之前下载的yolo模型的权重放到yolov7-main下,根据你自己的需要来,如果你的电脑性能不高就可以试试tiny,因为他比较轻量化,对电脑负担没那么重,我这里就直接使用yolov7.pt。在第一步的图片中可以看到我已经把那个pt文件放进去了。

第三步:修改train.py文件

weights修改成自己的权重

cfg要修改成对应的yaml文件,比如我用的是yolov7.pt那么就在yolov7-main/cfg文件夹里找到对应的yolov7.yaml,我在下面第二幅图中忘记标出来了,见谅见谅。

batch-size一般默认是2的倍数。如8、16、32等

这里还有一个img-size这是照片尺寸,可以先不改,等熟悉之后根据自己爹需要来修改

epochs是训练轮次,第一次测试就简单测试一下,搞个10就可以了

device就是来修改你用来训练的设备用的是cpu还是gpu

ok,上述修改都完成之后,就可以开始训练了。

我们直接在终端中激活虚拟环境,切换到我们的train文件所在的目录,然后运行train.py文件

这样就开始训练了,静静等待训练结束即可,训练结束之后,一些数据会提示你保存到什么什么位置。你可以根据这位置去查看训练中的最优权重best.pt。这个要用于后续的推理过程。

2 进行推理

如果你能顺利完成上述步骤,那么推理过程就很简单了。所谓推理过程其实就是使用你训练之后得到的最好的权重(也可以不是)对没有标注的图片进行检测。这里需要用到detect.py文件。

第一步:先找到我们训练后的最优权重best.pt的保存路径,然后复制这个路径到detect.py中的weights中代替原先的yolov7.pt,然后修改source里的数据来源,你可以将你需要检测的照片放入图中的路径,也可以指定一个新的路径。修改完毕之后,在终端直接输入命令python detect.py运行检测程序。

测试过程中就可以看到如下的提示,我们可以根据他给的路径去查看检测效果。

3 结束

到此为止,关于YOLOv7的部署和训练以及后续的推理就已经介绍完毕了,如果各位朋友们有任何疑问,或者发现我哪里有错误的的地方欢迎在评论区留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值