引言
问题由来,先看一波最初的标注文件,每组数据都包含一个json标注文件,一个红外图片,一个可见光图片。这三个文件名中有无"(1)",根本没有规律,这直接导致后续的处理变得很艰难。
思路主要利用红外可见光图片所占内存的大小去区分图片类型,根据创建时间已经不可取了。
os.path.getsize(image_file1)
方法
标注文件有两种格式类型:.json .xml 下面是最终规整过后的效果:
changechange_V_R_Name.py
import datetime
import json
import os
import re
import fnmatch
from PIL import Image
import numpy as np
from pycococreatortools import pycococreatortools
from glob import glob
import cv2
import shutil
anno_format = '.json' # .json .xml
part = "/tank/tank_static_forest/"
IMAGE_DIR = r"C:\Users\awei\Downloads\red_sunshice_origin"+part
saved_path = r"C:\Users\awei\Downloads\red_sunshice_origin\new_dir"+part
if not os.path.exists(saved_path):
os.makedirs(saved_path)
def filter_for_jpeg(root, files):
file_types = ['*.jpeg', '*.jpg', '*.png']
file_types = r'|'.join([fnmatch.translate(x) for x in file_types])
files = [os.path.join(root, f) for f in files]
files = [f for f in files if re.match(file_types, f)]
return files
def filter_for_annotation(root, files):
file_types = ['*.xml', '*.json']
file_types = r'|'.join([fnmatch.translate(x) for x in file_types])
files = [os.path.join(root, f) for f in files]
files = [f for f in files if re.match(file_types, f)]
return files
def main():
# filter for jpeg images
for root, _, files in os.walk(IMAGE_DIR):
image_files = filter_for_jpeg(root, files)
anno_files = filter_for_annotation(root,files)
while len(image_files)!=0:
# go through each image
image_file1 = image_files.pop(0)
try:
if '(' in image_file1:
index2 = image_files.index(image_file1.replace('(1)',''))
try:
anno_index = anno_files.index(image_file1.replace('(1).jpg',anno_format))
except:
anno_index = anno_files.index(image_file1.replace('.jpg',anno_format))
else:
index2 = image_files.index(image_file1.split('.')[0]+"(1).jpg")
try:
anno_index = anno_files.index(image_file1.replace('.jpg',anno_format))
except:
anno_index = anno_files.index(image_file1.replace('.jpg','(1)'+anno_format))
image_file2 = image_files.pop(index2)
except:
print("数据缺失:"+image_file1)
continue
# 可见光图片所占内存比红外大
rename_part = os.path.basename(image_file1).split('.')[0].split('(')[0]
if os.path.getsize(image_file1)>os.path.getsize(image_file2):
shutil.copy(image_file1, saved_path+rename_part+'_V.jpg')
shutil.copy(image_file2, saved_path+rename_part+'_R.jpg')
else:
shutil.copy(image_file2, saved_path+rename_part+'_V.jpg')
shutil.copy(image_file1, saved_path+rename_part+'_R.jpg')
label_file = anno_files.pop(anno_index)
shutil.copy(label_file, saved_path+rename_part+anno_format)
if __name__ == "__main__":
main()
下面就可以各种各样的融合处理: