ASAC 빅데이터 분석가 7기/ASAC 일일 기록

ASAC 빅데이터 분석가 과정 50일차 (25.02.20)

junslee 2025. 2. 20. 09:58

8_dl

1_code

5_AE

 

  • # 기본적인 모델 설계 방식!!!
    # 기본적인 구조 1 : VGG를 이용해서 이미지의 특징을 추출!!!!
    #                 ==> Encoder 파트로 활용하겠다!!!
    # 기본적인 구조 2 : AE 대칭 구조를 사용해서 Decoder 파트를 구성!!!--> ConvT
    # 기본적인 구조 3 : 중간에 인코더쪽에서 추출하는 특징에 대한 정보를...
    #                   잘 복원을 해야하는 Task입장에서 특징에 대한 정보를 넘겨줘볼까!!!
    #                   ==> 복원하는 과정에서 이런 특징이 1단계 추출한 정보!!!
    #                   각 단계별 인코더 파트의 특징 정보를 치팅 paper 넘겨주자!!!
    #                   ==> 본류 : 여러 이미지 특징을 고려한 사항 + 그 단계 이미지 특징!!
    #                 : ResNet
    # ===> 이미 잘 알려진 구조들을 원하는 목적을 위해서 잘 조립을 함!!!!!

  • # 위 구조를 어떻게 학습할까!!!
    # loss function : PSNR ( 이미지 복원쪽에서 주로 사용하는 지표!! )
    #     ==> 목적에 맞는 loss를 지정해서 하면 됨!!!!!
    #     ==> 어떤 loss 함수를 지정하는가에 따라서 학습이 잘 될 수도, 안 될 수도!!
    # *** 논문들에서도 loss 를 어떻게 근사화/ 세팅을 할까!!!!!! ==> 학습 결과

  • # 목적 : 저해상도 이미지 ---> 고해상도 이미지로 복원!!!
    # 1. 학습 데이터 셋 구축!!!!
    #    입력 : 저해상도 이미지
    #    출력 : 고해상도 이미지
    # 2. 몇 개의 층을 중심으로 네트워크를 설계할지!!!!
    #    : 네트워크 설계를 함수로 !!!
    #    : 몇 층을 쌓는 부분에서 "대칭구조" 함수화 하면,,원하는 층을 쉽게!!!
import tensorflow as tf
import numpy as np
# 저해상도 -- 고해상도 pair 데이터셋은 어쩔?
# ===> 일반 이미지 : 저해상도 낮추고(train_X), 원본(train_y)
!gdown 1N2qIHmXanRNc4UZN3L9vArfD0wV4yH_6

# colab에서 압축을 풀어야 함!!
# --q, --d ( 어떤 파일을, 특정 폴더/경로에 풀 때!!) kaggle
!unzip /content/bsd500_images.zip

 

# 필요한 파일 접근을 위해서...
import os
import glob # 파이썬에서 os쪽 명령어를 좀 효율적으로 하기 위한 패키지중 한.

 

# 모든 학습 이미지 데이터들에 대해서 접근!!!!
all_images_path = glob.glob("/content/images/*/*.jpg")
print(len(all_images_path))
500
all_images_path[:3]
all_images_path[-3:]
# 수집한 데이터셋에 대한 간단한 이미지 확인!!!
import matplotlib.pyplot as plt
# cv2
import PIL.Image as Image

 

plt.figure(figsize=(12,12))
for c in range(9): # 3 by 3 -->> 9개만 보려고 함!!!
    plt.subplot(3,3,c+1) # 어제 코드와 유사한 스타일!!!
    plt.imshow(plt.imread(all_images_path[c] ))
    plt.title(all_images_path[c])
plt.show()

  • # 참고하는 논문/ 기술 : 일반/대중성을 보여줘야 하기에,,,
    #                     : 두리뭉실 케이스!!!
    #                     ==> 특정 목적에 맞춰서는 잘 안되는 경우!!!
    # --> 논문/ 소개 사이트에 있는 것들을 다 믿으면 안 됨!!!

# 위의 보이는 이미지 데이터를 활용해서..
# 저해상도 이미지 ---- 고해상도 이미지 pair!!!

# 할 일 : 원본 이미지에서 일부분을 짜라서 저해상도 - 고해상도
#       : Why 짤라서? 이미지가 커요;;;
#                     이미지 별로 사이트가 제가각!!!
#                     다양한 특성에 대해서 학습!!! etc
#                     :주어진 시간내에 돌리기 위해서!!!HW
# 입력 : 이미지 경로 1장 기준
# 출력 : 그 이미지에서 일정 영역에 대한 저해상도 - 고해상도

def get_hr_and_lr( image_path):
    # 참고) 저는 잘 사용하지 않지만,,,,TF에도 이미지 처리 모듈!!!
    # 간단히 소개하는 정도!!!!!!!
    img = tf.io.read_file( image_path ) # 경로에 있는 파일 불러오기
    img = tf.image.decode_jpeg( img, channels=3 ) # 이미지 데이터 채널을 3명시해서 불러오기!!!
    img = tf.image.convert_image_dtype(img, tf.float32 )
    # 이미지 데이터를 TF의 자료형으로 변경하는 과정!!!
    # ===> TF에서 사용하는 기본적인 처리 과정!!!!
    # cv2.imread(path) + cv2coler(img , bgr2rgb ) etc

    # 1장 이미지에서 random 하게 작은 영역을 잘라내겠습니다!!
    # 이유 : 시간관계상!!!
    hr = tf.image.random_crop( img, [50,50,3])
    # ===> 원본 이미지에서 TF 알아서 랜덤하게 50*50 컬러로 잘라냄!!
    # 원본 : hr (output)

    # 저해상도 이미지를 만드는 방법 중 하나가 심플한 경우
    # 원본을 1/2 줄이고,,,다시 복원을 하면,,,
    lr = tf.image.resize( hr, [25,25])
    # 원본 50*50 ---> 25 * 25
    lr = tf.image.resize(lr, [50,50])
    # 25*25 ---> 50*50 확대하면서,,,해상도를 떨어뜨림!!!!

    # 네트워크 학습에 필요한 데이터 셋!!!
    # 출력을 2개 : 순서 저해상도, 고해상도( 크기는 동일 50*50*3)
    return lr, hr

 

test_img = all_images_path[4]
fig,ax = plt.subplots(1,3, figsize=(20,10))
ax[0].imshow(plt.imread(test_img))
# ---> lr, hr
test_lr, test_hr = get_hr_and_lr(test_img)
ax[1].imshow(test_lr)
ax[2].imshow(test_hr)

 

  • # ==> 저해상도 : train_X
    #     고해상도 : train_y
    # 순서가 동일한 이미지 영역에 대해서!!! pair!!!!!!!

    # 고민) 이미지 데이터를 학습을 하겠다!!!==> 데이터셋에 대한 용량이 엄청 큼!!
    # ===> 하나의 변수에 담아서 하는 것은 거의 불가능!!!!
    # Sol) 1. 파일 경로 --> 생성기 --> from_directory() ---> 학습
    #         [ kaggle 실습 *주로 많이 방식]
    #      2. 파일 경로 --> tf에 Dataset 클래스   ---------> 학습
    #         : 지금 구축을 해보겠습니다!!!!
batch_size= 32 # GPU vRAM에 맞춰서 : 이미지 크기에 영향을 받음!!

# train dataset을 구축!!!
train_path = glob.glob("/content/images/train/*.jpg")
train_dataset = tf.data.Dataset.list_files(train_path )
# ---> 필요에 따라서 수정을 하셔서 사용을 해야 함!!
train_dataset = train_dataset.map(get_hr_and_lr)
train_dataset =
<_ShuffleDataset element_spec=TensorSpec(shape=(), dtype=tf.string, name=None)>

내일 kaggle 데이터셋

=> yolo 모델을 가져다가 + 특화 (Fine Tunning)

=> 사용법 (이미지 폴더 구조 -> 모델에 넘기는 방식)