안녕하세요 오랜만 입니다
coco 데이터셋에서 json 파일 내에는 이미지가 있지만 실제 이미지는 존재하지 않는 경우
또는
실제 이미지는 존재하지만 json 파일 내에는 존재하지 않는 경우
또는
실제 이미지와 json 파일의 이미지 명이 다른 경우
를 체크해주는 코드입니다.
관련 프로젝트를 하며 학습을 하기위해선 완전한 json 파일이 필요하지만 상대측에서 정리가 안된 채로 보내서 미리 검사하는
코드를 작성해 보았습니다. 해당 코드로 위의 3가지 경우를 알아낼 수 있습니다.
이미지에 관한 인공지능을 공부하시는 분들은 coco dataset을 주로 사용하실텐데 필요하실때 응용하셔서 사용하면 됩니다.
기본적으로 검사결과를 출력하게 해놨고 주석문을 바꿔 txt 파일로 다운로드되게 할 수도 있습니다 상황에 맞게 사용하세요
사용하려면 다음과 같은 파일 구조를 가져야 합니다.
(github 주소 : https://github.com/dnfwlxo11/json_imageName_change_for-coco-dataset)
In [8]:
import os
import json
In [ ]:
각 클래스별 정상 이상 태스크 명들 읽어오기¶
In [34]:
os.chdir('/home/daein/Jupyter_notebook/data_tmp')
class_li = os.listdir()
In [35]:
# 각 클래스별 태스크 명 가져오는 함수
def get_taskName(state):
class_dict_tmp = {}
for i in class_li:
try:
class_dict_tmp[i] = os.listdir(os.path.join('./', i, state))
print(i + ' 클래스 {} 태스크 리스트 추출 완료\n'.format(state), '-' * 50)
except:
print(i + ' 클래스 일부에 {} 태스크가 없음'.format(state))
return class_dict_tmp
# class_dict_normal = {}
# class_dict_normal = get_taskName('정상')
# class_dict_abnormal = {}
# class_dict_abnormal = get_taskName('이상')
class_dict = {}
class_dict = get_taskName('')
In [ ]:
각 클래스 태스크 별 이미지 개수, 존재 여부 등을 검사¶
In [19]:
# class_dict_normal : 정상 클래스의 태스크 리스트
# class_dict_abnormal : 비정상 클래스의 태스크 리스트
In [20]:
# json 파일에서 이미지 명, 클래스 명 빼오는 함수
def load_json_imageList(file):
json_in_imageName = []
json_in_classId = []
json_in_className = []
with open(file, 'r', encoding='utf-8') as f:
data = json.load(f)
images_li = data['images']
cate_li = data['categories']
labelMap_li = data['categories']
for i in range(len(images_li)):
json_in_imageName.append(images_li[i]['file_name'])
for i in range(len(cate_li)):
json_in_className.append(cate_li[i]['name'])
json_in_classId.append(cate_li[i]['id'])
return json_in_imageName, json_in_className, json_in_classId, labelMap_li
In [33]:
class_labelMap = {}
# Json 파일 내의 이미지 파일 이름을 가져오는 함수
def inner_ImglistToJson(status, class_dict):
# f = open('./data_check.txt', 'w')
for i in class_dict:
for j in class_dict[i]:
try:
# json 내 이미지 리스트 추출
jsonName = os.listdir(os.path.join(i, status, j, 'annotations'))
json_result = load_json_imageList(os.path.join(i, status, j, 'annotations', jsonName[0]))
json_in_imageName = json_result[0]
json_in_className = json_result[1]
json_in_labelMap = json_result[3]
if i in class_labelMap.keys():
for idx in range(len(json_result[2])):
class_labelMap[i].append([str(json_result[2][idx]), json_result[1][idx]])
else:
class_labelMap[i] = []
for idx in range(len(json_result[2])):
class_labelMap[i].append([str(json_result[2][idx]), json_result[1][idx]])
print(json_result[2], json_result[1])
real_imageName = os.listdir(os.path.join(i, status, j, 'images'))
print('검사 클래스 명 : \t', i),
print('검사 태스크 명 : \t', j)
print('json 파일 내의 이미지 개수 : \t', len(json_in_imageName))
print('json 파일 내의 클래스 명 : \t', json_in_className)
print('json 파일 내의 라벨맵 : \t', json_in_labelMap)
print('실제 이미지 개수 : \t', len(real_imageName))
print('실제 파일명과 동일 여부 : \t', '같음' if (sorted(json_in_imageName) == sorted(real_imageName)) else '다름')
print('-'*50)
# f.write('검사 클래스 명 : \t' + i + '\n'),
# f.write('검사 태스크 명 : \t' + j + '\n')
# f.write('json 파일 내의 이미지 개수 : \t' + str(len(json_in_imageName)) + '\n')
# f.write('json 파일 내의 클래스 명 : \t' + str(json_in_className) + '\n')
# f.write('json 파일 내의 라벨맵 : \t' + str(json_in_labelMap) + '\n')
# f.write('실제 이미지 개수 : \t' + str(len(real_imageName)) + '\n')
# f.write('실제 파일명과 동일 여부 : \t' + ('같음' if (sorted(json_in_imageName) == sorted(real_imageName)) else '다름'))
# f.write('\n')
# f.write('-'*50)
# f.write('\n')
except:
print(i + ' 클래스 일부에 {} 태스크가 없음\n'.format(status), '-' * 50)
# f.close()
inner_ImglistToJson('', class_dict)
In [ ]:
라벨맵 중복 확인 (미완성)¶
In [36]:
for i in class_li:
class_labelMap[i] = list(set([tuple(set(i)) for i in class_labelMap[i]]))
for j in range(len(class_labelMap[i])):
class_labelMap[i][j] = sorted(class_labelMap[i][j])
print(i + ' :', sorted(class_labelMap[i]))
print('-'*50)
In [ ]:
In [37]:
from IPython.core.display import display, HTML
display(HTML("<style>.container {width:90% !important;}</style>"))
In [ ]:
반응형
'공부하는 중~~ > 인공지능' 카테고리의 다른 글
[학습 일지] 오버피팅(overfitting)을 방지해보기 - 3 (0) | 2021.01.19 |
---|---|
[학습 일지] 오버피팅(overfitting)을 방지해보기 - 2 (0) | 2021.01.12 |
[학습 일지] 오버피팅(overfitting)을 방지해보기 - 1 (0) | 2021.01.11 |
[Python] coco 데이터셋 train, test, valid 세트로 나누기 (0) | 2021.01.06 |
[OpenCV 4.4.0] opencv CV_LOAD_IMAGE_GRAYSCALE 에러 해결법 (C++) (1) | 2020.12.09 |
댓글