Yolo 的离线运行
运行环境准备
比较简单的办法是通过官方的github获取到对应的yolo运行需要的python环境-requirement.txt.通过如下地址可以获取到对应的文件和相应的说明以及实例。
Yolov5 git地址
为了让程序能本地话运行,我们还需要获取相应的模型权重文件,目前YOLO提供多种权重模型,我们选择的时Yolov5x的权重参数。
下载地址如下:
Yolov5 预训练参数
程序代码
import torch
from yolov5.models.experimental import attempt_load
from yolov5.utils.dataloaders import LoadImages
from yolov5.utils.general import check_img_size, non_max_suppression, scale_boxes
from yolov5.utils.plots import plot_one_box
from yolov5.utils.torch_utils import select_device
import cv2
def detect(weights=r'C:\VM\YOLO\yolov5-master\ultralytics\yolov5\yolov5x.pt', imgsz=640):
# 初始化设备
device = select_device('')
# 加载模型
model = attempt_load(weights, device='cuda') # load FP32 model
stride = int(model.stride.max()) # model stride
imgsz = check_img_size(imgsz, s=stride) # check img_size
# 设置模型为评估模式
model.to(device).eval()
# 加载图像
dataset = LoadImages(r'C:\Users\XPI1CNG\Pictures\Picture1.jpg', img_size=imgsz, stride=stride)
# 运行推理
for path, img, im0s, vid_cap, s in dataset:
img = torch.from_numpy(img).to(device)
img = img.float() # uint8 to fp32
img /= 255.0 # 0 - 255 to 0.0 - 1.0
if img.ndimension() == 3:
img = img.unsqueeze(0)
# 推理
pred = model(img, augment=False)[0]
# 应用非最大值抑制
pred = non_max_suppression(pred, 0.25, 0.45, classes=None, agnostic=False)
# 处理检测结果
for i, det in enumerate(pred): # detections per image
p, s, im0 = path, '', im0s
save_path = r'C:\Users\XPI1CNG\Pictures\3333.jpg'
gn = torch.tensor(im0.shape)[[1, 0, 1, 0]] # normalization gain whwh
if len(det):
# 将坐标缩放回原图大小
det[:, :4] = scale_boxes(img.shape[2:], det[:, :4], im0.shape).round()
# 绘制边界框
for *xyxy, conf, cls in reversed(det):
label = f'{model.names[int(cls)]} {conf:.2f}'
plot_one_box(xyxy, im0, label=label, color=(0, 255, 0), line_thickness=3)
# 保存结果
cv2.imwrite(save_path, im0)
if __name__ == '__main__':
detect()
错误处理
模块变更
在执行时,会出现如下错误:
ModuleNotFoundError: No module named ‘yolov5.utils.datasets’
原因时由于在新的yolov5中,没有了datasets.py文件,此文件被dataloaders所取代,因此需要修改程序为:
from yolov5.utils.dataloaders import LoadImages
函数变更
在执行时,会出现如下错误:
cannot import name ‘scale_coords’ from ‘yolov5.utils.general’
原因时在新版本的yolov5中,scale_coords已经被scale_boxes取代,因此需要修改程序中所有的scale_coords,变更为scale_boxes。
数据类型错误
在模型执行时,报错如下
RuntimeError: “upsample_nearest2d_channels_last” not implemented for ‘Half’
这个错误是因为PyTorch在处理Half数据类型时,对于某些操作(例如upsample_nearest2d_channels_last)没有实现。为了解决这个问题,你需要确保模型和输入数据都在相同的数据类型上进行操作。这里有一个步骤来解决这个问题:
- 首先,确保你的模型是在float32(即torch.float32)的数据类型上训练的。如果你的模型是用Half精度训练的,那么你可能需要重新训练它,因为YoloV5默认使用float32。
- 假设model是你加载的模型
model = model.half() # 将模型转换为Half精度
model = model.float() # 再次转换回Float32精度
- 确保输入数据也是float32。在加载图像数据时,可以使用to()函数将其转换为正确的数据类型
import torch
img_data = img_data.to(device='cuda', dtype=torch.float32)
返回值不匹配
在模型执行时,报错如下
ValueError:too many values to unpack(expected 4)
出现该错误的原因是dataset返回值与实际需要的值不匹配(path, img, im0s, vid_cap),通过查看LoadImages的函数,发现此函数的返回值为5个 - return path, im, im0, self.cap, s。
为解决这个问题,将程序修改为读取5个返回即可。
for path, img, im0s, vid_cap, s in dataset:
参考文件:
[1]https://www.baidu.com/link?url=cAxksQetEOEubXto-xSNdmLVZHbHjglVBnx__tkaqIwnvAwVabrjpydHpHCErG2B78VVu-pcpBGfKpVuHj-6uruvbwt-eNuCrv_NSCjlyxi&wd=&eqid=a600e45f0055a43a00000006668e2c07
[2]https://blog.csdn.net/m0_58074927/article/details/128032999