使用OpenCV合成训练图片,同时生成labelme兼容格式的标注文件
生活随笔
收集整理的這篇文章主要介紹了
使用OpenCV合成训练图片,同时生成labelme兼容格式的标注文件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?思路很簡單,加載背景圖片,加載目標圖片,隨機抽取N個目標圖像,將目標圖像的像素copy到背景圖片上,拷貝的位置可根據要求指定;同時合成標注json文件。代碼如下:
# coding=utf-8from cv2 import cv2 import os import numpy as np import randomfrom gen_ann_json import AnnotationsJsonXXX_WIDTH = 48 XXX_HEIGHT = 72#加載源圖像,多個,隨機抽取后復制到背景圖像上 def load_src_images():path = './src_img'files = os.listdir(path)xxxs = []for f in files:if '000' in f:continueif os.path.isdir(f):continueimg_file = os.path.join(path, f)xxx = cv2.imread(img_file)xxx = cv2.resize(xxx,(XXX_WIDTH, XXX_HEIGHT))xxxs.append(xxx)return xxxs#圖像混合(將src拷貝到dst上,位置:x、y) def img_mix(dst, src, x, y):output = dst.copy()output[y:y + src.shape[0], x:x + src.shape[1]] = srcreturn output#功能同上,多了一次90°旋轉操作 def img_mix_horv(dst, src, x, y):#transposedImage = cv2.transpose(src)transposedImage=np.rot90(src)output = img_mix(dst, transposedImage, x, y)return output#合成一個大的子區域,上面copy多個src圖像,最后在將子區域拷貝到背景上 def mix_xxx_region(offset_x, offset_y, show_region_img, xxxs):fixed_xxx_regions = [[85, 12], [138, 12], [208, 12], [261, 12]]random.shuffle(xxxs)#將樣本打亂,抽取前4--6個outputImg = show_region_img.copy()pointsArr = []for i in range(4):xxx = xxxs[i]x, y = fixed_xxx_regions[i][0], fixed_xxx_regions[i][1]outputImg = img_mix(outputImg, xxx, x, y)pointsArr.append([[offset_x + x, offset_y + y], [offset_x + x + XXX_WIDTH, offset_y + y + XXX_HEIGHT]])if random.random() > 0.5:outputImg = img_mix_horv(outputImg, xxxs[4], 9, 35)pointsArr.append([[offset_x+9, offset_y+35], [offset_x+9 + XXX_HEIGHT, offset_y+35 + XXX_WIDTH]])if random.random() > 0.5:outputImg= img_mix_horv(outputImg, xxxs[5], 314, 35)pointsArr.append([[offset_x+314, offset_y+35], [offset_x+314 + XXX_HEIGHT, offset_y+35 + XXX_WIDTH]]) return outputImg, pointsArr#保存json格式的標注文件 def saveJsonFile(jpgFileName, jsonFileName, pointsArr):annObj = AnnotationsJson(jpgFileName, 811, 833)for points in pointsArr:annObj.AppendLabel("xxx", points)annObj.SaveToJsonFile(jsonFileName)#合成圖片 def mix_image(dst, show_region_img, xxxs):#6個子區域所在位置show_region_pos_list = [[2, 157],[2, 435],[2, 713],[410, 157],[410, 435],[410, 713]]output = dst.copy()pointsArr = []subRegion = [0,1,2,3,4,5]random.shuffle(subRegion)#將位置打散,選取前4個for i in range(4):index = subRegion[i]x = show_region_pos_list[index][0]y = show_region_pos_list[index][1]#先將隨機的牌復制到顯示區域xxx_region, pointsArr2 = mix_xxx_region(x, y, show_region_img, xxxs)pointsArr.extend(pointsArr2)#再將顯示區域復制到桌位面板上output = img_mix(output, xxx_region, x, y)return output, pointsArrxxxs = load_xxx_images() dst = cv2.imread('./back1.jpg') show_region_img = cv2.imread('./show_region.jpg') for i in range(1, 1001):output, pointsArr = mix_image(dst, show_region_img, xxxs)cv2.imwrite('./images_ann/{}.jpg'.format(i), output)saveJsonFile('{}.jpg'.format(i), './images_ann/{}.json'.format(i), pointsArr)生成json標注文件代碼:
import jsonclass AnnotationsJson(object):def __init__(self, imagePath, imgWidht, imgHeight):self.version = "3.16.7"self.flags = {},self.shapes = []self.fillColor = [255,0,0,128]self.lineColor = [0, 255, 0, 128]self.imagePath = imagePathself.imageData = Noneself.imageHeight = imgHeightself.imageWidth = imgWidhtdef AppendLabel(self, label, points):self.shapes.append({"label":label, "line_color":None, "fill_color":None, "points":points, "shape_type":"rectangle", "flag":{}})def ToJson(self):outObj = {"version": self.version, "flags": {}, "shapes":[], "fillColor": self.fillColor,"lineColor":self.lineColor, "imagePath":self.imagePath, "imageData":None, "imageHeight":self.imageHeight, "imageWidth":self.imageWidth}for shape in self.shapes:outObj["shapes"].append({"label":shape["label"], "line_color":None, "fill_color":None, "points":shape["points"], "shape_type":"rectangle", "flags":{}})res = json.dumps(outObj)return resdef SaveToJsonFile(self, filename):jsonString = self.ToJson()with open(filename, "w") as f:f.write(jsonString)if __name__ == "__main__":annObj = AnnotationsJson("1.jpg", 811, 833)annObj.AppendLabel("xxx", [[11,22], [33,44]])print(annObj.ToJson())annObj.SaveToJsonFile("1.json")合成幾千張圖片后,即可使用unet等網絡進行訓練、驗證。
總結
以上是生活随笔為你收集整理的使用OpenCV合成训练图片,同时生成labelme兼容格式的标注文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 昨天的梦想 今天的幸福
- 下一篇: Python绘制节点是饼状图的社交网络图