Yolov5 7.0 训练自己的模型

Yolov5 7.0 训练自己的模型教程

  教程说明:本教程不提供文档教程安装,但有视频教程,包括一些软件安装的安装包,后续项目也会开源给大家。

  该教程主要说明,从零开始收集数据集,到标注数据集,最后训练数据集以及一些工具的使用。主要分为了六个步骤,

1.数据集的收集,

2.数据集存放文件格式,

3.标注数据集,

4.数据集的划分,

5.训练自己的yolov5模型,

6.使用自己训练的模型进行目标识别,

大体步骤就分为这些,步骤比较多,初学还是挺不容易的。

1.收集数据集

在进行模型训练时,首先我们要确定我们要进行目标识别的对象,本教程用到的是玉米病害,这里我们说一下什么样的的数据集对训练更有优势。

(1).图片大小尽量一致

(2).图片尽可能清晰

(3).数据集数据尽可能多

(4).环境多样性的图片

 

我这次搜集了玉米相关的叶片病变识别,以及健康叶的识别gls(南方叶斑病)、nls(北方叶斑病)、nlb(北方枯叶病)、以及健康叶,进千张图片。

6a6a692f027c40608ac9435da50f0f5b.png

在收集图片时,尽可能的重命名一下图片,在你标注数据集时,它会有大用处。

2.数据集存放文件格式

收集好后,接下来我们准备好文件格式,

文件名VOCdevkit

├── VOC2007

│ ├── JPEGImages  存放需要打数据集图片文件

│ ├── Annotations  存放标注的标签文件

│ ├── predefined_classes.txt  定义自己要标注的所有类别

!!!:VOCdevkit一定不要放在有中文名的路径中,如果你的电脑名称时中文,没关系,你放在d盘或其他盘即可。

fa3d71ed586144a29ad5054a9e6366cd.png

e92fa8232c4c46efb908e73b74bb3b52.png

 !!!:predefined_classes.txt这个文件存放你想要标注的数据集种类,我这里识别四个目标,就需要创建四个数据,一种对应一种类型。

b8201bd2d20e4cbba78ffb605dca5f7e.png

 

一定创建这样的文件格式,到时候划分数据集,就可以直接使用的下面代码进行数据集划分。

到这里数据集就收集完毕,下面进入数据集的标注。

3.标注yolo数据集

我们使用labelimg进行数据集的标注。

13051b644ac748f99a6827e46db1c059.png

首先我们来安装labelimg,

在win桌面按组合键win+R打开终端输入下面指令,

pip install labelimg -i Simple Index

 

安装成功后,下面正式进入数据集的标注

我的VOCdevkit放在桌面上,输入dir显示该目录的文件

67c6ca580e9d46f09d8b505fbff7e87d.png

进入桌面

9c21c943b5ff414f93215c535f4c5a13.png

输入dir,显示桌面目录文件,看是否有VOCdevkit文件,接下来进入该文件

4e697ecca0494672831b5d3811535f77.png

 

同理,在进入VOC2007文件夹

5bc7baefc8b7452cb1b05ab96e912b2b.png

 

接下来在该路径下,启动labelimg,指令如下

labelimg JPEGImages predefined_classes.txt

结果如下,

7ac59aafbbd84791853d64b18fef0249.png

 

 

2cf2060cbc014ae69a7b0189c31bebe7.png:待标注的图片文件夹路径(选择放置照片的JPEGimages文件夹)

efa2f1f6309447ada9abdc1150b984ba.png:以标注的数据文件(我们直接通过它选中YOLO_文件夹)

9aaced56e9074b46a54b74d6bf76361e.png格式:这里选择yolo格式(yolo训练需要)

如果你选择f056abf5a21b4056818f526b0bfe57fd.png也可以,使用它标注产生xmal(voc)文件,但是需要去网上找脚本,转换xmal(voc)文件为txt(yolo)文件。(本教程选yolo格式,也就是生产.txt文件)

接下来设置一些东西,

40f25ffc6c0f41b580e5d43902e4b436.png

 

接下来,我们介绍一下常用的一些操作

w:进入标注模式

a:上一张图片

d:下一张图片

0219f0c6ced24b2585827171dffece33.png:通过他退出标注模式(如果你标错标签,可点此退出,然后点你的标错的框,按delete即可删除)

 

具体怎么标注呢?

首先按下w进入转换为标准模式,然后就可以进行框图和打标签了,弄错了也没关系,点edit rectbox,然后选中你要删除的标注框,点击delect即可。

61cc69b0ccaf465db49c2c6c607d5d59.png

 

接下来把你的数据集全部标注完成就可以进入下一步了。

划分yolo数据集(验证集、训练集、测试集)

4.数据集的划分

在该vocdevkit路径下创建一个.py文件

 

8eb8cc94d773431b87e9060fb2edbaf1.png

 

.py文件下放入下面代码,修改代码最后的文件路径,改为你自己的文件路径

8154ec7467804a2fa06104b95591af96.png

import os, shutil, random

from tqdm import tqdm



"""

标注文件是yolo格式(txt文件)

训练集:验证集:测试集 (7:2:1)

"""





def split_img(img_path, label_path, split_list):

    try:

        Data = './VOCdevkit/VOC2007/ImageSets'

        # Data是你要将要创建的文件夹路径(路径一定是相对于你当前的这个脚本而言的)

        # os.mkdir(Data)



        train_img_dir = Data + '/images/train'

        val_img_dir = Data + '/images/val'

        test_img_dir = Data + '/images/test'



        train_label_dir = Data + '/labels/train'

        val_label_dir = Data + '/labels/val'

        test_label_dir = Data + '/labels/test'



        # 创建文件夹

        os.makedirs(train_img_dir)

        os.makedirs(train_label_dir)

        os.makedirs(val_img_dir)

        os.makedirs(val_label_dir)

        os.makedirs(test_img_dir)

        os.makedirs(test_label_dir)



    except:

        print('文件目录已存在')



    train, val, test = split_list

    all_img = os.listdir(img_path)

    all_img_path = [os.path.join(img_path, img) for img in all_img]

    # all_label = os.listdir(label_path)

    # all_label_path = [os.path.join(label_path, label) for label in all_label]

    train_img = random.sample(all_img_path, int(train * len(all_img_path)))

    train_img_copy = [os.path.join(train_img_dir, img.split('\\')[-1]) for img in train_img]

    train_label = [toLabelPath(img, label_path) for img in train_img]

    train_label_copy = [os.path.join(train_label_dir, label.split('\\')[-1]) for label in train_label]

    for i in tqdm(range(len(train_img)), desc='train ', ncols=80, unit='img'):

        _copy(train_img[i], train_img_dir)

        _copy(train_label[i], train_label_dir)

        all_img_path.remove(train_img[i])

    val_img = random.sample(all_img_path, int(val / (val + test) * len(all_img_path)))

    val_label = [toLabelPath(img, label_path) for img in val_img]

    for i in tqdm(range(len(val_img)), desc='val ', ncols=80, unit='img'):

        _copy(val_img[i], val_img_dir)

        _copy(val_label[i], val_label_dir)

        all_img_path.remove(val_img[i])

    test_img = all_img_path

    test_label = [toLabelPath(img, label_path) for img in test_img]

    for i in tqdm(range(len(test_img)), desc='test ', ncols=80, unit='img'):

        _copy(test_img[i], test_img_dir)

        _copy(test_label[i], test_label_dir)





def _copy(from_path, to_path):

    shutil.copy(from_path, to_path)





def toLabelPath(img_path, label_path):

    img = img_path.split('\\')[-1]

    label = img.split('.jpg')[0] + '.txt'

    return os.path.join(label_path, label)





if __name__ == '__main__':

    img_path = 'C:\\Users\\IOT_C3_306\\Desktop\\VOCdevkit_1\\VOC2007\\JPEGImages'  # 你的图片存放的路径(路径一定是相对于你当前的这个脚本文件而言的)

    label_path = 'C:\\Users\\IOT_C3_306\\Desktop\\VOCdevkit_1\\VOC2007\\YOLO_'  # 你的txt文件存放的路径(路径一定是相对于你当前的这个脚本文件而言的)

    split_list = [0.7, 0.2, 0.1]  # 数据集划分比例[train:val:test]

    split_img(img_path, label_path, split_list)

 

##运行代码,这样说明你的数据集划分成功。

cfc0c656b6774710bb3a026e257f58cf.png

 

进入VOCdevkit文件夹下多了个文件VOCdevkit,可以看到数据已经划分完成。

a935120157c9400a9ee52cc8fa62d050.png

5.训练自己yolov5模型

接下来我们就可以开始训练模型了,

将划分好的VOCdevkit文件夹直接复制进你的yolov5工程目录下,

dd17e6b563d94b648b27ce72d5217fba.png

8c6014fff8c74497a9e717561c43074a.png

在data文件夹下创建m_data.yaml文件,我这里是agr.yaml文件,你可以自己取名。

编译文件以下内容,

5c805b98d7ed410e8b93ee24fc567051.png

train: VOCdevkit/VOC2007/imageSets/images/train

val: VOCdevkit/VOC2007/imageSets/images/val

test: VOCdevkit/VOC2007/imageSets/images/test

#上面的内容可以不变

 

nc: 4#这里输入你的标注的目标种类数量,我这里有四个就填四。

 

names: [ 'healthy','nls','gls' ,'nlb']#这里是之前你创predefined_classes.txt文件夹的内容,也就是你目标对应的名称。 663511b0154846d2af8403d273c1089a.png

 

打开models文件复制yolov5s.yaml文件夹,这里我是yolov5s_agr.yaml文件夹,名字你可随意取

3d93e91d7c884ec586a6d9dda8985c0c.png

修改为你的nc目标种类数量即可

34e71defeba642a39ec82fdeda758cb5.png

 

接下来打开train.py文件

找到如下代码,

365e79dc2ac7455998253baa221acfc5.png

修改为你刚修改的文件路径

68a948ba802c43ada9b29b05e8dc9bc7.png

 

修改训练轮数,看你自己需求,最好不要低于100轮,

a3fdcedd8c9c47e4950d46dd64e35f33.png

 

根据你电脑的需求进行配置

61bc0ccf2a8945cfa0e177d0e1727687.png

a6ac174451be4f4c88c90cc1226d50b0.png

 

配置好后直接运动train.py代码,时间比较久,需等待等待,我用的电脑i9显卡3080ti

时间一个小时左右。

训练完,打runs/train/weight文件夹,这里会看到两个.pt文件,其中,best.pt是训练过程表现最好的模型,last是最后一次迭代的模型版本。

选择一个使用吧

e4f88902ad394f8da18658c486eb674c.png

6.使用自己的训练模型进行识别

在工程下创建weight文件夹用于存放训练好的模型,选择你刚训练好的模型文件,复制模型至weight,如下,我是改名了,你可以不用改名

457b3981c0c4453baee99cf821c8e519.png

接下来打开工程中的detect文件,下拉找到如下部分,修改配置

119b24bd16744a81afdb385cad590d5c.png

 

修改权重文件和识别源,这里我是一张照片文件源,在工程目录下

4c1750ee799e4d8a81c0de91a3520c7d.png

调用本地摄像头,更改为ROOT / ‘0’

 

这里只展示图片,

06ba7c35db93482bbdb6d690d81e0b3b.png这里更改识别置信度,这里我是0.4,意思就是识别相似度超过0.4,就框图,我们就可以看到显示

我们先看一下原图

c56de87da11a4328bbfdcbbce1725f86.png

接下来配置好了,运行detect.py,运行结束后,在runs文件夹下找运行结果。

我的运行结果如下

3f08039f74b344f5b95d980f2b0a83e5.jpeg

到此教程结束,谢谢!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值