Yolov5 7.0 训练自己的模型教程
教程说明:本教程不提供文档教程安装,但有视频教程,包括一些软件安装的安装包,后续项目也会开源给大家。
该教程主要说明,从零开始收集数据集,到标注数据集,最后训练数据集以及一些工具的使用。主要分为了六个步骤,
1.数据集的收集,
2.数据集存放文件格式,
3.标注数据集,
4.数据集的划分,
5.训练自己的yolov5模型,
6.使用自己训练的模型进行目标识别,
大体步骤就分为这些,步骤比较多,初学还是挺不容易的。
1.收集数据集
在进行模型训练时,首先我们要确定我们要进行目标识别的对象,本教程用到的是玉米病害,这里我们说一下什么样的的数据集对训练更有优势。
(1).图片大小尽量一致
(2).图片尽可能清晰
(3).数据集数据尽可能多
(4).环境多样性的图片
我这次搜集了玉米相关的叶片病变识别,以及健康叶的识别gls(南方叶斑病)、nls(北方叶斑病)、nlb(北方枯叶病)、以及健康叶,进千张图片。
在收集图片时,尽可能的重命名一下图片,在你标注数据集时,它会有大用处。
2.数据集存放文件格式
收集好后,接下来我们准备好文件格式,
文件名VOCdevkit
├── VOC2007
│ ├── JPEGImages 存放需要打数据集图片文件
│ ├── Annotations 存放标注的标签文件
│ ├── predefined_classes.txt 定义自己要标注的所有类别
!!!:VOCdevkit一定不要放在有中文名的路径中,如果你的电脑名称时中文,没关系,你放在d盘或其他盘即可。
!!!:predefined_classes.txt这个文件存放你想要标注的数据集种类,我这里识别四个目标,就需要创建四个数据,一种对应一种类型。
一定创建这样的文件格式,到时候划分数据集,就可以直接使用的下面代码进行数据集划分。
到这里数据集就收集完毕,下面进入数据集的标注。
3.标注yolo数据集
我们使用labelimg进行数据集的标注。
首先我们来安装labelimg,
在win桌面按组合键win+R打开终端输入下面指令,
pip install labelimg -i Simple Index
安装成功后,下面正式进入数据集的标注
我的VOCdevkit放在桌面上,输入dir显示该目录的文件
进入桌面
输入dir,显示桌面目录文件,看是否有VOCdevkit文件,接下来进入该文件
同理,在进入VOC2007文件夹
接下来在该路径下,启动labelimg,指令如下
labelimg JPEGImages predefined_classes.txt
结果如下,
:待标注的图片文件夹路径(选择放置照片的JPEGimages文件夹)
:以标注的数据文件(我们直接通过它选中YOLO_文件夹)
格式:这里选择yolo格式(yolo训练需要)
如果你选择也可以,使用它标注产生xmal(voc)文件,但是需要去网上找脚本,转换xmal(voc)文件为txt(yolo)文件。(本教程选yolo格式,也就是生产.txt文件)
接下来设置一些东西,
接下来,我们介绍一下常用的一些操作
w:进入标注模式
a:上一张图片
d:下一张图片
:通过他退出标注模式(如果你标错标签,可点此退出,然后点你的标错的框,按delete即可删除)
具体怎么标注呢?
首先按下w进入转换为标准模式,然后就可以进行框图和打标签了,弄错了也没关系,点edit rectbox,然后选中你要删除的标注框,点击delect即可。
接下来把你的数据集全部标注完成就可以进入下一步了。
划分yolo数据集(验证集、训练集、测试集)
4.数据集的划分
在该vocdevkit路径下创建一个.py文件
.py文件下放入下面代码,修改代码最后的文件路径,改为你自己的文件路径
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)
##运行代码,这样说明你的数据集划分成功。
进入VOCdevkit文件夹下多了个文件VOCdevkit,可以看到数据已经划分完成。
5.训练自己yolov5模型
接下来我们就可以开始训练模型了,
将划分好的VOCdevkit文件夹直接复制进你的yolov5工程目录下,
在data文件夹下创建m_data.yaml文件,我这里是agr.yaml文件,你可以自己取名。
编译文件以下内容,
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文件夹的内容,也就是你目标对应的名称。
打开models文件复制yolov5s.yaml文件夹,这里我是yolov5s_agr.yaml文件夹,名字你可随意取
修改为你的nc目标种类数量即可
接下来打开train.py文件
找到如下代码,
修改为你刚修改的文件路径
修改训练轮数,看你自己需求,最好不要低于100轮,
根据你电脑的需求进行配置
配置好后直接运动train.py代码,时间比较久,需等待等待,我用的电脑i9显卡3080ti
时间一个小时左右。
训练完,打runs/train/weight文件夹,这里会看到两个.pt文件,其中,best.pt是训练过程表现最好的模型,last是最后一次迭代的模型版本。
选择一个使用吧
6.使用自己的训练模型进行识别
在工程下创建weight文件夹用于存放训练好的模型,选择你刚训练好的模型文件,复制模型至weight,如下,我是改名了,你可以不用改名
接下来打开工程中的detect文件,下拉找到如下部分,修改配置
修改权重文件和识别源,这里我是一张照片文件源,在工程目录下
调用本地摄像头,更改为ROOT / ‘0’
这里只展示图片,
这里更改识别置信度,这里我是0.4,意思就是识别相似度超过0.4,就框图,我们就可以看到显示
我们先看一下原图
接下来配置好了,运行detect.py,运行结束后,在runs文件夹下找运行结果。
我的运行结果如下
到此教程结束,谢谢!