当前位置:   article > 正文

MOT16数据集标签转换yolo格式(笔记)

mot16

笔记的代码参考博主【只会GAN的小朋友】http://t.csdn.cn/uj9YP的博客。

1:在MOT16数据集下创建一个 MOT_yolo.py 文件。

 2:将转换代码复制到MOT_yolo.py文件中。

  1. # MOT数据集gt.txt标签转换yolo标签
  2. '''
  3. 创建以下四个目录,用于存放图片和标签
  4. images/train
  5. images/val
  6. labels/train
  7. labels/val
  8. '''
  9. import os
  10. import shutil
  11. import numpy as np
  12. import configparser
  13. if not os.path.exists('images'):
  14. os.makedirs('images/train')
  15. os.makedirs('images/val')
  16. if not os.path.exists('labels'):
  17. os.makedirs('labels/train')
  18. os.makedirs('labels/val')
  19. def convert(imgWidth, imgHeight, left, top, width, height):
  20. x = (left + width / 2.0) / imgWidth
  21. y = (top + height / 2.0) / imgHeight
  22. w = width / imgWidth
  23. h = height / imgHeight
  24. # c = classes
  25. # return x,y,w,h
  26. return ('%.6f'%x, '%.6f'%y, '%.6f'%w, '%.6f'%h) # 保留6位小数
  27. for mot_dir in os.listdir('train'): # mot_dir是例如MOT17-02-FRCNN这种
  28. det_path = os.path.join('train', mot_dir, 'gt/gt.txt') # det.txt路径
  29. dets = np.loadtxt(det_path, delimiter=',') # 读取det.txt文件
  30. ini_path = os.path.join('train', mot_dir, 'seqinfo.ini') # seqinfo.ini路径
  31. conf = configparser.ConfigParser()
  32. conf.read(ini_path) # 读取seqinfo.ini文件
  33. seqLength = int(conf['Sequence']['seqLength']) # MOT17-02-FRCNN序列的长度
  34. imgWidth = int(conf['Sequence']['imWidth']) # 图片宽度
  35. imgHeight = int(conf['Sequence']['imHeight']) # 图片长度
  36. # 可以根据自己的需求,选择对应的标签填在cl中进行转换,MOT共有12种标签,去除掉车类基本就可以了
  37. cl = [1, 2, 6, 7, 8, 9, 10, 11, 12]
  38. # n = np.shape(cl)
  39. # cl = cl - np.ones(n)
  40. for det in dets:
  41. frame_id, _, left, top, width, height, classes = int(det[0]), det[1], det[2], det[3], det[4], det[5], int(det[7])
  42. box = convert(imgWidth, imgHeight, left, top, width, height)
  43. if classes in cl:
  44. box = box
  45. else:
  46. continue
  47. if '-' in ''.join(box) or float(box[0]) > 10.0 or float(box[1]) > 10.0 or float(box[2]) > 1.0 or float(
  48. box[3]) > 1.0:
  49. print(imgWidth, imgHeight, left, top, width, height)
  50. print(box)
  51. continue
  52. image_name = mot_dir + '-' + '%06d' % frame_id + '.jpg' # MOT17-02-FRCNN-000001.jpg
  53. label_name = mot_dir + '-' + '%06d' % frame_id + '.txt' # MOT17-02-FRCNN-000001.txt
  54. oldimgpath = os.path.join('train', mot_dir, 'img1',
  55. '%06d' % frame_id + '.jpg') # train/MOT17-02-FRCNN/img1/000001.jpg
  56. if frame_id <= seqLength // 2: # 前一半划分给训练集
  57. newimgpath = os.path.join('images', 'train', image_name) # images/train/MOT17-02-FRCNN-000001.jpg
  58. labelpath = os.path.join('labels', 'train', label_name) # labels/train/MOT17-02-FRCNN-000001.txt
  59. else: # 后一半划分给验证集
  60. newimgpath = os.path.join('images', 'val', image_name) # images/val/MOT17-02-FRCNN-000001.jpg
  61. labelpath = os.path.join('labels', 'val', label_name) # labels/val/MOT17-02-FRCNN-000001.txt
  62. if not os.path.exists(newimgpath): # 如果图片没复制过去,就复制,
  63. shutil.copyfile(oldimgpath, newimgpath) # 把旧图片复制到新的地方
  64. with open(labelpath, 'a') as f: # 写label文件
  65. f.write(f'0 {box[0]} {box[1]} {box[2]} {box[3]}\n')

相比于原来的代码,主要改了两个地方。

2.1  det.txt改为gt.txt

一是以前的代码会将超出图片的标注框删掉,转换完成后,会丢失接近一半的图片。这里将判断命令的brecontinue。所有图片都会被转换。源代码使用的是det.txt文件进行转换的,这里修改为gt.txt文件。

2.2 二是关于使用det.txt文件转换还是使用gt.txt文件转换

det.txt文件为官方提供的Faster-rcnn检测器检测得到的注释文件。基本大部分的目标应该都被检测到了。

gt.txt文件为人工标注的真实框注释文件。有博主说,使用gt.txt文件转换会有很多错误的框。这是因为在gt文件中,不仅标注了行人,也同时包含自行车、汽车等目标。参考博主【修行的猫_zq】的博客http://t.csdn.cn/2C7s9MOT数据集共标注有12个类。

 其中

 具体可以分为三个大类:

 参考文章中的说法,一般进行新人检测的训练,可以将第三类中的标签去掉就可以了。

2.3 至于为神马要搞这么多不同的类型,原论文中是这样讲的:

“人是许多场景中常见的对象类,但是我们应该跟踪基准测试中的所有人吗?例如,我们应该跟踪坐在长凳上的静态人吗?还是骑自行车的人?那些坐在玻璃杯后面的人怎么样?我们将MOT16的目标类别定义为所有直立的人,站立或行走,沿着观看光线可以到达,没有物理障碍,即反射,透明墙或窗户后面的人被排除在外。我们还将安全带或其他车辆上的人排除在目标班级之外。对于所有这些类与我们的目标类非常相似的情况(见图5),我们采用了与[32]中类似的策略。也就是说,一种方法既不会因为跟踪或不跟踪那些类似的类而受到惩罚,也不会受到奖励。由于在这些情况下,探测器可能会触发,我们不希望用一组假阳性来跟踪这一组检测,即骑自行车的人。同样地,我们也不想惩罚”

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

闽ICP备14008679号