https://www.kaggle.com/martinpiotte/whale-recognition-model-with-score-0-78563/notebook
- Duplicate image identification (not much to see here -- keep moving)
- Image preprocessing (just the regular stuff)
- Siamese Neural Network architecture (some interesting thoughts)
- Training data construction (most of the secret sauce is here)
- Training procedure (zzzzz.....)
- Generating the submission file (re-zzzzz.....)
- Bootstrapping and ensemble (classic but short)
- Visualization (everyone's favorite!)
- Off topic (why add this unless it is interesting?)
(1)Duplicate image identification
有些图像的二进制相同,有些有一点改变:对比度或亮度,大小,水印等。如果两幅图符合下列标准,则认为两张图像是重复的:
- 有相同的phash,
- phash 相差低于6个bit,大小相同,归一化图像之间的像素平均平方误差低于给定的阈值。
重复的图片选择像素最高的那张。
(2)Image preprocessing
对图像做以下的操作:
- 如果图像位于旋转集合中,则旋转图像。
有些鲸鱼的尾巴是朝下的,当我在训练集中遇到这样的例子(并非测试集),把它加到一个列表中,训练过程中将它们旋转180度。
- 转变为黑白的
早期实验中,我注意到我的模型在比较两个彩色图像和两个黑白图像时获得的精度大致相同,然而将彩色图像与黑白图像进行比较,其精确度要低得多。最简单的解决办法是将所有的图像转换成黑白。
- 放射变换
放射变换是将原始图像的矩阵区域映射为一个分辨率具有384*384*1 (黑白矩阵只有一个channel) 的正方形图像,矩阵的款比高为2.15,接近平均图片的长宽比,该矩形比计算的bunding box 稍大,原因是削减掉尾巴的边缘的误差比恰好get 到合适的边缘所带来的效益 更大,因此最好有一定的边缘距。
在训练期间,通过增加随机变换来对数据进行增强,包括缩放,移位,旋转,和剪切,测试时要去掉随机变换。
最后,将图像归一化为0 均值和1方差。
(3)Siamese Neural Network architecture
https://mp.csdn.net/postedit/88093083
(4)Training data construction
这部分是让模型精度变化很大的一部分
我们希望Siamese 网络 从所有可能的鲸鱼中选一条正确的,正确的获得高分的同时,必须获得其他鲸鱼的低分。为了迫使其他鲸鱼降低概率。
同时,我们希望模型能够识别鲸鱼而不是图片,训练集中的图片很少,用波浪或者鸟儿想象模型识别特定的图片是不现实的,为了防止这种情况发生,,提交给模型的数据必须是不带偏见的,如果一张图片经常用于负例子,模型可能就可能只会学习预测不匹配的情况,而不是正确的比较鲸鱼,通过以50% 的阳性和50% 的阴性相同的次数来呈现图片,模型就不会学习特定的图片,而是致力于学习鲸鱼。
图片选择
最开始我们减少了训练集中图片的数量
- 删掉黑名单中的图片
- 删掉重复的图片
- 删除新鲸的图片
- 只有一张图片的鲸鱼被移除
黑名单是人工构建的,是那些对训练没有帮助的图片。可能的原因是尾巴下部是不可见的,或者只有尾巴的一部分,或是有两个尾巴,这个黑名单也不是详尽的。
x