瑜伽体式分类-黑羽
图像分类
最后更新 2022-06-01 12:10 阅读 5249
最后更新 2022-06-01 12:10
阅读 5249
图像分类
赛题背景:
本次赛题背景是瑜伽的动作类别太多,很难记住每个体式的名字,通过图像分类模型帮助我们识别各种瑜伽体式类别。
赛题分析:
数据集包含瑜伽体式共6大类、82小类(实际:线下49类,线上50类)
评价指标:准确率
赛题难点:
1、类别较多,分布不平衡
2、背景干扰项较多,人物在图片中的比例范围比较大
3、存在错误的图片数据
4、存在一些抽象的线条等较难识别的样本
解题过程:
思路一:多个Loss的分类网络 (没时间尝试,代码修改起来比较麻烦)
思路二:姿势识别+分类网络 (效率较低,姿势识别准确度不够,后续分类很难进行)
思路三:单个Loss的分类网络 (容易实现,直接用蘑菇分类的代码修改即可)
数据处理:
1、直接把小类的标签提取处理作为类别,大类舍弃
train_csv_path = os.path.join(DATA_PATH,'YogaClassification',"train.csv")
df = pd.read_csv(train_csv_path)
df['label'] = df['labels'].map(lambda x: int(x.split(',')[2]))
2、数据集划分
(1)使用两种划分方式: 8:2和9:1两种比例划分训练集和验证集
(2)遍历每一个类别,打乱数据,按照设定的比例采样训练与验证数据
分类模型选择:
Se_ResNet154 (92.16)
DenseNet161 (92.28)
Swin Transformer (94.61) 这两次比赛感觉Transformer系列是分类网络的首要选择
具体的参数:
(1)数据集划分: 训练集:验证集=8:2 / 9:1
(2)模型选择: Swim-Transformer 预训练模型: swin_large_patch4_window12_384_22k.pth
(3)inputsize: 384*384
(4)batchisize: 4
(5)max_epochs: 30
(6)学习率: initlr = 1e-3, 每隔10轮 lr=0.1*lr
(7)优化器: optim.SGD((self.model_ft.parameters()), lr=1e-3, momentum=momentum, weight_decay=0.0005)
(8)损失函数:LabelSmoothingCrossEntropy(smoothing=0.1).cuda()
(9)增强策略: 训练集: 随机裁剪、水平翻转、随机擦除;验证集:简单缩放
(10)测试增强:正常图片+ 水平翻转 -> 求平均
(11)融合策略:3个Swim-Transformer模型融合,结果用投票的少数服从多数原则
提分的一些操作:
1、标签平滑
2、模型选择 Swim-Transformer
3、模型融合
4、随机裁剪、随机擦除
5、tta
模型融合:
融合实验一: 94.98
Swim-Transformer TTA (原始图片+水平翻转) (Split=0.9)
融合实验二: 96.45
Swim-Transformer TTA (原始图片+水平翻转) (Split=0.9)
Swim-Transformer (Split=0.9)
Swim-Transformer (Split=0.8)
总结和展望:
(1)多看看最新的论文和算法,多去尝试一些新的优秀模型,Transformer模型在最后才利用上,在这两次比赛中的提分非常明显
(2)拥有一套比较完善的比赛框架,便于快速实现赛题目标
(3)尽量避免用K折交叉融合模型,没法评估单个模型的性能,还浪费时间
(4)提交要趁早,比赛最后时刻排队时间太长
(5)数据预处理还有很大的挖掘空间,人体检测、关键点检测,错误样本剔除等
(6)数据增强可以尝试新的增强组合
(7)学习率和优化器多去尝试,对结果影响都比较大
(8)大类别分类模型、骨骼点检测用于结果的矫正