ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자세 추정(Pose Estimation) MLP 모델 개발 - 2
    전공 공부/AI 2020. 1. 20. 18:12
    728x90

     

    지난 글에서 데이터 셋을 구성하는 것을 다루었다.

    이번 글에서는 데이터 전처리 과정을 거치고, 간단한 딥러닝 모델을 구현해본다.

     

    간단한 모델을 구현할 예정이므로, Google Colab을 이용하였다.

    먼저, 구성한 데이터 셋(csv파일)을 이용하기 위해, Colab에 Google Drive를 연결하였다.

    from google.colab import auth
    auth.authenticate_user()
    
    from google.colab import drive
    drive.mount('/content/gdrive')

     

    이후, 데이터 전처리 과정을 거쳤다.

    # 4개의 파일을 사용
    data_stand_jiyun = np.loadtxt(fileUrl + '/stand/data_stand_jiyun.csv', unpack = True, delimiter=',', skiprows = 1, dtype=np.int64)
    data_stand_hongchan = np.loadtxt(fileUrl + '/stand/data_stand_hongchan.csv', unpack = True, delimiter=',', skiprows = 1, dtype=np.int64)
    data_sit_jiyun = np.loadtxt(fileUrl + '/sit/data_sit_jiyun.csv', unpack = True, delimiter=',', skiprows = 1, dtype=np.int64)
    data_sit_hongchan = np.loadtxt(fileUrl + '/sit/data_sit_hongchan.csv', unpack = True, delimiter=',', skiprows = 1, dtype=np.int64)
    
    # 두 명의 서 있는 자세와 앉아 있는 자세 병합
    data_stand = np.concatenate((data_stand_jiyun, data_stand_hongchan), axis = 1).transpose()
    data_sit = np.concatenate((data_sit_jiyun, data_sit_hongchan), axis = 1).transpose()
    
    # 분류를 위한 라벨 구성 (0 - 서 있는 자세, 1 - 앉아 있는 자세)
    label_stand = []
    label_sit = []
    for i in range(len(data_stand)):
      label_stand.append(0)
    for i in range(len(data_sit)):
      label_sit.append(1)
    
    # 앉아 있는 자세와 서 있는 자세에 대한 데이터를 합쳐서 데이터 전처리 마무리
    data = np.concatenate((data_stand, data_sit), axis = 0)
    label = np.array(label_stand + label_sit)

     

    728x90

     

    사이킷런의 train_test_split 함수를 사용하여, 학습 데이터와, 테스트 데이터로 분리 (간단한 모델 구현이라 검증 데이터는 분리 x)

    from sklearn.model_selection import train_test_split
    
    X_train, X_test, y_train, y_test = train_test_split(data, label, test_size = 0.2, random_state = 121)
    
    print(X_train.shape)
    print(y_train.shape)

     

    분류가 잘 되는지 테스트가 목적이므로, 아주 간단한 모델을 구현하였다.

    각각, 10개의 노드로 구성된 input layer, hidden layer, output layer 구현

     

    # first Model 2020/1/20
    
    model = keras.Sequential([
        keras.layers.Dense(10, input_shape = (26,), activation='relu'), # 26개의 관절 좌표
        keras.layers.Dense(10, activation='relu'),
        keras.layers.Dense(10, activation='softmax')
    ])
    
    model.compile(optimizer='adam',
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])
    
    model.summary()

     

    학습 데이터로 모델을 학습시키고, 테스트 데이터로 검증하였다.

    model.fit(X_train, y_train, batch_size = 50, epochs = 50, verbose = 1) # train

    98%로 높은 정확도로 분류

     

    매우 간단한 모델임에도 불구하고  98% 정확도로 앉은 자세, 서 있는 자세를 분류를 하게 된다.

    (hidden layer의 노드를 64개로 조금만 늘려도 100% 정확도로 분류를 하게 된다)

     

     

     

    앞으로 다음과 같은 사항을 개선 및 테스트하고 포스트 할 예정이다.

    1. 현재는 모델이 1차원으로 26개의 입력을 받는다. 그러나 좌표는 x축, y축으로 구성되어 있으므로, (13, 2) 모양의 2차원으로 입력을 받도록 데이터를 다시 전처리하고, 모델을 수정 -> 수정 완료
    2. 비슷한 자세(스쿼트 앉은 자세, 그냥 구부린 자세)를 잘 분류할 수 있는지 테스트 -> 테스트 결과 잘 분류 함

     

    본 연구는 과학기술정보통신부 및 정보통신기술진흥센터의 SW중심대학지원사업의 연구결과로 수행되었음
    728x90

    '전공 공부 > AI' 카테고리의 다른 글

    자세 추정(Pose Estimation) MLP 모델 개발 - 1  (1) 2020.01.20

    댓글

Designed by Tistory.