一、通过Xshell等工具连接到Linux服务器
由于我使用的是window电脑,所以需要借助第三方工具来连接服务器,使用mac系统或者Linux系统的话,可以直接在终端使用ssh连接到远程服务器。
可以在服务器中新建一个文件夹来放置项目所需的各种文件。
二、检查服务器中的cuda版本
在服务器终端中输入以下命令,查看cuda的版本,注意V需要大写
nvcc -V
可以看到服务器中的cuda版本是10.0
之所以要检查cuda的版本,是因为之前在cuda9.0版本下,训练数据集后,最后的检测失败了(但也不能排除我操作上的原因),看了许多博客,如果最后的检测不出结果,有可能是cuda版本的原因,这一点需要格外注意一下。
下载安装新的cuda,可以查询相关的博客。
三、下载安装darknet
执行命令:
git clone https://github.com/pjreddie/darknet.git
执行成功后会在当前目录下自动生成一个darknet文件夹
使用命令进入darknet:
cd darknet
文件夹中的文件如下,有些文件是后续生成或者上传进去的,所以你执行后的命令肯定跟下面截图的不一样,后续我会对这些多出来的文件一一讲解
四、更改配置文件Makefile
使用vim编译器打开Makefile文档:
vim Makefile
将GPU和CUDNN后面的数值0改成1,否则默认用CPU训练数据的话,速度会无比的缓慢,如果有安装OpenCV,那么可以在第三行将OPENCV的值也置为一,这里我只是检测了图片,因此没有安装OpenCV。
修改完成之后,在命令行输入make,否则修改的代码不会生效
make
五、测试一下yolov3的效果
去yolo官网下载一个yolov3.weights的权重,下载命令如下:
wget https://pjreddie.com/media/files/yolov3.weights
下载过程可能会特别缓慢,或者是下载失败,这时候可以去找一些网盘的资源,下载到本地后,输入命令rz上传文件到darknet目录下,如图所示:
上传完成权重文件之后,就可以测试一下yolov3了
确保当前目录在darknet下,执行命令:
./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights data/dog.jpg
./darknet:当前目录
test:表示是检测,不是训练
cfg/coco.data:配置文件,包括物体总的类别数量,训练和测试文件的路径,生成权重保存在什么目录下等配置信息,在使用yolov3训练自己的数据集的时候是需要创建一个这样的文件的
cfg/yolov3.cfg:训练和测试过程的配置文件,训练voc数据集时,主要是要根据是训练还是测试,打开/关闭相应的注释,后面会再提到这个文件。
yolov3.weights:下载的权重文件,相当于就是已经训练的很好的权重信息,测试图片时可以直接拿来用
data/dog.jpg:要测试的图片,在darknet/data目录下,有一些其他的图片也可以拿来测试。
执行命令以后,会出现如下的结果:
可以看到图片中的三个物体都被检测出来了
由于Linux服务器下不能查看图片,所以可以用sz命令,上传到本地来查看图片
上述的predictions.jpg,就是已经标记好的图片,输入命令:
sz predictions.jpg
可以在本地查看到图片如下:
六、下载上传VOC数据集
下载VOC数据集,官网如下,如果下载缓慢,也可以去找网盘资源
https://pjreddie.com/projects/pascal-voc-dataset-mirror/
下载如下三个压缩包到本地,使用rz命令上传到服务器中,放到darknet目录下:
七、解包生成相应的文件夹
使用命令进行解包:
tar xvf VOCtest_06-Nov-2007.tar
tar xvf VOCtrainval_06-Nov-2007.tar
tar xvf VOCtrainval_11-May-2012.tar
操作后,会在当前目录生成一个VOCdevkit文件夹,里面有VOC2007,VOC2012两个子文件夹,拿VOC2012文件夹举例,相应的目录结构如下:
这些文件夹解压时会自动生成,但是训练自己的VOC格式的数据集时需要手动创建
八、执行voc_label.py文件
将scripts文件下的voc_label.py拷贝到darknet目录下
cp scripts/voc_label.py ./
在darknet目录下,运行该py文件
python voc_label.py
运行完成后在VOCdevkit/VOC2007(VOC2012)就可以看到多了一个labels文件
在darknet目录下也会生成一些txt文件:
九、修改配置文件voc.data
修改配置文件voc.data。该文件位于darknet/cfg目录下,修改train和valid后面的路径,改为自己的路径
说明:
classes=20:VOC数据集一共20个类别
train=...:训练文件的路径,train.txt是运行上面的py文件生成的,每行都是训练图片的绝对路径
vaild=...:测试文件的路径,也是运行上面的py文件生成的
names=...:20个类别的名称,voc.name文件是内置在darknet里面的,训练VOC数据集时不用手动修改,但是训练自己的数据集时就要手动修改了
backup=...:训练过程中存放权重文件,有过程中的权重文件和最终训练完成的权重的文件
十、修改配置文件yolov3-voc.cfg
该文件在darknet/cfg目录下,打开yolov3-voc.cfg文件,将第6、7行training下的注释去掉,如果按照默认的batch=1,subdivisions=1,训练时会出现大量的nan
把里面的max_batches调小,可以显著降低训练时间
十一、下载预训练权重并进行训练
终端下执行如下命令,下载预训练权重,注意是在darknet目录下执行该命令。如果速度慢,就找网盘资源。
wget https://pjreddie.com/media/files/darknet53.conv.74
完成上面的所有工作后,就可以进行训练了,训练的代码:
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74
train:代表训练
其他的参数在测试yolov3效果时说明过,总之就是指定一些配置文件和权重等
训练的时长在GPU性能较好的情况下大概需要好几个小时,但是训练一段时间,当损失降的比较低时,可以提前终止训练。
训练结束后,在backup文件夹中,可以看到许多过程的权重文件,里面的任何一个都可以用于测试,当然训练的越久,效果也就越好,训练完成后,会有一个后缀为final的文件,那个就是最终的权重文件了(我这里偷懒没有训练到最后),注意yolov3-voc.backup也是可以用的,这个文件保存的是最新的权重信息。
十二、测试
我测试的是单张图片,我是将图片上传到data文件夹下,下面的XXX是图片的名称,当然data文件夹里面有些本来就有的图片,那个也可以用来测试
./darknet detector test cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_600.weights data/XXX.jpg
测试成功的话,会出现图片中某个物体的概率,(默认的阈值好像是50%),结果图片(也就是物体框起来的图片)就是predictions.jpg,上传到自己电脑就可以查看了。
测试时应该要修改配置文件yolov3-voc.cfg(打开,关闭注释即可),但是经过测试,发现用训练的batch和subdivisions也是可以测试成功的
十三、测试过程指定置信度阈值
测试过程中可以手动指定置信度阈值,在测试代码后加上,数值可以随意指定
-thresh 0.25
最后这个0.25就是置信度,代表相似度为0.25及以上的目标都会被标出
十四、最后
如果需要测试多张图片,可以参考:
如果想要了解一些参数的效果,可以参考:
参考博客:
【学习笔记—Yolov3】Yolov3训练VOC数据集&训练自己的数据集