여러분 ! Darkflow에 사용되는 학습 이미지는 전부 jpg 형식이어야 합니다!!!!
저는.. png로 하는 실수를 또 저질러서 일을 두번하게 되었습니다.
저는 colab을 사용할 것입니다~
jpg가 아닌 png로 라벨링하여 생성한 학습파일 xml은 다음과 같은 오류를 발생 시킵니다.
UnicodeDecodeError: 'cp949' codec can't decode byte 0xec in position 22: illegal multibyte sequnce
라벨링을 해보셨다면 아시겠지만, 저희는 2가지의 파일을 가지고 있습니다.
이미지파일 1개, xml파일 1개
이렇게 세트입니다.
그래서 따로따로 변경해주어야 하는데요
Image file PDF to JPG
먼저 이미지 파일(png -> jpg)로 변경해보도록 하겠습니다.
일단 구글 드라이브 내에 2개의 폴더를 생성해주세요.
- jpg로 변경할 png파일을 저장해 둘 폴더
- jpg로 변환된 파일이 저장될 폴더
저는 다음과 같이 만들어 주었습니다.
png 를 jpg로 바꾸는 건 매우 간단합니다.
그냥 뒤에다가 .png를 지우고 .jpg를 붙여주면됩니다.
그래서 png -> jpg로 replace함수를 사용해 주었습니다.
그리고 RGB로 convert해주셔야 오류가 나지 않습니다.
#구글 드라이브와 연동
from google.colab import drive
drive.mount('/content/drive', force_remount=True)
#라이브러리 다운로드
from PIL import Image
#이미지 변환함수
def imgConvert(page_url,save_url):
im = Image.open(page_url)
im = im.convert("RGB")
save_url_change = save_url.replace("png","jpg")
im.save(save_url_change)
#함수실행
if __name__ == "__main__":
#변환된 파일이 저장될 폴더(jpg)
save_url='/content/drive/MyDrive/GRADING_Study/jpgIMG/'
#변환할 파일이 저장된 폴더(png)
load_url='/content/drive/MyDrive/GRADING_Study/pngTojpgIMG/'
os.chdir(load_url)
images=glob.glob('./*.png')
images.sort()
for i in range(len(images)):
filename=images[i]
save_path = save_url+images[i]
load_path = load_url+images[i]
imgConvert(load_path,save_path)
폴더 내 모든 png를 한번에 변환해주기 위해 다음과 같이 코드를 짜주었습니다.
폴더를 확인해 보시면 전부 jpg로 변환되었으며, 다운받아도 형식이 jpg로 뜨는 것을 보실 수 있습니다.
xml파일 수정하기
xml파일 내에서는 <filename> 과 <path> 부분에 있는 png를 jpg로 변경시켜 주어야 합니다.
import os
import xml.etree.ElementTree as ET
#xml파일들이 들어있는 경로
targetDir = r"/content/drive/MyDrive/GRADING_Study/pngTojpgXML2/"
num = 1
##targetDir에서 .xml파일 이름들 리스트로 가져오기
file_list = os.listdir(targetDir)
xml_list = []
for file in file_list:
if '.xml' in file:
xml_list.append(file)
##모든 .xml파일에 대해 수정
for xml_file in xml_list:
target_path = targetDir + xml_file
targetXML = open(target_path, 'rt', encoding='UTF8')
tree = ET.parse(targetXML)
root = tree.getroot()
#<filiename> 수정
filename_tag = root.find("filename")
original = filename_tag.text
modified = original.replace(r"png",r"jpg")
filename_tag.text = modified
#<path> 수정
path_tag = root.find("path")
original = path_tag.text
modified = original.replace(r"png",r"jpg")
path_tag.text = modified
print("[" + str(num) + "]" + xml_file + "[success]")
tree.write(target_path)
num += 1
print("finished")
root 변수는 최상위 태그인 <annotations>를 가리킵니다.
그렇게 정해두면 root.find를 이용하여 하위 태그를 선택할 수 있습니다.
<filename> <path> 태그를 선택하여 png부분을 jpg로 replace해줍니다.
변경된 모습을 확인할 수 있습니다.
여기 블로그를 참고했습니다.
변환하고, 다크플로우 학습시키니까 오류가 사라져서 잘 돌아갑니다.
여러분은 꼭 jpg로만 하시길 바랍니다..
'졸업프로젝트 > YOLO' 카테고리의 다른 글
[YOLO+flask] 초기 환경 설정 (0) | 2021.03.31 |
---|---|
[YOLO] Image Labeling 의문 사항들 (0) | 2021.03.12 |
[YOLO] Darknet 공식문서 번역 (0) | 2021.03.08 |
[YOLO]OpenCV를 이용한 YOLO (0) | 2021.03.07 |
[YOLOdarkflow] Image Labeling (0) | 2021.02.24 |