YoloV5 训练长方形图像

20230329更新

官方的源代码中,训练的时候将rect开启,即可进行长方形训练同时也会进一步降低训练时的显存。

 Imagesz只需要设置图像最大尺寸即可,在dataload中,读取图像时候会进行判断处理,

 在load_image过程中,会将图像等比例缩放

比如原图为1280*640。

输入的imagesize为1280的话,则读取的图像为1280*640,

输入的imagesize为640的话,则读取的图像为640*320

 

但是需要注意开始Rect后 不会再对图像进行mosaic的增强,如果实在需要的话可以参考原来的长方形训练(下面的文章进行更改)

 

 

 

长方形图像训练:

Step1: 修改训练图片的尺寸,因为默认尺寸是是对训练集和验证集的。所以此处进行修改长方形时,需要分别赋值构建一个数组。

Step2:Train.py中修改对图像尺寸检查的功能。

Step3: Train.py中修改模型属性功能。原来640 是int类型,现在【640,320】是一个数组。所以需要进行修改。

 Step4: 对LoadImageAndLabels中的代码进行修改

 

修改mosic功能

 修改Load_image功能

 修改load_mosaic功能

 

修改mosaic拼接功能以及label拼接的功能。

注意看if isinstance 做判断的位置,都会进行修改。

    def load_mosaic(self, index):
        # YOLOv5 4-mosaic loader. Loads 1 image + 3 random images into a 4-image mosaic
        labels4, segments4 = [], []
        if isinstance(self.img_size, int):
            s = self.img_size
            yc, xc = (int(random.uniform(-x, 2 * s + x)) for x in self.mosaic_border)  # mosaic center x, y
        else:
            s_h, s_w = self.img_size  # (h,w)
            yc, xc = [int(random.uniform(-x, 2 * s + x)) for x, s in zip(self.mosaic_border, self.img_size)]
        indices = [index] + random.choices(self.indices, k=3)  # 3 additional image indices
        random.shuffle(indices)
        for i, index in enumerate(indices):
            # Load image
            img, _, (h, w) = self.load_image(index)
            if isinstance(self.img_size, int):
                # place img in img4
                if i == 0:  # top left
                    img4 = np.full((s * 2, s * 2, img.shape[2]), 114, dtype=np.uint8)  # base image with 4 tiles
                    x1a, y1a, x2a, y2a = max(xc - w, 0), max(yc - h, 0), xc, yc  # xmin, ymin, xmax, ymax (large image)
                    x1b, y1b, x2b, y2b = w - (x2a - x1a), h - (y2a - y1a), w, h  # xmin, ymin, xmax, ymax (small image)
                elif i == 1:  # top right
                    x1a, y1a, x2a, y2a = xc, max(yc - h, 0), min(xc + w, s * 2), yc
                    x1b, y1b, x2b, y2b = 0, h - (y2a - y1a), min(w, x2a - x1a), h
                elif i == 2:  # bottom left
                    x1a, y1a, x2a, y2a = max(xc - w, 0), yc, xc, min(s * 2, yc + h)
                    x1b, y1b, x2b, y2b = w - (x2a - x1a), 0, w, min(y2a - y1a, h)
                elif i == 3:  # bottom right
                    x1a, y1a, x2a, y2a = xc, yc, min(xc + w, s * 2), min(s * 2, yc + h)
                    x1b, y1b, x2b, y2b = 0, 0, min(w, x2a - x1a), min(y2a - y1a, h)
            else:
                if i == 0:  # top left
                    img4 = np.full((s_h * 2, s_w * 2, img.shape[2]), 114, dtype=np.uint8)  # base image with 4 tiles
                    x1a, y1a, x2a, y2a = max(xc - w, 0), max(yc - h, 0), xc, yc  # xmin, ymin, xmax, ymax (large image)
                    x1b, y1b, x2b, y2b = w - (x2a - x1a), h - (y2a - y1a), w, h  # xmin, ymin, xmax, ymax (small image)
                elif i == 1:  # top right
                    x1a, y1a, x2a, y2a = xc, max(yc - h, 0), min(xc + w, s_w * 2), yc
                    x1b, y1b, x2b, y2b = 0, h - (y2a - y1a), min(w, x2a - x1a), h
                elif i == 2:  # bottom left
                    x1a, y1a, x2a, y2a = max(xc - w, 0), yc, xc, min(s_h * 2, yc + h)
                    x1b, y1b, x2b, y2b = w - (x2a - x1a), 0, w, min(y2a - y1a, h)
                elif i == 3:  # bottom right
                    x1a, y1a, x2a, y2a = xc, yc, min(xc + w, s_w * 2), min(s_h * 2, yc + h)
                    x1b, y1b, x2b, y2b = 0, 0, min(w, x2a - x1a), min(y2a - y1a, h)

            img4[y1a:y2a, x1a:x2a] = img[y1b:y2b, x1b:x2b]  # img4[ymin:ymax, xmin:xmax]
            padw = x1a - x1b
            padh = y1a - y1b

            # Labels
            labels, segments = self.labels[index].copy(), self.segments[index].copy()
            if labels.size:
                labels[:, 1:] = xywhn2xyxy(labels[:, 1:], w, h, padw, padh)  # normalized xywh to pixel xyxy format
                segments = [xyn2xy(x, w, h, padw, padh) for x in segments]
            labels4.append(labels)
            segments4.extend(segments)

至此就完成了程序上的修改

附mosaic增强

        mosaic拼接并不是将图片进行4等份拼接。

 1:会随机设定中心点,然后这个中心点将数据分为4份,然后将图片填充到每一份中。

马赛克的中心点值,随机从-x ---2*s+x 中随机抽选,一般X的值为-320,所以就变成 了  320-        -960中随机抽选中心值。

Step0:   初始化整幅图,将图片的像素都填充为114

Step1:读取当前要填充的图片,并获取图片的长和宽

Step2:    计算当前图片在大图中的位置 ,如果当前图片超过大图界限,越界部分就取消掉。

同时如果当前图片过小,填充不了大图给定的区域位置。

不管大图小图都要计算其在整幅图片中的位置,计算差异值,因为接下来要取更新标签(label)

(标签是相对于图片的位置的,如果当前图片放入大图中,没有完全占据左上角,那么不就多余

了部分空的区域了吗直接计算标签的话肯定偏移,所以要去除掉这些空的区域再取加载原来的图片的标签并且更新)

如果有label正好在边界上,就要修正或者裁剪掉超过边界的框

Step3:    连续放入图片

Step4:  对放入的图片进行随机的旋转,翻转 ,平移 缩放等等操作。

  • 9
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
对于训练 YOLOv7 模型来检测长方形图像,你可以按照以下步骤进行操作: 1. 数据准备:收集包含长方形图像数据集,并标注每个长方形的边界框。可以使用标注工具如LabelImg、RectLabel等进行标注,并生成相应的标注文件。 2. 数据预处理:将图像和标注文件转换为 YOLO 格式。YOLOv7使用的是 Darknet 格式,其中包含一个图像文件和一个对应的标注文件。标注文件的每一行应包含对象类别和边界框的位置信息。 3. 模型配置:在 Darknet 框架中,YOLOv7模型的配置信息保存在一个配置文件中,例如`yolov7.cfg`。你需要根据自己的需求进行相应的配置,包括网络结构、卷积层、类别数等。 4. 权重初始化:YOLOv7模型通常使用在大规模数据集上预训练的权重进行初始化,如COCO数据集。你可以从官方网站下载预训练权重文件,例如`yolov7.weights`。 5. 训练模型:使用准备好的数据集和配置文件进行训练。通过运行训练命令,例如`./darknet detector train data/obj.data cfg/yolov7.cfg darknet53.conv.74`,开始训练模型。在训练过程中,模型会逐渐学习检测长方形的能力。 6. 模型评估:训练完成后,可以使用测试集对模型进行评估,计算模型的精度和召回率等指标。 7. 模型部署:完成模型训练和评估后,可以将模型部署到你的应用中进行长方形检测。 请注意,以上步骤仅供参考,具体实施可能需要根据你的数据集和需求进行适当调整。同时,YOLOv7模型的具体实现可能会因框架和库的不同而有所差异。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值