yolo训练小记


稍微记录一下跑yolo的过程。
打标的工具不用说了,labelimg和labelme,别忘了把VOC模式改成yolo。这俩直接 pip install 就可以。
至于训练的工具,我直接用的darknet,简单粗暴。
按价格来排的话:腾讯云>阿里云≈百度云>滴滴云
但我还是选择了大家都不喜欢的百度云。
腾讯云太贵,阿里云没有GPU镜像(可能是我没找着),滴滴云同样没有GPU镜像,而且那内网速度,你懂的,不要看着便宜就往里跳。
而且千万千万注意,CUDA不支持虚拟化,那种1/4颗、1/8颗的P4的服务器是没法用的!
如果没有镜像,那就老老实实装cuda。在这里下载:CUDA Toolkit 10.0 Archive
从老黄家下一个rpm源导入:
sudo rpm -i cuda-repo-rhel7-10.0.130-1.x86_64.rpm
sudo yum clean all
sudo yum install cuda
大概需要2.5G的流量。反正都按量计费了,带宽就拉满吧,要么还浪费时间。
装完了你可以把cuda加入path,也可以进cuda里的samples进行编译测试。
这些步骤都可以忽略,因为按时间扣费的机器不允许你这么做。
如果没装gcc和gcc-c++(即g++)的,这个时候先yum install * -y
CUDNN是可选项,用以加速你的训练的,实际观感勾了CUDNN差不多是1-1.5倍的速度。下载地址在这里:NVIDIA cuDNN
CUDNN不能直接wget,需要先注册一个老黄的开发者账号。CUDNN跟CUDA不是那种互相依存的关系,硬要比喻的话有点类似DLC的感觉,CUDNN封装成so的形式,安装就是把这些文件复制到CUDA的对应目录下面而已,具体操作省略。
然后git clone https://github.com/AlexeyAB/darknet.git
修改Makefile文件,不过并不是所有的都需要用到,我只说一下要改的部分:
line 1-5:

GPU=0//此处改成GPU=1
CUDNN=0//如果你有装CUDNN的话,改成1
CUDNN_HALF=0
OPENCV=0
AVX=0

line15:

USE_CPP=0//改成1

这个很玄学,我也不清楚为什么。我第一次用的时候0是能正常编译,后面就不行了,会出现compilation terminated due to -Wfatal-errors的报错,所以还是改成1吧。

line 18-22:

ARCH= -gencode arch=compute_30,code=sm_30 \
      -gencode arch=compute_35,code=sm_35 \
      -gencode arch=compute_50,code=[sm_50,compute_50] \
      -gencode arch=compute_52,code=[sm_52,compute_52] \
        -gencode arch=compute_61,code=[sm_61,compute_61]

这段其实可以直接删掉,按道理来说应该根据你设备的具体算力进行编写,但下面注释已经给了常用的型号数据,直接把注释覆盖掉原来的ARCH就可以。比如说我用的P4:

# GTX 1080, GTX 1070, GTX 1060, GTX 1050, GTX 1030, Titan Xp, Tesla P40, Tesla P4
# ARCH= -gencode arch=compute_61,code=sm_61 -gencode arch=compute_61,code=compute_61

line64:

NVCC=nvcc//改成/usr/local/cuda/bin/nvcc

改成nvcc的路径(理论上来说你如果前面有加入path的话就不用改)。

line99-107:

ifeq ($(GPU), 1)
COMMON+= -DGPU -I/usr/local/cuda/include/
CFLAGS+= -DGPU
ifeq ($(OS),Darwin) #MAC
LDFLAGS+= -L/usr/local/cuda/lib -lcuda -lcudart -lcublas -lcurand
else
LDFLAGS+= -L/usr/local/cuda/lib64 -lcuda -lcudart -lcublas -lcurand
endif
endif

与上一条同理。理论上装完了会有/usr/local下会有cuda指向cuda-x.xx,如果你不放心可以改成对应路径。

改完之后make就可以。如果./darknet有提示缺少参数,那就说明编译成功了。

darknet的目录结构里只需要关心一下这些:
darknet // 主目录

├── cfg                                // 配置文件夹
│   ├── {project_name}.data            // 关于训练文件的配置
│   ├── {model_name}.cfg               // 网络模型的配置
│   ├── {project_name_train}.txt      // 训练集
│   └── {project_name_valid}.txt      // 验证集
├── data                               // 网络事件库
│   ├── {project_name}.names           // 分类的名称
├── train                              // 训练集的文件夹
├── backup                             // 模型生成的地方
│ train.log

当然以上的结构只是个实例,不是固定的结构。
{project_name}.data文件如下:

classes= 1 //分类类别的个数
train  = /home/darknet/cfg/{project_name_train}.txt //存放位置任意
valid  = /home/darknet/cfg/{project_name_valid}.txt //存放位置任意
names = /home/darknet/data/{project_name}.names
backup = /home/darknet/backup/

你可以按二八原则分成训练集和测试集。
这个txt的格式一定要是绝对路径,不能用相对!

{model_name}.cfg可以参照里面的各种模型进行修改,以yolov3为例:
line1-7:

[net]
# Testing
batch=1
subdivisions=1
# Training
# batch=64
# subdivisions=16

训练的时候把Training下面的两行取消注释,同时注释上面两行。当然subdivision可以改高一点,如果你得显存不够的话。
后面的几个参数根据你自己的需要修改,比如说学习率之类的。

每个yolo层前的卷积层filters,都要修改:

[convolutional]
size=1
stride=1
pad=1
filters=255 //filter=3*(classes+5),比如我做的单分类,filters=3*6=18
activation=linear

[yolo]
mask = 0,1,2
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=80 //分类的类目个数
num=9  //一个样本里的最大检测数量
jitter=.3
ignore_thresh = .7
truth_thresh = 1
random=1

然后就可以开始训练了:

./darknet detector train {data文件路径} {模型cfg路径} {如果你是第一次训练,那就是空,如果是接着上次的训练,此处就是上一次训练的权重.weights文件路径} | tee train.log
//Windows下为 >> train.log

声明:@ギャズOfficial|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - yolo训练小记


我们终将知道,我们必须知道。