参见:
一、安装labelImg
Ubuntu 18.04 Linux安装labelImg的教程
# 将源码下载到本地
git clone https://github.com/tzutalin/labelImg.git
# 切换进入项目代码
cd labelImg
# 开辟一个新的anaconda环境,命名为yolo
conda create -n yolo
# 进入yolo环境
conda activate yolo
# 安装基础python环境,conda会同时下载pip工具
conda install python=3.7
sudo apt-get install pyqt5-dev-tools
pip install -r requirements/requirements-linux-python3.txt
make qt5py3
python3 labelImg.py
二、制作数据集标签
参考:
把准备好的图片放到一个文件夹中,在LabelImg中打开这个文件夹。然后设置标签文件输出位置(change save Dir)。不要放在与图片相同的位置就行。然后对每张图片画框打标签。按w键可以画框,画完框后,就会弹出对话框,然后在对话框上写上标签名就行(这步工作就是说明图片上这个位置是什么东西)。打完标签后,你就得到两个文件夹。图片和标签。在标签文件夹中,你还得到了一个classes.txt文件。这个文件记录了数据集中所有类别。标签文件中记录的是引索。需要通过这个classes.txt文件才能知道对应的物品名称。图片和标签两个文件夹中的文件一一对应,它们名字相同,后缀名不同。然后你需要把数据分为训练集和测试集,比例要适中。
此时,你拥有4个文件夹和一个class.txt文件。
- train图片
- train标签(与train 图片一一对应,名字相同,后缀不同)
- test图片
- test标签 (与test 图片一一对应,名字相同,后缀不同)
labelImg
还支持文件夹的导入,在标完一张后,在左侧选择Next Image
就可以切换到下一张继续了。输出格式部分,目前labelImg
支持YOLO
和PascalOVC
2种格式,前者标签信息是存储在txt
文件中,而后者是存储在xml
中
打完标签后,就可以进行保存了,图片和标签文件我们分开存放,但是文件名是对应的,只是扩展名不同
最后来看看标签文件的内容
一行代表一个目标,格式是
class x_center y_center width height
第一列是class
的索引,计数从0开始,比如这里的0代表的是basketball
,1代表的是face
;后4列是x_center/image_width
、y_center/image_height
、width/image_width
、height/image_height
,取值范围是0 ~ 1
三、数据集配置
在工程目录下找到data文件夹,在这个文件夹里新建一个文件夹。可以任意命名(为方便说明,这里用命名为mydataset。在mydataset下新建两个文件夹。一个命名为images,另一个命名为labels。这两个文件夹名字是规定的,不能随意。然后分别在这两个文件夹下都新建两个文件夹,命名为train,test。
然后把第六步得到的4个文件夹中的文件转移到对应目录中
- train图片->images/train
- train标签->labels/train
- test图片->images/test
- test标签->labels/test
四、训练配置文件
1. 打开工程目录/models/yolov5s.yaml文件(如果训练的是其他模型则打开其他模型的yaml文件),然后把nc改为第六步中classes.txt中类别的数量。(你数据集中标签了多少样东西,这个数字就是几)
2. 打开工程目录/data/coco128.yaml文件。
把train:设置为第六步的train图片的存放位置
把val:设置为第六步的test图片的存放位置
程序会自动搜索labels文件的位置。这也就是第六步为什么要规定图片与标签文件夹名字的原因。这个搜索是通过简单字符串替换实现的
把nc:改为数据集的类别数目(1中的一样)
把names改为类别名称,顺序要和第六步得到的classes.txt中的一样。
五、训练权重
命令行切换到工程目录下。运行命令(运行之前确保修改的配置文件都保存好了)
python train.py --img 640 --data data/coco128.yaml --cfg models/yolov5s.yaml --weights weights/yolov5s.pt --batch-size 8 --epochs 50
这些参数根据实际情况进行调整。–cfg 指示用到的模型的配置文件的位置。–weights 指示对应模型权重文件的位置。
在开始训练前。会打印输出的位置。我们会得到训练指标,训练后的两个权重文件(一个是最佳权重,一个是最后一轮训练得到的权重)。
训练完成后,就可以去那个目录查看结果。
六、用训练的权重结果做预测
与第四步一样,不同的是权重文件的位置变了
python detect.py --source 0 --weights=“weights/yolov5s.pt”。改一下权重路径就行。
=>python detect.py --source 0 --weights=“runs\train\exp3\weights\best.pt”
source 参数说明
如果是0,则打开摄像头
如果是图片路径,则对图片进行预测。结果路径会打印
如果是文件夹,则对文件夹中的图片和视频进行预测。
如果是视频,则对视频进行预测。
七、使用公开的数据集进行训练
ROBOFLOW 提供了一些公开的数据集,我们下载其中的口罩数据集进行训练,链接是 Mask Wearing Object Detection Dataset, 如果原网站无法访问的话,可以到下面的链接下载
下载下来是一个压缩包,解压后,文件夹内的文件结构是这样的
其中文件夹train
包含了参加训练的图片以及对应的label
文件,两者只有扩展名不同而已,目前图片只有105张。我们将包含数据集的文件夹重命名为mask
,存储在yolov5
工程的同级目录下
接着修改mask/data.yaml
文件内容为
(base) xugaoxiang@1070Ti:~/Works/github/mask$ cat data.yaml
train: ../mask/train/images
val: ../mask/valid/images
nc: 2
names: ['mask', 'no-mask']
最后修改yolov5/models/yolov5s.yaml
,将nc = 80
修改为nc = 2
,因为数据集中只有mask
和no-mask
2个类别
接下来执行训练命令
cd yolov5
python train.py --img 640 --batch 16 --epochs 300 --data ../mask/data.yaml --cfg models/yolov5s.yaml --weights ''
训练结束后,在weights
文件夹下就生成了best.pt
和last.pt
,到mask/test/images
找些图片测试一下
python detect.py --weight weights/best.pt --source ../mask/test/images/1224331650_g_400-w_g_jpg.rf.b816f49e2d84044fc997a8cbd55c347d.jpg