darknet-yolov3训练自己的数据

比眉伴天荒 2023-02-23 05:09 139阅读 0赞

注意:本篇博客直接使用VOC2007数据集

1.数据集

Labelimg软件构建数据集,Labelimg项目地址:https://github.com/tzutalin/labelImg,Labelimg快捷键:




















































Ctrl + u Load all of the images from a directory
Ctrl + r Change the default annotation target dir
Ctrl + s Save
Ctrl + d Copy the current label and rect box
Space Flag the current image as verified
w Create a rect box
d Next image
a Previous image
del Delete the selected rect box
Ctrl++ Zoom in
Ctrl— Zoom out
↑→↓← Keyboard arrows to move selected rect box

voc2007数据集目录结构 :

  1. ----voc2007
  2. ----Annotations
  3. ----ImageSets
  4. ----Main
  5. ----JPEGImages

在voc2007同目录下新建makeTXT.py,将数据集划分,并且在Main文件夹下构建4个TXT:train.txt,test.txt,trainval.txt,val.txt。代码如下:

  1. import os
  2. import random
  3. trainval_percent = 0.8
  4. train_percent = 0.8
  5. xmlfilepath = 'VOC2007\Annotations'
  6. txtsavepath = 'VOC2007\ImageSets\Main'
  7. total_xml = os.listdir(xmlfilepath)
  8. num = len(total_xml)
  9. list = range(num)
  10. tv = int(num * trainval_percent)
  11. tr = int(tv * train_percent)
  12. trainval = random.sample(list, tv)
  13. train = random.sample(trainval, tr)
  14. ftrainval = open('VOC2007/ImageSets/Main/trainval.txt', 'w')
  15. ftest = open('VOC2007/ImageSets/Main/test.txt', 'w')
  16. ftrain = open('VOC2007/ImageSets/Main/train.txt', 'w')
  17. fval = open('VOC2007/ImageSets/Main/val.txt', 'w')
  18. for i in list:
  19. name = total_xml[i][:-4] + '\n'
  20. if i in trainval:
  21. ftrainval.write(name)
  22. if i in train:
  23. ftrain.write(name)
  24. else:
  25. fval.write(name)
  26. else:
  27. ftest.write(name)
  28. ftrainval.close()
  29. ftrain.close()
  30. fval.close()

在 voc2007同目录下新建voc_labels.py,生成labels。代码如下:

  1. import xml.etree.ElementTree as ET
  2. import pickle
  3. import os
  4. from os import listdir, getcwd
  5. from os.path import join
  6. #sets=[('2012', 'train'), ('2012', 'val'), ('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
  7. sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
  8. classes = ["aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"]
  9. def convert(size, box):
  10. dw = 1./(size[0])
  11. dh = 1./(size[1])
  12. x = (box[0] + box[1])/2.0 - 1
  13. y = (box[2] + box[3])/2.0 - 1
  14. w = box[1] - box[0]
  15. h = box[3] - box[2]
  16. x = x*dw
  17. w = w*dw
  18. y = y*dh
  19. h = h*dh
  20. return (x,y,w,h)
  21. def convert_annotation(year, image_id):
  22. #in_file = open('VOCdevkit/VOC%s/Annotations/%s.xml'%(year, image_id))
  23. #out_file = open('VOCdevkit/VOC%s/labels/%s.txt'%(year, image_id), 'w')
  24. in_file = open('VOC%s/Annotations/%s.xml' % (year, image_id))
  25. out_file = open('VOC%s/labels/%s.txt'%(year, image_id), 'w')
  26. tree=ET.parse(in_file)
  27. root = tree.getroot()
  28. size = root.find('size')
  29. w = int(size.find('width').text)
  30. h = int(size.find('height').text)
  31. for obj in root.iter('object'):
  32. difficult = obj.find('difficult').text
  33. cls = obj.find('name').text
  34. if cls not in classes or int(difficult)==1:
  35. continue
  36. cls_id = classes.index(cls)
  37. xmlbox = obj.find('bndbox')
  38. b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
  39. bb = convert((w,h), b)
  40. out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
  41. wd = getcwd()
  42. '''
  43. for year, image_set in sets:
  44. if not os.path.exists('VOCdevkit/VOC%s/labels/'%(year)):
  45. os.makedirs('VOCdevkit/VOC%s/labels/'%(year))
  46. image_ids = open('VOCdevkit/VOC%s/ImageSets/Main/%s.txt'%(year, image_set)).read().strip().split()
  47. list_file = open('%s_%s.txt'%(year, image_set), 'w')
  48. for image_id in image_ids:
  49. list_file.write('%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg\n'%(wd, year, image_id))
  50. convert_annotation(year, image_id)
  51. list_file.close()
  52. os.system("cat 2007_train.txt 2007_val.txt 2012_train.txt 2012_val.txt > train.txt")
  53. os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt 2012_train.txt 2012_val.txt > train.all.txt")
  54. '''
  55. for year, image_set in sets:
  56. if not os.path.exists('VOC%s/labels/'%(year)):
  57. os.makedirs('VOC%s/labels/'%(year))
  58. image_ids = open('VOC%s/ImageSets/Main/%s.txt'%(year, image_set)).read().strip().split()
  59. list_file = open('%s_%s.txt'%(year, image_set), 'w')
  60. for image_id in image_ids:
  61. list_file.write('%s/VOC%s/JPEGImages/%s.jpg\n'%(wd, year, image_id))
  62. convert_annotation(year, image_id)
  63. list_file.close()
  64. os.system("cat 2007_train.txt 2007_val.txt > train.txt")
  65. os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt > train.all.txt")

2.环境

(1)git clone https://github.com/AlexeyAB/darknet

(2)cd darknet

(3)pip install -r requirements.txt

(4)make

(5)在项目根目录下新建weights文件夹,下载权重文件,将其放入weights文件夹中。

(6)测试:./darknet detect cfg/yolov3.cfg weights/yolov3.weights data/dog.jpg 或 ./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights data/dog.jpg

3.训练模型

(1)下载darknet53.conv.74,将darknet53.conv.74放入其中。

(2)在data目录下新建**.name文件,存放你的数据集类别名称。本文用coco.names:

  1. aeroplane
  2. bicycle
  3. bird
  4. boat
  5. bottle
  6. bus
  7. car
  8. cat
  9. chair
  10. cow
  11. diningtable
  12. dog
  13. horse
  14. motorbike
  15. person
  16. pottedplant
  17. sheep
  18. sofa
  19. train
  20. tvmonitor

(3)在data目录下新建**.data文件,本文用coco.data:

  1. classes = 20#类别数
  2. train = data\2007_train.txt#voc_labels.py生成的训练集的位置
  3. valid = data\2007_test.txt
  4. names = data\coco.names
  5. backup = backup\

(4) 更新cfg文件的classes,本文使用的classes=20。yolo上一卷积层的filters=3*(classes+5),其中5代表的是4个坐标+1个置信度。

(5)开始训练:python ./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg weights/darknet53.conv.74

注意:max_batches = 50200 ### 迭代次数

发表评论

表情:
评论列表 (有 0 条评论,139人围观)

还没有评论,来说两句吧...

相关阅读