目标检测任务数据集的数据增强中,图像垂直翻转和xml标注文件坐标调整

需求:

数据集的数据增强中,有时需要用到图像垂直翻转的操作,图像垂直翻转后,对应的xml标注文件也需要做坐标的调整。
解决方法:
使用python+opencv+import xml.etree.ElementTree对图像垂直翻转和xml标注文件坐标调整。代码如下:

python 复制代码
import cv2
import os
import glob
import xml.etree.ElementTree as et


def flip_images(source_dir):
    images_list = glob.glob(os.path.join(source_dir, "*.jpg"))
    index = 0
    for image_path in images_list:
        image = cv2.imread(image_path)
        flip_image = cv2.flip(image,0)
        cv2.imwrite(image_path.replace(".jpg", "_flip.jpg"), flip_image)
        tree_ = et.ElementTree()
        tree_.parse(image_path.replace(".jpg", ".xml"))

        root = et.Element("annotation")
        folder = et.SubElement(root, "folder")
        folder.text = "images"
        filename = et.SubElement(root, "filename")
        filename.text = tree_.find(".//filename").text.replace(".jpg", "_flip.jpg")
        path = et.SubElement(root, "path")
        path.text = "/home/mapgoo/test"
        source = et.SubElement(root, "source")
        database = et.SubElement(source, "database")
        database.text = "Unknown"
        size = et.SubElement(root, "size")
        width = et.SubElement(size, "width")
        width.text = tree_.find(".//width").text
        height = et.SubElement(size, "height")
        height.text = tree_.find(".//height").text
        depth = et.SubElement(size, "depth")
        depth.text = "3"
        segmented = et.SubElement(root, "segmented")
        segmented.text = "0"

        for bndbox in tree_.findall(".//object"):
            xmin = bndbox.find(".//xmin")
            ymin = bndbox.find(".//ymin")
            xmax = bndbox.find(".//xmax")
            ymax = bndbox.find(".//ymax")
            xmin_text = xmin.text
            ymin_text = ymin.text
            xmax_text = xmax.text
            ymax_text = ymax.text

            object_ = et.SubElement(root, "object")
            name = et.SubElement(object_, "name")
            name.text = bndbox.find("name").text
            pose = et.SubElement(object_, "pose")
            pose.text = "Unspecified"
            truncated = et.SubElement(object_, "truncated")
            truncated.text = "0"
            difficult = et.SubElement(object_, "difficult")
            difficult.text = "0"
            bndbox = et.SubElement(object_, "bndbox")
            xmin = et.SubElement(bndbox, "xmin")
            xmin.text = xmin_text
            ymin = et.SubElement(bndbox, "ymin")
            ymin.text = str(image.shape[0] - int(ymax_text))
            xmax = et.SubElement(bndbox, "xmax")
            xmax.text = xmax_text
            ymax = et.SubElement(bndbox, "ymax")
            ymax.text = str(image.shape[0] - int(ymin_text))

        tree = et.ElementTree(root)
        tree.write(image_path.replace(".jpg", "_flip.xml"), encoding="utf-8")
        print(image_path, index)
        index += 1


if __name__ == '__main__':
    source_dir = "/home/Desktop/test"
    flip_images(source_dir)

使用以上代码需要修改原图像和标注文件所在文件夹路径(source_dir)。亲测可用。

相关推荐
Mrliu__2 分钟前
Opencv(十八) : 图像凸包检测
人工智能·opencv·计算机视觉
Brduino脑机接口技术答疑3 分钟前
脑机接口数据处理连载(六) 脑机接口频域特征提取实战:傅里叶变换与功率谱分析
人工智能·python·算法·机器学习·数据分析·脑机接口
计算所陈老师3 分钟前
Palantir的核心是Ontology
大数据·人工智能·知识图谱
大转转FE4 分钟前
[特殊字符] 浏览器自动化革命:从 Selenium 到 AI Browser 的 20 年进化史
运维·人工智能·selenium·测试工具·自动化
世岩清上6 分钟前
世岩清上:科技向善,让乡村“被看见”更“被理解”
人工智能·ar·乡村振兴·和美乡村
dagouaofei6 分钟前
AI 生成开题报告 PPT 会自动提炼重点吗?
人工智能·python·powerpoint
安达发公司9 分钟前
安达发|颜色与产能如何兼得?APS高级排程织就智慧生产网
大数据·人工智能·aps高级排程·aps排程软件·安达发aps
鼎道开发者联盟10 分钟前
当界面会思考:AIGUI八要素驱动DingOS实现“感知-生成-进化“闭环
前端·人工智能·ai·gui
OpenLoong 开源社区10 分钟前
技术视界 | 当开源机器人走进校园:一场研讨会上的开源教育实践课
人工智能·机器人·开源
PPT百科12 分钟前
教师备课效率:PPT家园的一键编辑 vsPPT百科的 AI 生成辅助
人工智能·经验分享·职场和发展·powerpoint·职场·ppt