머신러닝 & 딥러닝/자연어처리

대학교 AI 질의응답 챗봇 만들기 - 15. 저장된 이미지 파일 용량 줄이기

by seokii 2022. 11. 16.
728x90
반응형

0. 포스팅 목록 & GitHub

(깃허브 스타 버튼 눌러주시면 글 작성에 큰 도움이 됩니다!)

https://github.com/Seokii/Chatbot4Univ

 

GitHub - Seokii/Chatbot4Univ: 대학생을 위한 AI 질의응답 챗봇 만들기

대학생을 위한 AI 질의응답 챗봇 만들기. Contribute to Seokii/Chatbot4Univ development by creating an account on GitHub.

github.com

https://seokii.tistory.com/146

 

[Project] 대학생을 위한 AI 질의응답 챗봇 만들기

1. GitHub https://github.com/Seokii/Chatbot4Univ GitHub - Seokii/Chatbot4Univ: 대학교 재학생을 위한 AI 질의응답 챗봇 대학교 재학생을 위한 AI 질의응답 챗봇. Contribute to Seokii/Chatbot4Univ development by creating an account o

seokii.tistory.com

 

1. 이미지 용량 문제?

프로젝트내에 이미지를 저장하다가 생각한 점이,

1.png ~ 44.png와 같은 인터넷에서 크롤링 혹은 수집한 데이터들은 이미지의 용량이 적지만

실제로 학교 건물 사진, 주변 편의 시설에 대한 사진을 찍어서 파일로 저장을 하니 사진 파일의 용량이 꽤 크다는 생각이 들었습니다.

이렇게 서버에 축적되는 용량도 문제지만,

사용자가 어플이나 웹 서비스를 통해서 이미지를 안내 받을 경우 용량이 커지게 된다면,

사용자 서비스 기기의 용량, 전송 속도 등 어느 하나 좋을 것이 없을 것이라 생각했습니다.

그래서 서버 내에서 모아진 이미지를 순차적으로 조회하며 용량을 줄이는 코드를 작성했습니다.

 

2. 코드 작성

utils폴더에 imageResize.py라는 코드로 작성했습니다.

# /utils/imageResize.py

from PIL import Image
from io import BytesIO
import glob
import os

# 현재 경로와 저장 경로 설정
path = os.path.dirname(os.path.realpath(__file__))
save_path = "chatbot_api/static/resize_images/"
os.chdir(path)
print("path is : " + path)

# 세이브 경로의 모든 jpg 파일 삭제
[os.remove(f) for f in glob.glob(save_path+"*.jpg")]

# 배열 선언
image_list_png = []
image_list_jpg = []

# png 파일 불러오기 + jpg 변환
read_files_png = glob.glob("chatbot_api/static/images/*.png")
read_files_png.sort()
print(read_files_png)
print(len(read_files_png))

# .png 뺀 파일명 추출
image_list = os.listdir("chatbot_api/static/images")
image_list.sort()
print(image_list)
print(len(image_list))
search = '.png'
for i, word in enumerate(image_list):
    if search in word:
        image_list_png.append(word.strip(search))
search = '.jpg'
print(image_list_png)
print(len(image_list_png))
print(image_list)
print(len(image_list))

# png to jpg
cnt2 = 0
for f in read_files_png:
    img = Image.open(f).convert('RGB')
    img.save("chatbot_api/static/images/"+image_list_png[cnt2]+".jpg", 'jpeg')
    cnt2 += 1

# jpg 파일 resizing
read_files_jpg = glob.glob("chatbot_api/static/images/*.jpg")
read_files_jpg.sort()

# .jpg 뺀 파일명 추출
image_list = os.listdir("chatbot_api/static/images")
image_list.sort()
print(image_list)
print(len(image_list))
for i, word in enumerate(image_list):
    if search in word:
        image_list_jpg.append(word.strip(search))
print(image_list_jpg)
print(len(image_list_jpg))

cnt=0
for f in read_files_jpg:
    print(f)
    img = Image.open(f)
    buffer = BytesIO()
    img.save(buffer, 'jpeg', quality=70)
    buffer.seek(0)
    with open(save_path + image_list_jpg[cnt] + '_resize.jpg', 'wb') as nfile:
        nfile.write(buffer.getvalue())
    cnt += 1

파이썬 이미지 처리 라이브러리인 Pillow(=PIL)를 사용해 작업을 진행했습니다.

os로 기본적인 경로를 지정해주고, 용량이 조절된 사진들을 저장할 폴더에 있는 모든 파일을 삭제했습니다.

(주기적으로 해당 작업을 수행하기 위해서, 삭제하고 생성하고 반복할 수 있도록..)

(엄청 예전에 작성한 코드인데, 생각해보니 원본 폴더와 해당 폴더의 파일을 비교해 없는 사진 파일에 대해서만 jpg변환 및 크기 조정을 수행하는 것이 더 효율적일 것이라는 생각이드네요ㅠㅠ)

 

먼저, 모든 사진 파일 확장자명을 통일하기 위해서 png를 jpg로 변환후 원본 파일 폴더에 저장했습니다.

그 후, 원본 폴더에서 jpg 이미지를 불러와 quality라는 파라미터로 용량 변경을 진행 후

resize_images라는 용량이 바뀐 파일들이 저장될 폴더에 모든 사진을 저장했습니다.

 

 

3. 실행 결과

위의 사진은 실행 결과 모습입니다.

작업 완료한 파일명에 대해서 출력하도록 코드를 작성했습니다.

폴더의 총 용량을 살펴보니, 137MB에서 39.2MB로 줄어든 모습입니다.

물론 원본 폴더에는 44개의 png파일이 jpg로 변환되어 저장된 파일이 존재하지만,

그것을 감안하더라도 용량이 엄청 줄었다는 것을 확인할 수 있었습니다.

 

 

728x90
반응형

댓글