solomon数据集是什么_训练⼀个数据不够多的数据集是什么
体验?
摘要:这⾥介绍其中⼀种带标签扩充数据集的⽅法。
摘要:
前⾔
前⼀段时间接触了⼏位⽤户提的问题,发现很多⼈在使⽤训练的时候,给的数据集寥寥⽆⼏,有⼀些甚⾄⼀类只有5张图⽚。modelarts平台虽然给出了每类5张图⽚就能训练的限制,但是这种限制对⼀个⼯业级的应⽤场景往往是远远不够的。所以联系了⽤户希望多增加⼀些图⽚,增加⼏千张图⽚训练。但是⽤户后⾯反馈,标注的⼯作量实在是太⼤了。我思忖了⼀下,分析了⼀下他应⽤的场景,做了⼀些策略变化。这⾥介绍其中⼀种带标签扩充数据集的⽅法。
数据集情况
数据集由于属于⽤户数据,不能随便展⽰,这⾥⽤⼀个可以展⽰的开源数据集来替代。⾸先,这是⼀个分类的问题,需要检测出⼯业零件表⾯的瑕疵,判断是否为残次品,如下是样例图⽚:
这是两块太阳能电板的表⾯,左侧是正常的,右侧是有残缺和残次现象的,我们需要⽤⼀个模型来区分这两类的图⽚,帮助定位哪些太阳能电板存在问题。左侧的正常样本754张,右侧的残次样本358张,验证集同样,正常样本754张,残次样本357张。总样本在2000张左右,对于⼀般⼯业要求的95%以上准确率模型⽽⾔属于⼀个⾮常⼩的样本。先直接拿这个数据集⽤Pytorch加载imagenet的resnet50模型训练了⼀把,整体精度ACC在86.06%左右,召回率正常类为97.3%,但⾮正常类为62.9%,还不能达到⽤户预期。
当要求⽤户再多收集,⾄少扩充到万级的数据集的时候,⽤户提出,收集数据要经过处理,还要标注,很⿇烦,问有没有其他的办法可以节省⼀些⼯作量。这可⼀下难倒了我,数据可是深度学习训练的灵魂,这可咋整啊。
仔细思考了⼀阵⼦,想到modelarts上有智能标注然后⼈⼯校验的功能,就让⽤户先试着体验⼀下这个功能。我这边拿他给我的数据集想想办法。查了些资料,⼩样本学习few-shot fewshot learning (FSFSL)的常见⽅法,基本都是从两个⽅向⼊⼿。⼀是数据本⾝,⼆是从模型训练本⾝,也就是对图像提取的特征做⽂章。这⾥想着从数据本⾝⼊⼿。
⾸先观察数据集,都是300*300的灰度图像,⽽且都已太阳能电板表⾯的正⾯俯视为整张图⽚。这属于预先处理的很好的图⽚。那么针对这种图⽚,翻转镜像对图⽚整体结构影响不⼤,所以我们⾸先可以做的就是flip操作,增加数据的多样性。flip效果如下:
这样数据集就从1100张扩增到了2200张,还是不是很多,但是直接观察数据集已经没什么太好的扩充办法了。这时想到⽤Modelarts模型评估的功能来评估⼀下模型对数据的泛化能⼒。这⾥调⽤了提供的SDK:del_analysis下⾯的analyse接⼝。
def validate(val_loader, model, criterion, args):
batch_time = AverageMeter('Time', ':6.3f')
losses = AverageMeter('Loss', ':.4e')
top1 = AverageMeter('Acc@1', ':6.2f')
top5 = AverageMeter('Acc@5', ':6.2f')
progress = ProgressMeter(
len(val_loader),
[batch_time, losses, top1, top5],
prefix='Test: ')
pred_list = []
target_list = []
# switch to evaluate mode
model.eval()
_grad():
end = time.time()
for i, (images, target) in enumerate(val_loader):
if args.gpu is not None:
images = images.cuda(args.gpu, non_blocking=True)
target = target.cuda(args.gpu, non_blocking=True)
# compute output
output = model(images)
loss = criterion(output, target)
# 获取logits输出结果pred和实际⽬标的结果target
pred_list += output.cpu().numpy()[:, :2].tolist()
target_list += target.cpu().numpy().tolist()
# measure accuracy and record loss
acc1, acc5 = accuracy(output, target, topk=(1, 5), i=i)
losses.update(loss.item(), images.size(0))
top1.update(acc1[0], images.size(0))
top5.update(acc5[0], images.size(0))
# measure elapsed time
batch_time.update(time.time() - end)
end = time.time()
if i % args.print_freq == 0:
progress.display(i)
# TODO: this should also be done with the ProgressMeter
print(' * Acc@1 {top1.avg:.3f} Acc@5 {top5.avg:.3f}'
.format(top1=top1, top5=top5))
# 获取图⽚的存储路径name
name_list = val_loader.dataset.samples
for idx in range(len(name_list)):
name_list[idx] = name_list[idx][0]
analyse(task_type='image_classification', save_path='/home/image_labeled/',
pred_list=pred_list, label_list=target_list, name_list=name_list)
return top1.avg
上段代码⼤部分都是Pytorch训练ImageNet中的验证部分代码,需要获取三个list,模型pred直接结果logits、图⽚实际类别target和图⽚存储路径name。然后按如上的调⽤⽅法调⽤analyse接⼝,会在save_path的⽬录下⽣成⼀个json⽂件,放到Modelarts训练输出⽬录⾥,就能在评估结果⾥看到对模
型的分析结果。我这⾥是线下⽣成的json⽂件再上传到线上看可视化结果。关于敏感度分析结果如下:
这幅图的意思是,不同的特征值范围图⽚分别测试的精度是多少。⽐如亮度敏感度分析的第⼀项0%-20%,可以理解为,在图⽚亮度较低的场景下对与0类和其他亮度条件的图⽚相⽐,精度要低很多。整体来看,主要是为了检测1类,1类在图⽚的亮度和清晰度两项上显得都很敏感,也就是模型不能很好地处理图⽚的这两项特征变化的图⽚。那这不就是我要扩增数据集的⽅向吗?
好的,那么我就试着直接对全量的数据集做了扩增,得到⼀个正常类2210张,瑕疵类1174张图⽚的数据集,⽤同样的策略扔进pytorch 中训练,得到的结果:
eval是做什么的怎么回事,和设想的不太⼀样啊。。。
重新分析⼀下数据集,我突然想到,这种⼯业类的数据集往往都存在⼀个样本不均匀的问题,这⾥虽
然接近2:1,但是检测的要求针对有瑕疵的类别的⽐较⾼,应该让模型倾向于有瑕疵类去学习,⽽且看到1类的也就是有瑕疵类的结果⽐较敏感,所以其实还是存在样本不均衡的情况。由此后⾯的这两种增强⽅法只针对了1类也就是有问题的破损类做,最终得到3000张左右,1508张正常类图⽚,1432张有瑕疵类图⽚,这样样本就相对平衡了。⽤同样的策略扔进resnet50中训练。最终得到的精度信息:
可以看到,同样在验证集,正常样本754张,残次样本357张的样本上,Acc1的精度整体提升了接近3%,重要指标残次类的recall提升了8.4%!嗯,很不错。所以直接扩充数据集的⽅法很有效,⽽且结合模型评估能让我参考哪些扩增的⽅法是有意义的。当然还有很重要的⼀点,要排除原始数据集存在的问题,⽐如这⾥存在的样本不均衡问题,具体情况具体分析,这个扩增的⽅法就会变得简单实⽤。
之后基于这个实验的结果和数据集。给帮助⽤户改了⼀些训练策略,换了个更厉害的⽹络,就达到了⽤户的要求,当然这都是定制化分析的结果,这⾥不详细展开说明了,或者会在以后的博客中更新。
引⽤数据集来⾃:
Buerhop-Lutz, C.; Deitsch, S.; Maier, A.; Gallwitz, F.; Berger, S.; Doll, B.; Hauch, J.; Camus, C. & Bra
bec, C. J. A Benchmark for Visual Identification of Defective Solar Cells in Electroluminescence Imagery. European PV Solar Energy Conference and Exhibition (EU PVSEC), 2018. DOI: 10.4229/35thEUPVSEC20182018-5CV.3.15
Deitsch, S.; Buerhop-Lutz, C.; Maier, A. K.; Gallwitz, F. & Riess, C. Segmentation of Photovoltaic Module Cells in Electroluminescence Images. CoRR, 2018, abs/1806.06530
Deitsch, S.; Christlein, V.; Berger, S.; Buerhop-Lutz, C.; Maier, A.; Gallwitz, F. & Riess, C. Automatic classification of defective photovoltaic module cells in electroluminescence images. Solar Energy, Elsevier BV, 2019, 185, 455-468. DOI:
10.1016/j.solener.2019.02.067
点击关注,第⼀时间了解华为云新鲜技术~
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论