天天看點

對原始圖像,xml,label進行水準翻轉,進行資料增強

import numpy as np
import cv2
import xml.etree.ElementTree as ET
from PIL import Image

name_classes = ['hqc']  # 類别名,可以更改為對應的voc類别名稱即可

def flip_horizontal(jpg_file,new_jpg,png_file,new_png):
    img = Image.open(jpg_file)
    png =Image.open(png_file)
    # out = im.transpose(Image.ROTATE_180)
    out_img = img.transpose(Image.FLIP_LEFT_RIGHT)
    out_png = png.transpose(Image.FLIP_LEFT_RIGHT)

    out_img.save(new_jpg)
    out_png.save(new_png)


def flip_xml(xml_file,new_xml):
    tree = ET.parse(xml_file)
    objs = tree.findall('object')
    for ix, obj in enumerate(objs):
        name = obj.find('name').text
        if name == 'hqc':           # 因為本資料集隻針對某一個更改的,你要改的有很多,此處要改為 if name in name_classes :
            print(xml_file)
            obj_new = obj.find('bndbox')
            xmin = str( 256 - int(obj_new.find('xmax').text))     # 因為進行水準翻轉,這隻改變x坐标值,y坐标值不變
            xmax = str( 256 - int(obj_new.find('xmin').text))     # 此處256是圖檔的寬和高,水準翻轉,最大值變最小值,最小值變最大值
            obj_new.find('xmin').text = xmin
            obj_new.find('xmax').text = xmax
            tree.write(new_xml)


if __name__ == '__main__':
    # 原始的圖檔,xml,png資料集的路徑
    xml_file='F:/資料集/hqc/annotation/2.xml'
    jpg_file=r'F:/資料集/hqc/image/2.jpg'
    png_file=r'F:/資料集/hqc/label/2.png'
    
    # 水準翻轉後儲存的路徑
    new_jpg=r'F:/資料集/shiyan/2.jpg'
    new_xml = r'F:/資料集/shiyan/2.xml'
    new_png='F:/資料集/shiyan/2.png'
    flip_xml(xml_file, new_xml)
    flip_horizontal(jpg_file, new_jpg,png_file,new_png)

    image =Image.open(new_jpg)
    tree = ET.parse(new_xml)
    root = tree.getroot()

    for obj in root.iter('object'):
        difficult = 0
        if obj.find('difficult') != None:
            difficult = obj.find('difficult').text

        cls = obj.find('name').text
        if cls not in name_classes or int(difficult) == 1:
            continue
        cls_id = name_classes.index(cls)
        xmlbox = obj.find('bndbox')
        b = (int(xmlbox.find('xmin').text), int(xmlbox.find('ymin').text), int(xmlbox.find('xmax').text),
             int(xmlbox.find('ymax').text))
        print(b)

    image = cv2.cvtColor(np.asarray(image), cv2.COLOR_RGB2BGR)
    cv_img = cv2.rectangle(image, (int(float(b[0])),
                                   int(float(b[1]))),
                           (int(float(b[2])),
                            int(float(b[3]))), (255, 0, 0), 2)

    image = Image.fromarray(cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB))
    image.show()
           

 實作的效果如下:

對原始圖像,xml,label進行水準翻轉,進行資料增強

原始圖像

對原始圖像,xml,label進行水準翻轉,進行資料增強

水準翻轉

對原始圖像,xml,label進行水準翻轉,進行資料增強

水準翻轉後的标簽

對原始圖像,xml,label進行水準翻轉,進行資料增強

水準反轉後的框