본문 바로가기

졸업프로젝트/YOLO

[YOLO] python xml,이미지 파일 PNG to JPG

728x90

 

여러분 !  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개의 폴더를 생성해주세요.

  1. jpg로 변경할 png파일을 저장해 둘 폴더 
  2. 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해줍니다. 

 

 

변경된 모습을 확인할 수 있습니다.

 

 

여기 블로그를 참고했습니다. 

skkim1080.tistory.com/entry/Python%EC%9C%BC%EB%A1%9C-xml-%ED%8C%8C%EC%9D%BC-%EB%82%B4%EC%9A%A9-%EC%88%98%EC%A0%95%ED%95%98%EA%B8%B0

 

[Python]Python으로 .xml 파일 내용 수정하기

폴더 안에 있는 모든 xml파일 내용을 일괄적으로 수정할 필요가 생겨 코드를 작성하게 되었다 1. 필요한 라이브러리 import import os import xml.etree.ElementTree as ET xml.etree.ElementTree는 xml 파싱을 위..

skkim1080.tistory.com

 

 

변환하고, 다크플로우 학습시키니까 오류가 사라져서 잘 돌아갑니다.

여러분은 꼭 jpg로만 하시길 바랍니다.. 

728x90

'졸업프로젝트 > 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