https://github.com/zhengye1995/underwater-object-detection
https://github.com/jsnoc/underwater-objection-detection

数据分析

数据拆分

下载下来的数据,按照创建时间排序,可以发现视频前后之间存在关联性,但是按照编号排序,则不存在这种现象,怀疑是主办方估计将数据进行打乱编号了。

  • 按创建时间排序

image.png

  • 按编号排序

image.png
如果随机进行数据拆分,那么有可能会导致数据分布不平衡,考虑使用以下方式对数据进行拆分

  • 排除没有标注框的图片
  • 读取每张图片的创建时间,按照时间排序,间隔取样
  1. import os
  2. import time
  3. import shutil
  4. import re
  5. """
  6. 获取没有标注框的图片编号
  7. """
  8. # 载入标注文件
  9. import json
  10. with open('F:/jupyter/Underwater_detection/data/train/annotations/train.json') as f:
  11. a=json.load(f)
  12. ids=[]
  13. images_id=[]
  14. for i in a['annotations']:
  15. ids.append(i['id'])
  16. images_id.append(i['image_id'])
  17. print('训练集图片数量: ', len(a['images']))
  18. print('unique id 数量: ', len(set(ids)))
  19. print('unique image_id 数量: ', len(set(images_id)))
  20. image_list = set(images_id)
  21. import os
  22. tmp = os.listdir(r'F:/jupyter/Underwater_detection/data/train/image/')
  23. os_list = [int(i.replace('.jpg','')) for i in tmp]
  24. org_list = set(os_list)
  25. gaps = org_list - image_list
  26. print('缺少标注的图像数量:', len(gaps))
  27. # gaps 就是没有标注框的图片编号
  28. base = "../../data/train/image/"
  29. img_list = [os.path.join(base, i) for i in os.listdir(base)]
  30. imgId_time_dict = {}
  31. for img in img_list:
  32. last_modified_time = os.stat(img).st_mtime
  33. img_id = re.findall("(?<=/)\d{6}(?=.jpg)", img)
  34. imgId_time_dict[int(img_id[0])] = last_modified_time
  35. imgId_time_list = sorted(imgId_time_dict.items(), key=lambda x:int(x[1]), reverse=False)
  36. imgId_time_list = list(filter(lambda x:x[0] not in gaps, imgId_time_list)) # 去掉没有标注框的图片,并且按照图片最好一次修改的时间进行排序
  37. step = 6 # 间隔取样,每个 step 选 1 张 如拆分比例是 0.85:0.15,那么就是每 10 张抽取 1.5 张,既 每 20 张抽 3 张,平均下来就是每 6 张抽一张作为验证集
  38. val_set = set(imgId_time_list[::step])
  39. print("验证集数量", len(val_set))
  40. train_Set = set(imgId_time_list) - val_set
  41. print("训练集数量", len(train_Set))
  42. print("总的数量", len(train_Set)+len(val_set))