본문 바로가기
Visual Intelligence/Image Deep Learning

[시각 지능] Google Photos Prototype

by goatlab 2022. 8. 13.
728x90
반응형
SMALL

Google Photos

 

https://www.google.com/intl/ko/photos/about/

 

Google 포토에서는 모든 사진과 동영상을 자동으로 정리하고 간편하게 공유할 수 있다. 구글 드라이브를 통해 자동으로 업로드되는 사진과 동영상을 구글 포토의 설정 (화질)을 통해 제어할 수 있다. 또한 특정 폴더 또는 드라이브를 선택할 수 있다.

 

Google Photos 프로토타입 구현

 

import numpy as np
import tensorflow as tf
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPool2D
from tensorflow.keras.layers import Flatten, Dense, Dropout
import matplotlib.pyplot as plt

# 사전 학습 모델 로드
try:
    cnn = tf.keras.models.load_model('./google_photos.h5')
    print('pre-trained model is loaded.')
    
except Exception as err:
    print(str(err))
import os

# 결과를 저장할 상위 디렉토리 pred_result 생성
target_root_dir = 'pred_result'

if not os.path.exists(target_root_dir):
    os.mkdir(target_root_dir)
    print(target_root_dir + 'is created.')
# 정답 디렉토리 + unknown 디렉토리 생성
class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']

for i in range(len(class_names)):
    label_dir =  target_root_dir + '/' + str(class_names[i]).strip()

    if not os.path.exists(label_dir):
        os.mkdir(label_dir)
        print(label_dir + ' is created.')

# unknown dir 생성 (50% 미만의 확률로 예측된 이미지는 pred_result/unknown/ 디렉토리에 원본으로 저장)
unknown_dir = target_root_dir + '/unknown/' 

if not os.path.exists(unknown_dir):
    os.mkdir(unknown_dir)
    print(unknown_dir + ' is created.')
import zipfile

with zipfile.ZipFile('./my_test_image.zip', 'r') as target_file:
    target_file.extractall('my_test_image')

    print('test image is extracted into my_test_image dir.')
import cv2
import glob

src_img_list = []  # 원본 이미지 저장 list
dst_img_list = []

img_file_list = glob.glob('my_test_image/*')

print(img_file_list)

# 테스트 이미지 읽기
for i in range(len(img_file_list)):
    src_img = cv2.imread(img_file_list[i], cv2.IMREAD_COLOR)  # 원본 이미지
    dst_img = cv2.cvtColor(src_img, cv2.COLOR_BGR2RGB)  # 채널순서 변경된 이미지
    dst_img = cv2.resize(dst_img, dsize=(32,32))  # 학습데이터 크기에 맞게 resize
    dst_img = dst_img / 255.0  # 정규화

    print('%d-th image shape => '% (i+1), src_img.shape, dst_img.shape )

    src_img_list.append(src_img)  # src 이미지 저장
    dst_img_list.append(dst_img)  # dst 이미지 저장
# matplotlib 이용해서 원본 이미지 출력
# 원본 이미지에서 RGB 순서로 변경하지 않으면 색이 이상함
# 원본 이미지를 보존하기 위해서 변경하지 않음

plt.figure(figsize=(8,8))

for i in range(len(src_img_list)):
    plt.subplot(4,4,i+1)
    plt.imshow(src_img_list[i])

plt.tight_layout()
plt.show()

# matplotlib 이용해서 target 이미지 출력
plt.figure(figsize=(8,8))

for i in range(len(dst_img_list)):
    plt.subplot(4,4,i+1)
    plt.imshow(dst_img_list[i])

plt.tight_layout()
plt.show()

# predict() 입력을 위해 4차원으로 shape 확장
test_image_array = np.array(dst_img_list)

print(test_image_array.shape)
(16, 32, 32, 3)
# 이미지 예측을 위한 class name 정의
class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']

pred = cnn.predict(test_image_array)

print(pred.shape)
(16, 10)
for index in range(len(pred)):
    class_index = np.argmax(pred[index])
    print('prediction => ',class_names[class_index], pred[index].max())
# 상위 3개 예측 값
top3 = 3

for index in range(len(pred)):
    sorted_index = pred[index].argsort()  # 오름차순으로 인덱스 정렬
    sorted_index = sorted_index[::-1]     # 내림차순으로 인덱스 정렬

    print('=====================================')
    print(sorted_index)
    
    for j in range(top3):
        pred_val = pred[index, sorted_index[j]]
        class_index = sorted_index[j]
        print('prediction => ',class_names[class_index], pred_val)
import shutil

class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']

for index in range(len(pred)):
    class_index = np.argmax(pred[index])
    print('prediction => ',class_names[class_index], pred[index].max())

    if pred[index].max() >= 0.5: # 확률이 50% 이상

        target_dir = target_root_dir + '/' + class_names[class_index].strip()
        shutil.copy(img_file_list[index], target_dir)
        file_name = img_file_list[index].split('/')[1].strip()
        print('%s is copied into %s' % (file_name, target_dir))

    else: # 확률이 50% 미만
        target_dir = target_root_dir + '/unknown'
        shutil.copy(img_file_list[index], target_dir)
        file_name = img_file_list[index].split('/')[1].strip()
        print('%s is copied into %s' % (file_name, target_dir))
728x90
반응형
LIST