
利用labelme生成Mask
·
0. 背景
最近网络训练的数据为了排除图像周边的干扰,使得网络只关注划定的周界区域,因此需要得到训练图像的Mask,然后对原始图像进行预处理。
1. 使用labelme生成关键点的json文件
labelme的安装地址:Release v4.5.9 · wkentaro/labelme (github.com)
十分建议在win10下安装labelme.exe文件
下图为labelme绘制区域的示意图,保存之后可以得到一个json文件,文件内容中包含了绘制点的坐标信息。
2. 生成Mask文件
通过读取json文件,获取关键点信息,从而得到周界区域,生成Mask。
import json
import numpy as np
import cv2
# read json file
with open("./data/region.json", "r") as f:
data = f.read()
# convert str to json objs
data = json.loads(data)
# get the points
points = data["shapes"][0]["points"]
points = np.array(points, dtype=np.int32) # tips: points location must be int32
# read image to get shape
image = cv2.imread("./data/region.jpg")
# create a blank image
mask = np.zeros_like(image, dtype=np.uint8)
# fill the contour with 255
cv2.fillPoly(mask, [points], (255, 255, 255))
# save the mask
cv2.imwrite("mask.png", mask)
运行代码,得到Mask文件,如下图所示。
3. 对图像进行预处理
该阶段基于mask文件对原始图像进行填充处理,减少训练干扰以及训练难度。
import cv2
import os
import numpy as np
# 原始图像路径
srcRoot = "XXXX"
# 生成图像路径
dstRoot = "XXXXXXXXXX"
# 生成图像名前缀
prefix = "XXXXXXXXX"
# mask图像路径
maskPath = "mask.png"
def getPerimeter(srcRoot, dstRoot, prefix, maskPath, start=0):
maskImg = cv2.imread(maskPath)
region = maskImg == 0
img_paths = os.listdir(srcRoot)
for path in img_paths:
srcImg = cv2.imread(os.path.join(srcRoot, path))
srcImg[region] = 0
name = prefix + "0" * (6 - len(str(start))) + str(start) + ".jpg"
cv2.imwrite(os.path.join(dstRoot, name), srcImg)
start += 1
# 生成周界图像
getPerimeter(srcRoot, dstRoot, prefix, maskPath, 0)
得到的输出结果如下图所示:
预处理完毕!
更多推荐
所有评论(0)