Lesson Progress
0% Complete

코드 수정

이 활동에서는 Tobi가 ML 모델을 기반으로 사람에게 마스크를 착용하도록 지시하는 코드를 추가합니다.

다음 단계를 따르십시오.

  1. 마스크 감지를 위해 훈련된 모델을 내보낸 PictoBlox 파일을 여십시오.
  2. 해당 코드 내에서 코드를 추가하라는 요청을 받는 섹션이 표시됩니다. 아래와 같이 표시됩니다.
      ###############################################
      #Add your code here
    
      #Add your code here
      ###############################################
  3. 이 공간 내에서 프로그램 시작 부분에 스프라이트 클래스 선언을 추가합니다.
    sprite = Sprite("Tobi")
  4. 예측 중인 클래스의 결과는 predicted_class 변수에 저장됩니다.
  5. if-elif-else 조건문을 사용하여 predicted_class 변수에 어떤 클래스가 저장되었는지 확인합니다: Mask On, Mask Off 및 Mask Wrong. 등호 연산자( == )를 사용하여 이를 확인합니다.
  6. 또한 감지된 클래스(predicted_class의 값)를 기반으로 스프라이트가 다음 문장을 말하도록 할 것입니다. Sprite 클래스의 say() 함수를 사용하여 이 작업을 수행합니다.
    1. Mask On – 마스크를 착용해주셔서 감사합니다
    2. Mask Off – 마스크를 착용해주세요
    3. Mask Wrong – 마스크를 제대로 착용해주세요
      if predicted_class == "Mask On": 
        sprite.say("Thank you for wearing the mask") 
      elif predicted_class == "Mask Off": 
        sprite.say("Please wear a mask") 
      else: 
        sprite.say("Please wear the mask properly")
  7. 최종 코드가 준비되었습니다. 아래와 같이 표시되어야 합니다.
####################imports####################
#do not change

import cv2
import numpy as np
import tensorflow as tf
sprite = Sprite("Tobi")

#do not change
####################imports####################

#Following are the model and video capture configurations
#do not change

model = tf.keras.models.load_model('saved_model.h5',
                                   custom_objects=None,
                                   compile=True,
                                   options=None)

cap = cv2.VideoCapture(0)  # Using device's camera to capture video
text_color = (206, 235, 135)
org = (50, 50)
font = cv2.FONT_HERSHEY_SIMPLEX
fontScale = 0.8
thickness = 2

class_list = ['Mask Off', 'Mask On', 'Mask Wrong']  # List of all the classes

#do not change
###############################################

#This is the while loop block, computations happen here

while True:
  ret, image_np = cap.read()  # Reading the captured images
  image_np = cv2.flip(image_np, 1)
  image_resized = cv2.resize(image_np, (224, 224))
  img_array = tf.expand_dims(image_resized,
                             0)  # Expanding the image array dimensions
  predict = model.predict(img_array)  # Making an initial model prediction
  predict_index = np.argmax(predict[0],
                            axis=0)  # Generating index out of the prediction
  predicted_class = class_list[
      predict_index]  # Tallying the index with class list

  image_np = cv2.putText(
      image_np, "Image Classification Output: " + str(predicted_class), org,
      font, fontScale, text_color, thickness, cv2.LINE_AA)

  cv2.imshow("Image Classification Window",
             image_np)  # Displaying the classification window

  ###############################################
  #Add your code here
  
  if predicted_class == "Mask On":
    sprite.say("Thank you for wearing the mask")
  elif predicted_class == "Mask Off":
    sprite.say("Please wear a mask")
  else:
    sprite.say("Please wear the mask properly")
  
  #Add your code here
  ###############################################

  if cv2.waitKey(25) & 0xFF == ord(
      'q'):  # Press 'q' to close the classification window
    break

cap.release()  # Stops taking video input
cv2.destroyAllWindows()  #Closes input window

Run 버튼을 눌러 코드를 테스트합니다.

참고: 코드에 오류가 표시되면 코드를 편집하여 비디오 카메라를 변경해 보십시오.

cap = cv2.VideoCapture(0)

VideoCapture 함수에서 값 1, 2 또는 3을 매개변수로 추가해 보십시오.

폴더에서 이미지를 테스트하는 코드

때로는 이미지 파일을 분석하고 싶을 수 있으며 그에 따라 코드를 편집해야 합니다. 이 예에서는 다음 3개 파일을 분석합니다.

  1. 이미지 1: 다운로드
  2. 이미지 2: 다운로드
  3. 이미지 3: 다운로드

다음 단계를 따르십시오.

  1. 위의 파일을 다운로드합니다.
  2. 이미지 업로드 옵션을 사용하여 PictoBlox의 모든 파일을 로드합니다. 가져온 후 프로젝트 파일 에 다음 파일 구조가 표시됩니다.
  3. OpenCV의 imread() 함수를 이용하여 이미지를 1 by 1 읽어오도록 코드를 수정합니다. 분석을 실행하고 imwrite() 함수를 사용하여 저장합니다. 이 두 함수에 대한 코드는 아래에 강조 표시되어 있습니다.

다음은 코드입니다.

####################imports####################
#do not change

import cv2
import numpy as np
import tensorflow as tf

#do not change
####################imports####################

#Following are the model and video capture configurations
#do not change

model = tf.keras.models.load_model('saved_model.h5',
                                   custom_objects=None,
                                   compile=True,
                                   options=None)
                                   
text_color = (0, 0, 255)
org = (50, 50)
font = cv2.FONT_HERSHEY_SIMPLEX
fontScale = 0.6
thickness = 1

class_list = ['Mask Off', 'Mask On', 'Mask Wrong']  # List of all the classes

#do not change
###############################################

for i in range(3):
  <strong>image_np = cv2.imread("Image " + str(i + 1) + ".jpg", cv2.IMREAD_COLOR)</strong>
  image_resized = cv2.resize(image_np, (224, 224))
  img_array = tf.expand_dims(image_resized,
                             0)  # Expanding the image array dimensions
  predict = model.predict(img_array)  # Making an initial model prediction
  predict_index = np.argmax(predict[0],
                            axis=0)  # Generating index out of the prediction
  predicted_class = class_list[
      predict_index]  # Tallying the index with class list
  
  image_np = cv2.putText(
      image_np, "Image Classification Output: " + str(predicted_class), org,
      font, fontScale, text_color, thickness, cv2.LINE_AA)
  
 <strong> cv2.imwrite("Image " + str(i + 1) + " Analysed.jpg", image_np)
</strong>

코드를 실행하면 3개의 새 이미지가 생성된 것을 확인할 수 있습니다.

  1. 이미지 1 분석됨
  2. 이미지 2 분석됨
  3. 이미지 3 분석됨

모델이 다양한 데이터에 대해 잘 훈련되어 이러한 외부 데이터에 대해 정확할 만큼 충분히 일반화될 수 있는 경우 다음과 같은 결과를 얻을 수 있습니다.

  1. 이미지 1 분석됨
  2. 이미지 2 분석됨
  3. 이미지 3 분석됨

환경의 이미지에 잘못된 레이블이 표시되면 모델이 일반 데이터에 대해 정확하지 않으며 다양한 데이터에 대해 모델을 교육해야 함을 의미합니다. 이를 위해 학습 데이터에 대한 이미지를 캡처할 때 다음 사항에 주의해야 합니다.

  1. 화면에서 위치를 변경했는지 확인하십시오(왼쪽 오른쪽, 위, 아래).
  2. 화면과의 거리 변경(근거리 및 원거리)
  3. 배경/주변을 변경했는지 확인하십시오.
  4. 다른 사람에 대한 데이터 훈련(모델이 다른 얼굴에 대해 훈련되도록)
  5. 모델이 한 가지 유형의 조명에만 국한되지 않도록 다양한 각도에서 다양한 조명(어두운 조명, 밝은 조명, 태양광, 튜브 조명)을 사용해 보십시오.

이 모든 점을 주의하고 다양한 데이터에 대해 모델을 훈련하여 총 많은 양의 이미지(각 클래스에 대해 200-400개 이미지)가 되면 모델이 더욱 강력해지고 더 나은 성능을 제공할 수 있습니다. 다양한 유형의 데이터에 대한 정확성.

이 튜토리얼이 도움이 되었기를 바랍니다.