[딥러닝] 수어 동작 인식 모델 만들기 (CNN-LSTM) (2/4)

지현·2022년 4월 27일
0
post-custom-banner

지난 시간에 목표를 여러개 두고 진행을 끝냈었기에 목표들을 지우며 진행해보고자 한다.


😎 머신 러닝 - epoch, batch size, iteration의 의미에 대해 공부하기


😎 해당 모델이 어디에 사용되었는지, dataset은 무엇이었는지 알아보기

  • 참고하던 깃허브 코드에 대해서 조사를 해보았다.
    • Video-Classification-CNN-and-LSTM
      • To classify videos into various classes using keras library with tensorflow as back-end.
        I have taken 5 classes from sports 1M dataset like unicycling, marshal arts, dog agility, jetsprint and clay pigeon shooting. First I have captured the frames per sec from the video and stored the images. I gave the labels to those images and trained them on VGG16 pretrained model.
        I achieved 78% accuracy on frames using CNN model, 73% accuracy on whole videos using CNN model, 81% accuracy on frames using CNN-LSTM architecture, 77% accuracy on videos using CNN-LSTM.
      • tensorflow - keras 라이브러리를 사용하여 비디오를 여러 클래스로 분류한다.
        데이터는 nicycling, marshal arts, dog agility, jetsprint, clay pigeon shooting까지 총 5개 class를 가지고 있는 스포츠 데이터이다.
        먼저 비디오에서 초당 프레임을 캡처하고 이미지를 저장하고 해당 이미지에 label을 지정하고 VGG16으로 학습을 진행했다.
        CNN 모델을 사용하였을 때, frame의 경우 78%, whole videio의 경우 73%의 정확도를 얻었다.
        CNN-LSTM 모델을 사용하였을 때, frame의 경우 81%, whole videio의 경우 77% 정확도를 얻었다.

😎 .npy 파일에 대해서 알아보기
-.npy 파일이란 NumPy 라이브러리가 설치된 Python 소프트웨어 패키지로 만든 NumPy 배열 파일이다. NumPy (NPY) 파일 형식으로 저장된 배열이 포함되어 있다.

  • 진행 중인 코드에서는 Input(이미지) -> CNN(VGG-16) -> Result(.npy), Input(.npy) -> LSTM 의 순서로 진행되기 때문에 .npy 파일이 필요했던 것이다.

😎 전체적인 코드에 대해서 공부하기 (자세하게 의미를 알기 보다는 한 셀이 의미하는 것이 무엇인지 생각해보기) Colab

def bring_data_from_directory():
  datagen = ImageDataGenerator(rescale=1. / 255)
  train_generator = datagen.flow_from_directory(
          train_dir,
          target_size=(224, 224),
          batch_size=batch_size,
          class_mode='categorical',  # this means our generator will only yield batches of data, no labels
          shuffle=True,
          # classes=['class_1','class_2','class_3','class_4','class_5'])
          classes=['class_1','class_2','class_3'])

  validation_generator = datagen.flow_from_directory(
          valid_dir,
          target_size=(224, 224),
          batch_size=batch_size,
          class_mode='categorical',  # this means our generator will only yield batches of data, no labels
          shuffle=True,
          # classes=['class_1','class_2','class_3','class_4','class_5'])
          classes=['class_1','class_2','class_3'])
  return train_generator,validation_generator

-> 이미지를 가져와서 제너레이터 객체로 정의하는 코드
우선 class_1, class_2, class_3으로 라벨링 하였다.

def extract_features_and_store(train_generator,validation_generator,base_model):
  # 주석 처리됐던 부분 start
  x_generator = None
  y_lable = None
  batch = 0
  for x,y in train_generator:
      if batch == (56021/batch_size):
          break
      print "predict on batch:",batch
      batch+=1
      if x_generator==None:
         x_generator = base_model.predict_on_batch(x)
         y_lable = y
         print y
      else:
         x_generator = np.append(x_generator,base_model.predict_on_batch(x),axis=0)
         y_lable = np.append(y_lable,y,axis=0)
  x_generator,y_lable = shuffle(x_generator,y_lable)
  np.save(open('video_x_VGG16.npy', 'w'),x_generator)
  np.save(open('video_y_VGG16.npy','w'),y_lable)
  batch = 0
  x_generator = None
  y_lable = None
  for x,y in validation_generator:
      if batch == (3974/batch_size):
          break
      print "predict on batch validate:",batch
      batch+=1
      if x_generator==None:
         x_generator = base_model.predict_on_batch(x)
         y_lable = y
      else:
         x_generator = np.append(x_generator,base_model.predict_on_batch(x),axis=0)
         y_lable = np.append(y_lable,y,axis=0)
  x_generator,y_lable = shuffle(x_generator,y_lable)
  np.save(open('video_x_validate_VGG16.npy', 'w'),x_generator)
  np.save(open('video_y_validate_VGG16.npy','w'),y_lable)
  # end

  train_data = np.load(open('video_x_VGG16.npy'))
  train_labels = np.load(open('video_y_VGG16.npy'))
  train_data,train_labels = shuffle(train_data,train_labels)
  validation_data = np.load(open('video_x_validate_VGG16.npy'))
  validation_labels = np.load(open('video_y_validate_VGG16.npy'))
  validation_data,validation_labels = shuffle(validation_data,validation_labels)

  train_data = train_data.reshape(train_data.shape[0],
                     train_data.shape[1] * train_data.shape[2],
                     train_data.shape[3])
  validation_data = validation_data.reshape(validation_data.shape[0],
                     validation_data.shape[1] * validation_data.shape[2],
                     validation_data.shape[3])
  
  return train_data,train_labels,validation_data,validation_labels

-> 지난번 진행과 달라진 코드, 참고하던 깃허브에 주석처리된 코드를 지우고 진행했었는데 video_x_VGG16.npy 파일이 없다는 오류를 경험했었다.
주석처리된 코드가 video_x_VGG16.npy를 생성하는 코드라는 것을 깨닫고 다시 추가하여 진행 중인 상황이다.

profile
화이팅!
post-custom-banner

0개의 댓글