目录
1.Pycharm的安装和虚拟环境调用(已经安装好的可以跳过此步骤)
1.1 下载pycharm软件
1.2 调用已创建虚拟环境(调用上一篇教程中创建好的虚拟环境)
2.标注自己数据集(已有数据集的这部分可跳过)
2.1配置标注软件labelme
2.2 标注自己数据集
2.3 制作自己数据集
3. 用YOLOv8训练自己数据集
3.1 部署YOLOv8代码
3.2 训练自己数据集
3.3 推理数据集
4. 总结
文章主要详细介绍如何标注自己数据集,然后从0开始利用YOLOv8训练自己数据集,推理数据集等,本文的相关torch环境主要基于上一篇文章,如果还没配置torch环境的可以阅读上篇文章配置,希望大家多多点赞关注支持,后期还会继续更新更多相关代码复现和模块替换等内容!!!
上一篇:从零配置torch深度学习环境详细教程
1.Pycharm的安装和虚拟环境调用(已经安装好的可以跳过此步骤)
1.1 下载pycharm软件
大家直接进入pycharm官网下载:Pycharm官网下载
大家进入官网后记得选择和自己相关系统的版本,然后我这边用的是专业版(Professional),专业版前30天是免费的,后续要收费(如果大家是在读学生的话可以申请自己学校的教育邮箱,然后教育邮箱可以免费使用Pycharm专业版),不过社区版也是可以的
压缩包下载好之后,大家下载好之后直接双击运行安装程序即可
下一步
设置好自己的安装路径,然后点击下一步
在这一步的时候,我推荐是把这几个都选中,特别是添加将文件夹打开为项目,本人觉得还是很好用的,都选择完毕后点击下一步
然后继续点击下一步
点击安装,最后成功安装就可以了,安装完成后桌面上就会有pycharm界面了,大家可以先创建一个文件夹(文件夹名称不要带中文),然后将该文件夹在pychram打开
打开后就是以下页面
1.2 调用已创建虚拟环境(调用上一篇教程中创建好的虚拟环境)
首先,点击右下角的这个环境配置器部分,由于我之前配置过环境,所以显示的是我的环境名称(pidenet_code)大家不用在意,打开自己的就可以
点击之后,依次打开添加本地解释器
大家打开之后,依次进行选择现有,conda,然后环境的下拉键,就可以显示出自己所建的虚拟环境,大家选择自己在上一篇教程中建立的虚拟环境,然后点击确定就可以进入所建环境了
选择确认之后,右下角出现自己所选择环境名称后,则表示成功进入虚拟环境(我的虚拟环境名称是torch)
2.标注自己数据集(已有数据集的这部分可跳过)
2.1配置标注软件labelme
打开anaconda的终端,依次输入以下指令,即可创建一个名为labelme的标注环境
conda create -n labelme python=3.9
然后输入y ,回车
紧接着输入以下指令激活环境
conda activate labelme
输出下面这样则表述环境创建并激活成功
然后执行以下指令,安装标注软件
pip install labelme -i https://pypi.tuna.tsinghua.edu.cn/simple
这个的配置有时候加镜像也会很慢,会容易报错,大家多试几次,直到配置成功就行
出现以下界面就表示配置成功
然后就在当前界面输入以下指令,然后自动跳转至标注界面
labelme
出现这个界面表明已经打开了标注软件
2.2 标注自己数据集
紧接着我们开始标注自己的数据集,首先我们点击打开目录,然后将自己存放图片的文件夹打开(最好是路径和文件夹都不要带中文),具体操作步骤如下
选择好自己的图片所在文件夹路径之后点击下面的选择文件夹即可
点击之后文件夹内图片就会导入labelme标注软件,然后右下方会显示已导入图片(ps:我的图片是voc数据集里面随便找的两张,用作示例)
接下来大家可以点击上方的编辑,选择创建矩形,然后大家就可以利用这个矩形框对相应目标进行框选标注
大家框选完自己想标注的目标之后,就可以给目标定义一个名称,然后点击ok即可保存,下面是我标注了人(person)这个目标的示例
下面是我标注的所有目标,然后右边会显示标注的数量和目标名称,大家标注不同目标的话,只需定义不同目标名称即可
大家标注完之后点击下一张后会出现保存提示界面,一般会把标注的信息默认存在图片所在文件夹,大家也可以自定义保存路径
点击下一张后会在右下角显示是否已经标注且保存,已保存会有对号,大家可以检查一下,然后第二张的标注和第一张同理,后面的都按照这个方法标注保存即可
将自己数据集全部标注完成之后,会得到以下的内容,分别是图片和与其名称对应的.json标注文件
然后我们需要利用一个转换脚本代码,将这个.json文件转换为yolo格式的.txt文件
首先,我们在第一步的文件夹内右键点击建立一个新的.py格式文件
自定义好,py文件的名称后回车就可以新建一个名为json_to_txt的py文件
将以下转换代码粘贴到该文件
import json
import os
from tqdm import tqdmdef convert_label(json_dir, save_dir, classes):json_paths = os.listdir(json_dir)classes = classes.split(',')for json_path in tqdm(json_paths):path = os.path.join(json_dir, json_path)with open(path, 'r') as load_f:json_dict = json.load(load_f)h, w = json_dict['imageHeight'], json_dict['imageWidth']# save txt pathtxt_path = os.path.join(save_dir, json_path.replace('json', 'txt'))txt_file = open(txt_path, 'w')for shape_dict in json_dict['shapes']:label = shape_dict['label']label_index = classes.index(label)points = shape_dict['points']points_nor_list = []for point in points:points_nor_list.append(point[0] / w)points_nor_list.append(point[1] / h)points_nor_list = list(map(lambda x: str(x), points_nor_list))points_nor_str = ' '.join(points_nor_list)label_str = str(label_index) + ' ' + points_nor_str + '\n'txt_file.writelines(label_str)if __name__ == "__main__":json_dir = r'D:\my_dataset\json' ####将路径替换为你的json文件夹路径save_dir = r'D:\my_dataset\txt' ####将路径替换为你的txt文件夹保存路径classes = 'person' ####这里将自己标注的类别名称填进去,如果有还有其他标注目标,就在person后面加个,然后跟上就行#classes = 'person,others,others2,...' ####多个目标示例convert_label(json_dir, save_dir, classes)
然后将最下面的路径根据我的提示进行修改,并且将classes改为自己标注目标的名称即可(ps:json文件夹中只能有.json文件),运行代码后就会在保存路径中生成.txt文件
如果大家在运行时发生了以下报错
那么大家就在anaconda中打开自己的环境,或者打开终端界面,如下所示
其中()内的就是当前环境名称,大家确认好是自己的虚拟环境名称
然后输入以下指令回车后,就可以安装缺失的tqdm包
pip install tqdm -i https://pypi.tuna.tsinghua.edu.cn/simple
出现以下界面即表示安装成功
然后就可以直接运行上面那个代码了,会最终得到自己的txt文件
2.3 制作自己数据集
大家把自己的图片数据和txt数据分别放在两个不同文件夹内进行归类,然后再新建一个py代码,复制粘贴下面这些代码后,在最下面根据我的提示更改路径,然后运行(这个代码的主要功能是对训练集,验证集和测试集按照比例进行随机划分)
import shutil
import random
import os# 检查文件夹是否存在
def mkdir(path):if not os.path.exists(path):os.makedirs(path)def split(image_dir, txt_dir, save_dir):# 创建一级目录train_dir = os.path.join(save_dir, 'train')val_dir = os.path.join(save_dir, 'valid')test_dir = os.path.join(save_dir, 'test')# 创建二级目录train_images_dir = os.path.join(train_dir, 'images')train_labels_dir = os.path.join(train_dir, 'labels')val_images_dir = os.path.join(val_dir, 'images')val_labels_dir = os.path.join(val_dir, 'labels')test_images_dir = os.path.join(test_dir, 'images')test_labels_dir = os.path.join(test_dir, 'labels')# 创建所有需要的文件夹mkdir(train_dir)mkdir(val_dir)mkdir(test_dir)mkdir(train_images_dir)mkdir(train_labels_dir)mkdir(val_images_dir)mkdir(val_labels_dir)mkdir(test_images_dir)mkdir(test_labels_dir)# 数据集划分比例,训练集75%,验证集15%,测试集10%,按需修改train_percent = 0.75val_percent = 0.15test_percent = 0.10total_txt = os.listdir(txt_dir)num_txt = len(total_txt)list_all_txt = range(num_txt) # 范围 range(0, num)num_train = int(num_txt * train_percent)num_val = int(num_txt * val_percent)num_test = num_txt - num_train - num_valtrain = random.sample(list_all_txt, num_train)# 在全部数据集中取出trainval_test = [i for i in list_all_txt if not i in train]# 再从val_test取出num_val个元素,val_test剩下的元素就是testval = 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 = os.path.join(image_dir, name + '.jpg')srcLabel = os.path.join(txt_dir, name + '.txt')if i in train:dst_train_Image = os.path.join(train_images_dir, name + '.jpg')dst_train_Label = os.path.join(train_labels_dir, name + '.txt')shutil.copyfile(srcImage, dst_train_Image)shutil.copyfile(srcLabel, dst_train_Label)elif i in val:dst_val_Image = os.path.join(val_images_dir, name + '.jpg')dst_val_Label = os.path.join(val_labels_dir, name + '.txt')shutil.copyfile(srcImage, dst_val_Image)shutil.copyfile(srcLabel, dst_val_Label)else:dst_test_Image = os.path.join(test_images_dir, name + '.jpg')dst_test_Label = os.path.join(test_labels_dir, name + '.txt')shutil.copyfile(srcImage, dst_test_Image)shutil.copyfile(srcLabel, dst_test_Label)if __name__ == '__main__':image_dir = r'D:\my_dataset\image' ####图片文件夹路径txt_dir = r'D:\my_dataset\txt' ####txt文件夹路径save_dir = r'D:\my_dataset\dataset' ####划分后的保存路径split(image_dir, txt_dir, save_dir)
运行代码后,会按照规定文件夹格式对图片和标签进行存放,格式如下
dataset/
├── train/
│ ├── images/
│ └── labels/
├── valid/
│ ├── images/
│ └── labels/
└── test/├── images/└── labels/
3. 用YOLOv8训练自己数据集
3.1 部署YOLOv8代码
大家可以去YOLOv8的官网去下载代码包(尽量利用我的链接下载,我在链接中已经选好版本了,最新版本也可以用,但是有可能会因为python版本报错)
yolov8官方下载链接
大家打不开官网的也可以用百度网盘链接下载
yolov8网盘下载链接 提取码:x8yj
进入链接后,依次点击code和下载安装包进行下载
下载好之后解压,然后将解压文件在pycharm中打开,打开后是这样
打开后继续新建一个训练的.py文件脚本,以后大家就可以利用这个脚本去训练
from ultralytics import YOLO# Load a model
model = YOLO('yolov8n.yaml') # build a new model from YAML# 断点续训
#Load a model
#model =#YOLO(r'E:\anzhi\car\3\ultralytics-8.2.82\runs\detect\train27\weights\last.pt') # load a partially trained modelif __name__ == '__main__':#results = model.train(data=r'E:\anzhi\car\ultralytics\my.yaml', batch=80, epochs=10000, imgsz=640, resume=True,#workers=8, device=0)results = model.train(data=r'E:\anzhi\car\3\ultralytics-8.2.82\train.yaml',batch=40,close_mosaic=0,epochs=1000,imgsz=640,resume=True,workers=8,device=1)
然后大家将右下角的环境切换到之前配置的有torch包的环境
打开项目的终端,在终端输入以下命令配置yolov8所需包(一定要确定是在该环境内)
pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple
这个里面需要配置的包有点多,大家一定要确定完全配置好了再进行下一步,出现以下界面表示配置成功
3.2 训练自己数据集
大家依次点击ultralytics---cfg--datasets--voc.yaml,
打开之后是以下页面
我们接下来我们将其中的内容全部替换为以下内容,其中,上面三个都替换为之间建好数据集的训练、验证和测试集的路径,然后names下面将自己标注的目标个数和名称进行替换,如果只有一个目标那就只留下0,有多的就自己加上,切记,目标的名称也得修改(我这个是从voc数据集中截取了一部分,所有就有这些类别)
train: D:\my_dataset\voc\train # train images (relative to 'path') 128 images
val: D:\my_dataset\voc\valid # val images (relative to 'path') 128 images
test: D:\my_dataset\voc\test# Classes
names:0: person1: dog2: cow3: horse4: sheep
然后在上面找到该yaml文件右键复制该文件绝对路径
点击这个绝对路径就可以直接复制成功
复制成功后将该路径粘贴到我们之间创建的tain.py脚本中,就是以下位置
大家后面的指令可以先修改成我这样,这里面的batch表示批次数,epochs表示训练的轮次,resume表示是否打开中断续训,workers表示线程数,大家先按照我这个设置,等能跑起来没问题之后再自己调参数训练
batch=-1,epochs=10,imgsz=640,resume=True,workers=8
全部修改完成后,在该页面右键直接运行这个python文件即可
出现下面页面表示配置成功,已经开始调用gpu训练了
已经开始调用GPU了,速度还是比较快的(然后可以看到,我的训练集共有5527张,验证集有3409张,GPU显卡调用了5.3g)
紧接着大家耐心等待一段时间,等训练完成后会出现以下界面
然后最下面是相关结果的保存路径,打开自己的yolov8文件夹,然后按照对应路径打开就行,最终结果如下
这个里面就是所有的训练结果了
3.3 推理数据集
咱们在训练结果的文件夹中,找到weights文件夹,然后将其中的best.pt的路径进行复制(包括文件名称和后缀)
然后创建一个prediction的推理脚本,并将以下内容复制进去,然后将相应的路径进行修改,运行该脚本
from ultralytics import YOLOif __name__ == '__main__':# 使用训练好的权重文件加载模型model = YOLO(r'D:\Desktop\yolo\ultralytics-8.2.82\runs\detect\train3\weights\best.pt') #替换为自己训练好的best.pt文件的绝对路径# 推理参数设置results = model.predict(save=True, source=r'D:\my_dataset\voc\valid\images\2008_000026.jpg')# 推理的图片存放路径
得到以下的推理输出
这个是推理结果的保存地址,我们进入地址查看推理结果
可以看出,由于训练的次数比较少,因此存在了一个错误预测,不过由于右上角置信度比较低,所以还算不错(哈哈哈哈,毕竟只训练了10轮)
4. 总结
本篇文章从最基础的标注数据集开始教学,直到最终成功调用GPU训练本人标注数据集,整个过程超级详细,基本都可以成功复现,同时也希望能对大家有所启发。
博主后续将还会更新更多的与YOLO相关的一些复现和yolov8的模块替换和改进,希望大家继续关注博主!!!创作不易,希望大家多多关注点赞!!!