当前位置:   article > 正文

【红外目标检测】用YOLOv5实现对VisDrone-DroneVehicle的目标检测_dronevehicle的yaml文件

dronevehicle的yaml文件

数据集介绍

不同时段不同城市区域背景的城市道路、居民区、停车场、高速公路红外 无人机视角 15532对 840*712 下载链接 https://github.com/VisDrone/DroneVehicle

数据集处理

我们只做红外部分的检测,将数据集下载修改成如下格式:

说明:在YOLO5源代码中data文件夹下建立VISDroneIR文件夹存放红外数据集,分为images(存放红外图片)、labels(存放转换完的label,暂时为空)、xml(存放原有的xml格式标签)三个文件夹,其中分别再分train、test、val三个文件夹

  1. VISDroneIR(数据集名字)
  2. ├── images
  3. ├── train
  4. ├── xx.jpg
  5. ├── test
  6. ├── xx.jpg
  7. ├── val
  8. ├── xx.jpg
  9. ├── labels
  10. ├── train
  11. ├── test
  12. ├── val
  13. ├── xml
  14. ├── train
  15. ├── xx.xml
  16. ├── test
  17. ├── xx.xml
  18. ├── val
  19. ├── xx.xml

新建visdroneiryolov5.py文件对原本的label进行处理,在labels文件夹下分别生成txt存放yolov5格式标签

  1. # -*- coding: utf-8 -*-
  2. import xml.etree.ElementTree as ET
  3. import os
  4. from os import getcwd
  5. sets = ['train', 'val', 'test']
  6. classes = ["car", "truck", "bus", "van", "freight car"]
  7. def convert(size, box):
  8. dw = 1. / (size[0])
  9. dh = 1. / (size[1])
  10. x = abs((box[0] + box[1]) / 2.0 - 1)
  11. y = abs((box[2] + box[3]) / 2.0 - 1)
  12. w = abs(box[1] - box[0])
  13. h = abs(box[3] - box[2])
  14. x = x * dw
  15. w = w * dw
  16. y = y * dh
  17. h = h * dh
  18. return x, y, w, h
  19. def convert_annotation(image_id,image_set):
  20. in_file = open('/home/yolov5-master/data/VisDroneIR/xml/%s/%s.xml' % ((image_set),(image_id)), encoding='UTF-8')
  21. out_file = open('/home/yolov5-master/data/VisDroneIR/labels/%s/%s.txt' % ((image_set),(image_id)), 'w')
  22. tree = ET.parse(in_file)
  23. root = tree.getroot()
  24. size = root.find('size')
  25. w = int(size.find('width').text)
  26. h = int(size.find('height').text)
  27. for obj in root.iter('object'):
  28. '''if obj.find('difficult').text is not None:
  29. difficult = obj.find('difficult').text
  30. if int(difficult) == 1:
  31. continue'''#数据集里部分标签里没有difficult
  32. cls = obj.find('name').text
  33. if cls not in classes:
  34. continue
  35. cls_id = classes.index(cls)
  36. #数据集里有三种形式标点
  37. if obj.find('polygon') is not None:
  38. xmlbox = obj.find('polygon')
  39. xmin = int(min((xmlbox.find('x1').text), (xmlbox.find('x2').text), (xmlbox.find('x3').text), (xmlbox.find('x4').text)))
  40. xmax = int(max((xmlbox.find('x1').text), (xmlbox.find('x2').text), (xmlbox.find('x3').text), (xmlbox.find('x4').text)))
  41. ymin = int(min((xmlbox.find('y1').text), (xmlbox.find('y2').text), (xmlbox.find('y3').text), (xmlbox.find('y4').text)))
  42. ymax = int(max((xmlbox.find('y1').text), (xmlbox.find('y2').text), (xmlbox.find('y3').text), (xmlbox.find('y4').text)))
  43. if obj.find('bndbox') is not None:
  44. xmlbox = obj.find('bndbox')
  45. xmin = int(xmlbox.find('xmin').text)
  46. ymin = int(xmlbox.find('ymin').text)
  47. xmax = int(xmlbox.find('xmax').text)
  48. ymax = int(xmlbox.find('ymax').text)
  49. if obj.find('point') is not None:
  50. xmlbox = obj.find('point')
  51. xmin = int(xmlbox.find('x').text)
  52. ymin = int(xmlbox.find('y').text)
  53. xmax = int(xmlbox.find('x').text)
  54. ymax = int(xmlbox.find('y').text)
  55. b = (xmin, xmax, ymin, ymax)
  56. print(b)
  57. b1, b2, b3, b4 = b
  58. # 标注越界修正
  59. if b2 > w:
  60. b2 = w
  61. if b4 > h:
  62. b4 = h
  63. b = (b1, b2, b3, b4)
  64. bb = convert((w, h), b)
  65. out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
  66. wd = getcwd()
  67. for image_set in sets:
  68. #如果不存在label文件夹即建立
  69. if not os.path.exists('/home/yolov5-master/data/VisDroneIR/labels/%s/' % (image_set)):
  70. os.makedirs('/home/yolov5-master/data/VisDroneIR/labels/%s/' % (image_set))
  71. path = '/home/yolov5-master/data/VisDroneIR/images/%s/' % (image_set) # 文件夹地址
  72. files = os.listdir(path) # 读入文件夹
  73. for image_id in files:
  74. index = image_id.rfind('.')
  75. image_id = image_id[:index]
  76. list_file = open('/home/yolov5-master/data/VisDroneIR/labels/%s/%s.txt' % ((image_set), (image_id)),'w')
  77. convert_annotation(image_id,image_set)
  78. list_file.close()

建立VisDroneIR.yaml文件对路径进行存储

  1. path: /home/Newdisk/wyt/yolov5-master/data/VisDroneIR # dataset root dir
  2. train: images/train # train images (relative to 'path')
  3. val: images/val # val images (relative to 'path')
  4. test: images/test # test images (optional)
  5. # Classes
  6. nc: 5
  7. names:
  8. 0: car
  9. 1: truck
  10. 2: bus
  11. 3: van
  12. 4: freight car

 在官网下载所需预训练模型,并在对应文件里(这里以使用yolov5x为例,即yolov5x.yaml)对其中nc数进行更改

训练  

train.py中对部分数值进行更改,如有需要可自行对部分参数自行更改(比如epoch、batchsize等)

注意:上一步下载的模型放在下面第一行代码所写的路径里

  1. parser.add_argument("--weights", type=str, default="/home/Newdisk/wyt/yolov5-master/.torch/models/yolov5x.pt")
  2. parser.add_argument("--cfg", type=str, default="/home/Newdisk/wyt/yolov5-master/models/yolov5x.yaml", help="model.yaml path")
  3. parser.add_argument("--data", type=str, default= "/home/Newdisk/wyt/yolov5-master/data/VisDroneIR.yaml", help="dataset.yaml path")

运行train.py 

如果遇到大量图片没有被读入的情况,可以检查txt文件数值是否归一化、归一化后是否出现负数、路径里是否有中文 

验证

val.py中对部分数值进行更改,如有需要可自行对部分参数自行更改(比如epoch、batchsize等)

  1. parser.add_argument("--data", type=str, default="/home/yolov5-master/data/VisDroneIR.yaml", help="dataset.yaml path")
  2. parser.add_argument("--weights", type=str, default="/home/yolov5-master/runs/train/exp34/weights/best.pt", help="model path(s)")
  3. #这里exp选择最新训练出的就好

运行val.py 

测试 

val.py中将task中的val改为test

    parser.add_argument("--task", default="test", help="train, val, test, speed or study")

运行val.py 

上述部分直接改代码操作也可直接通过传参进行修改

如需进行数据集划分可参考这篇文章

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/593027
推荐阅读
相关标签
  

闽ICP备14008679号