python YOLOV8如何处理不同的图像大小

idfiyjo8  于 2023-02-07  发布在  Python
关注(0)|答案(1)|浏览(1880)

Yolov8和我怀疑Yolov5处理非正方形图像的效果很好。我看不出任何裁剪输入图像的迹象,即检测似乎是去了最长边的边缘。它是否会调整大小为正方形640x604,这将改变对象的长宽比,使它们更难检测?
当从预训练模型开始训练自定义数据集时,imgsz(图像大小)参数实际起什么作用?

fykwrbwg

fykwrbwg1#

从v3开始,现代Yolo版本可以处理任意大小的图像,只要两边都是32的倍数。这是因为 Backbone.js 的最大跨距是32,并且它是一个完全卷积网络。

培训

举个例子,假设你开始一个trining:

from ultralytics.yolo.engine.model import YOLO
  
model = YOLO("yolov8n.pt")
results = model.train(data="coco128.yaml", imgsz=512)

通过在trainer.py中打印输入到模型(im)的内容,您将获得以下输出:

Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
  0%|          | 0/8 [00:00<?, ?it/s]
 torch.Size([16, 3, 512, 512])
      1/100      1.67G      1.165      1.447      1.198        226        512:  12%|█▎        | 1/8 [00:01<00:08,  1.15s/it]
 torch.Size([16, 3, 512, 512])
      1/100      1.68G      1.144      1.511       1.22        165        512:  25%|██▌       | 2/8 [00:02<00:06,  1.10s/it]
 torch.Size([16, 3, 512, 512])

因此,在训练过程中,图像必须重新调整为相同的大小,以便能够创建迷你批次,因为您无法连接不同形状的Tensor。imgsz选择要训练的图像的大小。

预测

现在,我们来看一下预测,假设您选择assets下的图像作为source,imgsz 512下的图像为

from ultralytics.yolo.engine.model import YOLO
  
model = YOLO("yolov8n.pt")
results = model.predict(stream=True, imgsz=512) # source already setup

通过在predictor.py中打印原始图像形状(im0)和馈送到模型的图像形状(im),您将获得以下输出:

(yolov8) ➜  ultralytics git:(main) ✗ python new.py 
Ultralytics YOLOv8.0.23 🚀 Python-3.8.15 torch-1.11.0+cu102 CUDA:0 (Quadro P2000, 4032MiB)
YOLOv8n summary (fused): 168 layers, 3151904 parameters, 0 gradients, 8.7 GFLOPs
im0s (1080, 810, 3)
im torch.Size([1, 3, 512, 384])
image 1/2 /home/mikel.brostrom/ultralytics/ultralytics/assets/bus.jpg: 512x384 4 persons, 1 bus, 7.4ms
im0s (720, 1280, 3)
im torch.Size([1, 3, 288, 512])
image 2/2 /home/mikel.brostrom/ultralytics/ultralytics/assets/zidane.jpg: 288x512 3 persons, 2 ties, 5.8ms
Speed: 0.4ms pre-process, 6.6ms inference, 1.5ms postprocess per image at shape (1, 3, 512, 512)

您可以看到,最长的图像边被调整为512。短边被调整为最接近32的倍数,同时保持纵横比。由于您没有同时馈送多个图像,因此不需要将图像调整为相同的形状并堆叠它们,从而可以避免填充。

相关问题