详解yolo3-darknet使用voc数据在ubuntu下配置检测目标以及自定义目标检测

 

假若是一个新机器,要做配置1.显卡驱动,2.安装cuda,3.配置cudnn,4.git下载darknet,5.配置参数,6.训练网络,7.测试网络几个步骤

之前使用的是gtx1050ti的笔记本进行的实验,但是跑了差不多五天了,还没有收敛,目前avg loss在0.3左右。然后收敛速度太慢了,就是用rtx2080ti进行配置,也是一步一步就行配置过来的。

1.显卡驱动

在ubuntu中可以以下命令来检测是否安装了显卡驱动。

nvidia-smi

如果出现以下就表示已经有了显卡驱动

如果没有可以参考博客:https://mp.csdn.net/postedit/94722837

2.安装cuda

检测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版本的信息。

3.配置cudnn,

如果安装了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

 

4.git下载darknet

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.配置并训练

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次了。

7.测试网络

测试就是使用训练好了的权重去测试测试集:

./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下打开,如下:(说明一下:我这里是随机挑选一个训练的权重进行的测试,可能会欠拟合。但是钩子和汽车的概率挺高的。
 

8.自定义目标检测:

自定义目标检测的话呢,目前我还在实现中,具体修改的文件有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

进行训练

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值