当前位置:   article > 正文

简化YOLOv5的推理过程_yolov5推理过程

yolov5推理过程

模型为YOLOv5s(v7.0)


基本流程:

加载模型---动态resize图片大小---归一化---HWC转CHW---扩展维度---numpy转tensor---转float32---预测--NMS--将检测框缩放至原始图尺寸--你需要的功能(截图、画检测框等)

一、导入库

导入cv2和numpy、torch库,从general.py中导入non_max_suppression(NMS,用于去除重复框),scale_boxes(将检测框缩放至原图片上)。

  1. import cv2
  2. import numpy as np
  3. import torch
  4. from utils.general import non_max_suppression, scale_boxes
  5. from utils.plots import save_one_box2 #自己写的,根据检测框保存截图

二、完整代码

  1. import cv2
  2. import numpy as np
  3. import torch
  4. from utils.general import non_max_suppression, scale_boxes
  5. from utils.plots import save_one_box2 #自己写的,根据检测框保存截图
  6. if __name__ == "__main__":
  7. device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') #检测是否有gpu,有则使用gpu
  8. weights = 'best.pt' #模型权重地址
  9. img0 = cv2.imread('test/ori_images/9.jpg') #读取图片
  10. w = str (weights) #将权重地址转换为字符串
  11. #加载模型
  12. model=torch.load(w, map_location=device)['model'].float().fuse().eval() #加载模型,float()转换为float32,fuse()融合模型加速推理,eval()评估模式
  13. ###############################动态调整图片大小##############################################
  14. height, width = img0.shape[:2]
  15. #比较宽和高大小,将最大的设为640
  16. if height > width:
  17. target = 640
  18. scale = target / height
  19. # 计算缩放后的尺寸,高度向下取整至32的倍数
  20. new_width = int(width * scale / 32) * 32
  21. new_height = target
  22. else:
  23. target= 640
  24. scale = target / width
  25. # 计算缩放后的尺寸,高度向下取整至32的倍数
  26. new_height= int(height * scale / 32) * 32
  27. new_width = target
  28. # 缩放图像
  29. img = cv2.resize(img0, (new_width,new_height ))
  30. ############################################################################################
  31. img = img / 255. #归一化至[0,1]
  32. img = img[:, :, ::-1].transpose((2, 0, 1)) #HWC转CHW
  33. img = np.expand_dims(img, axis=0) #扩展维度至[1,3,new_height,new_width]
  34. img = torch.from_numpy(img.copy()) #numpy转tensor
  35. img = img.to(torch.float32) #float64转换float32
  36. img = img.to(device) #cpu转gpu
  37. pred = model(img)
  38. # pred.clone().detach()
  39. pred = non_max_suppression(pred, 0.25, 0.45, None, False, max_det=1000) #非极大值抑制,去除重复框
  40. for i, det in enumerate(pred):
  41. if len(det):
  42. det[:, :4] = scale_boxes(img.shape[2:], det[:, :4], img0.shape).round() #将预测框缩放至原图尺寸
  43. for *xyxy, conf, cls in reversed(det):
  44. img0=cv2.rectangle(img0, (int(xyxy[0]), int(xyxy[1])), (int(xyxy[2]), int(xyxy[3])), (0, 0, 255), 2)
  45. img0=cv2.putText(img0, str(int(cls)), (int(xyxy[0]), int(xyxy[1])), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
  46. save_one_box2(xyxy, img0, file='out2.jpg')
  47. cv2.imwrite('out.jpg', img0)

三、结果分析

使用动态resize

 直接resize(img,(640,640))

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

闽ICP备14008679号