介绍了如何使用 YOLOv5 模型进行图片中的物体检测,并对结果进行后续处理。
1. 从本地加载YOLOv5代码和模型
-
下载代码和模型文件:首先需要将YOLOv5的代码和预训练模型下载到本地。可以通过GitHub或其他方式获取代码和模型文件。
-
加载模型:使用PyTorch的
torch.hub.load
方法加载本地模型。指定模型文件的路径,通过source="local"
参数告知加载器模型来源。 -
读取图片:使用OpenCV等工具读取待检测的图片。
-
进行检测:将读取的图片传入模型,获取检测结果。
-
处理检测结果:根据需要对检测结果进行后续处理,比如绘制边界框、保存结果等。
2. 从GitHub加载YOLOv5代码
-
安装YOLOv5代码:通过Git从YOLOv5的GitHub仓库克隆代码到本地。
-
加载模型:与本地加载方式相同,使用
torch.hub.load
方法加载模型,但是需要指定模型名称而不是模型文件的路径。此时,加载器将自动从GitHub仓库下载模型文件。 -
其余步骤同上。
3. results.pred 与 results.xyxy 的区别
- results.pred:
results.pred
是一个PyTorch张量的列表,每个元素对应一张图片的检测结果。- 每个张量是一个二维张量,包含了检测到的物体的详细信息。每一行代表一个检测到的物体,包括了物体的类别索引、置信度以及边界框的坐标。
-
这种表示方式更加详细和全面,可以直接获取每个物体的类别、置信度和边界框信息。
-
results.xyxy:
results.xyxy
也是一个PyTorch张量的列表,每个元素对应一张图片的检测结果。- 每个张量是一个二维张量,只包含了检测到的物体的边界框坐标信息,每一行包含了一个物体的左上角和右下角的坐标值,以及物体的类别索引和置信度。
- 这种表示方式更加简化,只提供了边界框的坐标信息,不包含类别和置信度信息。
import torch, cv2
# 联网加载模型
# model = torch.hub.load("ultralytics/yolov5", "yolov5s")
# 加载本地模型
model = torch.hub.load(
"/home/ranvane/WorkSpace/yolov4_opencv/yolov5",
"custom",
"/home/ranvane/WorkSpace/yolov4_opencv/yolov5/pt/yolov5s.pt",
source="local",
)
# 读取图片
img_path = "1.jpg"
img = cv2.imread(img_path)
# 进行人体检测
results = model(img)
# results.pred 中包含的是一个包含所有检测结果的 PyTorch 张量,一般一张图片检测结果为1个
for info in results.pred[0]:
x1, y1, x2, y2, label, confidence = info # 获取边界框的坐标
print(x1, y1, x2, y2, label, confidence)
print("-----------")
for info in results.xyxy[0]:
x1, y1, x2, y2, label, confidence = info # 获取边界框的坐标
print(x1, y1, x2, y2, label, confidence)
humans = [x for x in results.xyxy[0] if x[-1] == 0]
# 显示检测结果
for human in humans:
x1, y1, x2, y2, conf, cls = human
cv2.rectangle(img, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2)
cv2.imshow("Humans", img)
cv2.waitKey(0)
cv2.destroyAllWindows()