"Colab" 은 Google Colaboratory 를 줄여서 쓴 것으로, Google Research 팀에서 개발한 서비스 제품입니다. Colab을 사용하면 웹브라우저를 통해서 클라우드 상에서 CPU뿐만 아니라 GPU나 TPU도 무료로(!!!) 사용하여 Python과 Jupyter Notebook으로 데이터 분석을 할 수 있습니다. 


물론 무료로 Colab을 이용하려면 Resource 한도가 있기는 합니다만, 교육용이나 간단한 실습용으로 GPU 또는 TPU를 써서 기계학습 모델을 훈련시켜보기에는 손색이 없습니다. 


Colab 한도를 높여서 더 빠른 GPU, 더 긴 타임, 추가 메모리를 사용하고 싶으면 $9.99/월 유료 Colab Pro 를 이용하면 됩니다. (무료는 최대 12시간 vs. Colab Pro는 최대 24시간) 



이번 포스팅에서는 Google Colab에서 외부 데이터를 로딩해서 이용할 수 있는 2가지 방법을 소개하겠습니다. 


(1) Local folder에서 Colab 으로 파일 로딩하기 

    (Loading a file from the local folder to Colab)


(2) Google Drive를 Colab에 연결해서 데이터 로딩하기 

    (Mounting google drive to Colab) (추천)





  0. Google Colab 실행하여 Jupyter Notebook 론칭하기


Google Colab을 시작하려면, 먼저 Google Drive에 접속한 후에 왼쪽 상단의 '+ New' 메뉴를 선택한 후, 




'More' 메뉴의 오른쪽 꺽쇠 화살표를 눌러 나온 추가 메뉴에서 'Google Colaboratory' 를 선택해주면 됩니다. 




그러면 아래처럼 Colab Jupyter Notebook 이 론칭됩니다. (backend 에서 도커 이미지 생성되어 돌아가고 있음.)




CPU, GPU, 또는 TPU 를 사용할지 여부는 Runtime > Change runtime type 메뉴에서 선택할 수 있습니다.




  (1) Local folder에서 Colab 으로 파일 로딩하기 

       (Loading a file from the Local folder to Colab)


만약 Colab에서 로컬 머신에 있는 폴더 내 파일을 읽어오려고 하면 "FileNotFoundError: [Errno 2] No such file or directory: your_local_path_here" 라는 에러 메시지가 나올 겁니다. Google 의 클라우드에서 작동하고 있는 Colab 은 로컬 머신의 경로를 인식하지 못하기 때문에 이런 에러가 발생합니다.("우물가에서 숭늉 찾는 격"이라고 할까요...)  


이럴 때 필요한게 Local machine 의 folder에서 파일을 Colab으로 로딩해서 사용하는 방법입니다. Google Colab에서 쉽게 로컬 폴더에서 업로드할 수 있도록 해주는 메소드인 google.colab.files.upload() 를 제공합니다. 


Colab에서 아래처럼 코드를 실행하면 '파일 선택' 하는 메뉴가 나타납니다. 



from google.colab import files
file_uploaded = files.upload()

 




'파일 선택' 메뉴를 선택하면 아래와 같이 '탐색기 창'이 팝업으로 나타납니다. 원하는 위치에서 원하는 파일을 선택한 후 '열기' 메뉴를 선택해줍니다. 




선택한 'abalone.txt' 파일이 Colab 으로 업로딩이 완료되면 아래 화면캡쳐처럼 '100% done' 이라는 메시지와 함께 'Saving abalone.txt to abalone.txt' 라는 안내 메시지가 뜹니다. 



위에서 업로딩한 'abalone.txt' 텍스트 파일을 읽어와서 Pandas DataFrame으로 만들어보겠습니다. 이때 pd.read_csv()를 바로 사용하면 안되며, Python으로 다양한 I/O 스트림을 다룰 때 사용하는 io 모듈을 사용해서 io.BytesIO(file_uploaded['abalone.txt'] 로 '_io.BytesIO object'를 먼저 만들어준 다음에 pandas.read_csv() 메소드로 Pandas DataFrame을 만들 수 있습니다. 



# io : Python's main facilities for dealing with various types of I/O.
import io
import pandas as pd

abalone_df = pd.read_csv(io.BytesIO(file_uploaded['abalone.txt']))

abalone_df.head()




그런데, 이 방법은 로컬 머신에 수동으로 경로를 찾아가서 하나씩 파일 열기를 하여 읽어와야 하는 번거로움이 있고, 구글 드라이브 클라우드 내에서 모든 걸 해결할 수 있는 더 편리하고 폴더 채 데이터에 접근할 수 있는 더 강력한 방법이 있습니다. 그게 다음에 설명할 Google Drive를 Colab에 연결(mounting)해서 사용하는 방법입니다. 




  (2) Google Drive를 Colab에 연결해서 데이터 로딩하기 

       (Mounting google drive to Colab) 


Google Drive를 Colab에 올려서(mounting) 사용하는 방법이 전에는 인증, API 연결같은게 좀 까탈스러웠는데요, 지금은 아래처럼 google.colab.drive.mount('/content/drive') 를 해주고 'authorization code' 만 복사해서 넣어주면 되게끔 깔끔하게 간소화되었습니다. 


아래 화면캡쳐에서 'Go to this URL in a browser: https://xxxx ' 부분의 URL 링크를 클릭해줍니다. 



from google.colab import drive
drive.mount('/content/drive')




그러면 아래 화면처럼 'Sign in with Google' 팝업 창의 'Choose an account to continue to Google Drive File Stream' 에서 데이터가 들어있는 자신의 구글 계정을 선택해서 클릭해줍니다. 




다음으로, 아래 화면캡쳐처럼 'Google Drive File Stream에서 내 Google 계정에 액세스하려고 합니다.' 안내창이 뜨면 하단의 '허용'을 선택해줍니다. 




이제 거의 다 왔네요. 아래 화면캡쳐처럼 'Google 로그인: 이 코드를 복사하여 애플리케이션으로 전환한 다음 붙여넣으세요' 라는 메시지가 뜨는데요, '인증 코드를 복사'합니다. 





바로 위에서 복사한 '인증코드'를 Google Colab Jupyter Notebook으로 다시 돌아와서 아래의 'Enter your authorization code:' 의 아래 빈 칸에 붙여넣기를 해주고 Jupyter notebook cell 을 실행시킵니다. 




자, 이제 Google Drive를 Colab 위에 올려놓기(mounting)를 성공했으므로 Colab의 왼쪽 상단의 '폴더' 아이콘을 클릭하여 탐색기 모드로 전환하고 폴더와 파일을 찾아봅시다.  저기에 Google Drive에 올라가 있는 'abalone.txt' 파일이 보이는군요. 이 파일의 오른쪽 끝에 ':' 을 클릭한 후 'Copy path'를 선택해서 'abalone.txt' 파일이 있는 경로를 복사해놓습니다. 




바로 위에서 'Copy path'로 복사한 'abalone.txt' 파일이 있는 경로(path)를 붙여넣기 해서 보니 '/content/abalone.txt' 입니다. 이 경로를 pd.read_csv() 에 바로 입력해서 pandas DataFrame 으로 만들어보겠습니다. 



import pandas as pd

abalone_df2 = pd.read_csv('/content/abalone.txt', sep=',')
abalone_df2.head()





참고로, 위에서 처럼 마우스로 폴더 탐색기 눌러서 하나씩 찾아가는 방법 말고, Python의 os 모듈을 이용하면 Colab의 현재 작업경로(os.getcwd(), current working directory), 폴더와 파일 리스트 (os.listdir()), 경로에 특정 파일이 존재하는지 여부(os.path.isfile()) 등을 편리하게 확인할 수 있습니다. 



import os

os.getcwd()
[Out] '/content'


os.listdir()
[Out] ['.config', 'drive', 'abalone.txt', '.ipynb_checkpoints', 'sample_data']

os.path.isfile('/content/abalone.txt')
[Out] True







만약에 여러개의 파일들을 폴더별로 계층적으로 정리하여 놓은 데이터를 이용해야 하는 경우라면 아래처럼 Google Drive에 로컬에 있는 폴더를 통째로 올려서 사용할 수도 있습니다. 




저는 로컬 머신의 다운로드 폴더에 들어있는 'dogs_cats_sample' 폴더를 통째로 Google Drive에 업로드해보겠습니다. 'dogs_cats_sample' 폴더 밑에는 'output', 'test', 'train', 'validation' 하위 폴더가 있으며, 이들 각 폴더에는 개와 고양이 이미지 jpg 파일들과 정답 라벨 텍스트 파일이 들어있습니다. 폴더를 통째로 Google Drive 에 한번에 올릴 수 있어서 정말 편리합니다. 



개와 고양이 jpg 이미지들과 라벨 데이터가 Google Drive에 업로드가 되는데 시간이 좀 걸립니다. 업로드가 완료되면 아래 화면처럼 Colab의 왼쪽 사이드바에서 '폴더' 모양 아이콘을 클릭하여 보조창을 열고, 'drive > My Drive > 0_dogs_cats_sample' 폴더를 찾아가서 선택한 후 'Copy path'를 클릭하면 '0_dogs_cats_sample' 폴더의 경로를 복사할 수 있습니다. 



위에서 복사한 경로를 붙여넣기 해서 보면 '/content/drive/My Drive/0_dogs_cats_sample' 경로에 잘 업로드되어 있음을 알 수 있습니다. 아래에는 이들 폴더 내 이미지 파일들 중에서 'train/cat/cat.1.jpg' 이미지 파일 하나를 가져와서 시각화해보았습니다. 



img_dir = '/content/drive/My Drive/0_dogs_cats_sample'
os.listdir(img_dir)
[Out] ['.DS_Store', 'train', 'output', 'validation', 'test']

os.listdir(os.path.join(img_dir, 'train/cat'))
[Out] 'cat.1.jpg'


from keras.preprocessing import image

img = image.load_img(os.path.join(img_dir, 'train/cat/cat.1.jpg'),
target_size=(250, 250))

import matplotlib.pyplot as plt
plt.imshow(img)
plt.show()




[ Reference ]

* Coalbroatory FAQs: https://research.google.com/colaboratory/faq.html

* How to mount Google drive to Colab: https://colab.research.google.com/notebooks/io.ipynb#scrollTo=u22w3BFiOveA

* Python io module: https://docs.python.org/3/library/io.html


출처: https://rfriend.tistory.com/431 [R, Python 분석과 프로그래밍의 친구 (by R Friend)]


많은 도움이 되었기를 바랍니다. 

이 포스팅이 도움이 되었다면 아래의 '공감~'를 꾹 눌러주세요. 


728x90
반응형
Posted by Rfriend
,

이번 포스팅에서는 파일 형태의 이미지 데이터를 TensorFlow와 Keras 메소드를 사용하여


(1) 웹에서 압축 이미지 파일을 다운로드하여 압축을 해제하고,

(2) 폴더 이름을 확인하고 폴더 밑에 있는 파일 이름을 리스트로 만들기

(3) 이미지 파일을 로딩하여 시각화하고 라벨 이름 출력하기


를 해보겠습니다.



  (1) 웹에서 압축 이미지 파일을 다운로드하여 압축 해제하기


먼저 TensorFlow 와 객체지향 파일시스템 경로(object-oriented filesystem paths)를 관리할 때 사용하는 pathlib 모듈을 importing 하겠습니다.



import tensorflow as tf

import pathlib

import os


print(tf.__version__)

[Out] 2.4.0-dev20200913

 



이제 준비가 되었으니 https://storage.googleapis.com 의 예제 이미지로 압축되어 저장되어 있는 'flower_photos.tgz' 압축 파일을 Keras의 get_file() 메소드를 사용하여 가져와서 압축을 풀어(untar = True)보겠습니다.



flowers_root = tf.keras.utils.get_file(
    'flower_photos',
    'https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz',
    untar=True)




이러면 압축이 풀린 파일이 '.keras/datasets/flower_photos 라는 폴더에 저장되어 있습니다. 이를 pathlib.Path() 메소드로 Mac, Linux, Windows OS에 상관없이 경로를 인식할 수 있도록 PurePath로 만들어주었습니다.


* source: https://docs.python.org/3/library/pathlib.html




print(flowers_root)

[Out] /Users/xxx/.keras/datasets/flower_photos


flowers_root = pathlib.Path(flowers_root)

flowers_root

[Out] PosixPath('/Users/xxx/.keras/datasets/flower_photos')

 



저는 Mac OS 에서 작업을 했는데요, Mac OS에서 숨겨진 폴더, 파일을 보려면 Finder 에 커서를 가져다대고 'Shift + Command + .' 을 동시에 눌러주면 됩니다. 그러면 아래의 화면 캡쳐처럼 '/.keras/datasets/flower_photos/' 경로에 다운로드 후 압축해제한 이미지 파일들이 들어있음을 눈으로 직접 확인할 수 있습니다.






  (2) 폴더 이름을 확인하고 폴더 밑에 있는 파일 이름을 리스트로 만들기


다음으로, root directory 밑에 있는 하위 디렉토리와 파일 이름들을 모두(flowers_root.glob("*") ) 가져다가 for loop 으로 순회하면서 하나씩 차례대로 출력해서 확인해보겠습니다.


위의 화면캡쳐에서 숨겨진 폴더, 파일을 눈으로 봤던 것과 동일하게 하위 폴더에는 'roses', 'sunflowers', 'daisy', 'dandelion', 'tulips' 폴더와 'LICENSE.txt' 텍스트 파일이 들어있군요.



# The root directory contains a directory for each class.
for item in flowers_root.glob("*"):
    print(item.name)


[Out]

roses sunflowers daisy dandelion tulips LICENSE.txt




이제 TensorFlow.Dataset.list_files() 메소드를 사용해서 각 꽃 이름 폴더 ('roses', 'sunflowers', 'daisy', 'dandelion', 'tulips' 폴더) 밑에 있는 이미지 파일 이름(jpg 포맷) 들의 리스트를 만들어보겠습니다.


그리고 이중에서 3개만 가져와서(take(3)) 하나씩 차례대로 '전체 경로/파일이름'을 출력해보겠습니다.



# The files in each class directory are examples:
list_ds = tf.data.Dataset.list_files(str(flowers_root/'*/*'))


for f in list_ds.take(3):
    print(f.numpy())


b'/Users/xxx/.keras/datasets/flower_photos/daisy/4440480869_632ce6aff3_n.jpg' b'/Users/xxx/.keras/datasets/flower_photos/daisy/1879567877_8ed2a5faa7_n.jpg' b'/Users/xxx/.keras/datasets/flower_photos/sunflowers/969913643_9d5cd2fe45_m.jpg'

 




  (3) 이미지 파일을 로딩하여 시각화하고 라벨 이름 출력하기


이제 이미지 파일이 준비가 되었으니 TensorFlow.keras.preprocessing.image 메소드를사용하여 꽃 이미지 3개를 크기가 (250, 250)인 이미지로 변환하여 로딩하고, matplotlib 모듈로 시각화(plt.imshow(img))해보겠습니다. ( tf.Tensor() 파일을 f.numpy() 로 변환하여 로딩)


이때 TensorFlow.strings.split(f, os.sep)[-2] 로 '전체 경로/파일이름' 리스트에서 뒤에서 부터 두번째에 위치한 라벨을 파싱해서 가져와서 이미지를 시각화할 때 라벨도 같이 출력을 해보겠습니다.


해바라기(sunflowers), 장미(roses), 민들레(dandelions) 이 차례대로 시각화되었네요.



from tensorflow.keras.preprocessing import image
import matplotlib.pyplot as plt

for f in list_ds.take(3):
    img = image.load_img(f.numpy(), target_size=(250, 250))
    label = tf.strings.split(f, os.sep)[-2]
    print(label.numpy())
    plt.imshow(img)
    plt.show()




* Reference: https://www.tensorflow.org/guide/data?hl=en



많은 도움이 되었기를 바랍니다.

이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾹 눌러주세요.



728x90
반응형
Posted by Rfriend
,