изменить размер помеченного изображения в labelimg

искусственный интеллект Python

описание проблемы

в нашем использованииlabelimgПосле того, как такой инструмент будет аннотирован, может возникнуть необходимость снова изменить размер изображения.В это время настройка рамки аннотации более громоздка.

по фактуstackoverflow этот вопросОтвет ниже дал более полное объяснение этого требования, и заинтересованные друзья могут взглянуть. Я даю свое собственное временное решение в этой статье для справки.

решение

Небольшой скрипт выглядит следующим образом

    import re
    import cv2


    def resize_labelimg_pic(src_img_file, tar_img_file, src_ann_file, tar_ann_file, w_new):
        '''
        resize 已标注图片并更新标注文件
        :param src_img_file: 原始图片地址
        :param tar_img_file: 更新后图片地址
        :param src_ann_file: 原始标注文件地址
        :param tar_ann_file: 更新后标注文件地址
        :param w_new: resize 后的图片宽度
        '''

        # 获取原始图片尺寸
        img = cv2.imread(src_img_file)
        h, w, _ = img.shape

        # 计算缩放比例
        ratio = w_new / w

        # 计算目标图片尺寸并保存
        h_new = int(h * ratio)

        # 更新标注文件(直接基于正则替换)
        with open(src_ann_file, "r") as f:
            text = f.read()
            text = re.sub("<width>.*</width>", f"<width>{w_new}</width>", text)
            text = re.sub("<height>.*</height>", f"<height>{h_new}</height>", text)

            for tab in ["xmin", "xmax", "ymin", "ymax"]:
                text = re.sub(f"(?<=<{tab}>)(.*?)(?=</{tab}>)",
                            lambda match: str(int(int(match.group())*ratio)), text)

        # 输出结果
        tar_img = cv2.resize(img, (w_new, h_new))
        cv2.imwrite(tar_img_file, tar_img)

        with open(tar_ann_file, "w") as f:
            f.write(text)