Datawhale开源学习202301 Pytorch图像分类全流程实战Task1:构建自己的图像分类数据集

任务一要求:构建自己的图像分类数据集

Datawhale开源学习202301 Pytorch图像分类全流程实战Task1:构建自己的图像分类数据集_第1张图片

对于datawhale的开源学习计划,我眼馋很久了,只是之前在学校,不敢轻易尝试。此次寒假终于能够克服畏难情绪进行尝试,终归是有所进步的。

第一个任务即是构建自己的图像分类数据集,看起来还是一个比较简单的任务,没想到还是让我头大许久。

数据来源

身为一名机械工程学院学生,我采用了一百个标准件构建数据集。

构建方法是,通过solidworks的运动算例生成标准件改变视图的动画,再将动画视频按帧读取。因为solidworks中的帧数可以自己调整,所以我制作的多是40~80帧、4~5秒的动画视频。

 

 用opencv读取每一帧。这里出现了一个问题,cv.imwrite()不支持中文路径,因此我直接采用0~99的数字为名字创建文件夹,随后用os库与之前读取的零件名称列表对文件夹名进行了修改。Datawhale开源学习202301 Pytorch图像分类全流程实战Task1:构建自己的图像分类数据集_第2张图片

这样最初的图片文件夹就建立完成了。

疑虑

由于这些零件在图片中所处位置、颜色等方面都比较相似,与ImageNet数据集的相似度也比较低,我对这样一个数据集能否进行有效的分类心存疑虑。选择了25种零件进行了迁移学习微调训练,仅30个轮次,在测试集上的准确率就达到了77%,这二十五种零件都是螺栓、轴承的种类,相互之间本就没有很大的差别。这让我意识到,我这个刚刚接触深度学习的小白还是太孤陋寡闻了。

Datawhale开源学习202301 Pytorch图像分类全流程实战Task1:构建自己的图像分类数据集_第3张图片 

 统计图像的尺寸分布

先经过统计得出图像宽高的dataframe

Datawhale开源学习202301 Pytorch图像分类全流程实战Task1:构建自己的图像分类数据集_第4张图片

 

然后用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

 

 

 

 

你可能感兴趣的:(参与dw开源学习,学习,pytorch,分类,python)