项目
无超:
难点:
1)小物体识别,期望高的查准率,速度有一定保障。
采用了ensemble的思想,将两个学习器联结成为一个强学习器,我们对这两个学习器有不同的要求:
一.针对第一个学习器,我们期望做一个二分类的检测任务,由于在商品定位的过程中。
目标 :1)我们期望检测器查全率比较高。
2)期望神经元中坐标信息更丰富
方法:
1)我们调整的正负样本的比例(商品与背景),提高正负比例,发现查全率上升了
但由于是一个简单的二分类任务,而一般的交叉熵损失函数在简单样本迭代过程中缓慢且容易仅达到局部最优,我们考虑提高它对空间位置的注意力。在这里,我们采用了Focal loss损失函数:
这个函数通过, gamma>0使得减少易分类样本的损失,加入平衡因子alpha,用来平衡正负样本本身的比例不均
2) 采用将sigmoid后特征图与之前的concat操作,丰富它的空间坐标信息。
3)
# 发现,对于二分类来讲 ,较大,则位置损失训练起来有难度,有较大提升空间。使得模型更关注于位置信息
二 .针对第二个学习器,我们期望训练一个特征提取器。
用了 resnet50作为基础网络,此处,我们用了个arcface的损失函数,将提取到的特征做1:n的比对
2)网络可迁移性强。
其他优点:
1)这样训练更细致,我们可以做一些特征工程。
我们可以每批次送入不同商品 ,观察检测器的不同层神经元对于这些不同商品空间敏感度(观察loss和权值变化)
2) 考虑检测器得到充足的坐标信息后,仅仅训练分类网络便可以更迭识别商品的种类
3) 为自主识别打基础,当网络坐标信息丰富时,我们作一些非监督的尝试,观察后入商品的聚类效果(如果训练完成,我们不需要每次重新训练了)
收获:
我们采用哪些训练策略?
1)先小数据集,大网络,训练过拟合,loss收敛,确认数据集没有问题,确定你选的初始化权值,超c参没有大的问题。
2)如果再细致点,那我可以添加多个BN操作,观察训练速度,尝试正则项和dropout层,观察过拟合
3)加速训练,先采用adma训练,观察Loss下降速度变缓,换用sgd训练
4)LR设置不能太小,也不能太大,小了容易跑到局部最优,大了容易梯度爆炸,因此常先试用1
然后可以观察loss ,发现loss是逐渐下降的,那么这是说明梯度方向正确,然后我们调大点lr加速训练,loss渐渐平稳时再减小lr
遇到哪些问题?
1)训练过程中出现NAN:
1)查看代码,主要看除法
2)减小学习率,再试着训练
3) 换组初始化权值
2)
语言逻辑:
1)我们针对项目需求,需要一个检测速度快,可以达到5帧/s,小目标物体的precision(查准率)高。
2)考虑到模型的优化问题,我们需要一个可拆解,可迭代的模型
因此,这里我们使用了ensemble策略,将两个学习器结联,组合成一个强学习器
1)我们将第一学习器训练为二分类的检测器
2)我们将第二个学习器训练为50分类的分类器
针对第一个学习器,我们需要一个查全率高,坐标信息丰富的检测器。
拆成两个分类器最主要优势: 一个简单的检测器,对于多目标学习时,其背景样本比其余的目标样本数量多的多,在
1)对于提高查全率的措施
在提高正负比例后,我们可以发现,学习器的查全率有效提升。
因此,这里我们考虑改变损失函数,替代简单的二叉熵损失函数(由于对于二分类问题,其样本较为简单,交叉熵损失函数对于简单样本容易达到局部最优,不利于训练),并且能够解决样本正负比例不均衡的问题。这里我们改用Focal loss损失函数,它的gamma参数>0时,可以减少易分类样本的损失,它的平衡因子alpha,可以用来平衡正负样本本身的比例不均问题。
2)针对丰富神经元的坐标信息,我们采用增加空间坐标注意力机制,将relu后特征图与之前的concat操作
3)针对项目,调整ssd算法第4,7,8,9,10,11层的多特征层检测机制,由于目标任务检测物体像素较小,因此,将检测层提前。
4)只对项目,调整原算法中default bbox的大小比例,由原来计算出来的 5中默认框的长宽比,我们采用对真实标注框的长宽进行聚类方法,将其取代。
,k表示
实质计算为(prior box(,
) 与 bbox(
,
)的offset
5) 训练刚开始,我们进行预测,由于偏置量可能比较大的原因,会出现越界现象(即超出图片大小范围),我们在位置便宜后面加上sigmoid函数(使其限定在0-1范围内)
针对第二个学习器,我们需要一个(precision)查准率高的分类器。
1)我们在此做一个聚类措施,即改用一个center loss分类损失函数,使得其类间距离变大,类别便捷更加清晰
2) 我们将卷积最后一层输出特征图与商品数据库进行1:n 的比对,可以有效提高查准率(Presion),笔并且使得分类模型具有据识率(拒绝识别库中没有的类)
改进:
1)对商品的数量进行判断,加入分割损失函数
2)对模型进行裁剪
1.将float32--》int
2. 使某些神经原的w=0 ,甚至可以直接删除某些网络层