接上一篇。任务流程是拿到电池三维重建结果,对重建结果进行Z轴切割,根据切割出的图像中的电池边缘在合适的位置对电池进行X轴和Y轴方向再次切割,就可以得到清晰的电池纵向和横向的切割截面图,并找出截面图中电池正负级极点坐标输出为csv文件。
因为这次项目要用到yolov5深度学习框架,是要用到英伟达显卡,我的笔记本是amd显卡,所有用的是我师父的电脑,现在就没什么数据在我这个电脑上。
yolov5下载
链接: yolov5安装教程
打标签
labelme 打标签工具
labelme生成的标签文件是.json文件,而YOLOv5标签文件格式要求是.txt文件,所以要对.json文件进行处理转换成.txt文件。
训练模型
创建文件目录框架如下
images和labels的一定要放在同一路径下,因为yolov5模型使用时并不需要你去指定labels数据位置,而是通过训练数据的路径去找labels路径,如训练集路径./datasets/images/train/*.png,那么yolov5会直接把训练集路径中的’images’替换成‘labels’,‘png’替换成’txt’,替换后的新路径设置为label训练集对应的标签路径。
训练前需要调整的是训练的模型,yolov5提供了5个模型,yolov5n、yolov5s、yolov5m、yolov5l、yolov5x,训练时间依次递增,训练效果依次递增
训练结束后会将模型保存在runs下的exe文件夹下。
值得一提的是yolov5模型有早停机制(Early Stopping),如果训练过程中在未到达epochs且平均mAP(平均精确率的平均)没有再提高,那么yolov5会自己停下训练并保存训练模型。
检验模型
定义detector检测类,
class Detector:
def __init__(self):
self.model_af = torch.hub.load(r'C:\dip\yolov5', 'custom', path=r'C:\dip\model\weights\best-xwd-1109.pt', source='local')
self.model_af.conf = 0.01 # 置信度
self.model_af.iou = 0.01 # 交叉比
def detect(self, images):
res_list = []
results = None
results = self.model_af(images, size=1000)
for row_i in results.xyxy[0].cpu():
xmin, ymin, xmax, ymax, conf, label = row_i
res_list.append([int(xmin.round()), int(ymin.round()), int(xmax.round()), int(ymax.round()), float(conf), int(label)])
return res_list
定义检测函数
def detect_img_dir(src_dir:str):
detector = Detector()
img_file_list = glob.glob('*.png', root_dir=src_dir)
total_num = len(img_file_list)
print("total_num = ", total_num)
i = 0
for img_file in img_file_list:
i += 1
print(f'{i}/{total_num} {img_file}')
try:
detect_tif_file(os.path.join(src_dir, img_file), detector)
except BaseException as e:
print(e)
通过调用检测函数会在原文件下新生成两个.csv文件和一个*mark.png文件,即正负级极点坐标和描点图像。
问题
这次任务中遇到以下几个问题
- x,y截面图不清晰
- 模型找不到标签
- 训练模型准确度不够理想
解决方法
- 重新修改寻边函数,对于个别结果依旧不理想的手动去截
- 创建标准文件目录框架,labels和images一定要是相同的路径结构
- 原因认为是训练集太少,打标签的标准不够清晰。先打第一批标签60个,生成预标准,然后训练模型,将全部数据集在放入模型中去检测,将检测结果在转回.json文件,再次订正标签60个,生成第二批预标准,将两批预标准都放入模型中再次训练。
总结
这次项目是来公司的第一个项目,主要运用Canny边缘检测算法和yolov5深度学习框架。首先是对于边缘检测的有了新的认识。本科在校期间也做过边缘检测的相关实验,使用的有sober算子、Laplace算子和Canny算子等,这次是首次将这些真正运用到实际生活中,图像的边缘处理效果最好的还是Canny算子,他是基于一阶导数,对于图像噪声有较强的适应性,主要分为高斯滤波、计算梯度、非极大值抑制、双阈值过滤四个部分,其中sigma为高斯滤波方差,影响图像所能识别出线条的数量,双阈值是为了控制非主体线条的数量。YOLOv5使用起来还是非常方便的,用x模型训练出来的模型效果也较为理想,但原理方面现在还是一窍不通,往后会继续学习深度学习和机器视觉相关内容,再接再厉!!!