YOLOv3试验

十二月的第二天,我来更新了!从开学到现在一直在做师姐的棉花顶识别的毕业设计,一路下来真是坎坷啊,不过也一点一点的学到了不少干货,积累了很多经验 。今天主要记录一下YOLOv3。开始.......



YOLOv3到底是什么

首先并不是一开始就有了YOLOv3,YOLO有一系列的版本,YOLOv1,YOLOv2,YOLO9000,还有很多YOLO与其他算法结合的版本,YOLO我认为是为了提高区域检测的速度而生的,他是一步检测(faster-RCNN是两步检测),所以他的速度比faster-RCNN快很多,也适合棉花顶检测实时性的要求,但是提高实时性的代价就是牺牲了准确率,针对这一点从v1,v2,到现在的v3,准确率也在一步一步的提升。

贴一张YOLOv3-Tensorflow版本的demo检测图


检测图

再来一张Darknet-53的网络结构图


Darknet-53

这下好好解释一下这个Darknet-53

根据这个名字也能猜到这个网络有53层,可以说是我目前用到的网络最深的了,这个网络主要是引入了很多层的卷积层用来做特征提取,特别需要注意的是最后一层卷积层的卷积核的合数是根据255,是根据3*(80+4+1)=255计算得来的,不过现在的开源代码真的很良心,写的都非常具有普遍性。

还有Residual结构

他就是用来解决网络因为深度增加而导致性能下降的问题,


Residual

由Residual又引出了shortcut connections(捷径),可以越层连接。随着网络深度的增加,性能将逐渐变好。可以推测,当网络层数够深时,优化 Residual Function:F(x)=H(x)−x,易于优化一个复杂的非线性映射 H(x)。


跑YOLOV3-Tensorflow的过程

Github源码:GitHub - wizyoung/YOLOv3_TensorFlow: Complete YOLO v3 TensorFlow implementation. Support training on your own dataset.

1,首先下载YOLOv3的权重文件(用于迁移学习),放到data文件夹的Darknet-weight,然后修改convert_weight.py中的num_class,img_size和对应的model中的参数。

2,假设VOC数据集都已经做好了,将train.txt,val.txt,test.txt都做好,新建voc_names.txt(里面放的是标签的类别)放到misc文件夹中,运行parse_voc_xml.py。

改动很多,贴一下代码

# coding: utf-8

import xml.etree.ElementTreeas ET

import os

names_dict = {}

cnt =0

f =open('./voc_names.txt', 'r').readlines()

for linein f:

line = line.strip()

names_dict[line] = cnt

cnt +=1

voc_07 ='C:/Users/Administrator/Desktop/YOLOv3_TensorFlow-master/data/VOCdevkit/VOC2007/'

#voc_07 = 'E:/'

#voc_07 = '/data/VOCdevkit/VOC2007'

#voc_12 = '/data/VOCdevkit/VOC2012'

anno_path = [os.path.join(voc_07, 'Annotations')]

img_path = [os.path.join(voc_07, 'JPEGImages')]

#trainval_path = [os.path.join(voc_07, 'ImageSets/Main/trainval.txt'),

train_path = [os.path.join(voc_07, 'ImageSets/Main/train.txt')]

#                os.path.join(voc_12, 'ImageSets/Main/trainval.txt')]

test_path = [os.path.join(voc_07, 'ImageSets/Main/test.txt')]

val_path = [os.path.join(voc_07, 'ImageSets/Main/val.txt')]

def parse_xml(path):

tree = ET.parse(path)

img_name = path.split('/')[-1][:-4]

height = tree.findtext("./size/height")

width = tree.findtext("./size/width")

objects = [img_name, width, height]

for objin tree.findall('object'):

difficult = obj.find('Difficult').text

if difficult =='1':

continue

        name = obj.find('name').text

bbox = obj.find('bndbox')

xmin = bbox.find('xmin').text

ymin = bbox.find('ymin').text

xmax = bbox.find('xmax').text

ymax = bbox.find('ymax').text

name =str(names_dict[name])

objects.extend([name, xmin, ymin, xmax, ymax])

if len(objects) >1:

return objects

else:

return None

test_cnt =0

def gen_test_txt(txt_path):

global test_cnt

f =open(txt_path, 'w')

for i, pathin enumerate(test_path):

img_names =open(path, 'r').readlines()

for img_namein img_names:

img_name = img_name.strip()

xml_path = anno_path[i] +'/' + img_name +'.xml'

            objects = parse_xml(xml_path)

if objects:

objects[0] = img_path[i] +'/' + img_name +'.jpg'

                if os.path.exists(objects[0]):

objects.insert(0, str(test_cnt))

test_cnt +=1

                    objects =' '.join(objects) +'\n'

                    f.write(objects)

f.close()

train_cnt =0

def gen_train_txt(txt_path):

global train_cnt

f =open(txt_path, 'w')

for i, pathin enumerate(train_path):

img_names =open(path, 'r').readlines()

for img_namein img_names:

img_name = img_name.strip()

xml_path = anno_path[i] +'/' + img_name +'.xml'

            objects = parse_xml(xml_path)

if objects:

objects[0] = img_path[i] +'/' + img_name +'.jpg'

                if os.path.exists(objects[0]):

objects.insert(0, str(train_cnt))

train_cnt +=1

                    objects =' '.join(objects) +'\n'

                    f.write(objects)

f.close()

val_cnt=0

def gen_val_txt(txt_path):

global val_cnt

f =open(txt_path, 'w')

for i, pathin enumerate(val_path):

img_names =open(path, 'r').readlines()

for img_namein img_names:

img_name = img_name.strip()

xml_path = anno_path[i] +'/' + img_name +'.xml'

            objects = parse_xml(xml_path)

if objects:

objects[0] = img_path[i] +'/' + img_name +'.jpg'

                if os.path.exists(objects[0]):

objects.insert(0, str(val_cnt))

val_cnt +=1

                    objects =' '.join(objects) +'\n'

                    f.write(objects)

f.close()

gen_train_txt('train.txt')

gen_test_txt('test.txt')

gen_val_txt('val.txt')

这样YOLOv3需要的数据集格式就做好了。

3,将生成的train.txt放到根目录下,运行get_kmeans.py(主要是获取目标的识别框,每个目标有三种不同尺寸的识别框),将得到的值粘贴到data文件夹中的yolo_anchors.txt文件中。

4,最后将train.txt ,val.txt ,test.txt和voc_names.txt都放到data文件夹中

5最后就可以开始训练了

目前是在用cpu在训练,速度可以说是非常慢(等到GPU回来后,肯定是要爽一下的)

YOLOv3对于小目标检测结果不是很好,具体不好到什么程度现在也说不清楚,等实验结果吧.....

你可能感兴趣的:(YOLOv3试验)