这篇主要想记录一下yolo训练数据集的准备过程,毕竟数据才是价值所在。
下面说的内容都是基于darknet
,已测试。
关于数据集准备过程我们之前说过,重复的内容就不说了(定位模型训练手册),这里主要解决一下文件标注命名的问题,以及如何避免训练时遇到Too many or too few labels
问题,这个问题的根源就是文件标签没有按yolo的规则整理好。
这里简单梳理一下逻辑,方便理解我们要怎么给训练集里的数据命名。
首先回忆一下我们训练分类器需要准备哪几个文件:
-
xx.data:定义模型使用到的所有文件路径
classes = 144 train = data/nine_train.txt labels = data/nine.labels backup = backup/ top=1
-
xx.labels:所有分类的标签名称
斧头 螃蟹 沙发 帽子 老虎 气球 ...
-
xx.txt:所有训练集文件的绝对路径
/Users/train_file/nine/笔记本电脑_2dae8897ecb032a7daac908c31c596562.jpg /Users/train_file/nine/笔记本电脑_2dc1ad266d264d40bab65095a5ef86157.jpg /Users/train_file/nine/笔记本电脑_2dd25a294a4c7157f02aa92724d78ef31.jpg /Users/train_file/nine/笔记本电脑_2df0b329e546630547a4f1aa816d03ee4.jpg ...
假设我们现在有一批训练数据是这样的:
/Users/train_file/nine/笔记本电脑_2dae8897ecb032a7daac908c31c596562.jpg
/Users/train_file/nine/笔记本电脑_2dc1ad266d264d40bab65095a5ef86157.jpg
/Users/train_file/nine/笔记本电脑_2dd25a294a4c7157f02aa92724d78ef31.jpg
/Users/train_file/nine/笔记本电脑_2df0b329e546630547a4f1aa816d03ee4.jpg
...
在训练图片分类器时,图片的文件名要包含标注的标签信息,比如:
/Users/train_file/nine/笔记本电脑_2dae8897ecb032a7daac908c31c596562.jpg
,这个图片文件
文件名分为三个部分
- 2dae8897ecb032a7daac908c31c596562:随机标签,用来防止文件名重复,用随机字符串都可以
- 笔记本电脑:标注的图片内容
- Jpg:文件格式
这里要注意:yolo读取的是文件绝对路径,在整个路径中不能包含多个标签
什么意思呢?举个例子:
- 在
/Users/train_file/nine/笔记本电脑_2dae8897ecb032a7daac908c31c596562.jpg
这个文件路径中,笔记本电脑
是我们要分类的标签,因此不能用这种路径/Users/train_file/nine/笔记本电脑/笔记本电脑_2dae8897ecb032a7daac908c31c596562.jpg
,这样的话yolo会在路径中读取到两个笔记本电脑
标签,会提示Too many or too few labels 2
;
分类的标签不能存在包含与被包含的关系
举个例子:
-
我们当前的分类任务要分类这些标签:
斧头 螃蟹 沙发 鳄鱼 ...
但是如果我们现在要加一个分类,叫做
鱼
,此时就变成了:斧头 螃蟹 沙发 鳄鱼 鱼 ...
这时候
鳄鱼
和鱼
就组成了被包含的关系,也会报错。