IEEE UV 2022 “Vision Meets Algae” Object Detection Challenge BaseLine

前言

上午看到天池有了一个新的Challenge,没什么精力去想方案写paper打比赛,但是花了一上午“站在巨人的肩膀上”写了一个Baseline供大家参考.

首先报名参加,下载数据集并解压,大致长这样

IEEE UV 2022 “Vision Meets Algae” Object Detection Challenge BaseLine-LMLPHP

这里test_images下面原始是没有.cache的,是后面测试的时候再生成的.看一下比赛简介,这是关于目标检测的一个比赛,

IEEE UV 2022 “Vision Meets Algae” Object Detection Challenge BaseLine-LMLPHP

训练集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.使用切分数据集应该会有下面的结构

IEEE UV 2022 “Vision Meets Algae” Object Detection Challenge BaseLine-LMLPHP

同样的,忽略掉.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个小时

IEEE UV 2022 “Vision Meets Algae” Object Detection Challenge BaseLine-LMLPHP

IEEE UV 2022 “Vision Meets Algae” Object Detection Challenge BaseLine-LMLPHP

训练好了模型,利用模型对测试集图片进行推理,得到结果

python test.py --weights runs/train/exp/weights/best.pt --save-json --data data/custom.yaml --task test

然后runs/test下就有best_predictions.json,去官网提交

IEEE UV 2022 “Vision Meets Algae” Object Detection Challenge BaseLine-LMLPHP

mAP[@.5:.95]在测试集上0.4,排名131(居然不是垫底),没有任何调参优化,没引入任何对于小目标检测的trick,感觉这个效果还是非常满意的,只能说yoloV7牛皮!!!

最后

今天正好是1024总得发点什么,上午正愁着没东西发突然逛着找到这个比赛正好水一篇Blog出来.要说改进想法当然也是有的,不过看到要小paper和视频介绍果断放弃,实在没精力.

  • 感觉图片大小可以用1024来训练,毕竟原图(2048,2880)并不小,大图片训练可以对小目标更清晰
  • 加点常用的注意力
  • 多尺度和上下文学习
  • 仔细观察训练图片对象本身找找特点


更新

用所有数据训练,增大训练图片大小(640->960),仅仅这么简单的操作直接提升到0.4688.
IEEE UV 2022 “Vision Meets Algae” Object Detection Challenge BaseLine-LMLPHP
碍于自己电脑显卡显存限制,无法尝试更大图片大小进行训练.这次训练放着训了一晚上,后续准备弄服务器上去等他自己跑
IEEE UV 2022 “Vision Meets Algae” Object Detection Challenge BaseLine-LMLPHP

10-25 17:36