文章目录
1 题目简介
笔者个人的毕业设计课题如下:
简介:使用预训练的Diffusion Model图像生成模型生成图像,将这些生成的图像作为扩充训练集加入到2D目标检测器、2D图像分类器的训练过程。深度学习是数据驱动的,随着数据量的扩充,能够提高检测器、分类器的鲁棒性、准确性。
建议的baseline:
分类:ResNet
检测:YOLO
可以看到,给的题目难度还是比较轻松的;本次毕设的全过程会以周为单位采用博客的形式记录下来。
2 前言
上周的任务完成后,因为笔者个人在准备春招企业的二面,一直在忙于准备demo和其他相关的内容;所以内容只得暂缓
这周等事情暂时告一段落后,重新开始进行毕业设计的内容处理
本篇博客会记载原始ResNet34的实验,并将训练集经过数据增强后对比精度效果,来验证本次毕业实际的题目。
3 数据集
如图所示,用的是一个花卉分类的数据集,对于图像分类任务它将目标分成了5类
该数据集共有数据3670份,分成雏菊 蒲公英 玫瑰 向日葵 郁金香五类
需要说明的是,笔者没有找到这份数据集的名字… 只是在数据集许可证说明文档中找到了给出免费分享使用的许可证明网站
但这个数据集是笔者在大一刚接触图像分类的时候搜到的第一个数据集 电脑里一直忘了清理, 所以这次毕业设计就决定直接使用该数据集
使用该数据集的原因有二
其一 数据集本身量级大小合适,比起ImageNet这种千万量级的数据集;只有当数据集本身样本较少的情况下才能较好体现出数据增强的作用性,当然也不能太少,否则容易出现过拟合的现象。
其二 数据集的图片像素大小最好不要太低,在笔者的实验中;像著名的CIFAR数据集中32*32的像素大小,经过扩散模型后得到的数据肉眼可见的难以使用,一定要保证数据的像素大小不要太低。
3.1 数据集划分
当然,第一步要进行的是数据集划分
笔者这里就不贴代码了,ResNet相关的代码在网上非常多,数据集划分这一方面的也不会少;有需要的可以直接去查找
训练集:验证集是9:1的比例划分的
3.2 ResNet34测试
训练中
可以看到最后精度是停在90.1
4 扩散模型数据增强
接下来将对刚才已经划分过的数据集使用数据增强来做消融实验
注意 一定要对刚才划分过的数据集增强,而非重新划分
4.1 数据预处理
由于StableDiffusion对输入数据的尺寸存在要求,所以要事先进行resize操作,顺便重命名一下文件名(非必要)
关于为什么存在尺寸要求,上一篇博客里有提到
这里附上resize和重命名操作的函数 非常简单,也可以自行编写
from PIL import Image
import os
# 指定文件夹路径和新的图片尺寸,这里用的是绝对路径,可以自行修改
folder_path = "C:\\code\\stable-diffusion-main\\img\\"
new_size = (512, 512)
count=0;
# 遍历文件夹中的所有图片文件
for filename in os.listdir(folder_path):
if filename.endswith(".jpg") or filename.endswith(".png"):
# 打开图片并调整大小
image_path = os.path.join(folder_path, filename)
image = Image.open(image_path)
image = image.resize(new_size)
new_filename = "{:05d}".format(count) + os.path.splitext(filename)[1]
# 生成新的文件名并保存图片
count+=1
new_image_path = os.path.join(folder_path, new_filename)
image.save(new_image_path)
顺便可以看到雏菊的训练集个数是570个
对其他几个数据集执行上述相同操作
4.2 数据集增强
这里先做说明 分别使用0.4和0.8的图像噪声量对每张图片进行4张图片的数据增强
由于笔者没有找到StableDiffusion的图像转图像的多图片转换方法,直接在参数接口里输入/*.jpg也没有办法识别 这里就用一个比较笨的方法
for /l %x in (1, 1, 570) do python scripts/img2img.py --init-img img/daisy/%x.jpg --strength 0.4 --n_iter 5
直接控制台输入上面的命令
for /l %x in (1, 1, 570) do 是控制台的循环输入指令
相当于让控制台自己依次对每个图片执行相同的数据增强命令
图里虽然看不出来,不过确实是自己在运行
有些时候也会用这种笨方法啦
这里需要的时间会比较多,可以慢慢等待
可以看到,确实是570*4=2280个结果
对其他几个分类做相同操作
4.3 数据增强后的消融实验
4.3.1 0.4噪声强度下4张图片
和预想中的一样,效果相当不错
因为用的是StableDiffusion 的模型而非专门针对数据集单独去搭建和训练的模型,所以噪声强度这一点上不应该给到太高
事实上,仅仅是0.4的噪声强度生成的图像中,人为的去审视一下,就会发现已经出现小规模的图像经过扩散模型后生成的新图像已经不太准确了 比如【将本来应该是根茎的部分渲染成人】
不过就算是在这样的前提下,最终92.3的精确度也有所上升
4.3.2 0.8噪声强度下4张图片
91.5的精度比起0.4噪声强度时有所下降
这也是可以预见的结果,0.8的噪声强度在StableDiffusion 的模型生成中已经是一个比较大的值了,会生成很多超出原本预期的图片;在这个噪声强度下上面提到的现象更加严重
但另外一方面来讲,从理性来说;这种情况下的模型应该具有更强鲁棒性,只是在测试集上的表现效果欠佳
【在数据集上表现过于优异的模型往往缺少拟合能力导致鲁棒性较差,在实际应用中反而效果不甚出众】这个是很通识的现象了,就不再赘述
4.3.3 0.4噪声强度下8张图片
88.2的精度比原本的模型差了不少
其实是非常简答的情况,在一张图片生成8张图片的情况下,原本570张的雏菊,数据量已经来到4560张了
然而实际上,在0.4这个较小的噪声强度下,每8张相差甚小的图片在网络中被视为不同样本多次反复对权重产生影响
这一定会带来严重的过拟合问题
在这个消融实验中可以了解到,每张图片数据增强的数量一定要严格控制
4.3.4 0.8噪声强度下8张图片
这个实验是想着前面的做都做了,索性一起试一下
结果89.8的精度其实有些超出预期
不过想想也可以理解,毕竟虽然是8张数据增强,但是噪声比0.4大得多;在这样的前提下其实过拟合的问题会相对减弱不少
不过和原先的精度相比,仍然是有所下降的。
5 总结
上面所有的消融实验因为笔者个人时间问题,都是只做了3次实验选取的中位数
所以精度上可能是存在一定干扰的,后续有时间了会再重新进行
另外一方面,其实想要做的消融实验不止这几种;还会对比原始数据集在不同规模下用扩散模型做数据增强的效果
这两天有时间了会再用电脑跑一下