尝试解决的问题
项目中要使用实例分割网络将图片中的目标分割出来,但是原图普遍非常大,大部分是 (5000pixels * 6000pixels)
这样的规格,如果直接传到网络中进行训练,计算量会非常大。所以考虑先离线resize好了之后作为数据集再训练网络,而不是在输入网络之间才resize(这样会很浪费时间)。
实现代码
废话少说,直接上代码即可:代码逻辑大概为先统计文件夹中的是图片的文件格式,例如有 {'jpg', 'JPG', 'png'}
这三种,接着使用 glob
库找到包含这几种后缀格式的所有图片文件,对这些照片使用 cv2.resize()
函数进行等比例缩放,缩放后保存到目标文件夹去。另外也要对json格式的标注文件中的点坐标进行缩放,直接坐标乘以缩放比例即可。最后值得注意的一点是,json
标注文件中的 ['imageData']
字段也要改成resize之后的图片哦,不然使用labelme
打开后的图片还是原来没有resize前的图,polygons
的位置跟大小是不对的。
import cv2
import os
import glob
import json
import collections
import numpy as np
from labelme import utils
if __name__ == "__main__":
src_dir = './srcDir'
dst_dir = './dstDir'
if not os.path.exists(dst_dir):
os.makedirs(dst_dir)
# 先收集一下文件夹中图片的格式列表,例如 ['.jpg', '.JPG']
exts = dict()
filesnames = os.listdir(src_dir