import os
import shutil
from glob import glob
from PIL import Image
import tensorflow as tf
import numpy as np
from tqdm import tqdm
def ret_img_path(all_paths, fname) :
for path in all_paths :
if fname in path:
return path
all_paths 리스트와, 원하는 fname 을 인자로 사용fname 을 포함하는 이미지의 경로를 return 해준다fname은 properties로 부터 받아오는 파일명, return해주는 path같은 경우는 이미지의 전체 경로를 나타내므로 pillow혹은 cv로 이미지를 읽어올때 path를 바로 전달해주면 이미지 읽어들이기 가능def cropping(class_paths, main_class):
# 결과물은 새로운 폴더에 저장
# 클래스명을 활용해서 cropped_'class'폴더 생성
save_dir_path = '../test/cropped_kfood/' + main_class +'/'
if not os.path.exists(save_dir_path):
os.makedirs(save_dir_path)
print("main 디렉토리 생성 : ", save_dir_path)
# crop_area path 저장
print("crop_area 파일 수집중")
for path in class_paths :
if 'crop_area' in path :
crop_path = path
break
# crop_area파일 읽기
f = open(crop_path, 'r')
data = f.read()
f.close()
crop_infos = data.split('\\n')
cropped_fname = []
# crop에 대한 정보가 있는 파일들은 crop을 하고,
# 앞에서 새로 만든 cropped_classname 디렉터리에 저장
print("crop 시작")
for crop_info in tqdm(crop_infos) :
fname = crop_info.split('=')[0]
try :
x, y, w, h = list(map(int, crop_info.split('=')[-1].split(',')))
except :
continue
img_path = ret_img_path(class_paths, fname)
try :
image = Image.open(img_path)
class_name = img_path.split('/')[-2]
except :
continue
# print(class_name)
image = image.convert("RGB")
cropped_img = image.crop((x, y, x+w, y+h))
img_save_path = save_dir_path + class_name + '/'
if not os.path.exists(img_save_path) :
os.makedirs(img_save_path)
print("sub 디렉토리 생성 : ", img_save_path)
# print(img_save_path + 'cropped_' + fname + '.jpg')
cropped_img.save(img_save_path + 'cropped_' + fname + '.jpg')
cropped_fname.append(fname)
print("crop 끝")
print("\\n\\ncrop을 하지 않은 이미지를 복사 중입니다.")
print("잠시만 기다려 주세요")
# crop이 필요없는 image들의 경우..
# crop 경로에 똑같이 복사를 해준다
for path in tqdm(class_paths):
fname = path.split('/')[-1].split('.')[0]
if fname not in cropped_fname and 'csv' not in path and 'properties' not in path:
shutil.copy(path, img_save_path)
main class 디렉토리 생성 (김치, 튀김, 면 등등)
crop_area.properties 탐색 후 파일 열기
다음과 같은 형식으로 구성되어 있음
...
Img_016_0763=17,117,290,283
...
파일명 = x, y, w, h
2번에서 찾은 파일명을 사용해서 ret_img_path 호출
→ x, y, w, h 에 대한 정보가 없는 사진도 존재, 값이 두개만 존재하는 경우가 있어서 예외처리문으로 이러한 경우에는 다음 사진을 처리
→ Image를 Open하는데 에러가 나는 경우가 있었음, image를 읽을때... 이상한 형식의 이미지가 있는 것일까
image = image.convert("RGB")
→ 이미지중에 RGBA 형식이 있었다. A는 Alpha값으로 일반적인 3개의 채널이 아니라 하나의 채널이 더 있는 형식인 것 같음..
→ convert('RGB')로 채널을 RGB로 바꿔주면 오류 해결
crop 실행 후 sub_class로 디렉토리를 생성 후 그 디렉토리에 crop한 이미지를 저장 (총각김치, 배추김치, 열무김치 등등)
각 클래스당 이미지는 1000장이지만 모든 사진을 crop하는 것은 아니다
→ crop한 이미지에 대해서만 새로운 디렉토리에 저장해 놓았기 때문에 crop을 수행하지 않은 이미지들에 대해서는 복사 사용해서 새로운 디렉토리에 사진을 옮겨준다.
→ 이후에 폴더를 한꺼번에 불러와서 사용하기 편하게 하기위해서
import shutil
shutil.copy(origin_filepath, target_path)