当前位置:   article > 正文

Windows10+Python+Yolov8+ONNX图片缺陷识别,并在原图中标记缺陷,有onnx模型则无需配置,无需训练。_could not open file yolov8l.onnx

could not open file yolov8l.onnx

目录

一、训练自己数据集的YOLOv8模型 

1.博主电脑配置

2.深度学习GPU环境配置

 3.yolov8深度学习环境准备

4.准备数据集

二、Python+Onnx模型进行图像缺陷检测,并在原图中标注

1、模型转换

2、查看模型结构

3、修改输入图片的尺寸

4、 图像数据归一化

5、模型推理

6、推理结果筛选

7、像素还原

8、筛选重叠面积

9、标记缺陷


一、训练自己数据集的YOLOv8模型 

如果已经有了自己数据集的onnx模型或pt模型,则可以直接跳到二。

1.博主电脑配置

NVIDIA GeForce RTX 3060 12G

Intel(R) Xeon(R) E5-2670 v2 2.50GHz

DDR3 16G

2.深度学习GPU环境配置

python3.9.16+cuda11.1+pytorch1.9.0+torchvision0.10.0+Anaconda3

 打开Anaconda Prompt

conda create --name 环境名字(字母组成) python=3.9.16
activate 你环境的名字
  1. pip install ultralytics
  2. conda install pytorch==1.9.0 torchvision==0.10.0

 3.yolov8深度学习环境准备

到这个网站下载yolov8模型,并解压,尽量放在不含中文路径的文件夹内,解压后是ultralytics-main文件夹。然后我们再Anaconda内cd进这个文件夹

  1. cd C:\Users\SlowS\Desktop\ultralytics-main(你电脑上ultralytics-main的路径)
  2. pip install -r requirements.txt

4.准备数据集

 在主目录ultralytics-main下创建my_data文件夹,在my_data文件夹内创建AnnotationsimagesImageSetslabels这几个文件夹。这几个文件夹名字不能更改!!!

Annotations放xml标注文件,如果没有也不用管
images放数据集文件
ImageSets放txt文件,暂时不用管
labels放txt标注文件,暂时不用管

通过python下载labelimg,并开始标注数据集

 然后参考博客来划分数据集,并进行训练。(2条消息) YOLOv8教程系列:一、使用自定义数据集训练YOLOv8模型(详细版教程,你只看一篇->调参攻略),包含环境搭建/数据准备/模型训练/预测/验证/导出等_Zhijun.li@Studio的博客-CSDN博客

二、Python+Onnx模型进行图像缺陷检测,并在原图中标注

1、模型转换

通过训练得到的模型是pt文件,我们需要转换为onnx文件

  1. from ultralytics import YOLO
  2. # 加载模型
  3. model = YOLO("models\\best.pt")
  4. # 转换模型
  5. model.export(format="onnx")

2、查看模型结构

通过以下网站来查看onnx模型结构

best.onnx (netron.app)

 

 可以得到,输入图片的尺寸要求为3*640*640,输出结果为float32的n*8400二维数组,n为数据集缺陷种类的数量

3、修改输入图片的尺寸

为防止图片畸变,所以需要将图片修改为如下形状

  1. import onnxruntime
  2. import numpy as np
  3. import tkinter
  4. from tkinter import filedialog
  5. import random
  6. import cv2
  7. # 弹出文件选择框,让用户选择要打开的图片
  8. filepath = tkinter.filedialog.askopenfilename()
  9. # 如果用户选择了一个文件,则加载该文件并显示
  10. if filepath != '':
  11. # 读取图片
  12. image = cv2.imread(filepath)
  13. # 获取图像尺寸
  14. h, w = image.shape[:2]
  15. # 将BGR图像转换为RGB图像
  16. image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
  17. # 尺寸变换
  18. if h > w:
  19. img = cv2.resize(image, (int(w / h * 640) , 640))
  20. else:
  21. img = cv2.resize(image, (640 , int(h / w * 640)))
  22. # 创建单色背景图像
  23. background = np.zeros((640, 640, 3), np.uint8)
  24. background[:] = (255, 0, 0)
  25. # 将图像居中放置
  26. x_offset = (640 - img.shape[1]) // 2
  27. y_offset = (640 - img.shape[0]) // 2
  28. background[y_offset:y_offset+img.shape[0], x_offset:x_offset+img.shape[1]] = img
  29. # 显示图片
  30. cv2.imshow('Result', background)
  31. cv2.waitKey(0)
  32. cv2.destroyAllWindows()

4、 图像数据归一化

为了方便深度学习模型对图片数据进行推理,需要对读入图片进行归一化处理

  1. # 将像素值转换为浮点数,并将其归一化到0~1之间
  2. img = image.astype(np.float32) / 255.0
  3. # 将图像从HWC格式转换为CHW格式
  4. img = np.transpose(img, (2, 0, 1))
  5. # 将图像从CHW格式转换为NCHW格式,批次大小为1
  6. img = np.expand_dims(img, axis=0)

5、模型推理

将修改好的图像数据,用onnx模型推理工具进行推理,得到n*8400二维数组的推理结果,n为数据集缺陷种类的数量

  1. # onnx测试
  2. session = onnxruntime.InferenceSession(onnx_model_path)
  3. inputs = {session.get_inputs()[0].name: image}
  4. logits = session.run(None, inputs)[0]
  5. # 将输出转换为二维数组
  6. # 将(1, 9, 8400)的形状转换为(9, 8400)的形状
  7. output = logits.reshape((9, -1))
  8. # 将二维数组转置为(8400, 9)的形状
  9. output = output.transpose((1, 0))

6、推理结果筛选

9*8400二维数组转成8400*9方便处理,9列数据分别表示了检测框的中心x坐标、y坐标、宽度、高度、每个缺陷的置信系数

 需要筛选出缺陷置信系数大于阈值的检测框

  1. # 缺陷位置和缺陷置信系数
  2. selected = np.zeros((0, 9))
  3. # 缺陷置信系数
  4. Thresh = np.zeros((0, 1))
  5. # 缺陷类型
  6. typ = np.zeros((0, 1), dtype=int)
  7. i = 0
  8. # 循环遍历每一行,筛选大于阈值的缺陷
  9. for n in range(num.shape[0]):
  10. # 如果第4~8列中有大于阈值的元素
  11. if np.any(num[n, 4:] > threshold):
  12. # 将这一行添加到selected数组中
  13. selected = np.vstack((selected, num[n]))
  14. # 如果第4列大于阈值
  15. if selected[i, 4] == max(selected[i, 4:]):
  16. # 将type数组第i个元素赋值为缺陷类型0
  17. typ = np.vstack((typ, 0))
  18. # 将Thresh数组第i个元素赋值为缺陷类型0的阈值
  19. Thresh = np.vstack((Thresh, selected[i, 4]))
  20. elif selected[i, 5] == max(selected[i, 4:]):
  21. typ = np.vstack((typ, 1))
  22. Thresh = np.vstack((Thresh, selected[i, 5]))
  23. elif selected[i, 6] == max(selected[i, 4:]):
  24. typ = np.vstack((typ, 2))
  25. Thresh = np.vstack((Thresh, selected[i, 6]))
  26. elif selected[i, 7] == max(selected[i, 4:]):
  27. typ = np.vstack((typ, 3))
  28. Thresh = np.vstack((Thresh, selected[i, 7]))
  29. elif selected[i, 8] == max(selected[i, 4:]):
  30. typ = np.vstack((typ, 4))
  31. Thresh = np.vstack((Thresh, selected[i, 8]))
  32. i = i + 1

7、像素还原

将筛选结果还原成原图像素点坐标

  1. # 获取selected数组的第0、1、2和3列,分别对应缺陷中心x,y坐标,宽度,高度
  2. x_center = select[:, 0]
  3. y_center = select[:, 1]
  4. width = select[:, 2]
  5. height = select[:, 3]
  6. # 计算左上角坐标
  7. x_min = x_center - width / 2
  8. y_min = y_center - height / 2
  9. # 创建bbox数组,将左上角坐标和宽度、高度存储进去
  10. bbox = np.zeros((select.shape[0], 6))
  11. bbox[:, 0] = x_min
  12. bbox[:, 1] = y_min
  13. bbox[:, 2] = width
  14. bbox[:, 3] = height
  15. # 将type数组和Thresh数组分别添加到bbox数组的第4列和第5列
  16. bbox[:, 4] = typ
  17. bbox[:, 5] = thresh
  18. # 图像比例恢复
  19. if h > w:
  20. bbox[:, :4] *= (h/640)
  21. bbox[:, 0] -= (h/2-w/2)
  22. else:
  23. bbox[:, :4] *= (w/640)
  24. bbox[:, 1] -= (w/2-h/2)
  25. # 将二维数组转换为二维列表
  26. my_list = [list(row) for row in bbox]
  27. # 将 0~4 列转换为 int 型,5 列转换为 float 型
  28. for i in range(len(my_list)):
  29. for j in range(len(my_list[i])):
  30. if j < 5:
  31. my_list[i][j] = int(my_list[i][j])
  32. else:
  33. my_list[i][j] = float(my_list[i][j])

8、筛选重叠面积

根据阈值去除同一缺陷种类的重复检测框

  1. i = 0
  2. bbox = sorted(bbox, key=lambda x: x[3])
  3. while i < (len(bbox) - 1):
  4. if bbox[i][4] == bbox[i + 1][4]:
  5. # 计算两个框之间的重叠面积
  6. x1 = max(bbox[i][0], bbox[i + 1][0])
  7. y1 = max(bbox[i][1], bbox[i + 1][1])
  8. x2 = min(bbox[i][0] + bbox[i][2], bbox[i + 1][0] + bbox[i + 1][2])
  9. y2 = min(bbox[i][1] + bbox[i][3], bbox[i + 1][1] + bbox[i + 1][3])
  10. intersection = (x2 - x1) * (y2 - y1)
  11. area1 = bbox[i][2] * bbox[i][3]
  12. area2 = bbox[i + 1][2] * bbox[i + 1][3]
  13. nms = 1 - intersection / (area1 + area2 - intersection)
  14. # print(nms)
  15. # 去除多余框
  16. if nms < threshold and bbox[i][5] >= bbox[i + 1][5]:
  17. del bbox[i + 1]
  18. elif nms < threshold and bbox[i][5] < bbox[i + 1][5]:
  19. del bbox[i]
  20. elif nms > threshold:
  21. i = i + 1
  22. else:
  23. i = i + 1

9、标记缺陷

根据处理完的缺陷位置信息,使用方框将缺陷标记出来

  1. # 循环遍历 bbox 列表中的每一行
  2. for bbox in bbox_list:
  3. # 获取方框的左上角坐标和宽度、高度
  4. x, y, w, h = bbox[:4]
  5. # 随机生成颜色值
  6. color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
  7. # 绘制方框
  8. cv2.rectangle(img, (x, y), (x + w, y + h), color, 2)
  9. # 在方框左上角上加上缺陷类型和置信系数
  10. defect_type = bbox[4]
  11. confidence = bbox[5]
  12. with open(typ_txt, 'r') as f:
  13. labels = f.read().splitlines()
  14. str_confidence = "{:.3f}".format(confidence)
  15. cv2.putText(img, labels[defect_type] + ' ' + str_confidence, (x, y - 5),
  16. cv2.FONT_HERSHEY_SIMPLEX, 2, color, 3)
  17. # 保存绘制好方框的图像
  18. cv2.imwrite('5.jpg', img)
  19. # 创建窗口并显示完整图像
  20. cv2.namedWindow("Image", cv2.WINDOW_NORMAL)
  21. cv2.imshow("Image", img)
  22. # 循环等待按键输入
  23. while True:
  24. if cv2.waitKey(1) == 27:
  25. break
  26. # 关闭窗口并释放资源
  27. cv2.destroyAllWindows()

关注私信发源码。

目前在完成Python+onnx实时检测程序,敬请期待!

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

闽ICP备14008679号