[직접 만드는 NFT Generator] ― ③ 구글 Colaboratory 활용하기

<직접 만드는 NFT Generator> 시리즈의 세번째 게시물로 앞서 구글 스프레드시트에 기록한 데이터를 기반으로 파이썬과 구글 Colaboratory를 활용하여 NFT Art를 랜덤으로 조합해본다.

[직접 만드는 NFT Generator] ― ③ 구글 Colaboratory 활용하기
[직접 만드는 NFT Generator] ― ③ 구글 Colaboratory 활용하기

지난 포스트에서는 NFT Generator 제작을 위해 Property Image를 만들고, 그 속성을 구글 스프레드시트에 기록했다.

  • NFT Art를 구상하여 Property 분리하기
  • 구글 드라이브에 Property Image 업로드하기
  • 구글 스프레드시트에 Property의 정보와 확률 입력하기

이번 포스트에서는 앞서 입력한 Property의 정보와 확률을 토대로 구글 Colaboratory를 통해 NFT Art를 조합해볼 것이다.


구글 Colaboratory에 스프레드시트 연결하기

구글 Colaboratory 파일 생성하기

앞서 구글 드라이브에서 생성한 NFT-Generator 폴더 내에 다음과 같이 구글 Colaboratory 파일을 생성한다.

구글 Colaboratory 파일을 생성하는 모습

생성이 완료되면, 새로 만들어진 구글 Colaboratory 파일의 이름을 NFT Generator - Art로 변경한다.

구글 드라이브와 연결하기

이제 구글 Colaboratory 파일에서 Property Image와 구글 스프레드시트에 접근할 수 있도록, 구글 드라이브와 구글 Colaboratory 파일을 연결하고, 현재 작업하고 있는 디렉토리를 변경해준다.

import os
from google.colab import auth
from google.colab import drive

auth.authenticate_user()

drive.mount('/content/drive', force_remount=True)
os.chdir('/content/drive/Shareddrives/MINSOO.BLOG/NFT-Generator/')

구글 드라이브와 연결하기

이를 실행하면 구글 계정 인증이나 권한 동의 요청이 발생하는데, 이는 작업에 필수적인 것이므로 모두 동의해야한다.

구글 스프레드시트와 연결하기

미리 제작해둔 구글 스프레드시트의 데이터를 구글 Colaboratory에서 사용할 수 있도록 연결한다. 여기서 gpsread 패키지를 활용하여 구글 스프레드시트의 데이터를 가져올 수 있다. gpread의 자세한 사용법은 gspread 공식문서에서 확인할 수 있다.

import gspread
from google.auth import default

creds, _ = default()
gc = gspread.authorize(creds)

sheet = gc.open('NFT Generator')

구글 스프레드시트 연결하기

gc.open(filename)은 현재 디렉토리에서 파일명으로 구글 스프레드시트 문서를 가져오는 함수이다. 앞서 os.chdir(path)로 작업 디렉토리를 변경하였기 때문에, gc.open('NFT Generator') 를 통해 우리가 제작한 구글 스프레드시트를 가져올 수 있었다.


구글 스프레드시트 데이터 가져오기

Property 정보를 Dataframe으로 가져오기

구글 Colaboratory와 구글 스프레드시트 연결을 성공적으로 완료했다면, 구글 스프레드시트의 Property 정보를 가져오기 위해 Properties worksheet를 보아야 한다.

gspread 에서 sheet가 구글 스프레드시트 파일을 뜻하고, worksheet는 파일 내에 만들어진 시트를 뜻하므로, 이제부터 sheet와 worksheet를 구분하여 서술할 것이다.

Properties 시트에 기록된 데이터

Properties worksheet를 통해 전체적인 Property 정보를 가져오기 위해서는 다음과 같은 순서로 절차가 진행되어야 한다.

  1. Properties worksheet의 데이터를 가져와 props_worksheet에 저장하고, 기록된 order에 따라 정렬한다.
  2. 가져온 데이터에서 trait_type에 기록된 Property들의 목록을 가져와 props에 저장한다.
  3. Property 각각의 worksheet의 데이터를 Dataframe으로 가져와 worksheets에 저장한다.
import pandas as pd

props_worksheet = pd.DataFrame(
    sheet.worksheet('Properties').get_all_records(head=1)
).sort_values(by=['order'])

props = props_worksheet['trait_type'].to_list()

worksheets = dict()
for prop in props:
    worksheets.update({
        prop: pd.DataFrame(
            sheet.worksheet(prop).get_all_records(head=1)
        )
    })

Property 정보를 Dataframe으로 가져오기

  • properties_worksheet : Properties worksheet 데이터 (Dataframe)
  • props : Property의 목록 (list)
  • worksheets : 각각의 Property 정보가 담긴 Dataframe들의 dictionary (dict)

확률에 따라 NFT 조합하기

사용자가 원하는 NFT Art의 개수만큼 NFT Art Data를 만들어내야 하는데, 각각의 Property 확률에 따라 랜덤하게 조합을 해야한다. 이는 다음과 같은 순서로 진행된다.

  1. 사용자가 원하는 NFT Art의 개수를 입력받아 count에 저장한다.
  2. Property 확률에 따라 랜덤하게 count개만큼의 NFT Art Data를 생성하고, nft_df에 저장한다.
  3. 생성된 데이터 nft_df에서 중복을 제거한다. 이는 동일한 NFT Art가 없도록 하기 위해서이다.
  4. 만약 중복을 제거한 후의 데이터 개수가 count개 보다 적다면 2~3의 과정을 반복한다.

특히 4번 단계에서 count개 만큼만 생성한다면 중복제거로 인해 개수가 모자랄 수 있으니, countattempt 값을 곱해 더 많은 NFT Art Data를 생성하도록 한다.

이후 count개 보다 많은 데이터가 생성된다면, count개 만큼의 데이터만 추출하고 loop를 종료한다.

import random

nft_df = pd.DataFrame(columns=props)

count = int(input("NFT Art : "))
attempt = 1

while True:
    for prop in props:
        nft_df[prop] = random.choices(
            worksheets[prop]['File'].tolist(), 
            weights=worksheets[prop]['Count'].tolist(),
            k=int(count*(1.1**attempt)),
        )

    nft_df.drop_duplicates(inplace = True)

    if len(nft_df) < count:
        nft_df.drop(nft_df.index, inplace=True)
        attempt += 1

    else:
        nft_df = nft_df.sample(count).reset_index(drop=True)
        break

확률에 따라 NFT 조합하기

  • nft_df : NFT Art Data (Dataframe)
  • count : 만들어내고자하는 NFT Art의 개수 (int)
  • attempt : 목표하는 것보다 더 많은 개수의 NFT Art를 만들기 위한 시도횟수로, count*(1.1**atempt)배의 NFT Art Data를 만들어낸다. (int)

지난 포스트에서 만든 Property의 수가 많지 않으므로, 10개의 NFT Art를 만든다고 하면 다음과 같은 결과를 얻어낼 수 있다. 이는 무작위로 생성한 것으로 매번 다른 결과가 나올 것이다.

10개의 NFT Art Data가 생성되어 nft_df 에 저장되었다.

구글 스프레드시트에 NFT Art Data 저장하기

방금 생성한 NFT Art Data는 무작위로 생성된 것이고, 새로 구글 Colaboratory를 실행하면 또 다른 새로운 데이터가 생성되므로 NFT Art Data를 어딘가에 저장해둘 필요가 있다.

  1. 구글 스프레드시트에 NFT Art Data라는 빈 worksheet를 생성한다.
  2. gspread를 활용하여 저장한다.
NFT Art Data worksheet를 생성한 모습
sheet.worksheet('NFT Art Data').update(
    [nft_df.columns.values.tolist()] + nft_df.values.tolist()
)

구글 스프레드시트에 NFT Art Data 저장하기


NFT Art Image 조합/저장하기

구글 스프레드시트에서 NFT Art Data 불러오기

이미 nft_df에는 NFT Art에 대한 데이터가 있지만, 구글 Colaboratory의 세션이 만료되거나 런타임이 종료될 경우 기존의 데이터를 불러오지 못하게 된다. 이러한 경우, 기존에 생성된 데이터를 활용하려면 미리 저장해둔 데이터를 불러와야 한다.

nft_df = pd.DataFrame(
    sheet.worksheet('NFT Art Data').get_all_records(head=1)
)

구글 스프레드시트에서 NFT Art Data 불러오기

Property 조합하여 NFT Art Image 저장하기

먼저 NFT Art Image를 저장할 폴더를 생성하여야하므로, NFT-Generator 폴더 내에 NFT Art 폴더를 생성한다.

NFT Art 폴더를 생성한 모습

다음으로 Python Image Library인 PIL 을 활용하여, Property를 조합하여 NFT Art Image를 만들고 구글 드라이브에 저장한다. 이때 nft_df를 한줄씩 읽으며 iteration을 실행하는데 그 과정은 다음과 같다.

  1. 빈 이미지를 만든다.
  2. nft_df에 기록된 값에 따라 이미지를 불러온다.
  3. 빈 이미지 위에 불러온 이미지를 붙여넣고, 2~3단계를 반복하며 Property 이미지를 순서대로 붙여넣는다.
  4. 완성된 이미지를 저장한다.

여기서 Property의 값이 -인 경우가 있는데, 이는 이전 포스트에서 Property가 없는 경우를 나타낸 것이라고 설명했으므로, 이미지를 불러오지 않고 과정을 Skip한다.

from PIL import Image

for idx, row in nft_df.iterrows():
    nft_image = Image.new(mode="RGBA", size=(600, 600))

    for prop in props:
        if row[prop] == '-': 
            continue

        prop_image = Image.open(
            f"./Properties/{prop}/{row[prop]}.png"
        )
        nft_image.paste(prop_image, (0, 0), prop_image)
    
    nft_image.save(f"./NFT Art/{idx}.png")

Property 조합하여 NFT Art Image 저장하기

  • nft_image : Property 이미지들이 붙여넣어질 빈 이미지로, 모든 Property 이미지가 붙여넣어지고 나면 NFT Art로 저장 (Image)
  • prop_image : 각 Property에 대한 이미지로, 이는 nft_image위에 붙여넣어진다. (Image)

NFT Art 생성완료

일련의 과정을 완료하면, NFT Art가 모두 만들어진다. 이는 구글 드라이브에 업로드되어 있으므로 다음과 같이 확인해볼 수 있다.

구글 드라이브에 저장된 NFT Art

Summary

이번 포스트에서는 구글 스프레드시트에 기록한 확률에 기반하여 NFT Art를 제작해보았다.

  • 구글 Colaboratory에 스프레드시트 연결하기
  • 구글 스프레드시트에 기록한 정보로 NFT Art Data 만들기
  • NFT Art Data를 스프레드시트에 기록하기
  • 이 데이터로 NFT Art Image 만들기

다음 포스트에서는, 저장된 NFT Art Image와 Data를 활용하여 IPFS에 NFT Art Image를 업로드하고 NFT Metadata를 생성해볼 것이다.