当前位置:   article > 正文

(202301)pytorch图像分类全流程实战Task1:构建自己的图像分类数据集_pytorch制作自己的图片数据集

pytorch制作自己的图片数据集

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

对于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”两个文件夹,并创建子类。

  1. import os
  2. dataset_path = ""
  3. classes = os.listdir(dataset_path)
  4. # 创建 train 文件夹
  5. os.mkdir(os.path.join(dataset_path, 'train'))
  6. # 创建 test 文件夹
  7. os.mkdir(os.path.join(dataset_path, 'val'))
  8. # 在 train 和 test 文件夹中创建各类别子文件夹
  9. for ling in classes:
  10. os.mkdir(os.path.join(dataset_path, 'train', ling))
  11. os.mkdir(os.path.join(dataset_path, 'val', ling))

 然后再给出训练集与测试集的比例,随机进行文件的移动。

下面就是拆分后的文件夹结构。

  1. mechanicalling_split/
  2. ├── train
  3. │ ├── Erings挡圈
  4. │ ├── O型圈A系列
  5. │ ├── O型圈G系列
  6. │ ├── 侧面带孔圆螺母
  7. │ ├── 储能焊用焊接螺柱
  8. │ ├── 六角头头部带孔螺栓细杆B级
  9. │ ├── 六角头头部带槽螺栓A级和B级
  10. │ ├── 六角头自攻锁紧螺栓
  11. │ ├── 六角头螺杆带孔螺栓A级和B级
  12. │ ├── 六角头螺杆带孔螺栓细杆B级
  13. │ ├── 六角头螺杆带孔铰制孔用螺栓A级和B级
  14. │ ├── 六角头螺栓带孔螺栓细牙A和B级
  15. │ ├── 六角钢
  16. │ ├── 内六角平圆头螺钉
  17. │ ├── 内锯齿锁紧垫圈
  18. │ ├── 内齿锁紧垫圈
  19. │ ├── 加强半圆头方颈螺栓
  20. │ ├── 十字槽凹穴六角头自攻螺钉
  21. │ ├── 十字槽凹穴六角头螺栓
  22. │ ├── 十字槽沉头螺钉
  23. │ ├── 十字槽锁紧自钻自攻螺钉
  24. │ ├── 半圆头带榫螺栓
  25. │ ├── 半圆头方颈螺栓
  26. │ ├── 单耳止动垫圈
  27. │ ├── 双列圆柱滚子轴承NNU型
  28. │ ├── 双列圆柱滚子轴承NN型
  29. │ ├── 双头螺柱
  30. │ ├── 双耳止动垫圈
  31. │ ├── 圆柱滚子轴承
  32. │ ├── 圆螺母用止动垫圈
  33. │ ├── 圆锥滚子轴承
  34. │ ├── 外舌止动垫圈
  35. │ ├── 外调心推力球轴承
  36. │ ├── 外锯齿锁紧垫圈
  37. │ ├── 外齿锁紧垫圈
  38. │ ├── 大半圆头带榫螺栓
  39. │ ├── 大半圆头方颈螺栓C级
  40. │ ├── 夹紧挡圈
  41. │ ├── 孔用弹性挡圈
  42. │ ├── 小半圆头低方颈螺栓B级
  43. │ ├── 小方头螺栓B级
  44. │ ├── 嵌装圆螺母
  45. │ ├── 工字钢用异形垫圈
  46. │ ├── 带锁圈的螺钉锁紧挡圈
  47. │ ├── 平垫圈
  48. │ ├── 开口垫圈
  49. │ ├── 开口销
  50. │ ├── 开槽半沉头螺钉
  51. │ ├── 开槽沉头不脱出螺钉
  52. │ ├── 开槽球面圆柱头轴位螺钉
  53. │ ├── 开槽锥端定位螺钉
  54. │ ├── 拉环螺钉
  55. │ ├── 推力圆柱滚子轴承
  56. │ ├── 推力球轴承
  57. │ ├── 推力调心滚子轴承
  58. │ ├── 方头螺栓C级
  59. │ ├── 方螺母
  60. │ ├── 无头焊钉
  61. │ ├── 普通切向键
  62. │ ├── 标准型弹簧垫圈
  63. │ ├── 正齿轮
  64. │ ├── 沉头双榫螺栓
  65. │ ├── 沉头带榫螺栓
  66. │ ├── 沉头方颈螺栓
  67. │ ├── 波形弹性垫圈
  68. │ ├── 波形弹簧垫圈
  69. │ ├── 深沟球轴承
  70. │ ├── 滚花高头螺钉
  71. │ ├── 热轧工字钢
  72. │ ├── 焊接六角头螺母
  73. │ ├── 球面垫圈
  74. │ ├── 直斜接齿轮
  75. │ ├── 直齿伞
  76. │ ├── 直齿内齿轮
  77. │ ├── 直齿条
  78. │ ├── 精密机械用十字槽自攻螺钉刮削端
  79. │ ├── 蝶形螺母
  80. │ ├── 螺旋齿轮
  81. │ ├── 螺栓紧固轴端挡圈
  82. │ ├── 螺钉紧固轴端挡圈
  83. │ ├── 螺钉锁紧挡圈
  84. │ ├── 角接触球轴承
  85. │ ├── 调心滚子轴承
  86. │ ├── 调心球轴承
  87. │ ├── 轴用弹性挡圈
  88. │ ├── 轴肩挡圈
  89. │ ├── 轻中系列滚针轴承
  90. │ ├── 轻型弹簧垫圈
  91. │ ├── 轻轨
  92. │ ├── 重型弹簧垫圈
  93. │ ├── 钢丝挡圈
  94. │ ├── 钢丝锁圈
  95. │ ├── 钢网架螺栓球节点用高强度螺栓
  96. │ ├── 钩头楔键
  97. │ ├── 锥形斜垫圈
  98. │ ├── 锥形锁紧垫圈
  99. │ ├── 锥形锯齿锁紧垫圈
  100. │ ├── 锥销锁紧挡圈
  101. │ ├── 鞍形弹性垫圈
  102. │ └── 鞍形弹簧垫圈
  103. └── val
  104. ├── Erings挡圈
  105. ├── O型圈A系列
  106. ├── O型圈G系列
  107. ├── 侧面带孔圆螺母
  108. ├── 储能焊用焊接螺柱
  109. ├── 六角头头部带孔螺栓细杆B级
  110. ├── 六角头头部带槽螺栓A级和B级
  111. ├── 六角头自攻锁紧螺栓
  112. ├── 六角头螺杆带孔螺栓A级和B级
  113. ├── 六角头螺杆带孔螺栓细杆B级
  114. ├── 六角头螺杆带孔铰制孔用螺栓A级和B级
  115. ├── 六角头螺栓带孔螺栓细牙A和B级
  116. ├── 六角钢
  117. ├── 内六角平圆头螺钉
  118. ├── 内锯齿锁紧垫圈
  119. ├── 内齿锁紧垫圈
  120. ├── 加强半圆头方颈螺栓
  121. ├── 十字槽凹穴六角头自攻螺钉
  122. ├── 十字槽凹穴六角头螺栓
  123. ├── 十字槽沉头螺钉
  124. ├── 十字槽锁紧自钻自攻螺钉
  125. ├── 半圆头带榫螺栓
  126. ├── 半圆头方颈螺栓
  127. ├── 单耳止动垫圈
  128. ├── 双列圆柱滚子轴承NNU型
  129. ├── 双列圆柱滚子轴承NN型
  130. ├── 双头螺柱
  131. ├── 双耳止动垫圈
  132. ├── 圆柱滚子轴承
  133. ├── 圆螺母用止动垫圈
  134. ├── 圆锥滚子轴承
  135. ├── 外舌止动垫圈
  136. ├── 外调心推力球轴承
  137. ├── 外锯齿锁紧垫圈
  138. ├── 外齿锁紧垫圈
  139. ├── 大半圆头带榫螺栓
  140. ├── 大半圆头方颈螺栓C级
  141. ├── 夹紧挡圈
  142. ├── 孔用弹性挡圈
  143. ├── 小半圆头低方颈螺栓B级
  144. ├── 小方头螺栓B级
  145. ├── 嵌装圆螺母
  146. ├── 工字钢用异形垫圈
  147. ├── 带锁圈的螺钉锁紧挡圈
  148. ├── 平垫圈
  149. ├── 开口垫圈
  150. ├── 开口销
  151. ├── 开槽半沉头螺钉
  152. ├── 开槽沉头不脱出螺钉
  153. ├── 开槽球面圆柱头轴位螺钉
  154. ├── 开槽锥端定位螺钉
  155. ├── 拉环螺钉
  156. ├── 推力圆柱滚子轴承
  157. ├── 推力球轴承
  158. ├── 推力调心滚子轴承
  159. ├── 方头螺栓C级
  160. ├── 方螺母
  161. ├── 无头焊钉
  162. ├── 普通切向键
  163. ├── 标准型弹簧垫圈
  164. ├── 正齿轮
  165. ├── 沉头双榫螺栓
  166. ├── 沉头带榫螺栓
  167. ├── 沉头方颈螺栓
  168. ├── 波形弹性垫圈
  169. ├── 波形弹簧垫圈
  170. ├── 深沟球轴承
  171. ├── 滚花高头螺钉
  172. ├── 热轧工字钢
  173. ├── 焊接六角头螺母
  174. ├── 球面垫圈
  175. ├── 直斜接齿轮
  176. ├── 直齿伞
  177. ├── 直齿内齿轮
  178. ├── 直齿条
  179. ├── 精密机械用十字槽自攻螺钉刮削端
  180. ├── 蝶形螺母
  181. ├── 螺旋齿轮
  182. ├── 螺栓紧固轴端挡圈
  183. ├── 螺钉紧固轴端挡圈
  184. ├── 螺钉锁紧挡圈
  185. ├── 角接触球轴承
  186. ├── 调心滚子轴承
  187. ├── 调心球轴承
  188. ├── 轴用弹性挡圈
  189. ├── 轴肩挡圈
  190. ├── 轻中系列滚针轴承
  191. ├── 轻型弹簧垫圈
  192. ├── 轻轨
  193. ├── 重型弹簧垫圈
  194. ├── 钢丝挡圈
  195. ├── 钢丝锁圈
  196. ├── 钢网架螺栓球节点用高强度螺栓
  197. ├── 钩头楔键
  198. ├── 锥形斜垫圈
  199. ├── 锥形锁紧垫圈
  200. ├── 锥形锯齿锁紧垫圈
  201. ├── 锥销锁紧挡圈
  202. ├── 鞍形弹性垫圈
  203. └── 鞍形弹簧垫圈
  204. 202 directories, 0 files

 然后我们可以得到这100种图片数目统计。

 然后就可以使用这个数据集进行训练了吧。

总结与体会

找数据真的很麻烦。虽然我是机械工程学院的,但我同时还是一个op。前天晚上从百度图片上爬了28个原神角色每人200张图片,但是质量真的很低,热度高的角色还好,热度低的角色搜索结果种常常会出现热度高的角色。手动删了十几个文件夹,最后放弃了这条路子。

随后才打算回到自己的专业上来。本来是打算全部标准件都弄上,但是终究没有这样做。一方面即使是用运动算例生成动画也是足够久;另一方面很多标准件也并不是靠三维图像就能分辨得了的,加进去很多反而会导致数据集质量变差。最后凑整录入了100个标准件,处理后共得到了21828张图像。感觉还是够多了吧大概。

另一个难住我了的就是在Ubuntu上进行matplotlib中文画图的配置。老是搞不好,网上的说法我都试过了,自己下字体,移动到matplotlib的fonts文件夹并修改配置文件我也试过了。连系统的默认字体我都给修改了,还是搞不好,原因是我无法导入“_rebuild”这个重构函数。最后的图像还是在自己的Windows上面搞出来的。

对的,我上面用的是云GPU平台,恒源云。放个链接:恒源云_GPUSHARE-恒源智享云

也没必要隐瞒大家什么,这是个邀请连接,不过只要你不充100块以上,对我来说没有所谓的邀请奖励。QAQ

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/860509
推荐阅读
相关标签
  

闽ICP备14008679号