본문 바로가기
인공지능 기초

티처블머신 OpenCV Keras 오픈소스 업그레이드(화면 확장)

by SwMaker_Jun 2024. 10. 24.
728x90
반응형

1. Teachable Machine 오픈소스

    - 티처블머신에서 만든 모델을 사이트에서 제공하는 오픈소스 tensorflow opencv keras 에서

      웹캠 화면 사이즈가 (224,224) 로 제공되는 것을 

 

      (640,480)로 업그레이드 하여 활용해 보도록 하자.

 

 

https://swmakerjun.tistory.com/46

 

티처블머신(Teachable Machine) 모델 파이썬 openCV로 불러오기

1. 아나콘다 가상환경에 티처블머신 모델 옴기기 - 아나콘다에서 설정한 가상환경 폴더로 이동하여 새폴더 만들기 - 전내용에서 티처블머신으로 만든 가위, 바위, 보 모델 파일을 압축을 풀어 가

swmakerjun.tistory.com

   ※ 티처블 머신 오픈소스 활용 예시 블로그

 

 

2. 파이썬 코드

from keras.models import load_model  # TensorFlow is required for Keras to work
import cv2  # Install opencv-python
import numpy as np

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

# Load the model
model = load_model("keras_Model.h5", compile=False)

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

# CAMERA can be 0 or 1 based on default camera of your computer
camera = cv2.VideoCapture(0)

# Set a larger window size for webcam display (e.g., 640x480)
camera.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
camera.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

while True:
    # Grab the webcamera's image.
    ret, image = camera.read()

    # Check if the frame was successfully captured
    if not ret:
        print("Failed to grab frame")
        break

    # Resize the raw image into (224-height, 224-width) pixels for model input
    input_image = cv2.resize(image, (224, 224), interpolation=cv2.INTER_AREA)

    # Show the original image in a larger window
    cv2.imshow("Webcam Image", image)

    # Make the image a numpy array and reshape it to the model's input shape
    input_image = np.asarray(input_image, dtype=np.float32).reshape(1, 224, 224, 3)

    # Normalize the image array for model input
    input_image = (input_image / 127.5) - 1

    # Predict with the model
    prediction = model.predict(input_image)
    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:", str(np.round(confidence_score * 100))[:-2], "%")

    # Listen to the keyboard for presses.
    keyboard_input = cv2.waitKey(1)

    # 27 is the ASCII for the esc key on your keyboard.
    if keyboard_input == 27:
        break

camera.release()
cv2.destroyAllWindows()

 

 

3.  코드 설명

    기존 오픈소스와 공통점:

  1. 모델 로딩: 두 코드 모두 keras_Model.h5 파일을 로드하여 학습된 Keras 모델을 사용합니다.
  2. 이미지 전처리: 이미지 입력을 224x224 픽셀로 리사이즈하고, 이를 모델에 맞는 입력 포맷으로 변환합니다.
  3. 예측 출력: 모델의 예측 결과를 출력하고, 가장 높은 확률을 가진 클래스와 해당 클래스의 신뢰도(확률)를 출력합니다.
  4. 웹캠 사용: 두 코드 모두 웹캠을 통해 이미지를 실시간으로 캡처하여 모델에 전달하는 흐름을 따릅니다.

 

  기존 오픈소스와 차이점:

  1. 웹캠 창 크기:
    • 티처블 머신 코드: 기본적으로 224x224 픽셀 크기로 이미지를 처리하고 웹캠 화면을 작은 크기로 출력합니다. 모델에 입력하기 위해 사용되는 이미지 크기가 곧 웹캠에 출력되는 크기입니다.
    • 수정된 코드: 웹캠 창 크기를 640x480으로 크게 설정하여 더 큰 화면에서 실시간 웹캠을 볼 수 있도록 하였습니다. 대신 모델 입력 이미지만 224x224로 리사이즈하여 처리합니다.
  2. 오류 처리:
    • 티처블 머신 코드: 일반적으로 카메라에서 이미지를 제대로 불러오지 못했을 때에 대한 처리 부분이 없거나 간단하게 넘어갑니다.
    • 수정된 코드: ret 변수를 통해 카메라에서 프레임을 성공적으로 읽어왔는지 확인하고, 실패 시 오류 메시지를 출력하고 루프를 종료하는 안전장치가 추가되었습니다.
  3. 키보드 입력 처리:
    • 티처블 머신 코드: 웹캠 창을 종료하려면 키보드 입력을 감지하여 ESC 키를 누르면 루프가 종료되도록 하였습니다.
    • 수정된 코드: 이 부분은 동일하게 유지되어 있지만, 에러 처리를 통해 코드의 안정성을 강화했습니다.
  4. 출력 형식:
    • 티처블 머신 코드: 클래스 예측 결과와 신뢰도를 출력하는 방식이 간단하게 구성되어 있습니다.
    • 수정된 코드: 출력 형식에 약간의 개선이 있어, 신뢰도를 소수점 두 자리가 아닌 정수형으로 출력하는 부분이 추가되었습니다.

 

 

4.  웹캠 사이즈 비교

티처블머신 오픈소스 제공 웹캠 사이즈

 

변경된 코드로 적용된 웹캠 사이즈

 

 

 

 

5.  실습 : 더 큰 사이즈로 수정하여 실행해 보자 !

무엇을 수정하면 가능할까 ?

 

 

 

6.  putText 함수 활용하기 !

if confidence_score > 0.7:
        text = f"Class: {class_name[2:]} - Confidence: {int(confidence_score * 100)}%"
        cv2.putText(image, text, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2, cv2.LINE_AA)
728x90
반응형