任务一要求:构建自己的图像分类数据集
对于datawhale的开源学习计划,我眼馋很久了,只是之前在学校,不敢轻易尝试。此次寒假终于能够克服畏难情绪进行尝试,终归是有所进步的。
第一个任务即是构建自己的图像分类数据集,看起来还是一个比较简单的任务,没想到还是让我头大许久。
数据来源
身为一名机械工程学院学生,我采用了一百个标准件构建数据集。
构建方法是,通过solidworks的运动算例生成标准件改变视图的动画,再将动画视频按帧读取。因为solidworks中的帧数可以自己调整,所以我制作的多是40~80帧、4~5秒的动画视频。
用opencv读取每一帧。这里出现了一个问题,cv.imwrite()不支持中文路径,因此我直接采用0~99的数字为名字创建文件夹,随后用os库与之前读取的零件名称列表对文件夹名进行了修改。
这样最初的图片文件夹就建立完成了。
疑虑
由于这些零件在图片中所处位置、颜色等方面都比较相似,与ImageNet数据集的相似度也比较低,我对这样一个数据集能否进行有效的分类心存疑虑。选择了25种零件进行了迁移学习微调训练,仅30个轮次,在测试集上的准确率就达到了77%,这二十五种零件都是螺栓、轴承的种类,相互之间本就没有很大的差别。这让我意识到,我这个刚刚接触深度学习的小白还是太孤陋寡闻了。
统计图像的尺寸分布
先经过统计得出图像宽高的dataframe
然后用matplotlib将分布表达出来
可以看到我的图像似乎大多数集中在800*800上,实际上不是这样的,接近800*800的主要是上文所说用来迁移学习的25种零件,是拖动录屏的。在600*450处的图像实际上是最多的,是用运动算例直接生成的。
进行训练集与测试集的划分
在最初的数据集文件夹下创建“train”与“test”两个文件夹,并创建子类。
import os
dataset_path = ""
classes = os.listdir(dataset_path)
# 创建 train 文件夹
os.mkdir(os.path.join(dataset_path, 'train'))
# 创建 test 文件夹
os.mkdir(os.path.join(dataset_path, 'val'))
# 在 train 和 test 文件夹中创建各类别子文件夹
for ling in classes:
os.mkdir(os.path.join(dataset_path, 'train', ling))
os.mkdir(os.path.join(dataset_path, 'val', ling))
然后再给出训练集与测试集的比例,随机进行文件的移动。
下面就是拆分后的文件夹结构。
mechanicalling_split/
├── train
│ ├── Erings挡圈
│ ├── O型圈A系列
│ ├── O型圈G系列
│ ├── 侧面带孔圆螺母
│ ├── 储能焊用焊接螺柱
│ ├── 六角头头部带孔螺栓细杆B级
│ ├── 六角头头部带槽螺栓A级和B级
│ ├── 六角头自攻锁紧螺栓
│ ├── 六角头螺杆带孔螺栓A级和B级
│ ├── 六角头螺杆带孔螺栓细杆B级
│ ├── 六角头螺杆带孔铰制孔用螺栓A级和B级
│ ├── 六角头螺栓带孔螺栓细牙A和B级
│ ├── 六角钢
│ ├── 内六角平圆头螺钉
│ ├── 内锯齿锁紧垫圈
│ ├── 内齿锁紧垫圈
│ ├── 加强半圆头方颈螺栓
│ ├── 十字槽凹穴六角头自攻螺钉
│ ├── 十字槽凹穴六角头螺栓
│ ├── 十字槽沉头螺钉
│ ├── 十字槽锁紧自钻自攻螺钉
│ ├── 半圆头带榫螺栓
│ ├── 半圆头方颈螺栓
│ ├── 单耳止动垫圈
│ ├── 双列圆柱滚子轴承NNU型
│ ├── 双列圆柱滚子轴承NN型
│ ├── 双头螺柱
│ ├── 双耳止动垫圈
│ ├── 圆柱滚子轴承
│ ├── 圆螺母用止动垫圈
│ ├── 圆锥滚子轴承
│ ├── 外舌止动垫圈
│ ├── 外调心推力球轴承
│ ├── 外锯齿锁紧垫圈
│ ├── 外齿锁紧垫圈
│ ├── 大半圆头带榫螺栓
│ ├── 大半圆头方颈螺栓C级
│ ├── 夹紧挡圈
│ ├── 孔用弹性挡圈
│ ├── 小半圆头低方颈螺栓B级
│ ├── 小方头螺栓B级
│ ├── 嵌装圆螺母
│ ├── 工字钢用异形垫圈
│ ├── 带锁圈的螺钉锁紧挡圈
│ ├── 平垫圈
│ ├── 开口垫圈
│ ├── 开口销
│ ├── 开槽半沉头螺钉
│ ├── 开槽沉头不脱出螺钉
│ ├── 开槽球面圆柱头轴位螺钉
│ ├── 开槽锥端定位螺钉
│ ├── 拉环螺钉
│ ├── 推力圆柱滚子轴承
│ ├── 推力球轴承
│ ├── 推力调心滚子轴承
│ ├── 方头螺栓C级
│ ├── 方螺母
│ ├── 无头焊钉
│ ├── 普通切向键
│ ├── 标准型弹簧垫圈
│ ├── 正齿轮
│ ├── 沉头双榫螺栓
│ ├── 沉头带榫螺栓
│ ├── 沉头方颈螺栓
│ ├── 波形弹性垫圈
│ ├── 波形弹簧垫圈
│ ├── 深沟球轴承
│ ├── 滚花高头螺钉
│ ├── 热轧工字钢
│ ├── 焊接六角头螺母
│ ├── 球面垫圈
│ ├── 直斜接齿轮
│ ├── 直齿伞
│ ├── 直齿内齿轮
│ ├── 直齿条
│ ├── 精密机械用十字槽自攻螺钉刮削端
│ ├── 蝶形螺母
│ ├── 螺旋齿轮
│ ├── 螺栓紧固轴端挡圈
│ ├── 螺钉紧固轴端挡圈
│ ├── 螺钉锁紧挡圈
│ ├── 角接触球轴承
│ ├── 调心滚子轴承
│ ├── 调心球轴承
│ ├── 轴用弹性挡圈
│ ├── 轴肩挡圈
│ ├── 轻中系列滚针轴承
│ ├── 轻型弹簧垫圈
│ ├── 轻轨
│ ├── 重型弹簧垫圈
│ ├── 钢丝挡圈
│ ├── 钢丝锁圈
│ ├── 钢网架螺栓球节点用高强度螺栓
│ ├── 钩头楔键
│ ├── 锥形斜垫圈
│ ├── 锥形锁紧垫圈
│ ├── 锥形锯齿锁紧垫圈
│ ├── 锥销锁紧挡圈
│ ├── 鞍形弹性垫圈
│ └── 鞍形弹簧垫圈
└── val
├── Erings挡圈
├── O型圈A系列
├── O型圈G系列
├── 侧面带孔圆螺母
├── 储能焊用焊接螺柱
├── 六角头头部带孔螺栓细杆B级
├── 六角头头部带槽螺栓A级和B级
├── 六角头自攻锁紧螺栓
├── 六角头螺杆带孔螺栓A级和B级
├── 六角头螺杆带孔螺栓细杆B级
├── 六角头螺杆带孔铰制孔用螺栓A级和B级
├── 六角头螺栓带孔螺栓细牙A和B级
├── 六角钢
├── 内六角平圆头螺钉
├── 内锯齿锁紧垫圈
├── 内齿锁紧垫圈
├── 加强半圆头方颈螺栓
├── 十字槽凹穴六角头自攻螺钉
├── 十字槽凹穴六角头螺栓
├── 十字槽沉头螺钉
├── 十字槽锁紧自钻自攻螺钉
├── 半圆头带榫螺栓
├── 半圆头方颈螺栓
├── 单耳止动垫圈
├── 双列圆柱滚子轴承NNU型
├── 双列圆柱滚子轴承NN型
├── 双头螺柱
├── 双耳止动垫圈
├── 圆柱滚子轴承
├── 圆螺母用止动垫圈
├── 圆锥滚子轴承
├── 外舌止动垫圈
├── 外调心推力球轴承
├── 外锯齿锁紧垫圈
├── 外齿锁紧垫圈
├── 大半圆头带榫螺栓
├── 大半圆头方颈螺栓C级
├── 夹紧挡圈
├── 孔用弹性挡圈
├── 小半圆头低方颈螺栓B级
├── 小方头螺栓B级
├── 嵌装圆螺母
├── 工字钢用异形垫圈
├── 带锁圈的螺钉锁紧挡圈
├── 平垫圈
├── 开口垫圈
├── 开口销
├── 开槽半沉头螺钉
├── 开槽沉头不脱出螺钉
├── 开槽球面圆柱头轴位螺钉
├── 开槽锥端定位螺钉
├── 拉环螺钉
├── 推力圆柱滚子轴承
├── 推力球轴承
├── 推力调心滚子轴承
├── 方头螺栓C级
├── 方螺母
├── 无头焊钉
├── 普通切向键
├── 标准型弹簧垫圈
├── 正齿轮
├── 沉头双榫螺栓
├── 沉头带榫螺栓
├── 沉头方颈螺栓
├── 波形弹性垫圈
├── 波形弹簧垫圈
├── 深沟球轴承
├── 滚花高头螺钉
├── 热轧工字钢
├── 焊接六角头螺母
├── 球面垫圈
├── 直斜接齿轮
├── 直齿伞
├── 直齿内齿轮
├── 直齿条
├── 精密机械用十字槽自攻螺钉刮削端
├── 蝶形螺母
├── 螺旋齿轮
├── 螺栓紧固轴端挡圈
├── 螺钉紧固轴端挡圈
├── 螺钉锁紧挡圈
├── 角接触球轴承
├── 调心滚子轴承
├── 调心球轴承
├── 轴用弹性挡圈
├── 轴肩挡圈
├── 轻中系列滚针轴承
├── 轻型弹簧垫圈
├── 轻轨
├── 重型弹簧垫圈
├── 钢丝挡圈
├── 钢丝锁圈
├── 钢网架螺栓球节点用高强度螺栓
├── 钩头楔键
├── 锥形斜垫圈
├── 锥形锁紧垫圈
├── 锥形锯齿锁紧垫圈
├── 锥销锁紧挡圈
├── 鞍形弹性垫圈
└── 鞍形弹簧垫圈
202 directories, 0 files
然后我们可以得到这100种图片数目统计。
然后就可以使用这个数据集进行训练了吧。
总结与体会
找数据真的很麻烦。虽然我是机械工程学院的,但我同时还是一个op。前天晚上从百度图片上爬了28个原神角色每人200张图片,但是质量真的很低,热度高的角色还好,热度低的角色搜索结果种常常会出现热度高的角色。手动删了十几个文件夹,最后放弃了这条路子。
随后才打算回到自己的专业上来。本来是打算全部标准件都弄上,但是终究没有这样做。一方面即使是用运动算例生成动画也是足够久;另一方面很多标准件也并不是靠三维图像就能分辨得了的,加进去很多反而会导致数据集质量变差。最后凑整录入了100个标准件,处理后共得到了21828张图像。感觉还是够多了吧大概。
另一个难住我了的就是在Ubuntu上进行matplotlib中文画图的配置。老是搞不好,网上的说法我都试过了,自己下字体,移动到matplotlib的fonts文件夹并修改配置文件我也试过了。连系统的默认字体我都给修改了,还是搞不好,原因是我无法导入“_rebuild”这个重构函数。最后的图像还是在自己的Windows上面搞出来的。
对的,我上面用的是云GPU平台,恒源云。放个链接:恒源云_GPUSHARE-恒源智享云
也没必要隐瞒大家什么,这是个邀请连接,不过只要你不充100块以上,对我来说没有所谓的邀请奖励。QAQ