钢材是现代工业和建筑领域中不可或缺的结构材料,其质量影响到工程的安全性和可靠性。钢材表面的缺陷,如裂纹、夹杂、斑块、麻点表面、轧制鳞片、划痕,可能导致结构弱点和降低耐久性,进而引发安全隐患。因此,检测钢材表面缺陷成为钢材生产过程中的重要环节。本次实验是在PC端训练一个钢材缺陷模型并部署在Atlas200DK A2上,项目代码已上传百度网盘:https://pan.baidu.com/s/1oFioXDg8DF9Z09YdlAVAsw?pwd=anyp,提取码:anyp。
数据集使用的是东北大学热轧带钢表面缺陷数据集,该数据集收集了 热轧带钢表面的6类典型缺陷:氧化铁皮压入(rolled-in scale, RS)、斑块(patches, Pa)、开裂(crazing, Cr)、点蚀(pitted surface, PS)、包含杂物(inclusion, In)、划痕(scratches, Sc)。每种类型缺陷各 300 个样本,总共 1800 张灰度图像,每张图像的 原始分辨率 为 200×200 像素。直接从官方下载的数据集为XML格式,需要转换成txt格式,数据集下载地址:NEU-DET数据集,XML转txt脚本参考这里。

数据集部分图片
模型训练使用的是yolov5官方代码,版本yolov5s,训练参数epochs为100,batch_size为32,发现直接使用原版yolov5s训练效果并不好,准确率只有0.41,map0.5为0.497

在不改变训练参数的情况下我在SPPF(快速空间金字塔池化)层前面加了一个SE注意力模块,通过在模型中引入SE注意力机制,可以使得模型在训练过程中更加高效地学习到数据中的重要特征,从而提升模型的性能。对修改后的模型进行重训练,准确率由0.41提升到0.709,map0.5由0.497提升到0.655,效果还是比较明显的。

将训练好的模型转换为.onnx模型,在虚拟机安装cann通过atc工具转换为.om模型,转换脚本为
,在转换模型时遇到了一些问题,使用版本为Ascend-cann-toolkit_7.0.1_linux-x86_64.run转换出来的.om模型通过netron查看比较奇怪,实际使用时可以使用但是精度很低,样子如下图
使用cann版本7.0.1的.om模型
印象中以前转换出来的模型不是这样的,怀疑是更新了cann版本导致的,将cann版本换回Ascend-cann-toolkit_6.2.RC2_linux-x86_64.run,相同转换命令转换出来的模型并无异常,后续使用cann6.2版本转换模型。
使用cann版本6.2的.om模型
将转换的模型和脚本上传到Atlas200DK A2开发板中,脚本由官方的yolov5脚本修改而来,报错为下图将预处理函数中数据类型由np.float32改为np.float16

下面这个报错也卡住了好久,参考模型适配工具 yolov5 模型迁移说明, 将img = np.ascontiguousarray(img, dtype=np.float32)改为 img = np.ascontiguousarray(img, dtype=np.float32)/255.0后问题解决。
运行main.py后会在output目录下生成推理结果,具体效果如下(gif图片上传大小限制5M,压缩在压缩,有点看不清了):

总结:通过在Atlas200DK A2部署了基于YOLOV5s的钢材缺陷检测,进一步的熟悉了在Atlas200DK A2上部署识别算法的整体流程,同时对踩的坑进行总结,为后续在嵌入式设备上部署算法积累经验。
钢材是现代工业和建筑领域中不可或缺的结构材料,其质量影响到工程的安全性和可靠性。钢材表面的缺陷,如裂纹、夹杂、斑块、麻点表面、轧制鳞片、划痕,可能导致结构弱点和降低耐久性,进而引发安全隐患。因此,检测钢材表面缺陷成为钢材生产过程中的重要环节。本次实验是在PC端训练一个钢材缺陷模型并部署在Atlas200DK A2上,项目代码已上传百度网盘:https://pan.baidu.com/s/1oFioXDg8DF9Z09YdlAVAsw?pwd=anyp,提取码:anyp。
数据集使用的是东北大学热轧带钢表面缺陷数据集,该数据集收集了 热轧带钢表面的6类典型缺陷:氧化铁皮压入(rolled-in scale, RS)、斑块(patches, Pa)、开裂(crazing, Cr)、点蚀(pitted surface, PS)、包含杂物(inclusion, In)、划痕(scratches, Sc)。每种类型缺陷各 300 个样本,总共 1800 张灰度图像,每张图像的 原始分辨率 为 200×200 像素。直接从官方下载的数据集为XML格式,需要转换成txt格式,数据集下载地址:NEU-DET数据集,XML转txt脚本参考这里。
数据集部分图片
模型训练使用的是yolov5官方代码,版本yolov5s,训练参数epochs为100,batch_size为32,发现直接使用原版yolov5s训练效果并不好,准确率只有0.41,map0.5为0.497
在不改变训练参数的情况下我在SPPF(快速空间金字塔池化)层前面加了一个SE注意力模块,通过在模型中引入SE注意力机制,可以使得模型在训练过程中更加高效地学习到数据中的重要特征,从而提升模型的性能。对修改后的模型进行重训练,准确率由0.41提升到0.709,map0.5由0.497提升到0.655,效果还是比较明显的。
将训练好的模型转换为.onnx模型,在虚拟机安装cann通过atc工具转换为.om模型,转换脚本为
,在转换模型时遇到了一些问题,使用版本为Ascend-cann-toolkit_7.0.1_linux-x86_64.run转换出来的.om模型通过netron查看比较奇怪,实际使用时可以使用但是精度很低,样子如下图
使用cann版本7.0.1的.om模型
印象中以前转换出来的模型不是这样的,怀疑是更新了cann版本导致的,将cann版本换回Ascend-cann-toolkit_6.2.RC2_linux-x86_64.run,相同转换命令转换出来的模型并无异常,后续使用cann6.2版本转换模型。
使用cann版本6.2的.om模型
将转换的模型和脚本上传到Atlas200DK A2开发板中,脚本由官方的yolov5脚本修改而来,报错为下图将预处理函数中数据类型由np.float32改为np.float16
下面这个报错也卡住了好久,参考模型适配工具 yolov5 模型迁移说明, 将img = np.ascontiguousarray(img, dtype=np.float32)改为 img = np.ascontiguousarray(img, dtype=np.float32)/255.0后问题解决。
Traceback (most recent call last): File "/home/HwHiAiUser/samples/notebooks/10-mytest/det_utils.py", line 225, in nms boxout = non_max_suppression(box_out, conf_thres=conf_thres, iou_thres=iou_thres, multi_label=True) File "/home/HwHiAiUser/samples/notebooks/10-mytest/det_utils.py", line 179, in non_max_suppression LOGGER.warning(f'WARNING ⚠️ NMS time limit {time_limit:.3f}s exceeded') NameError: name 'LOGGER' is not defined During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/HwHiAiUser/samples/notebooks/10-mytest/main.py", line 158, in <module> infer_image(img_path, model, labels_dict, cfg) File "/home/HwHiAiUser/samples/notebooks/10-mytest/main.py", line 68, in infer_image boxout = nms(output, conf_thres=cfg["conf_thres"], iou_thres=cfg["iou_thres"]) File "/home/HwHiAiUser/samples/notebooks/10-mytest/det_utils.py", line 227, in nms boxout = non_max_suppression(box_out, conf_thres=conf_thres, iou_thres=iou_thres) File "/home/HwHiAiUser/samples/notebooks/10-mytest/det_utils.py", line 179, in non_max_suppression LOGGER.warning(f'WARNING ⚠️ NMS time limit {time_limit:.3f}s exceeded') NameError: name 'LOGGER' is not defined运行main.py后会在output目录下生成推理结果,具体效果如下(gif图片上传大小限制5M,压缩在压缩,有点看不清了):
总结:通过在Atlas200DK A2部署了基于YOLOV5s的钢材缺陷检测,进一步的熟悉了在Atlas200DK A2上部署识别算法的整体流程,同时对踩的坑进行总结,为后续在嵌入式设备上部署算法积累经验。