본문 바로가기
Programming 개발은 구글로/기타 정보

[WEB+AI] 17일차 티처블 머신 활용 + 머신러닝

by 40대직장인 2024. 11. 5.

티처블 머신을 활용한 AI 웹페이지 만들기

 

강사: 이주화님

 

1. 티처블 머신

  홈페이지: https://teachablemachine.withgoogle.com

 

  - 티처블 머신은 구글에서 제공하는 머신러닝 학습 도구

  - 누구나 머신러닝 모델을 쉽고 빠르게 만들 수 있도록 제작된 웹 기반 도구

  - 티처블 머신을 사용해 이미지, 사운드, 포즈를 학습할 수 있음.

 

 1.1. 이미지 크롤링

  - bing-image-downloader 라이브러리 설치

!pip install bing-image-downloader

 

 

 1.2. 이미지 가져오기

from bing_image_downloader import downloader
# bing_image_downloader 모듈의 downloader.download 함수를 사용하여 Bing 이미지 검색 결과를 다운로드

def download_images(keyword, limit):
    downloader.download(keyword, limit=limit, output_dir='images', adult_filter_off=True, force_replace=False)
    
# keyword 매개변수: 검색어
# limit 매개변수: 다운로드할 이미지 개수
# output_dir 매개변수: 이미지를 저장할 디렉토리를 지정
# adult_filter_off 매개변수: True로 설정하면, 성인 콘텐츠가 필터링되지 않음. (필터링을 적용하려면 False로 설정)
# force_replace 매개변수: True로 설정하면, 동일한 이름의 이미지 파일이 이미 존재하는 경우에도 강제로 덮어씀.

keyword = input("이미지 검색어를 입력하세요: ")
limit = int(input("다운로드할 이미지 개수를 입력하세요: "))

download_images(keyword, limit)

 

  - 실행 결과

 

 이미지 검색어를 입력하세요: 삼성라이온즈 강민호

 다운로드할 이미지 개수를 입력하세요: 2

 

 

 

 1.3. 이미지 압축

import shutil
# shutil: 파일 및 폴더를 복사, 이동, 삭제, 압축하는 기능 포함된 모듈

def compress_folder(folder_path, output_path):
    shutil.make_archive(output_path, 'zip', folder_path)

# 이미지 저장 폴더 압축
folder_path = "images"
output_path = "images"

compress_folder(folder_path, output_path)

# folder_path 압축하려는 폴더의 경로
# output_path: 압축 파일을 저장할 경로 및 파일 이름

 

 

  1.4. 티처블 머신 실행

  • 각각의 클래스에 이미지를 업로드 한 후 학습을 시킴.
  • Webcam을 실행하면 유사한 이미지의 확률을 보여줌.

 

  1.5. Tensorfolw - Keras로 모델 내보내기

 

※ Colab에서 사용할 수 있게 tensorflow 버전 다운그레이드

!pip install tensorflow==2.12.0

 

  - 버전 확인

import tensorflow as tf
print(tf.__version__)

 

 

  - keras 코드를 Colab에 복사 후 경로 설정 및 파일 업로드 후 실행

 

from keras.models import load_model  # TensorFlow is required for Keras to work
from PIL import Image, ImageOps  # Install pillow instead of PIL
import numpy as np

# Disable scientific notation for clarity
np.set_printoptions(suppress=True)

# Load the model
model = load_model("/content/sample_data/keras_model.h5", compile=False)

# Load the labels
class_names = open("/content/sample_data/labels.txt", "r").readlines()

# Create the array of the right shape to feed into the keras model
# The 'length' or number of images you can put into the array is
# determined by the first position in the shape tuple, in this case 1
data = np.ndarray(shape=(1, 224, 224, 3), dtype=np.float32)

# Replace this with the path to your image
image = Image.open("/content/sample_data/Image_5.jpg").convert("RGB")

# resizing the image to be at least 224x224 and then cropping from the center
size = (224, 224)
image = ImageOps.fit(image, size, Image.Resampling.LANCZOS)

# turn the image into a numpy array
image_array = np.asarray(image)

# Normalize the image
normalized_image_array = (image_array.astype(np.float32) / 127.5) - 1

# Load the image into the array
data[0] = normalized_image_array

# Predicts the model
prediction = model.predict(data)
index = np.argmax(prediction)
class_name = class_names[index]
confidence_score = prediction[0][index]

# Print prediction and confidence score
print("Class:", class_name[2:], end="")
print("Confidence Score:", confidence_score)

 

  - 실행 결과

 


 

 

 1.6. Tensorflow.js - tm-my-image-model.zip 파일 다운로드

 

  - Vscode Open 후 Javascript 복사 코드 추가

  •  <body></body> 사이에 복사한 코드 추가

 

  • 다운로드 받은 tm-my-image-model에 있는 3개의 파일을 my_model 폴더를 생성 후 업로드함.

 

 

 

  • 오른쪽 마우스 눌러서 Open with Live Server 실행

 

  • 실행화면


 

 

 1.7. 비교 예측한 결과로 웹페이지 이동(1.6. 코드 수정)

  • awit 키워드를 사용하여 predict 비동기 함수를 정의함.
  • model.predict() 메서드를 호출하여 머신러닝 모델이 webcam.canvas에서 가져온 이미지 데이터를 바탕으로 예측을 수행함
  • awit 키워드를 사용하여 예측이 완료 될 때까지 기다린 후 결과를 prdiction 변수에 저장함.
  • prediction[0].probability가 0.60보다 큰 경우 True가 됨.
  • toFixed(2): 확률값을 소수점 둘째 자리까지 반올림함.

 

  - html 생성

 

  - 실행 결과

  

  - 구자욱 선수를 닮지는 않았지만, 표본이 적다보니... ^^

 


 

 1.8. Gradio를 이용하여 이미지 유사도 확인하기

import gradio as gr
import numpy as np
from PIL import Image, ImageOps  # 추가된 부분

# 분류할 클래스 리스트
classes = ['강민호', '구자욱', '이재현']

def predict_image(img):
    data = np.ndarray(shape=(1, 224, 224, 3), dtype=np.float32)
    
    # 이미지 변환 및 전처리
    image = Image.fromarray(img).convert("RGB")  # 수정된 부분
    size = (224, 224)
    image = ImageOps.fit(image, size, Image.Resampling.LANCZOS)
    image_array = np.asarray(image)
    
    # 이미지 정규화
    normalized_image_array = (image_array.astype(np.float32) / 127.5) - 1
    data[0] = normalized_image_array    

    # 모델 예측
    prediction = model.predict(data)
    max_index = np.argmax(prediction)  # 확률이 가장 높은 인덱스
    return classes[max_index]

# Gradio 앱 인터페이스 설정
app = gr.Interface(fn=predict_image, inputs="image", outputs="text")
app.launch(share=True, debug=True)

 

 

  • data 배열: (1, 224, 224, 3) 크기의 배열을 만들고 데이터 타입을 float32로 설정합니다.
    • 이 배열은 모델에 입력될 이미지를 저장합니다.
    • (1, 224, 224, 3)는 배치 크기 1, 너비와 높이 각각 224 픽셀, 3은 RGB 채널을 나타냅니다.
  • Image.fromarray(img).convert("RGB"):
    • Gradio에서 제공하는 이미지는 *NumPy 배열 형식으로 입력됩니다. 따라서 Image.fromarray(img)로 배열을 이미지 객체로 변환합니다.
    • .convert("RGB")를 통해 이미지를 RGB 형식으로 변환하여 일관된 색상 공간을 유지합니다.
  • ImageOps.fit(image, size, Image.Resampling.LANCZOS):
    • 이미지를 (224, 224) 크기로 조정합니다. Image. Resampling.LANCZOS는 고해상도 이미지를 낮은 해상도로 변환할 때 주로 사용되는 *보간 방법으로, 이미지 품질을 최대로 유지합니다.
  • np.asarray(image):
    • 크기 조정된 이미지를 NumPy 배열 형식으로 변환하여 후속 처리와 모델 입력에 사용할 수 있게 합니다.

 

 

* NumPy 배열 형식

  : Python의 NumPy 라이브러리가 제공하는 다차원 배열 (multi-dimensional array) 형식으로 행렬 또는 텐서 형태로 데이터를 저장됨. 

# NumPy 배열 예제

# 1차원 배열 (벡터)
array_1d = np.array([1, 2, 3, 4])
print(array_1d)  # 출력: [1 2 3 4]

# 2차원 배열 (행렬)
array_2d = np.array([[1, 2, 3], [4, 5, 6]])
print(array_2d)
# 출력:
# [[1 2 3]
#  [4 5 6]]

 

* 보간 방법

  : 보간은 두 개의 데이터 지점 사이에 값을 예측하여 새로운 데이터 지점을 만들어 내는 작업을 의미함.

    특히 이미지 보간은 이미지의 크기를 변경할 때 발생하는 빈 픽셀 값을 예측하여 채우는 과정임.


 

정규화: image_array.astype(np.float32) / 127.5) - 1는 이미지 픽셀 값을 -1에서 1 사이로 정규화합니다.

  • 일반적으로 머신러닝 모델은 정규화된 값을 사용해 학습됩니다.
  • 정규화된 이미지를 data[0]에 저장하여 모델의 입력 형태로 만듭니다.

 

  - 실행 결과

 

 


 

2. 머신러닝

 2.1. 개요

  - 데이터로부터 결과를 찾는 것이 아닌 주어진 데이터로부터 규칙성을 찾는 것이 목표로 기계가 규칙성을 찾도록 학습하는 것

 

Y = w * X + b
X 가 주어졌을 때, Y를 만족하는 w와 b를 찾아내는 것
  • X : 입력 값 (Feature)
  • Y : 출력 값 (Label)
  • w : 가중치 (Weight)
  • b : 편향 (Bias)

 2.2. 머신러닝 단계

  - 문제 정의

  : 해결해야 할 문제 분석

  - 데이터 수집

  : 머신러닝에 활용할 학습 데이터 수집

  - 데이터 전처리

  : 데이터 형식 변형 및 비어 있는 값 채우기, 연관 데이터 추가, 삭제

  - 알고리즘 / 모델 선택

  : 문제 해결을 위해 알고리즘 / 모델 선택

  - 학습 

  : 선택한 알고리즘 / 모델에 학습 데이터 입력하여 학습

  - 평가

  : 새로운 데이터에 대한 예측, 머신러닝 모델의 성능 평가

 

   2.2.1. 머신러닝의 유형

 

    - 회귀(Regrssion)

  • 학습 데이터에 부합하는 출력 값을 찾아주는 함수를 찾아내는 방법 (e.g., 사람의 몸무게를 기반으로 키 예측)

   

    - 분류(Classification)

  • 정해진 카테고리 내에서 입력된 값이 어느 카테고리에 속하는지 찾아내는 방법 (e.g., 개, 고양이 분류)

   

    - 군집화(Clustering)

  • 유사성이 높은 데이터들을 동일한 그룹으로 분류하고 서로 다른 군집들이 상이성을 가지도록 그룹화하는 방법 (e.g., 소비 수준에 따른 고객군 군집화)

   

    - 이상값 감지(Anomaly Detection)

  • 매우 적은 비율로 발생하는 비정상적인 데이터를 검출하는 방법 (e.g., 금융 사기 감지)

 

     - 강화(Reinforcement)

  • 에이전트가 현 상태에서 선택 가능한 다양한 행동 중 보상을 최대화하는 방향으로 선택하는 방법 (e.g., 알파고)

 

   2.2.2. 머신러닝의 종류

 

    - 지도학습 (Supervised learning)

  • 정답이 있는 데이터를 활용해 데이터를 학습하는 방법
  • 입력 값(X data, Feature)과 입력값에 대한 결과 값(Y data, Lable)이 주어진 상태로 학습

    - 비지도학습 (Unsupervised learning)

  • 정답이 없는 데이터를 학습하여 결과 값을 예측하는 방법
  • 입력 값(X data, Feature)은 주어지지만 입력값에 대한 결과 값(Y data, Lable)은 주어지지 않은 상태로 학습

    - 강화학습 (Reinforcement Learning)

  • 결과 값(Y data, Lable)이 주어지지 않은 상태로 경험에 기반하여 시행착오와 보상을 통해 학습

 


출처: AI Hub 교육과정 - WEB+AI (위 내용이 문제가 된다면 댓글에 남겨주세요. 바로 삭제조치하도록 하겠습니다.)

 

 

 

댓글