假若是一个新机器,要做配置1.显卡驱动,2.安装cuda,3.配置cudnn,4.git下载darknet,5.配置参数,6.训练网络,7.测试网络几个步骤
之前使用的是gtx1050ti的笔记本进行的实验,但是跑了差不多五天了,还没有收敛,目前avg loss在0.3左右。然后收敛速度太慢了,就是用rtx2080ti进行配置,也是一步一步就行配置过来的。
在ubuntu中可以以下命令来检测是否安装了显卡驱动。
nvidia-smi
如果出现以下就表示已经有了显卡驱动
如果没有可以参考博客:https://mp.csdn.net/postedit/94722837
检测cuda的安装可以使用以下命令:
nvcc -V
如果显示
表示没有安装cuda,记得安装了cuda之后要将cuda的路径添加到环境变量中去,可以采用如下的操作:
sudo vi /etc/profile
export PATH=/usr/local/cuda-10.1/bin:$PATH
export LD_LIBRATY_PATH=/usr/local/cuda-10.1/lib64:$LD_LIBRARY_PATH
source /etc/profile
然后可以使用nvcc -V 查看cuda版本的信息。
如果安装了cuda的话,就是需要将cudnn下载下来,然后解压,将include以及lib64里面的文件对应的复制到cuda-10.1目录下的对应的includ和lib64中去。
可以使用以下命令:
cp {your cudnn_pkg_path}/include/cudnn.h /usr/local/cuda-10.1/include/
cp {your cudnn_pkg_path}/bin/* /usr/local/cuda-10.1/bin/
然后使用以下命令可以查看是否安装成功:
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
dark详细说明网址:https://pjreddie.com/darknet/yolo/https://pjreddie.com/darknet/yolo/
github详细网址以及配置说明:https://github.com/AlexeyAB/darknet
可以看到需求是:cmake,ubuntu自带的,cuda,opencv,cudnn等等。
可以先使用以下的命令将github上的项目拷贝下来。然后使用tar zxvf xxxx.tar解压。再进入到解压的文件夹,进行配置make
git clone https://github.com/AlexeyAB/darknet
4.1配置使用gpu加速:
通过下面的可以看到使用vi Makefile修改里面的配置文件:如下是我修改的配置。
opencv 安装可以使用:(如果不是desktop桌面版的话可以不用安装opencv,因为server服务器版本没有图形界面是使用不了的,但是桌面版的话可以看到avg loss的曲线,服务器版本看不了。)
sudo apt-get install libopencv-dev
配置完成了之后就可以使用make命令进行make了。
以下是我使用make进行编译的结果,第一次编译的时候报了g++:command not found命令找不到,然后我使用 sudo apt-get install g++,安装了之后就可以make了
make完成了之后可以发现有了之前没有darknet文件
5.1github项目怎么训练说明。
先使用github项目本身的进行测试。github上的项目是使用voc数据集
1是与卷积层的预训练的权重文件,可下载可不下载。
2是voc数据集的训练集和测试集。
先下载他推荐的数据集voc数据集。下载完成之后上传到服务器(可以使用xftp传输,很快的,这个数据集有点大)。
如图,数据集已经被我上传到服务器了。
解压数据
tar -xvf VOCtest_06-Nov-2007.tar
tar -xvf VOCtrainval_06-Nov-2007.tar
tar -xvf VOCtrainval_11-May-2012.tar
然后会发现多了一个文件夹VOCdevkit,里面就是数据集。
2.1是生成voc标签文件的py程序文件,由于这个里面有路径什么的,因此我们得修改voc_label.py文件里面的路径。如果你的py文件和数据集文件夹是放在同一个路径,就不需要更改了,直接使用python3 voc_label.py就可以了。
执行了python3 voc_label.py之后会发现多了几个txt文件
3.由于windows下没有预装python,因此他给了一个windows下的python安装链接,这个我们可以忽略
4.是叫你运行这个voc_label的文件,是为了得到训练集和测试集的标签文件
5.是将训练集的所有标签文件添加到train.txt中去,这里我们可以使用命令:
cat 2007_train.txt 2007_val.txt 2012_*.txt >train.txt
6.设置yolov3-voc.cfg文件,如果是训练就将testing注释掉,如果是测试就将training注释掉。
batch-64表示每次训练的批次。subdivisions=8表示分割训练的批次数,这个可以根据gpu的型号分批,GPU好点的可以设置为batch64 ,subdivisions=64。
5.2训练命令解读:
训练网络可以使用以下命令训练,由于已经make了,因此这个文件夹下会有一个darknet的文件
如果第一步你下载了那个卷积的文件,后面就加一个,如果没有下载就可以直接训练。
darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74
第一个darknet就相当于使用函数一样,
第二个detector就是detector ,
第三个train就是train,后面测试就使用test
第四个cfg/voc.data是训练集:如下,指向的是一个文件,里面有五行,
第一行是类别,voc是20类别的数据集。
第二行是训练集的文件地址
第三行是测试集的文件地址
第四行是数据集的类别名称,打开可看见如下显示:分别为类别1-20的对应的名字
第五行是backup,也就是训练网络的时候保留的权重的文件夹,这个darknet是每迭代1000次就保存一个weight文件到这个文件夹里面,具体如下,由于你没有开始训练,因此会是一个空的文件夹,这里我已经训练到了28000次了。
第五个cfg/yolov3-voc.cfg是训练数据的批次等信息。打开如下:
第六个就是卷积层的初始权重。
这个过程很漫长,我之前使用gtx1050ti跑了一个星期,avg loss还在0.5左右。然后使用rtx2080ti跑了不到大半天就迭代了28000次了。
测试就是使用训练好了的权重去测试测试集:
./darknet detector test ./cfg/voc.data ./cfg/voc.cfg ./backup/yolov3-voc_20000.weights
这里前面的四个都跟训练时候差不多,不过就是把train改成了test,然后第五个就是把之前的yolov3-voc.cfg文件里面的training注释,把test反注释,第六个backup里面得到的权重weight文件。如下图:
显示done之后就会让你输入图片的地址:
这里,我使用的是darknet自带的data/dog.jpg图像,然后可以看到使用了大约31milli-seconds就出结果了,而且下面会显示各种类别的概率,
bicycle: 61% 表示自行车61%的概率
dog: 96% 表示狗子96%的概率
bicycle: 30% 表示自行车96%的概率
car: 92% 表示汽车96%的概率
Not compiled with OpenCV, saving to predictions.png instead 这句话的意思是没有配备opencv,我在1050t的桌面ubuntu上测试了以下,使用这个之后会直接将预测结果的png图片显示出来。然后这个地方就显示不了,但是会将预测的图片保留,我把图片下载到windows下打开,如下:(说明一下:我这里是随机挑选一个训练的权重进行的测试,可能会欠拟合。但是钩子和汽车的概率挺高的。)
自定义目标检测的话呢,目前我还在实现中,具体修改的文件有names(检测类别名称),data(训练集、测试集所处的位置),cfg(网络设置)
一.修改cfg
首先创建cfg文件,可以使用命令(我这里使用的是digger,包括接下来所有包含digger的你都可以自定义为你想检测的名称)
cp /darknet/cfg/yolov3-voc.cfg /darknet/digger.cfg
然后修改digger文件
vi /darknet/digger.cfg
根据步骤
我这里自定义检测的目标是三类。
1.修改每次训练图片的批次,这个可以设置为batch=64,就相当于一次64张,但是实际是根据subdivision共同作用的。比如batcch=64,subdivision=8,就表示64分为8次每次8张送入。这个后期可调,如果出现报错
就表示subdivision设置过小了,应该设置大一些。比如可以取16,32,64等等。
2.更改subdivision,根据1里面的训练的时候不够再调都可以。
3.修改最大训练迭代次数。这个是根据类别进行计算的设置值为类别数X2000.也就是说如果你检测目标有三类,那么这个max_batch=6000。
4.设置步长,分别为百分之八十,百分之九十的最大批次数。我这里是4800,5400.
5.修改每一个yolo层里面的类别数classes=你要检测的类别数目,我这里设置的都为3.
6.设置fliters为(类别数+5)X3,我这里就是24了。
二.修改names
你可以自创建一个names文件,我项检测的挖掘机。所以使用命令创建了一个digger.names
里面包含三类目标
digger
bulldozer
tractor
三修改data
这个里面主要包含的就是训练集和测试集所处位置可以使用
cp /darknet/cfg/voc.data /darknet/digger.data
然后就是修改里面的data文件
vi /darknet/digger.data
比如更改类别数目改为3
train表示的就是你所使用的train.txt(里面每一行是你训练图片的绝对路径)的路径
test表示的是你所使用的test.txt(里面的每一行是你测试图片的绝对路径)的路径
names表示的是你第二部创建的names文件的绝对路径w
backup表示的是训练的时候得到的权重文件存放的路径。
关于train.txt已经test.txt的生成,可以先将训练的图片和测试的图片放在不同的文件夹。并且对每一个图片都使用标记工具进行标记得到对应的txt文件,比如img.jpg使用yolomark(不怎么好用),推荐使用labelImghttps://github.com/tzutalin/labelImg进行标记。对于每一个img.jpg会生成对应的img.txt里面每一行的第一个表示的就是names里面的类别(比如0表示digger,1表示bulldozer,2表示tractor),然后第二第三个分别代表所标注的目标的矩形区域正中心在img.jpg中相对x和y坐标(取值为0-1),第四第五表示的就是矩形区域的相对于img.jpg的宽度和高度。比如 0 0.5 0.5 0.5 0.5表示就当前第0类目标在img.jpg中中心是在正中心,宽高是各占一半全部图片的宽高。
完成了之后就使用语句
./darknet/darknet detector train ./darknet/digger.data ./darknet/digger.cfg
进行训练