안녕하세요.

이번 글에서는 실행파일에 대해서 설명한 후, 파이썬으로 실행파일을 만드는 방법에 대해서 말씀드리도록 하겠습니다.

 

[Note]

실행파일 만드는 순서만 따로 보고싶으시다면 맨 아래 "6. python으로 작성된 딥러닝 실행파일을 만드는 방법 정리"만 참고하시면 될 것 같습니다.

 

1. 딥러닝 개발을 하는데 실행파일이 왜 필요한가요?

학계에서 딥러닝을 연구하시는 분들은 보통 파이썬으로 train 코드와 evaluation 코드를 작성하고, "train.py"  or "test.py" 파일형태로 github에 올립니다. 특히 요즘 같이 top-tier 딥러닝 학회에 논문을 낼 때에는 자신의 코드를 github에 올린 후, 논문에 기재하기도 하죠. 이렇게 코드를 올리면 다운받아서 실제로 잘 돌아가는지도 확인할 수 있겠죠?

 

 

 

그렇다면 딥러닝을 비지니스에서 사용하려고 할 때는 어떨까요? 

 

학계에서는 많은 연구자들에게 어필해야하므로 관련 코드를 github에서 볼 수 있게 해줍니다. 물론 연구자들은 전문가이기 때문에 언제든 github을 통해 돌려볼 수 도 있습니다. 논문도 훌륭하고 코드도 잘 돌아가면 그만큼 저자의 명성이 높아지겠죠.

 

비지니스에서는 어필해야할 사람들이 누굴까요?

바로, 투자자들입니다. 우리가 학계에서 처럼 투자자들에게 코드를 github에서 다운받아서 돌려보라고 할 수 있을까요? 투자자들이 모델학습에 관심이 있을까요?

 

학계와 달리 투자자들은 개발에 대해서 전혀 모르고 있을 가능성이 큽니다. 또한, 투자자들의 관심은 단지 모델이 잘 돌아가는지 눈으로 확인하는 것이죠.

 

그래서, 프로젝트 마무리 단계에 진입하면 자신들의 성과를 보여주기 위해 투자자들에게 개발한 모델을 시연합니다.

 

예를 들어, 우리가 숫자를 인식하는 딥러닝 프로그램을 만들었다고 해보겠습니다. 투자자들은 간단한 GUI 프로그램을 통해 숫자 인식을 제대로 하는지에만 관심이 있을거에요.

(↓↓ 18초 부터 ↓)

https://www.youtube.com/watch?v=m_VjcyjMlpQ 

 

이러한 GUI 프로그램을 만들기 위해 필요한 것이 실행파일입니다. 즉, .exe 라는 확장자명을 가진 실행파일을 클릭하기만 하면 자동으로 GUI 프로그램이 실행되도록 해주는 것이죠. 이러한 실행파일을 실행시키기 위해서는 단지 학습이 완료된 모델들과 테스트 이미지만 있으면 됩니다.

 

(파이썬으로 간단한 GUI 프로그램을 만드는 방법은 "pyqt5" 모듈 or "tkinter" 모듈을 이용하면 됩니다. 이 내용은 따로 다루도록 하겠습니다.)

 

 

 

 

 

2. PyInstller 모듈

파이썬으로 실행파일을 만드는 과정은 간단합니다.

 

첫 번째, PyInstller 모듈을 설치해줍니다. 

필자는 개발환경으로 anaconda를 이용하고 있기 때문에, anaconda 명령어로 설치해주었습니다.  

conda install -c conda-forge pyinstaller

 

두 번째, 아래 명령어를 이용해 원하는 python파일(.py)을 실행파일(.exe)로 만들어 줍니다.

pyinstaller 원하는파일.py

 

 

[예시]

1. VS code 편집기에 YOLOv3를 구현해 놓습니다.

 

 

 

2. YOLOv3를 구현해 놓은 코드를 돌리면 __pycache__ 폴더가 생성됩니다.

 

 

(__pycache__ 폴더에는 컴파일되어 실행 준비가 된 Python 3 바이트 코드들이 저장됩니다)

 

 

 

 

 

3. 원하는 python 파일을 실행파일로 바꿔주기 위한 명령어를 입력합니다.

 

 

 

4. 명령어를 실행하면 아래와 같이 두 개의 폴더가 생성됩니다.

 

  • dist 폴더: distribute(배포)의 약자입니다. 즉, 배포되는 파일이 들어 있는 디렉토리라고 보시면 됩니다. dist 폴더에 실행파일이 만들어졌음을 확인할 수 있습니다. 나중에 시연할 때에는 아래의 실행파일이용하면 됩니다.

 

 

 

 

 

3. pyinstaller 업데이트 (Feat. No module named)

지금부터는 아래와 같이 'main_for_exe.py' 파일을 실행파일로 만들어보겠습니다.

 

 

 

만약 pyinstaller를 처음 설치하고 바로 실행파일을 만들고 실행('main_for_exe.exe')하면, 아래와 같이 "No module named"라는 에러 메시지가 뜰 가능성이 있습니다. 제가 사용하고 있는 vscode에서는 문제 없이 잘 돌아갔는데, 왜 실행파일을 실행시키면 에러가 날까요?

 

 

 

이유는 간단합니다. 

 

vscode의 interpreter는 anaconda or pip로 설치한 패키지들이 저장되어 있는 디렉토리의 path를 잘 잡아주고 있는 반면, 업그레이드 하지 않은 초기 버전의 pyinstaller 를 이용하면 해당 디렉토리를 못잡아주기 때문에 anaconda 명령어로 설치한 'torch' 모듈을 load 할 수 없게 되는 것이지요. 

 

( anaconda or pip로 설치한 패키지들이 저장되어 있는 디렉토리↓)

 

 

위와 같은 문제를 해결해주는 방법은 아래와 같이 pyinstaller를 업그레이드 해주는 것입니다. (사실, 최근에 설치했다면 위와 같은 오류가 생성되지는 않을 것입니다.)

pip install --upgrade pyinstaller

 

 

위와 같이 업그레이드를 시켜주고 다시 실행파일을 만들면 아래와 같이 hook path로써 "anaconda or pip로 설치한 패키지들이 저장되어 있는 디렉토리"를 잡아주는 것을 확인할 수 있습니다.

 

 

 

 

 

4. hidden module (Feat. hidden import)

만약 anaconda or pip로 설치한 모듈이 아닌 다른 github에서 다운 받는 모듈들을 사용하게 되면 추가적인 작업을 해주어야 합니다.

 

예를 들어, github에서 아래와 같이 'retinanet'이라는 모듈을 다운을 받았다고 가정해보겠습니다.

 

 

이때, 'main_for_exe.py'의 실행파일을 만들기 위해서는 추가된 retinanet 모듈의 path도 잡아주어야 합니다.

 

path를 잡아주는 방법은 간단합니다.

 

1. 실행파일을 생성했다면 동시에 spec 파일도 생성될 것 입니다.

 

 

2. vscode(or 다른 IDE)로 해당 spec 파일을 열어 줍니다.

 

3. hiddenimports 부분에 추가할 module을 입력 해줍니다.

 

 

 

retinanet.model 모듈을 추가해준 이유는 retinanet만 추가해줬을 때 아래와 같은 에러가 출력됐기 때문입니다.

 

 

4. hiddenimports를 추가해주었다면 spec 파일을 아래와 같이 다시 빌드해줍니다.

 

이렇게 하면 'no module name'과 같이 모듈을 인식하지 못하는 문제는 해결할 수 있을 것입니다.

 

(사실 pyinstaller 명령어에서 --hidden-import 라는 옵션이 있긴 한데, 위에서 언급한 대로 에러를 잡아가는게 더 정확했던것 같습니다.)

 

 

 

 

 

5. 실행파일과 script파일 경로 차이 해결

vscode에서는 문제없이 돌아간 파일을 실행파일로 만들면 아래와 같이 경로에러를 발생시키는 경우가 있습니다.

 

 

위의 에러가 난 이유를 아래 코드 디버깅을 통해 살펴보니 retina_model_path 경로 때문인 것으로 파악할 수 있었습니다. 아래 vscode 상에서는 "C:\\Users\\MI2RL\\Desktop\\script\\logs\\Retina_weight\\retinanet101_21.pt"로 잘 설정되어 있지만, 위의 Anaconda Prompt에서는 엉뚱한 경로를 설정하고 있는걸 확인할 수 있었습니다.

 

 

 

아래 디렉토리를 확인해 보니, main_for_exe.exe 실행 파일을 수행하면 현재 실행시킨 경로를 기준으로 파일경로가 재설정되는 듯했습니다. 자세히 말하자면, vscode 상에 'retina_model_path를 설정하는 코드를 보면 'prefix' 변수명에 'logs\Retina_weight\~' 경로를 합쳐주는걸로 되어있는데, vscode 상에서는 script 폴더에서부터 접근하는 반면, 

 

 

 

실행파일을 돌리면 script\src\dist 폴더에서부터 접근하는 것으로 보였습니다.

 

 

그래서, vscode에서 main_for_exe.py을 실행시켰던 src 디렉토리로 main_for_exe.exe 파일을 옮겨준 후 다시 실행시켜보았습니다.

 

 

 

그러자, 앞서 언급한 경로문제는 해결되었지만, src\dist\main_for_exe 폴더에 main_for_exe.exe가 생성될 때 같이 생성된 다른 모듈들과의 호환문제가 발생했습니다. 

 

 

위의 에러메시지를 보면 main_for_exe.exe 파일이 생성되는 디렉토리에 관련 모듈들도 동일한 디렉토리에 생성되는데, main_for_exe.exe 파일만 따로 빼내어 실행시키다보니 에러메시지가 나타났습니다. 

 

 

 

그래서, src\dist 폴더에 main_for_exe.exe 파일에 모든 모듈을 통합하도록 --onefile 옵션을 주어 파일을 다시 컴파일을 해줍니다.

 

 

앞서 --onefile 옵션을 통해 아래와 같이 하나의 exe 파일로 생성됐습니다. 그리고, 해당 파일을 복사한 후

 

 

 

아래 폴더 위치에 다시 옮겨 놓습니다.

 

 

[Note]

만약, 위와 같이 main_for_exe.exe 파일을 src\dist 폴더에서 빼내지 않고, 애초에 main_for_exe.exe 파일을 main_for_exe.py 폴더가 위치한 src 폴더에 생성시키려면 아래와 같이 distpath 옵션에 src 폴더경로를 입력해주면 됩니다.

 

 

 

그리고, src 디렉토리에서 main_for_exe.exe 파일을 실행시키면, 아래와 같이 warning 메시지만 뜨고 문제 없이 실행되는 걸 확인 하실 수 있습니다.

 

 

 

 

 

6. 다른 local에서 실행파일 테스트하기

자신의 local 컴퓨터에서 문제 없이 돌아갔다면, 다른 사용자의 local 컴퓨터에서도 문제 없이 돌아갔는지 확인해야 합니다.

 

위의 예시를 기준으로 확인순서를 말씀 드리겠습니다.

 

  1. 다른 사용자의 local 컴퓨터에 script 폴더를 다운받습니다.
  2. src 폴더의 main_for_exe.exe를 실행시켜 줍니다.

 

만약 아래와 같은 에러가 생긴다면 CUDA를 설치하시고 다시 실행시키면 됩니다.

OSError: [WinError 126] 지정된 모듈을 찾을 수 없습니다. Error loading "C:\Users\MI2RL-JW\AppData\Local\Temp\_MEI260802\torch\lib\caffe2_detectron_ops_gpu.dll" or one of its dependencies.
[32] Failed to execute script 'test_OP_exe' due to unhandled exception!

 

(에러 원인을 찾아보니 아래와 같은 문구가 있어서 CUDA를 다시 설치하니 다른 local에서도 문제 없이 돌아가네요. 아마 코드자체가 gpu를 사용하겠금 구현되어 있어서 그런듯 합니다...)

 

(↑↑↑ 위의 메시지 출력↑↑↑) 

https://discuss.pytorch.org/t/i-cannot-use-the-pytorch-that-was-built-successfully-from-source-dll-initialization-routine-failed-error-loading-caffe2-detectron-ops-gpu-dll/93243/23

 

I cannot use the pytorch that was built successfully from source: (DLL) initialization routine failed. Error loading caffe2_dete

Thank you very much for your fast answer @lorenzznerol (are you italian like me?), I tried activating the base environment and it solves the warning in python but not the torch error. C:\Users\AZand_000\Downloads\Pytorch\pytorch>conda activate base (base)

discuss.pytorch.org

 

 

 

 

 

7. python으로 작성된 딥러닝 실행파일을 만드는 방법 정리

지금까지 설명드린 내용을 종합하여 설명해보도록 하겠습니다.

 

1. pyinstaller 설치 및 업그레이드 (최근에 설치하는 것이라면 아래 명령어 중 하나만 선택하기만 해도 됨)

conda install -c conda-forge pyinstaller
pip install --upgrade pyinstaller

 

 

 

2. vscode 실행했던 디렉토리에 (모듈이 통합 된) exe 파일 및 spec 파일 생성 하기

pyinstaller --onefile --distpath 디렉토리명 실행파일명.py

 

(↓↓vscode에서 실행했던 main_for_exe.py 파일과 동일한 경로에 --distpath가 설정되어있는지 확인↓↓)

 

(↓↓아래와 같이 새 폴더 또는 파일이 생성됐는지 확인↓)

 

 

 

 

 

 

 

3. github으로 다운 받은 모듈이 있다면 hiddenimports 추가 && spec 파일 다시 빌드

 

 

 

[Note]

--distpath 설정해주어야 이전에 --distpath 경로에서 만들어진 exe 실행파일에 hiddenimports가 추가된 내용이 overwrite됩니다. 

 

pyinstaller --distpath 디렉토리명 실행파일명.spec

 

 

 

 

4. 실행하기

실행파일.exe

 

 

 

5. 다른 local 컴퓨터에서 실행파일 테스트 (시연) 하기

  1. 다른 사용자의 local 컴퓨터에 script 폴더를 다운받습니다.
  2. src 폴더의 main_for_exe.exe를 실행시켜 줍니다.

 

만약 아래와 같은 에러가 생긴다면 

OSError: [WinError 126] 지정된 모듈을 찾을 수 없습니다. Error loading "C:\Users\MI2RL-JW\AppData\Local\Temp\_MEI260802\torch\lib\caffe2_detectron_ops_gpu.dll" or one of its dependencies.
[32] Failed to execute script 'test_OP_exe' due to unhandled exception!

 

  1. Pytorch + CUDA를 설치하시고 다시 실행시킵니다.
  2. 1번이 안되면 spec 파일에 아나콘다\torch\lib 경로를 pathex에 추가시켜주고 다시 실행파일로 만들어줍니다

 

※만약, 해당 파일이 계속해서 실행이 안된다면 아래의 사항을 확인해주세요!

  • 실행하려는 Local에서 GPU가 있는지 확인합니다.
  • 만약, GPU가 없다면 코드에 try ~ except 문을 이용하여 GPU가 없을 시, CPU 코드로 돌아갈 수 있게 구현해 놓습니다.

(보통 딥러닝 모델을 inference 용도로만 사용하는 경우 해당 local에는 GPU가 없을 가능성이 있습니다. 클라우드 서버에서 돌리면 더더욱 그러한데, 그 이유는 클라우드에서 GPU 사용시 돈이 굉장히 많이 소요되기 때문이라고 합니다.)

 

 

 

 

 

 

 

[Note. pydicom 에러]

만약 pydicom 모듈이 포함된 실행파일을 만들었다면 아래와 같은 에러 메시지가 출력 될 수 도 있습니다.

 

 

 

1. 위 문제를 해결할 수 있는 한 가지 방법은 pydicom 모듈을 simpleITK 모듈로 바꿔주어 dicom 파일을 읽도록 하는 것이 있습니다.

 

https://89douner.tistory.com/284?category=991951 

 

4-1. Python으로 dicom 데이터 읽기 (Feat. pydicom, SimpleITK)

안녕하세요. 이번 장에서는 Python으로 dicom 데이터를 읽는 방법에 대해서 말씀드리겠습니다. Python에서는 pydicom 모듈과 SimpleITK 모듈을 제공하고 있는데, 이러한 모듈들을 사용하여 dicom 파일을 읽

89douner.tistory.com

 

2. 사실 pydicom을 사용해서도 실행파일이 돌아갈 수 있게 하는 것이 더 큰 궁극적인 목적인데, 이를 위해서는 pydicom 버전을 2.0.0으로 downgrade해주면 해결이 됩니다.

 

 

이상 딥러닝 모델을 실행파일로 만드는 과정을 설명드렸습니다. 

감사합니다!

안녕하세요. 

이번 글에서는 logging 모듈에 대해서 설명해보려고 합니다.

먼저, logging을 검색하면 아래와 같이 정의하고 있음을 알 수 있습니다.

 

"In computing, a log file is a file that records either events that occur in an operating system(or other software runs) or messages between different users of communication software. Logging is the act of keeping a log."

(By Wikipedia)

 

 

1. Event란 무엇인가요?

컴퓨팅에서 event란 프로그램에 의해 감지되고 처리될 수 있는 동작이나 사건을 말합니다.  예를 들어, 마우스를 클릭 하거나 키보드를 입력하면 이벤트가 발생합니다.  마우스를 예로 들어 이벤트 기반 시스템이 수행되는 과정을 설명하면 아래와 같습니다.

  1. (마우스) 장치로부터 입력이나 내부 경보를 계속해서 기다립니다.
  2. 마우스 클릭 시, 이벤트 발생 시 정보들(ex: 언제, 어디서, 어떤 이벤트가 발생 했는지 등)을 이벤트 핸들러 (event handler)로 보냅니다.
  3. 그리고, 이벤트 핸들러 (event handler) 에서 발생 한 이벤트를 어떻게 처리해 줄 지 프로그래밍 해줍니다.

<그림1 출처. https://fromyou.tistory.com/546>

 

위 그림에서 마우스를 클릭하여 event를 발생시키면 event handler를 통해 사이트에 접속하는 과정이 실행됩니다.

 

이때, 접속한 시간을 따로 기록할 수 있도록 프로그래밍을 할 수 도 있습니다. 이렇게 접속한 시간을 따로 기록해두면 나중에 내가 한달에 몇 번 사이트에 접속했는지 알 수 있겠죠?  

 

 

 

2. Log란 무엇인가요?

앞서 설명한 "접속시간을 기록하는 행위""log"라고 합니다. 좀 더, 일반화 해서 말하자면 "무언가를 기록하는 행위"log라고 하지요.  (computer 분야에서는 log라는 것 자체를 동사 개념으로 사용하고 있는데, 보통 logging이라는 용어로 대체되어 사용되기도 합니다) 

 

<그림2 출처. https://en.dict.naver.com/#/entry/enko/36130c3cc2784ed8a58f61092fab6066>

 

그리고, 이렇게 "무언가를 기록하는 행위"를 한다는 것은 "기록에 대한 파일을 만드는 것"으로 볼 수 있는데, 이때 만들어진 파일을 log파일이라고 합니다. 접속시간에 대한 내용만 기록을 했다면 "접속시간 log 파일"이라고 부르죠.

 

마우스나 키보드와 같은 이벤트를 통해서만 log라는 행위를 하거나 (log)파일을 얻을 수 있는 건 아닙니다. 

프로그램 명령어를 통해 log라는 행위를 할 수 도 있습니다

 

 

 

3.logging 모듈이란?

Python에서는 명령어를 통해 log를 할 수 있게 해줍니다.

즉, 특정 명령어를 이용하면 프로그램이 실행되는 동안 일어나는 모든 정보를 기록으로 남길 수 있죠.

기록된 정보들은 의미있는 분석을 위해 사용될 수 도 있습니다.

 

log를 이용하는 또 다른 목적은 개발 단계에서 프로그램이 제대로 동작하는지 확인하기 위함입니다.  

프로그램이 제대로 동작하는지 확인하는 단계는 크게 5가지 단계로 나눌 수 있는데, 이것을 logging level이라고 합니다.

 

 

3.1. logging level

Level Numeric value 의미
DEBUG 10 어떤 문제가 발생했을 경우 해당 문제를 진단하고 싶을 때 필요한 자세한 정보를 기록
INFO 20 작업이 정상적으로 작동하고 있음을 메시지를 통해 확인하고 싶은 경우 
WARNING 30 소프트웨어가 동작하고 있지만, 예상치 못한 일이 발생했거나 가까운 미래에 문제가 발생할 수 도 있음을 경고
Ex1) 디스크 공간 부족 → 프로그램은 잘 동작되지만 앞으로 문제가 발생할 수 도 있음
ERROR 40 문제가 발생했으며 소프트웨어 일부가 기능을 수행하지 못했다는 뜻
CRITICAL 50 심각한 에러 → 프로그램 자체가 실행되지 않을 수 있다는 것을 뜻함

 

DEBUG < INFO < WARN < ERROR < FATA 

 

"setLevel"이라는 명령어를 이용하여 위와 같은 5단계의 logging level 중 하나를 설정해 줄 수 있습니다.

만약, WARN을 로그 레벨로 지정을 하게 되면 WARN보다 높은 level에 대한 logging message만 출력되는 것을 볼 수 있습니다.

 

 

 

3.2. logging.Formatter

logging.Formatter를 이용하면 추가적인 정보를 더해 logging message를 출력할 수 있습니다.

logging.Formatter를 이용하려면 4가지 단계를 거쳐야 합니다.

  1. logging.Formatter를 이용하여 원하는 logging message 출력형태를 결정해줍니다. 
  2. logging message를 출력하는 방법은 총 2가지 입니다. 첫 번째는 console 창에 logging message를 띄우는 방법이 있고, 두 번째는 특정 파일에 logging message를 보내 저장시키는 방법이 있습니다. 이때, console 창에 출력하고 싶다면 "logging.StreamHandler()"함수를, 특정 파일에 출력하고 싶다면 "logging.FileHandler()"함수를 이용하면 됩니다. 
  3. 앞서 설정한 logging message 형태와 출력방식을 "setFormatter(formatter)" 함수로 세팅해줍니다.
  4. 마지막으로 "addHandler"를 통해 logging 객체(=logger)에 추가시켜 줍니다.

 

 

 

 

참고로 logging.Formatter의 attribute에 대한 설명은 아래 사이트를 참고 하시는걸 추천합니다.

https://docs.python.org/ko/3/library/logging.html

 

logging — 파이썬 로깅 시설 — Python 3.9.7 문서

logging — 파이썬 로깅 시설 소스 코드: Lib/logging/__init__.py 이 모듈은 응용 프로그램과 라이브러리를 위한 유연한 이벤트 로깅 시스템을 구현하는 함수와 클래스를 정의합니다. 표준 라이브러리

docs.python.org

<그림3 출처. https://docs.python.org/ko/3/library/logging.html>

 

 

logging에 대해 좀 더 알고 싶으시다면 아래 사이트를 참고하시는 걸 추천합니다!

https://greeksharifa.github.io/%ED%8C%8C%EC%9D%B4%EC%8D%AC/2019/12/13/logging/#21-%EC%B0%A8%EB%A1%80%EB%8C%80%EB%A1%9C-logging-%EC%A4%80%EB%B9%84%ED%95%98%EA%B8%B0

 

Python, Machine & Deep Learning

Python, Machine Learning & Deep Learning

greeksharifa.github.io

 

https://www.youtube.com/watch?v=zf7L1hCO1t4 

 

안녕하세요.

이번 글에서는 Pillow 패키지의 가장 기본이 되는 모듈인 Image 모듈에 대해서 설명하려고 합니다.

 

 

 

1. Image 모듈이란?

Image 모듈은 기본적으로 이미지 파일을 로드하거나 새로운 이미지를 생성하는 기능들을 제공해줍니다.

 

"The module also provides many factory functions, including loading images from files and creating new images."

 

 

모듈이라는 것은 크게 두 가지 요소로 구성되어 있다고 볼 수 있습니다.

  1. attribute = 속성
  2. function = 함수

 

 

먼저 Image 모듈 reference 사이트에 접속해서 어떤 attribute이 있는지 살펴보겠습니다.

 

(↓↓↓Image Module reference site↓↓↓)

https://pillow.readthedocs.io/en/stable/reference/Image.html

 

Image Module

The Image module provides a class with the same name which is used to represent a PIL image. The module also provides a number of factory functions, including functions to load images from files, a...

pillow.readthedocs.io

 

 

 

2. Image 모듈 함수(=function) (Feat. attribute)

2-1. Image.open()

Image 모듈 reference site를 들어가 보면 첫 번째로 보이는 함수가 open()입니다.

 

아래 설명을 통해 보자면 open()이라는 함수는 어떤 이미지 파일을 단지 identification(확인) 하는 역할을 수행합니다. 

즉, 이미지 데이터를 읽어드린 것이 아니라 단지 이미지 파일에 대한 몇 가지 (메타)정보를 확인합니다.

 

예를 들어, 아래와 같이 Image.open() 함수를 통해 리턴 받은 img_input 값들을 살펴보면 Image 모듈의 기본적인 attribute 값들 (=filename, size, width, height, format) 과 그 외에 현재 이미지와 관련한 다양한 정보들을 포함하고 있다는걸 확인할 수 있습니다.

 

 

 

(↓↓↓ Image 모듈의 다양한 attribute들 ↓↓↓)

 

 

 

 

image 모듈은 굉장히 다양한 image file format을 지원합니다. 아래 링크에 접속하면 지원가능한 format 형식들이 나옵니다.

 

"The open() function identifies files from their contents. When an image is opened from a file, only that instance of the image is considered to have the format."

 

https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html#tiff

 

Image file formats

The Python Imaging Library supports a wide variety of raster file formats. Over 30 different file formats can be identified and read by the library. Write support is less extensive, but most common...

pillow.readthedocs.io

 

위에서 사용한 이미지 파일의 format은 tiff인데, 위 링크에 들어가면 아래 화면 처럼 TIFF 파일 형식을 찾아볼 수 있습니다.

 

 

만약 TIFF 파일을 image.open()으로 읽어들이면 tiff 이미지와 관련된 다양한 값들을 리턴받을 수 있는데, 이러한 값들에 대한 설명이 아래와 같이 나옵니다.

 

 

 

(↓↓↓ TIFF file format (Feat. open()) ↓↓↓)

https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html#tiff

 

Image file formats

The Python Imaging Library supports a wide variety of raster file formats. Over 30 different file formats can be identified and read by the library. Write support is less extensive, but most common...

pillow.readthedocs.io

 

 

 

image.open() 함수의 설명 중에는 또 이러한 아래와 같은 표현이 있습니다.

 

"The file object must be opened in binary mode." 

 

여기서 말하는 binary model란 "binary representation of the pixels"라고 보시면 됩니다.

 

이진 파일이란 컴퓨터는 읽을 수 있으나 사람을 읽지 못하는 파일입니다. 

보통 binary mode로 읽으면 byte 단위로 읽게되는 데, 아래 "data" 값을 보면 확인 할 수 있습니다. 

 

 

 

위와 같은 binary 관련 내용은 아래를 참고해주세요!

https://ballentain.tistory.com/50

 

이미지 읽는 방법 / cv.imdecode( ), io.BytesIO( )

이미지를 읽는 방법에는 여러가지가 있다. openCV를 사용해서 읽는 방법도 있고, PIL를 이용해서 읽는 방법도 있다. 최근에는 이미지 파일을 binary 형태로 읽은 다음( = byte 단위로 읽음 ) jpeg로 decodin

ballentain.tistory.com

 

https://stackoverflow.com/questions/48367128/string-to-bytes-python-without-change-in-encoding

 

String to Bytes Python without change in encoding

I have this issue and I can't figure out how to solve it. I have this string: data = '\xc4\xb7\x86\x17\xcd' When I tried to encode it: data.encode() I get this result: b'\xc3\x84\xc2\xb7\xc2\x...

stackoverflow.com

 

 

https://stackovergo.com/ko/q/980400/convert-binary-files-into-ascii-in-python

 

바이너리 파일을 Python에서 ascii로 변환 – 3 개의 답변

다음 형식의 데이터를 포함하는 바이너리 파일이 많이 있습니다. ... 질문 : python, binary, ascii, decoding.

stackovergo.com

 

 

 

 

Image.open() 함수의 리턴 값은 Image 객체입니다.

즉, 리턴 받은 값에서 다시 Image 모듈의 function, attribute를 사용할 수 있다는 뜻입니다.

예를 들어, 아래 코드와 같이 Image.open()를 통해 Image 객체를 리턴 받은 img_input가 Image 모듈의 함수 중 하나인 seek() 을 이용할 수 있다는걸 확인 할 수 있습니다.

 

 

Image.open() 함수의 parameter 부분에 "fp" 설명을 보면 마지막 부분에 "the file object must implement "read()", "seek()", "tell()"같은 함수를 사용해야 실제로 이미지 데이터를 load할 수 있다고 합니다. (이 부분은 뒤에서 "file.seek" 함수 를 설명할 때 더 자세히 하도록 하겠습니다)

 

 

 

2-2. Image.seek()

앞서 실제 이미지 데이터를 load 하는 함수에는 세 가지가 있다고 언급했습니다.

  1. read()
  2. seek()
  3. tell()

보통은 read() 함수를 많이 사용하지만 가끔씩 이미지들이 frame 단위로 묶여있는 경우 seek() 함수를 이용해 이미지를 읽어들입니다.

 

예를 들어, 아래 train-labels 이미지 정보를 보면 512×512×30 형태로 제공된 것을 볼 수 있습니다.

 

 

512×512×30에서 30이 의미하는 바는 특정 이미지 frame을 의미합니다. 예를 들어, (512, 512, 1) 값들은 첫 번째 이미지frame을 뜻하고, (512, 512, 2) 값들은 두 번 째 이미지 frame을 뜻합니다.

 

그래서 위와 같은 이미지 형태를 읽어들일 때는 frame 단위로 이미지를 읽어야 하는 경우가 있습니다.이러한 경우는 seek 이라는 함수를 이용합니다.

 

 

 

for문과 seek() 함수를 통해 frame 별 이미지들을 하나씩 따로 불러올 수 있습니다.

 

 

이렇게 불러온 binary mode 이미지를 0~255 값으로, 즉 사람이 읽을 수 있는 값으로 변형 시키려면 numpy 패키지에서 제공해주는 함수를 이용하면 됩니다. 아래 코드에서는 numpy.asarray() 함수를 이용했네요.

 

 

 

 

굳이 위와 같이 numpy로 변경 시켜줄 필요 없이, tiff 이미지만 저장시키고 싶은 경우는 아래와 같이 코드를 작성해주면 됩니다.

 

 

그럼 아래와 같이 이미지가 frame 별로 따로 'tiff' 형식으로 저장되는걸 확인하실 수 있습니다.

 

 

 

 

지금까지 Image 모듈에 대한 설명과 기본적인 함수인 Image.open(), Image.seek() 에 대해서 알아보았습니다.

감사합니다.

 

'파이썬 패키지 소개 > Pillow' 카테고리의 다른 글

1.Pillow 패키지란 무엇인가요?  (0) 2021.08.01

안녕하세요.

이번 글에서는 Pillow라는 파이썬 패키지에 대해서 소개해드리려고 합니다.

 

 

1. Pillow 패키지란?

Pillow 패키지를 설명하기 전에 PIL 패키지에 대해 간단히 설명하겠습니다.

 

PIL는 Python Imaging Libarary의 약자로, 파이썬으로 이미지를 다룰 때 유용한 기능들을 제공하는 라이브러리 였습니다.

 

"PIL is the Python Imaging Library by Fredrik Lundh and Contributors."

 

파이썬에서 setuptools이란 python 라이브러리 를 확장 및 배포하는데  사용되는 extension libarary인데, 이러한 setuptools을 이용하여 프로젝트 빌드, 배포를 쉽게 관리할 수 있게 도와줍니다. 하지만, PIL는 "not setuptools compatible" 하다고 알려져 있었기 때문에 이를 개선하고자 PIL를 fork하여 Pillow라는 프로젝트를 실행하게 됩니다. (파이썬에 이미지를 다루는 또 다른 패키지로는 openCV가 있습니다)

 

(↓↓Pillow 공식 사이트↓)

https://pillow.readthedocs.io/en/stable/

 

Pillow

Pillow is the friendly PIL fork by Alex Clark and Contributors. PIL is the Python Imaging Library by Fredrik Lundh and Contributors. Pillow for enterprise is available via the Tidelift Subscription...

pillow.readthedocs.io

 

 

2. Pillow 패키지 설치하는 방식은?

Pillow 패키지를 설치하기 전에 알아두어야 할 사항들을 정리해보겠습니다.

 

 

2-1. PIL 설치 여부 확인

Pillow를 설치하는 방법을 알려주는 사이트에 접속하면 아래와 같은 주의사항을 알려줍니다.

 

"Pillow and PIL cannot co-exist in the same environment. Before installing Pillow, please uninstall PIL."

 

즉, Pillow를 설치하기 전에 PIL가 있으면, PIL를 uninstall 해주어야 합니다.

 

(↓↓Pillow 설치 방식↓)

https://pillow.readthedocs.io/en/stable/installation.html#warnings

 

Installation

Warnings: Python Support: Pillow supports these Python versions.,,,,,,,,,,,,, Python, 3.9, 3.8, 3.7, 3.6, 3.5, 3.4, 3.3, 3.2, 2.7, 2.6, 2.5, 2.4,, Pillow >= 8.0, Yes, Yes, Yes, Yes,,,,,,,,,, Pillow...

pillow.readthedocs.io

 

 

 

2-2. Python 버전 확인

지금까지 Pillow 패키지는 여러 업데이트를 통해 다양한 버전이 release 되었습니다. 

Python 패키지도 마찬가지로 다양한 버전이 있죠.

 

그래서, Pillow 패키지를 설치 할 시, 파이썬 버전과 Pillow 패키지 간의 호환성을 고려해야 합니다.

(예를 들어, Pillow 7.0 버전을 만들 때는 python 3.5 버전의 기능 중 python 3.4에서 추가된 기능등을 이용했다고 하면, 당연히 python 3.4 버전에서는 호환이 안되겠죠?)

 

 

 

2-3. OS (Operating System) 확인

사실 패키지를 설치하기 위해서 OS까지 확인하는 경우는 없지만, 만일의 경우에 대비해서 Pillow 개발자들이 테스트한 환경에 맞게 세팅해준다면 더 안전할 수 있겠죠?

 

아래와 같은 표를 보면 OS 마다 Pillow를 어떤 python 버전에서 테스트 했는지 나와있습니다. 

Supporting해주는 python 버전이 있으니, python 버전에 맞는 Pillow 패키지 버전을 설치해주면 되겠죠? 

 

(Tested architecture 부분은 CPU 모델과 관련된 설명인데, 자세한 부분은 아래 글을 참고해주세요)

https://89douner.tistory.com/151

 

2.Core 그리고 CPU,Memory,OS간의 관계 (32bit 64bit; x86, x64)

안녕하세요~ CPU를 보시면 x86, x64 아키텍처라는 걸 본적있으시죠? 폴더갖은 곳에서도 x86, x64 폴더가 따로 존재하는것도 본적있으실거에요! 이번 시간에는 x86, x64가 어떤 개념인지 알아보기 위해 C

89douner.tistory.com

 

 

2-5. Pillow 패키지 설치

 

아래와 같은 명령어를 사용하시면 Pillow 패키지가 설치 됩니다.

python3 -m pip install --upgrade pip
python3 -m pip install --upgrade Pillow

 

하지만, 아나콘다 가상환경을 이용하시는 분은 Pillow 패키지 설치 시, 아래의 글을 참고해주세요! 

("ctrl+F" 누른 후, "pillow" 검색)

https://89douner.tistory.com/73

 

4. 아나콘다 가상환경 구축하기

안녕하세요~ 제가 이전글에서 했던 질문을 다시 가져와 볼게요. "여러분이 진행하는 프로젝트에서 딥러닝과 관련된 프로그램을 3개(A,B,C) 정도 사용한다고 했을때 여러분의 PC는 하나라고 가정

89douner.tistory.com

 

 

 

 

 

3. Pillow 모듈

Pillow 패키지에는 굉장히 다양힌 모듈들이 있습니다.

어떠한 이미지 관련 기능을 제공해주는지에 따라서 모듈의 종류가 결정됩니다.

 

 

(↓↓Pillow 모듈들 reference↓)

https://pillow.readthedocs.io/en/stable/reference/index.html

 

Reference

Image Module- Examples, Functions, The Image Class, Image Attributes, Classes, Constants., ImageChops(“Channel Operations”) Module- Functions., ImageCms Module- Functions, CmsProfile., ImageColor M...

pillow.readthedocs.io

 

※참고로 파이썬에서 모듈이란 "함수나 변수 또는 클래스를 모아 놓은 파일"을 지칭합니다.

(↓↓모듈에 대한 설명↓)

https://wikidocs.net/29

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

 

 

그렇다면, Pillow 패키지 중 가장 기본이 되는 Image 모듈에는 어떤 기능이 있을까요?

이러한 모듈을 어떻게 사용할 수 있을까요?

 

다음 글에서 알아보도록 하겠습니다!

 

 

'파이썬 패키지 소개 > Pillow' 카테고리의 다른 글

2. Image 모듈 (Image.open(), Image.seek())  (2) 2021.08.01

+ Recent posts