基于深度学习的小样本多噪音的鱼类生物图像识别
课题及数据来源:第1届山东省大学生大数据智能大赛(初赛)
课题内容
该课题旨在通过机器学习的智能化手段实现对水生生物的图像进行类别识别任务。
在本次任务中的难点是在训练数据中有大量的噪音数据,如:A类数据中分为标注和未标注部分,标注部分为干净的A类鱼数据,然而只有非常少量的,不足以用来训练,未标注部分则是A类鱼和其他各种噪音图片的干扰,因此,如何去除噪音是此次比赛的难点重点。
最终效果为输入一张图片后,程序判断是A-Y中的哪一类鱼,或者是Z类杂质
官方数据的文档结构
--T1_ImageData
--A
--标注数据(数量极少)
--未标注数据(数量多,但含有大量噪音)
--B
--标注数据(数量极少)
--未标注数据(数量多,但含有大量噪音)
--C
--标注数据(数量极少)
--未标注数据(数量多,但含有大量噪音)
.
.
.
--Y
--标注数据(数量极少)
--未标注数据(数量多,但含有大量噪音)
框架与算法
开源框架:Pytorch
算法支持:cnn卷积神经网络
神经网络结构
基本结构
6层卷积层+池化层+5层全连接层
池化函数
max_pool3()
激活函数
relu()
防止过拟合
torch.nn.functiona.dropout()
分类函数
torch.log_softmax()
代码
设计思路
训练基础模型
通过官方数据给出的25类鱼的有标签数据作为训练数据来训练基础模型,我们以100次为步长,从100次训练到800次,然后对每次训练得到的识别模型做测验,数据来源于官方给出的有标签数据和我们自己拟造的噪声图片数据。
分类做实验
得到迭代训练400次的模型之后,我们想到:每张图片进入神经网络,总会被分为一类,而且有相应的概率,我们做实验考察一下各类鱼在各自识别正确结果各个概率阈值里面正确的占比是多少。所以我们对25类鱼新建25个文件夹,每类鱼下面设立5个文件夹,分别对应概率为100%,90%,80%,60%,50%,然后对官方给出的无标签文件进行识别计算概率,然后分别存储,最后人工计算实验结果,实验结果见表格文件。
迭代去噪训练
这一步即上面的那个流程图中的1-5重复的过程
- 根据每个不同的类别不同阈值会得到选取的图片,正确率较高了
- 随机选择1/3的图片加入训练数据(为了避免各个训练类别之间数量差距过大,最终决定统一每一类都随机选取10张)
发现问题
在去噪训练的过程中G类鱼出现了非常显著的问题
杂质特点
筛选出来的图片中只有G类鱼和文章,因此,特征非常鲜明所以我们想在原有的分类器的基础上对G类再做一个相对简易的二分类器。
后来在参加2019年济南国际超算产业博览会时天津大学教授的演讲中也看到了类似的分层结构,也为我们的解决问题提供了更加严谨的解决方案。
最后一步
至此我们得出了25类鱼的训练数据共8118个图片文件,以此为训练数据来训练最终的识别模型,再次以100次为步长,记录每一个训练次数的识别准确率,最终我们再次选取了训练400次的模型,得到了最终的模型
赛后的改进思路
- 在去除噪音增加训练样本时,我们选取的图片是通过手动测算,统计不同分类的阈值,我们是否能通过其他机器学习的方式来确定选取阈值,而且选取图片的张数是否也可以通过机器学习的方式进行动态的选择
- 通过赛后与其他的选手进行交流的时候了解到,有的组使用了迁移学习的技术,使得正确率大幅上升,这个方向会改变整个神经网络和设计思路,还在改进中
- 我们也在想是否能将这种应用实际生产环境中