系统环境:
硬件环境:
笔记本RTX 3060 6G显存
软件环境:
Windows 10
安装anaconda,准备python环境。
anconda是一个python的环境管理的工具,可以把不同项目的python环境独立开来。
防止不同的python依赖互相影响,出现老的项目依赖老的工具包,新的项目依赖新的工具包,互相之间出现冲突。
这里我创建两个独立的python环境,一个用来安装跑半自动标注工具,一个用来跑yolov8-seg。
打开Powershell(CMD也行),执行以下命令
# 创建标注工具conda环境
conda create -n label python=3.9.13
# 创建yolov8 conda环境
conda create -n yolov8 python=3.9.13
# 启动标注工具环境
conda activate label
下载标注工具源码,这里我用的是X-AnyLabeling
https://github.com/CVHub520/X-AnyLabeling/tree/main
有网络条件的用git clone,没有的点Download ZIP等他下载完。
在刚刚的命令行窗口下,进入X-AnyLabeling文件夹,安装依赖
# 进入项目文件夹
cd X-AnyLabeling
# 安装依赖
pip -r requirements-gpu.txt
安装完执行命令打开软件
python anylabeling/app.py
顺利的话长这样
用文本编辑器啥的创建一个分类文件classes.txt,一个分类一行,例如
people
dog
apple
....
我这里的数据集是圆棒端面一种分类,所以是一行
circle
回到标注程序,点击左上角文件夹图标打开你的数据集图片文件夹,点一下没反应就点两下,似乎有bug。顺利的话长这样。
点击【导入】【导入YOLO标签】,选择刚刚创建的classes.txt文件,然后选择标注文件要保存的位置,最好是个空的文件夹,或者是里面对应的有标注文件的文件夹,否则会闪退。
顺利的话右边的标签栏里就会显示classes.txt文件里保存的标签类型。
按ctrl+a进入半自动标注模式,选择里面的Segment Anything或者SAM-HQ,这是一个meta开源的万物皆可分割的图像大模型Segment Anything | Meta AI有兴趣可以了解下。
掂量自己的显卡水平选择Base或Large或Huge模型,运行耗时和要求的显存依次递增,但准确性也依次递增。Quant版本是对应版本的量化版,稍微牺牲一点精度,显存低一点也可以跑。可以每个都试下,大不了报错闪退。
这里想要流畅的通过软件里自动下载模型的话,需要有一定的网络条件,没有的同学可以通过热心的软件作者这里从百度网盘下载对应的模型
https://github.com/CVHub520/X-AnyLabeling/blob/main/docs/en/model_zoo.md
这里我选择了Segment Anything(ViT-Large Quant),顺利的话是这样的。
使用默认的输出【多边形】,按快捷键Q或点【+点】按钮,开始选择点标注的对象,他会自动框出这个目标,再按快捷键F或【完成对象】按钮,完成标注。对象标签里没有默认标签的话,需要手动输入一下。顺利的话是这样的。
按A或D切换上一张下一张继续标注,直到所有的图片标注完。
点击【导出】【导出YOLO标签】,至此标注工作完成。
有了半自动标注工具,标注这种分割类任务的数据,效率直接起飞。更多功能可以在上面项目链接里继续探索。
命令行执行,切换到准备给yolov8的python环境。
# 退出当前conda换进
conda deactivate
# 切换yolov8环境
conda activate yolov8
安装yolov8
pip install ultralytics
详细的教程可以到yolov8的中文文档里查看
主页 - Ultralytics YOLOv8 文档
安装PyTorch,这里我选择保守的1.13.1版本+CUDA11.7
pip install torch==1.13.1+cu117 torchvision==0.14.1+cu117 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu117
也可以去官网尝试更多新的版本
Previous PyTorch Versions | PyTorch
命令行执行,设置yolo相关的文件夹路径
# 设置执行过程文件夹路径
yolo settings runs_dir='/path/to/runs'
# 设置数据集文件夹路径
yolo settings datasets_dir='/path/to/datasets'
# 设置模型权重保存的文件夹路径
yolo settings weights_dir='/path/to/weights'
将上面标注好的数据按一定比例分成训练集和测试集,按以下路径存放,这里我按8:2的比例划分。写个简单的python降本打乱一下顺序,然后按比例划分即可。
images里的是图片,labels里是对应名称的标注文件txt。
创建一个数据集配置文件,mydata.yaml,填入刚刚的文件夹结构。这里val我直接复制了一份测试集test。
# 数据集文件夹相对路径,相对于之前设好的数据集文件夹
path: circle
# 训练数据集图片
train: images/train
# 测试数据集图片
val: images/val
# 验证数据集图片
test: images/val
# 标签类型,依次按0,1,2,3,4....列出
names:
0: circle
执行以下命令开始训练
这里我选这里最大的模型yolov8x-seg。yolov8n-seg,yolov8s-seg,yolov8m-seg,yolov8l-seg,yolov8x-seg,模型参数量依次递增,精度也递增,运行耗时也递增。
yolo segment train data=mydata.yaml model=yolov8x-seg.pt epochs=1000 imgsz=1280
imgsz:文档默认的图像输入尺寸是640,这里我设置了1280,对高分辨率的图片,理论上精度会更高。
epochs:让这批数据集一共反复训练多少次。
model:预训练模型路径。
data:数据集配置文件路径。
还有其他参数如:
batch:训练一次使用的图像数量,会根据这批图像去更新模型参数。设置-1为自动根据显存评估一次最大能运行的图像数量。比如数据集一共是1000张图片,batch设置10,就是训练一轮要分成100次,每次10张,设置越大显存占用越多。
patience:训练到发现效果不会再提升,持续多少轮之后,自动提前停止训练。
其他更多参数可以看官方文档。
训练 - Ultralytics YOLOv8 文档
训练完模型权重会保存在设置的weights文件夹里。
找到训练保存的最佳权重,保存再weights文件夹里的best.pt
执行以下命令进行推理,顺利的话会弹出识别结果。
yolo segment predict model=best.pt source='图片路径' show=True
model:参数权重路径
source:要识别的图片路径
show:是否显示推理结果
其他设置查看官方文档。
预测 - Ultralytics YOLOv8 文档
下篇将会更新如何将yolov8-seg转成TensorRT,并用C++调用,部署成可以供生产环境使用的版本。1280输入分辨率在3080显卡,单图片一次识别只需要65ms。