Python에서 이미지 data를 MySQL DB에 INSERT하기

조하운·2023년 4월 3일
0

지난 이야기

저번 포스팅에서는 원격 MySQL 서버에 나의 로컬에 설치되어 있는 MySQL workbench를 연동하고 local 환경에 있던 작업 내용을 옮기는 것 까지 모두 완료했다. 인프라는 모두 구축이 되었으니, 본격적으로 Python을 활용해 비정형 데이터 '이미지'를 DB에 저장하는 법을 구현해보고자 한다.

Python에서 MySQL DB 연결하기

이번에는 Python 을 가지고 실제로 위에 구축한 DB에 data를 생성해 볼 것이다.

개발환경은 VS Code를 사용했다.

참고

Python으로 MySQL 사용하기 - PyMySQL 라이브러리 with Pandas

파이썬으로 이미지 데이터 mysql에 저장하고 읽어들여오기

먼저 이미지 형식의 데이터를 image 컬럼에 저장해보도록 하자.

이미지 데이터는 멀티미디어 형식이므로 바이너리 형식으로 형변환 해준 뒤에 쿼리로 DB에 내보내야만 한다.

  1. python pakage 설치
    $ pip install pymysql pillow

  1. connect() 함수로 DB 연결
    conn = pymysql.connect(
       host='ec2-43-201-101-246.ap-northeast-2.compute.amazonaws.com',
       user='johaun', 
       password='8312', 
       db= 'SCV', 
       charset='utf8')
       
       cur = conn.cursor(pymysql.cursors.DictCursor)
    
  • user : user name
  • passwd : 설정한 패스워드
  • host : DB host
  • db : 연결할 데이터베이스
  • charset : 인코딩 설정
  1. Image data를 인코딩
buffer = BytesIO()

work_dir = 'data'
dir_list = os.listdir(f'{work_dir}/images')
print(dir_list)
for images in dir_list[1:]:
    file_list = os.listdir(f'{work_dir}/images/{images}')
    for image in file_list:
        im = Image.open(f'{work_dir}/images/{images}/{image}')
        im = im.resize((400, 300))
        im.show()
        im.save(buffer, format='jpeg')
        img_str = base64.b64encode(buffer.getvalue())
        img_str = img_str.decode('UTF-8')
        print(img_str)
        print(image)
        sql = f"""insert into image (cctv_id, filename, image_data) values (1, '{image}', '{img_str}')"""
        cur.execute(sql)
        conn.commit()
conn.close()
  • Image.open('이미지 파일 경로') = 경로로부터 이미지 파일을 가져와 im 객체에 저장
  • resize = 이미지 크기를 통일하기 위해서 이미지 사이즈를 조정한 객체를 반환
  • im.save(buffer, format='jpeg') = buffer 라는 ByteIO 객체에 이미지를 jpeg 형식으로 저장함
  • base64.b64encode(buffer.getvalue()) 이미지 정보가 담겨있는 buffer로부터 정보를 추출해서 base64 형식으로 encode해 문자열로 반환
  • decode('UTF-8') encoded data를 utf-8 형식으로 decode 하여 반환

결과

내 로컬 폴더에 있는 사진 여섯 장이 정상적으로 저장되었음을 볼 수 있다. image_data는 바이너리 내용 자체가 너무 길어서 select 했을 때 알아 볼 수가 없게 나온다. 관계형 DB의 한계랄까...

아마 이미지 데이터를 처리해야 할 때 DB를 어떤 것을 써야 할까 생각한다면 NoSQL을 사용하는 것이 성능이나 편리성 면에서 더 적합할 것 같다.

다음 포스팅

이번에는 python 에서 작업하고 나온 결과물, 특히 이미지 데이터 같은 비정형 데이터를 전처리해서 원격 DB에 전송하는 것 까지 성공했다. 그 다음은 이제 이 모든 테스트들을 잘 정제해서 파이프라인으로 만들고, CLIP이라는 이미지-자연어 통합 분류 모델을 끼워 넣어서 잘 작동하는 지 테스트해 볼 예정이다.

profile
| 컴퓨터 비전 | 딥 러닝 | 자율주행 |

0개의 댓글