IEEE UV 2022 “Vision Meets Algae” Object Detection Challenge BaseLine
IEEE UV 2022 “Vision Meets Algae” Object Detection Challenge BaseLine
前言
上午看到天池有了一个新的Challenge,没什么精力去想方案写paper打比赛,但是花了一上午“站在巨人的肩膀上”写了一个Baseline供大家参考.
首先报名参加,下载数据集并解压,大致长这样
这里test_images下面原始是没有.cache的,是后面测试的时候再生成的.看一下比赛简介,这是关于目标检测的一个比赛,
训练集537张图片,测试集430张;里面共包含8类藻类,标注文件的格式是yolo格式,也就是txt文件每一行开头是类别,后面是坐标(center,w,h)形式
对于一些不熟悉的目标进行检测,首先就要了解待检测目标的特点,这里官方也给出了各个类别藻类的大小,可以看出在尺度上还是有一定差异的.打开下载的数据,迅速浏览一下也能看出大小差异.
大致了解比赛背景和数据内容后就可以开始动手了
开始
1. 制作数据(可选)
这里给出的train并没有切分训练集和验证集,可以切分保证每次训练验证的数据不是训练输入过的.当然也可以不切分,毕竟本身训练图片并不是很多,537张图来说数据量并不是很大可以全部训练
如果切分,可以参考下面的代码
import pathlib, shutil
import numpy as np
from sklearn.model_selection import train_test_split
import pandas as pd
# before run code ,please create folders like below
src_path = '/home/shelgi/ssd/IEEEUV2022/train/'
label_val_path = '/home/shelgi/ssd/IEEEUV2022/datasets/labels/val/'
image_val_path = '/home/shelgi/ssd/IEEEUV2022/datasets/images/val/'
label_train_path = '/home/shelgi/ssd/IEEEUV2022/datasets/labels/train/'
image_train_path = '/home/shelgi/ssd/IEEEUV2022/datasets/images/train/'
# find image path from src_path and get label(class)
src_image_path=[str(i).split("/")[-1].split(".")[0] for i in pathlib.Path(src_path+"images").glob("*")]
# train images total 537
print(len(src_image_path))
labels=[]
# get class
for i in src_image_path:
with open(src_path+"labels/"+i+".txt",'r') as f:
labels.append(int(f.read()[0]))
f.close()
data=pd.DataFrame({"path":src_image_path,"class":labels})
train_path,test_path,_,_=train_test_split(data['path'],data['class'],test_size=0.1,stratify=data['class'])
# copy images and labels to create new datasets
for i in train_path:
shutil.copyfile(src_path+"images/"+i+".png",image_train_path+i+".png")
shutil.copyfile(src_path + "labels/" + i + ".txt", label_train_path + i + ".txt")
for i in test_path:
shutil.copyfile(src_path+"images/"+i+".png",image_val_path+i+".png")
shutil.copyfile(src_path + "labels/" + i + ".txt", label_val_path + i + ".txt")
这里每一个txt里面只有一类,然后为了切分后类别均衡,加了stratify.使用切分数据集应该会有下面的结构
同样的,忽略掉.cache
2.训练
训练这里我选择的就是直接用目前SOTA yoloV7
根据官网的介绍,下载预训练权重,然后修改自己data下的yaml路径,cfg中training的yaml修改一下nc=8,然后开始训练
python train_aux.py --workers 8 --device 0 --batch-size 16 --data data/custom.yaml --img 640 640 -cfg cfg/training/yolov7-e6e-custom.yaml --weights 'yolov7-e6e_training.pt' --name yolov7-e6e --hyp data/hyp.scratch.p6.yaml
因为是Baseline,所以我没进行任何调参完全用原有的参数,这个时候只需要调一下风扇转速,然后去干点其他事(因为是在我自己电脑上跑的,所以batchsize最大只有16,图片大小也只能640)
3.测试并提交结果
差不多十点多开始训,然后中午吃饭回来训练结束,300个epoch训了差不多1.9个小时
训练好了模型,利用模型对测试集图片进行推理,得到结果
python test.py --weights runs/train/exp/weights/best.pt --save-json --data data/custom.yaml --task test
然后runs/test下就有best_predictions.json,去官网提交
mAP[@.5:.95]
在测试集上0.4,排名131(居然不是垫底),没有任何调参优化,没引入任何对于小目标检测的trick,感觉这个效果还是非常满意的,只能说yoloV7牛皮!!!
最后
今天正好是1024总得发点什么,上午正愁着没东西发突然逛着找到这个比赛正好水一篇Blog出来.要说改进想法当然也是有的,不过看到要小paper和视频介绍果断放弃,实在没精力.
- 感觉图片大小可以用1024来训练,毕竟原图(2048,2880)并不小,大图片训练可以对小目标更清晰
- 加点常用的注意力
- 多尺度和上下文学习
- 仔细观察训练图片对象本身找找特点
转载自:https://juejin.cn/post/7157959531069177887