Yolov7训练自己的数据集(超详细教程)

2024-02-26 1081阅读

温馨提示:这篇文章已超过444天没有更新,请注意相关的内容是否还可用!

目录

一,准备数据集

1.1 挑选照片

1.2 做标注

二,下载YoloV7

三,划分数据集

四,模型训练

4.1 创建yaml文件

4.2 修改默认参数

4.3 开始训练

五,训练模型遇到的问题

5.1 UnicodeDecodeError: 'gbk' codec can't decode type 0xaf in position 525: illegal multibyte sequence

5.2  subprocess.Called processError: Command 'git tag' returned non-zero exit status 128

六,测试

七,解决标签中文显示问题


一,准备数据集

1.1 挑选照片

  公主做的是缺陷检测方向,没有好办法,只能靠人眼,公主试过用阈值分割法来挑选,但是!如果阈值分割法能准确分离缺陷,就不用用yolo了不是?特别是灰度相近,而且每张照片灰度都不同,背景与缺陷灰度对比度很接近,比如上图中的硌伤~特别是背景有噪声的时候如下图,阈值分割法就直接躺平了~                                      

Yolov7训练自己的数据集(超详细教程)

Yolov7训练自己的数据集(超详细教程)

       没办法,从4T的数据里挑出来,挑的公主眼睛都要瞎了~~~

1.2 做标注

  公主用的labelImg,大部分做yolo标注都用这个,也是很主流的标注工具,安装方法见公主另一篇博客。那篇博客标注方法没写全,在这里详细介绍一下:

  (1)修改默认标签。公主先只做了一种缺陷,缺陷名称为“硌伤”,因此只写了一种class。在labelImg的安装文件夹中的data/predefined_classes里面修改class:

Yolov7训练自己的数据集(超详细教程)

  (2)创建images文件夹和labels文件夹,可以放在任意的文件夹下。将挑选出的照片放到images的文件夹中。

Yolov7训练自己的数据集(超详细教程)

  (3)在cmd中cd到labelImg文件夹下,运行python labelImg命令打开labelImg主页面。或者直接在pycharm的Terminal中打开也行,公主是直接用pycharm的Terminal来运行的。

Yolov7训练自己的数据集(超详细教程)

      (4)在主页面上打开待标注文件,进行标注

Yolov7训练自己的数据集(超详细教程)

  labelImg如上图所示。

    • 第一步先将标注类型改为YOLO,这一步非常关键!
    • 第二部修改Save Dir到之前创建的labels的文件夹
    • 第三步Open Dir,打开之前创建的images文件夹,此时会出现4框中的所有文件
    • 双击想要标注的图像,通过Create RectBox在需要标注的位置画出框,选好标注类型就可以啦~
    • 可以选中View->Auto Save Mode,这样标注完就不用手动点Save了,直接点Next Image跳到下一张即可自动保存。
    • 此时可以看到labels文件夹中多了一个与图像同名的.txt文件,即为标注文件啦!注意,标注与图片是一一对应的!

      labels的格式如下:

    Yolov7训练自己的数据集(超详细教程)

    二,下载YoloV7

      下载地址

      下载之后的目录结构是这样的:

    Yolov7训练自己的数据集(超详细教程)

    三,划分数据集

      由于公主是一股脑将所有图像放到一起了,由于工业生产的特殊性,临近时间产生的缺陷相似,因此需要随机将图像拆分为训练集,验证集及测试集。

      在yolov7-main主文件夹下创建data.py, 并在datasets文件夹下创建defect文件夹,目录结构如下:红框画出的文件是下面代码运行完后自动生成的。  

    Yolov7训练自己的数据集(超详细教程)

      公主在这篇博客的代码基础上修改了一下,同时生成了yolov7需要的目录文件,代码如下:

    # 将图片和标注数据按比例切分为 训练集和测试集
    import shutil
    import random
    import os
    # 原始路径
    image_original_path = "./mydata/images/"
    label_original_path = "./mydata/label/"
    cur_path = os.getcwd()
    # 训练集路径
    train_image_path = os.path.join(cur_path, "datasets/defect/images/train/")
    train_label_path = os.path.join(cur_path, "datasets/defect/labels/train/")
    # 验证集路径
    val_image_path = os.path.join(cur_path, "datasets/defect/images/val/")
    val_label_path = os.path.join(cur_path, "datasets/defect/labels/val/")
    # 测试集路径
    test_image_path = os.path.join(cur_path, "datasets/defect/images/test/")
    test_label_path = os.path.join(cur_path, "datasets/defect/labels/test/")
    # 训练集目录
    list_train = os.path.join(cur_path, "datasets/defect/train.txt")
    list_val = os.path.join(cur_path, "datasets/defect/val.txt")
    list_test = os.path.join(cur_path, "datasets/defect/test.txt")
    train_percent = 0.6
    val_percent = 0.2
    test_percent = 0.2
    def del_file(path):
        for i in os.listdir(path):
            file_data = path + "\\" + i
            os.remove(file_data)
    def mkdir():
        if not os.path.exists(train_image_path):
            os.makedirs(train_image_path)
        else:
            del_file(train_image_path)
        if not os.path.exists(train_label_path):
            os.makedirs(train_label_path)
        else:
            del_file(train_label_path)
        if not os.path.exists(val_image_path):
            os.makedirs(val_image_path)
        else:
            del_file(val_image_path)
        if not os.path.exists(val_label_path):
            os.makedirs(val_label_path)
        else:
            del_file(val_label_path)
        if not os.path.exists(test_image_path):
            os.makedirs(test_image_path)
        else:
            del_file(test_image_path)
        if not os.path.exists(test_label_path):
            os.makedirs(test_label_path)
        else:
            del_file(test_label_path)
    def clearfile():
        if os.path.exists(list_train):
            os.remove(list_train)
        if os.path.exists(list_val):
            os.remove(list_val)
        if os.path.exists(list_test):
            os.remove(list_test)
    def main():
        mkdir()
        clearfile()
        file_train = open(list_train, 'w')
        file_val = open(list_val, 'w')
        file_test = open(list_test, 'w')
        total_txt = os.listdir(label_original_path)
        num_txt = len(total_txt)
        list_all_txt = range(num_txt)
        num_train = int(num_txt * train_percent)
        num_val = int(num_txt * val_percent)
        num_test = num_txt - num_train - num_val
        train = random.sample(list_all_txt, num_train)
        # train从list_all_txt取出num_train个元素
        # 所以list_all_txt列表只剩下了这些元素
        val_test = [i for i in list_all_txt if not i in train]
        # 再从val_test取出num_val个元素,val_test剩下的元素就是test
        val = random.sample(val_test, num_val)
        print("训练集数目:{}, 验证集数目:{}, 测试集数目:{}".format(len(train), len(val), len(val_test) - len(val)))
        for i in list_all_txt:
            name = total_txt[i][:-4]
            srcImage = image_original_path + name + '.bmp'
            srcLabel = label_original_path + name + ".txt"
            if i in train:
                dst_train_Image = train_image_path + name + '.bmp'
                dst_train_Label = train_label_path + name + '.txt'
                shutil.copyfile(srcImage, dst_train_Image)
                shutil.copyfile(srcLabel, dst_train_Label)
                file_train.write(dst_train_Image + '\n')
            elif i in val:
                dst_val_Image = val_image_path + name + '.bmp'
                dst_val_Label = val_label_path + name + '.txt'
                shutil.copyfile(srcImage, dst_val_Image)
                shutil.copyfile(srcLabel, dst_val_Label)
                file_val.write(dst_val_Image + '\n')
            else:
                dst_test_Image = test_image_path + name + '.bmp'
                dst_test_Label = test_label_path + name + '.txt'
                shutil.copyfile(srcImage, dst_test_Image)
                shutil.copyfile(srcLabel, dst_test_Label)
                file_test.write(dst_test_Image + '\n')
        file_train.close()
        file_val.close()
        file_test.close()
    if __name__ == "__main__":
        main()

    至此,数据集彻底准备完毕!

      CUDA的安装我是参考这篇博客。

    四,模型训练

    4.1 创建yaml文件

    Yolov7训练自己的数据集(超详细教程)

       在data文件夹中创建新的yaml文件,本例中缺陷为硌痕(公主不知道硌痕怎么翻译,长得像气泡,就翻译成了bubble >_

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]