darknet框架

Darknet和YOLO关系

Darknet和yolo的关系,tensorflow和yolo的关系,torch和yolo的关系,keras和yolo的关系,都是一个关系,yolo是方法,其他都是框架。

特点

  • Darknet深度学习框架是由Joseph Redmon提出的一个用C和CUDA编写的开源神经网络框架。它安装速度快,易于安装,并支持CPU和GPU计算。
  • YOLO(You Only Look Once)是Joseph Redmon针对这一框架提出的核心目标检测算法。

YOLO算法优点缺点

  • YOLO的速度非常快。在Titan X GPU上的速度是45 fps(frames per second),加速版的YOLO差不多是150fps。

  • YOLO是基于图像的全局信息进行预测的。这一点和基于sliding window以及region proposal等检测算法不一样。与Fast R-CNN相比,YOLO在误检测(将背景检测为物体)方面的错误率能降低一半多。

  • 可以学到物体的generalizable-representations。可以理解为泛化能力强。

  • 位置精确性差,对于小目标物体以及物体比较密集的也检测不好,比如一群小鸟。

  • YOLO虽然可以降低将背景检测为物体的概率,但同时导致召回率较低。

代码结构

  • cfg :cfg文件夹内是一些模型的架构,每个cfg文件类似与caffe的prototxt文件,通过该文件定义的整个模型的架构。
  • data : data文件夹内放置了一些label文件,如coco9k的类别名等,和一些样例图(该文件夹主要为演示用,或者是直接训练coco等对应数据集时有用,如果要用自己的数据自行训练,该文件夹内的东西都不是我们需要的)
  • src : src文件夹内全是最底层的框架定义文件,所有层的定义等最基本的函数全部在该文件夹内,可以理解为该文件夹就是框架的源码;
  • examples: examples文件夹是更为高层的一些函数,如检测函数,识别函数等,这些函数直接调用了底层的函数,我们经常使用的就是example中的函数;
  • python: python文件夹里是使用python对模型的调用方法,基本都在darknet.py中。
  • include: include文件夹,顾名思义,存放头文件的地方
  • scripts: scripts文件夹中是一些脚本,如下载coco数据集,将voc格式的数据集转换为训练所需格式的脚本等

darknet安装

# 下载源码
git clone https://github.com/pjreddie/darknet.git

# 配置,修改makefile,如需使用CUDA进行GPU计算,修改Makefile文件,设置GPU为1。其它同理
GPU=1
CUDNN=0
OPENCV=0
OPENMP=0
DEBUG=0

# 编译
make

使用预先训练模型测试

# 下载预训练权重
wget https://pjreddie.com/media/files/yolov3.weights

# 运行命令检测,没有使用gpu所以时间有点长
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

Loading weights from yolov3.weights...Done!
data/dog.jpg: Predicted in 68.859996 seconds.
dog: 100%
truck: 92%
bicycle: 99%

训练模型

收集图片

我收集了一组无人机的图片

53

做标签

用于深度网络训练的数据集做标注的方法和工具有好多,像Labelme、labelImg、yolo_mark、Vatic、Sloth等等,此处暂时只介绍其中的一种标注工具:labelImg。

打开无人机所在目录

54

标记图片然后保存

55

新建一个train_images和val_images,分别放入一个训练集以及一个验证集

xml转txt

标签文件是xml格式的,yolo要求是txt(每张图片对应一个txt文件,txt的文件名要和图片的文件名一个)

xml转txt代码(python3)如下:

#此代码和data文件夹同目录
import glob
import xml.etree.ElementTree as ET


#  类名
class_names = ['uav']
#  xml文件路径,train_images只需改为val_images就可以处理val_images的了
path = 'data/train_images/' 

#  转换一个xml文件为txt
def single_xml_to_txt(xml_file):
	tree = ET.parse(xml_file)
	root = tree.getroot()
	#  保存的txt文件路径
	txt_file = xml_file.split('.')[0]+'.txt'
	with open(txt_file, 'w') as txt_file:
		for member in root.findall('object'):
			#filename = root.find('filename').text
			picture_width = int(root.find('size')[0].text)
			picture_height = int(root.find('size')[1].text)
			class_name = member[0].text
			#  类名对应的index
			class_num = class_names.index(class_name)
			box_x_min = int(member[4][0].text)  # 左上角横坐标
			box_y_min = int(member[4][1].text)  # 左上角纵坐标
			box_x_max = int(member[4][2].text)  # 右下角横坐标
			box_y_max = int(member[4][3].text)  # 右下角纵坐标
			# 转成相对位置和宽高
			x_center = (box_x_min + box_x_max) / (2 * picture_width)
			y_center = (box_y_min + box_y_max) / (2 * picture_height)
			width = (box_x_max - box_x_min) / picture_width
			height = (box_y_max - box_y_min) / picture_height
			print(class_num, x_center, y_center, width, height)
			txt_file.write(str(class_num) + ' ' + str(x_center) + ' ' + str(y_center) + ' ' + str(width) + ' ' + str(height) + '\n')

#  转换文件夹下的所有xml文件为txt
def dir_xml_to_txt(path):
	for xml_file in glob.glob(path + '*.xml'):
		single_xml_to_txt(xml_file)


dir_xml_to_txt(path)

最后把这些txt文件都复制到train_images目录下

生成train.txt

train.txt文件包含train_images中所有图片的路径,每个图片一行

用下面脚本自动生成

#此代码和data文件夹同目录
import glob


path = 'data/'


def generate_train_and_val(image_path, txt_file):
    with open(txt_file, 'w') as tf:
        for jpg_file in glob.glob(image_path + '*.jpg'):
            tf.write(jpg_file + '\n')


generate_train_and_val(path + 'train_images/', path + 'train.txt')
generate_train_and_val(path + 'val_images/', path + 'val.txt')
准备UAV.names文件

名字随便起但是要是.names文件

uav  #自己需要探测的类别,一行一个
准备UAV.data文件

名字随便起但是要是.data文件

classes= 1				#修改为自己的类别数
train = data/train.txt
valid = data/val.txt
names = data/UAV.names
backup = backup/
准备.cfg文件

复制olov3.cfg 然后做几处修改:cp yolov3.cfg yolov3-uav.cfg

  • 每batch个样本更新一次参数。

  • 如果内存不够大,将batch分割为subdivisions个子batch,每个子batch的大小为batch/subdivisions。

classes=1

  • classes是类别数,这里只有一个类,所以设置为1,文件里一共有3处需要修改classes

filters=18

  • 将每个[yolo] 上方的第一个filters的值进行修改,计算方式为(5+classes)*3,如果classes为1,则为18,注意filters一共有多个我们只需要修改[yolo]上面的那一个,总共有三个。
下载预训练权重
wget https://pjreddie.com/media/files/darknet53.conv.74
开始训练

如有预训练模型,可追加在命令结尾

./darknet detector train data/UAV.data cfg/yolov3-uav.cfg  darknet53.conv.74

每迭代100次就会在backup文件夹上生成一个模型权重,当avg loss在好几个迭代中都没有下降,此时可以停止训练了

常见问题
  1. 碰到Can't open label file xxxx.txt的问题

一定要按照voc数据集的格式存放,首先存放txt坐标文件的文件夹要取名为labels,然后存放图片的文件夹要命名为Images。其它的几个文件夹在训练中用不到,因此可以不管。然后labels和Images文件夹一定要放在同一目录下,这样就ok啦。

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×