Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 데이터 전처리
- Generative Adversarial Nets
- Coherent Semantic Attention for Image Inpainting
- mnist
- CelebA
- Moire 이미지
- C-RNN-GAN:Continuous recurrent neural networkswith adversarial training
- 2D 이미지 높이 측정
- Image Inpainting
- 백준
- 이미지 특징
- music data
- json 파일로 image 라벨링
- Generative Adversarial Networks
- gan
- 이미지파일 특성으로 폴더분류
- horse2zebra
- 논문 리뷰
- Python
- PAPER
- 이미지 복원
- json 파일 정보 csv파일로 저장
- Phase Map 이미지
- labeling
- 논문리뷰
- CT 영상에서 U-Net 기반 변형가능 컨볼루션 GAN을이용한 잡음제거
- JSON
- Phase Map
- AI 대회
- 자체 데이터 제작
Archives
- Today
- Total
Deep Learning through deep learning
# 2 데이터 전처리 - json 파일 정보 csv 파일로 저장 (Python 편) 본문
앞서 json 파일을 가지고 image에 라벨링 하는 방법에 대해 알아보았다.
이번에는 json 파일을 가지고 해당 정보들을 csv 파일로 저장해보려고 한다.
모델링을 하는데 앞서 바로 이미지를 이용하여 학습할 수 있지만, csv파일을 통해 이미지의 라벨 정보를 불러옴으로써도 학습이 가능하다.
Introduction
앞선 #1 글에서와 다르게 이번에는 대회에서 사용했던 모든 json 파일을 이용할 예정이며, 이미지는 별도로 사용하지 않을 예정이다.
json 파일의 정보만을 csv파일에 저장하는 것이니 이미지는 필요하지 않다. 다만, 모델을 학습시키기 위해서는 csv파일에 이미지 경로도 추가할 예정이다.
먼저 json 폴더는 아래와 같다.
json 파일을 통해 만든 csv 파일 결과는 아래와 같다.
라벨링에 필요한 이미지 경로, 라벨 이름, 좌표값들이 저장된 모습이다.
왜 left, width, top, height 인지는 코드를 살펴보도록 하자.
Python Coding
import os
import json
import pandas as pd
path = './json파일모음'
#[path] 에 데이터가 있는 디렉터리
file_list = os.listdir(path)
# 경로 내에 파일을 모두 불러옴
json_file_list = [file for file in file_list if file.endswith('.json')]
#json 확장자를 가진 파일로 새로운 리스트 생성
output = {'image' : [],
'label' : [],
'left' : [],
'width' : [],
'top' : [],
'height' : []
}
output_df = pd.DataFrame(output)
res_count = 0
for i in range(len(json_file_list)):
with open(path+"/"+json_file_list[i],"r") as f:
data = json.load(f)
for j in range(len(data["features"])):
count = 0
s = ""
for k in range(len(data["features"][j]["properties"]["object_imcoords"])):
if data["features"][j]["properties"]["object_imcoords"][k] != ",":
s += data["features"][j]["properties"]["object_imcoords"][k]
else:
if count == 0:
x11 = s
elif count==1:
y11 = s
elif count == 2:
x22 = s
elif count==3:
y22 = s
elif count == 4:
x33 = s
elif count==5:
y33 = s
elif count == 6:
x44 = s
count += 1
s = ""
if k == len(data["features"][j]["properties"]["object_imcoords"]) -1:
y44 = s
x11 = int(float(x11))
x22 = int(float(x22))
x33 = int(float(x33))
x44 = int(float(x44))
y11 = int(float(x11))
y22 = int(float(x22))
y33 = int(float(x33))
y44 = int(float(x44))
xli = [x11,x22,x33,x44]
yli = [y11,y22,y33,y44]
a = min(xli)
b = max(xli)
c = min(yli)
d = max(yli)
if a<0:
a = 0
if b<0:
b = 0
if c<0:
c = 0
if d<0:
d = 0
output_df.loc[res_count,'left'] = a
output_df.loc[res_count,'width'] = b-a
output_df.loc[res_count,'top'] = c
output_df.loc[res_count,'height'] = d-c
output_df.loc[res_count,'label'] = (data["features"][j]["properties"]["type_name"])
output_df.loc[res_count,'image'] = (data["features"][j]["properties"]["image_id"])
res_count +=1
output_df.set_index('image', inplace=True)
output_df.to_csv('./output.csv')
Df = pd.read_csv('./output.csv')
print(Df.head(10))
- json 폴더의 모든 json 파일을 읽어들여 관련 정보를 csv파일로 저장하는 전체코드이다.
이제 부분적으로 코드를 살펴보자.
import os
import json
import pandas as pd
path = './json파일모음'
#[path] 에 데이터가 있는 디렉터리
file_list = os.listdir(path)
# 경로 내에 파일을 모두 불러옴
json_file_list = [file for file in file_list if file.endswith('.json')]
#json 확장자를 가진 파일로 새로운 리스트 생성
- import 해주고,
- path 에는 json 폴더 경로를 넣는다. (해당 폴더 안에 모든 json 파일이 있다.)
- json_file_list 에는 json 파일 경로를 리스트로 저장하여 꺼내쓸 수 있다.
output = {'image' : [],
'label' : [],
'left' : [],
'width' : [],
'top' : [],
'height' : []
}
output_df = pd.DataFrame(output)
- output_df 라는 데이터프레임을 만든다. csv파일로 바꾸기 전에 이용하기 편한 형태이기 때문이다.
- output_df 에는 순서대로 output 에서 앞으로 json 파일을 통해 가져올 정보인 이미지 경로, 라벨 이름, x좌표 최소값, 가로길이, y좌표 최소값, 세로길이에 대한 정보가 들어갈 것이라고 명시해준다.
for i in range(len(json_file_list)):
with open(path+"/"+json_file_list[i],"r") as f:
data = json.load(f)
for j in range(len(data["features"])):
count = 0
s = ""
for k in range(len(data["features"][j]["properties"]["object_imcoords"])):
if data["features"][j]["properties"]["object_imcoords"][k] != ",":
s += data["features"][j]["properties"]["object_imcoords"][k]
else:
if count == 0:
x11 = s
elif count==1:
y11 = s
elif count == 2:
x22 = s
elif count==3:
y22 = s
elif count == 4:
x33 = s
elif count==5:
y33 = s
elif count == 6:
x44 = s
count += 1
s = ""
if k == len(data["features"][j]["properties"]["object_imcoords"]) -1:
y44 = s
- for 문을 이용해 json 파일 하나하나씩 살펴볼 예정이다.
- with 구문으로 #1 글에서처럼 json 정보를 data라는 이름으로 불러오고, features 항목안의 정보에 대해 탐색에 들어간다.
- 우리는 좌표값을 일일이 하나씩 넣기 위해, ',' 로 좌표를 나누고 문자 하나하나씩 넣어줘야 한다. (좌표값의 타입이 문자열이다.)
- s라는 빈 문자열을 만들어 조건을 걸어 ',' 이전까지의 숫자들을 문자형태로 더해준다. ','를 만나면 하나의 좌표값이 완성되는 것이고 이를 첫번째 x11 좌표로 넣어준다. 이때 주의할 점은 s문자열을 다시 초기화해주고, count를 하나 더해 다음에는 y11 좌표로 값이 들어가도록 알고리즘을 구성하는 것이다.
- 이후 반복문이 막바지에 다다르면 y44에 마지막 값을 넣어준다. (문자열의 마지막에는 ','가 없으므로 따로 설정해주지 않으면 y44에는 값이 들어가지 않는다.
x11 = int(float(x11))
x22 = int(float(x22))
x33 = int(float(x33))
x44 = int(float(x44))
y11 = int(float(x11))
y22 = int(float(x22))
y33 = int(float(x33))
y44 = int(float(x44))
xli = [x11,x22,x33,x44]
yli = [y11,y22,y33,y44]
a = min(xli)
b = max(xli)
c = min(yli)
d = max(yli)
if a<0:
a = 0
if b<0:
b = 0
if c<0:
c = 0
if d<0:
d = 0
output_df.loc[res_count,'left'] = a
output_df.loc[res_count,'width'] = b-a
output_df.loc[res_count,'top'] = c
output_df.loc[res_count,'height'] = d-c
output_df.loc[res_count,'label'] = (data["features"][j]["properties"]["type_name"])
output_df.loc[res_count,'image'] = (data["features"][j]["properties"]["image_id"])
res_count +=1
- 이제 위에서 받은 좌표를 int 정수형으로 바꾼다. (이미지 픽셀에는 정수형이 들어가야한다.)
- xli, yli 로 각각 x,y 좌표에 대한 리스트를 만들어 x,y 에 대한 최대값/최소값을 구한 후, a,b,c,d에 값을 넣어준다.
- 만일을 대비해 이 값이 음수인 경우가 있다. 이 경우엔 a,b,c,d를 0으로 바꾸어준다.
- 이제 앞서 만들어두었던 데이터프레임 output_df 에 값들을 넣어주자
- left 에는 좌측값이니 x좌표 최소값을
- width 에는 가로 길이니 x좌표 최대 - 최소값을
- top 에는 상단값이니 y좌표 최소값을
- height 에는 세로 길이니 y좌표 최대 - 최소값을
- label 에는 라벨 이름 (container)
- image 에는 이미지 경로가
- res_count 를 인덱스로 넣어주는 이유는 json 파일 하나가 끝나도 csv파일에 이어서 계속 저장하기 위함이다.
else
이를 통해 우리는 두 가지 방법으로 모델 학습이 가능해졌다.
첫 번째는 라벨링된 이미지를 바로 모델에 적용
두 번째는 이미지와 csv파일을 토대로 실시간 라벨링을 통해 모델에 적용
json 파일의 경우 이미지 분야에서는 자주 사용되는 파일이므로 이참에 그 구조에 대해 이해하고 갔으면 하는 바람이다.
'ML&DL > 데이터 전처리' 카테고리의 다른 글
# 3 데이터 전처리 - 이미지 파일 특성으로 폴더 분류 (Python 편) (2) | 2023.08.09 |
---|---|
# 1 데이터 전처리 - json 파일로 이미지 라벨링 (Python 편) (0) | 2023.08.09 |