1.数据集
首先对数据进行标注,标注的工具LabelImg,标记参考:win10下使用labelImg标注图像
2.训练代码
使用PyTorch框架: yolov3下载(github)
3.数据预处理
3.1 将Annotations和images放入data目录下,并新建文件夹ImageSets,labels
3.2 运行根目录下makeTxt.py
将数据分成训练集,测试集和验证集,比例可以在代码设置。在ImageSets得到四个文件,其中我们主要关注的是train.txt,test.txt,val.txt,主要存储图片名称。
3.3 运行根目录下voc_label.py
生成labels下的具体内容,和data下的train.txt,test.txt,val.txt,得到完整的图片具体路径
4.配置文件
4.1 在data目录下新建xxx.data,配置训练的数据:
classes=1
train=data/train.txt
valid=data/test.txt
names=data/xxx.names
backup=backup/
eval=coco
4.2 在data目录下新建xxx.names,配置预测的类别:
xxx
4.3 网络结构配置,在工程下cfg目录下有很多的yolov3网络结构,我们本次采用的是yolov3-tiny.cfg
5.训练
python train.py --device 0 --data data/xxx.data --cfg cfg/yolov3-tiny.cfg --epochs 10 --weights weights/yolov3-tiny.weights
训练结束得到最好的模型: best.pt
6.预测
python detect.py --device 0 --names data/xxx.names --source data/samples/ --cfg cfg/yolov3-tiny.cfg --weights weights/best.pt --conf-thres 0.056
7.注意:
运行:tensorboard --logdir=runs --> http://localhost:6006/
device 设置: 0 or 0,1 or cpu
CUDA_VISIBLE_DEVICES=1 # 只有编号为1的GPU对程序是可见的,在代码中gpu[0]指的就是这块GPU;
CUDA_VISIBLE_DEVICES=0,2,3 # 只有编号为0,2,3的GPU对程序是可见的,在代码中gpu[0]、gpu[1]和gpu[2]分别指的是第0、2和3块。
8.遇到的问题
8.1 cuda 内存溢出:
import os
os.environ["CUDA_VISIBLE_DEVICES"] = '1'
8.2 OSError: [WinError 1455] 页面文件太小,无法完成操作
1.修改Dataloader中的num_workers参数为0(似乎仅针对windows系统下)
2.缩小batch_size
3.把训练的代码块放入if __name__=='__main__':中
8.3 GPU利用率低:
1.把batch_size设置大些(如batch_size=512),尽可能利用GPU;
2.train_loader中pin_memory=True,num_workers=8或16,提高计算速度。
8.4 命令行如何debug:
import pdb; pdb.set_trace() (n代表下一步)
参考:红白细胞的数据识别
补充:
Yolov5源码:https://github.com/ultralytics/yolov5
Yolov4源码:https://github.com/AlexeyAB/darknet
Yolov3源码:https://github.com/ultralytics/yolov3
【Yolo5 train.py详讲】:
https://www.freesion.com/article/9638973025/#11_nvidiaapex_3
【Keras+TF+Yolo3】掌握图像标注、训练、识别(tf2填坑):
https://cungudafa.blog.csdn.net/article/details/105074825
使用apex混合精度训练加速NN:
Apex源码:https://github.com/NVIDIA/apex