https://github.com/zhengye1995/underwater-object-detection
https://github.com/jsnoc/underwater-objection-detection
数据分析
数据拆分
下载下来的数据,按照创建时间排序,可以发现视频前后之间存在关联性,但是按照编号排序,则不存在这种现象,怀疑是主办方估计将数据进行打乱编号了。
- 按创建时间排序

- 按编号排序

如果随机进行数据拆分,那么有可能会导致数据分布不平衡,考虑使用以下方式对数据进行拆分
- 排除没有标注框的图片
- 读取每张图片的创建时间,按照时间排序,间隔取样
import osimport timeimport shutilimport re"""获取没有标注框的图片编号"""# 载入标注文件import jsonwith open('F:/jupyter/Underwater_detection/data/train/annotations/train.json') as f:a=json.load(f)ids=[]images_id=[]for i in a['annotations']:ids.append(i['id'])images_id.append(i['image_id'])print('训练集图片数量: ', len(a['images']))print('unique id 数量: ', len(set(ids)))print('unique image_id 数量: ', len(set(images_id)))image_list = set(images_id)import ostmp = os.listdir(r'F:/jupyter/Underwater_detection/data/train/image/')os_list = [int(i.replace('.jpg','')) for i in tmp]org_list = set(os_list)gaps = org_list - image_listprint('缺少标注的图像数量:', len(gaps))# gaps 就是没有标注框的图片编号base = "../../data/train/image/"img_list = [os.path.join(base, i) for i in os.listdir(base)]imgId_time_dict = {}for img in img_list:last_modified_time = os.stat(img).st_mtimeimg_id = re.findall("(?<=/)\d{6}(?=.jpg)", img)imgId_time_dict[int(img_id[0])] = last_modified_timeimgId_time_list = sorted(imgId_time_dict.items(), key=lambda x:int(x[1]), reverse=False)imgId_time_list = list(filter(lambda x:x[0] not in gaps, imgId_time_list)) # 去掉没有标注框的图片,并且按照图片最好一次修改的时间进行排序step = 6 # 间隔取样,每个 step 选 1 张 如拆分比例是 0.85:0.15,那么就是每 10 张抽取 1.5 张,既 每 20 张抽 3 张,平均下来就是每 6 张抽一张作为验证集val_set = set(imgId_time_list[::step])print("验证集数量", len(val_set))train_Set = set(imgId_time_list) - val_setprint("训练集数量", len(train_Set))print("总的数量", len(train_Set)+len(val_set))
