要件:
データセットのデータ拡張では、画像を垂直方向に反転する操作が必要になる場合があります。画像を垂直方向に反転した後、対応する XML アノテーション ファイルの座標も調整する必要があります。
解決策:
python+opencv+import xml.etree.ElementTree を使用して画像を垂直方向に反転し、xml 注釈ファイルの座標を調整します。コードは以下のように表示されます。
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) を変更する必要があります。プロテストが受けられます。