본문 바로가기
Python/openCV

운동자세 판별 딥러닝 프로젝트 (OpenCV, Numpy, Pandas, TensorFlow)

by code2772 2024. 8. 31.

[ 목차 ]

    728x90
    반응형

    프로젝트 상세 분석 및 설명

     

     

    1. 데이터 준비 및 전처리

    코드 블록:

    
    root_dir = 'dataset/train'
    img_path_list = []
    possible_img_extension = ['.jpg', '.jpeg', '.JPG', '.bmp', '.png']
    
    for (root, dirs, files) in os.walk(root_dir):
        if len(files) > 0:
            for file_name in files:
                if os.path.splitext(file_name)[1] in possible_img_extension:
                    img_path = root + '/' + file_name
                    img_path = img_path.replace('\\\\', '/')
                    img_path_list.append(img_path)

    사용 기술 설명:

    1. 데이터 수집:
      • os.walk()를 사용하여 지정된 디렉토리 내의 모든 이미지 파일을 재귀적으로 탐색합니다.
      • 이는 대량의 데이터를 효율적으로 수집하는 방법으로, 딥러닝 모델의 성능 향상에 중요합니다.
    2. 파일 필터링:
      • 특정 확장자를 가진 파일만 선택하여 데이터의 일관성을 유지합니다.
      • 이는 데이터 품질 관리의 첫 단계로, 모델 학습의 안정성을 높입니다.

     

    2. 이미지 전처리 및 특징 추출

    코드 블록:

    
    inpBlob = cv2.dnn.blobFromImage(image, 1.0 / 255, (imageWidth, imageHeight), (0, 0, 0), swapRB=False, crop=False)
    net.setInput(inpBlob)
    output = net.forward()

    사용 기술 설명:

    1. 이미지 정규화:
      • cv2.dnn.blobFromImage를 사용하여 이미지를 [0, 1] 범위로 정규화합니다.
      • 정규화는 모델의 수렴 속도를 높이고 안정적인 학습을 가능하게 합니다.
    2. 사전 훈련된 모델 사용:
      • net.forward()를 통해 사전 훈련된 포즈 추정 모델을 사용합니다.
      • 이는 전이 학습의 한 형태로, 복잡한 특징을 효과적으로 추출할 수 있게 합니다.

     

    3. 포즈 추정 및 시각화

    코드 블록:

    
    points = []
    for i in range(0, 15):
        probMap = output[0, i, :, :]
        minVal, prob, minLoc, point = cv2.minMaxLoc(probMap)
        x = (imageWidth * point[0]) / W
        y = (imageHeight * point[1]) / H
    
        if prob > 0.1:
            cv2.circle(image, (int(x), int(y)), 3, (0, 255, 255), thickness=-1, lineType=cv2.FILLED)
            points.append((int(x), int(y)))
        else:
            points.append(None)

    사용 기술 설명:

    1. 키포인트 검출:
      • 확률 맵에서 최대값을 찾아 키포인트를 검출합니다.
      • 이는 이미지에서 중요한 특징(인체 관절 위치)을 추출하는 과정입니다.
    2. 임계값 기반 필터링:
      • 확률이 0.1보다 큰 키포인트만 선택하여 노이즈를 줄입니다.
      • 이는 모델의 robustness를 높이는 기법입니다.
    3. 데이터 증강:
      • 검출된 키포인트를 이미지에 시각화하는 것은 일종의 데이터 증강으로 볼 수 있습니다.
      • 이는 모델이 포즈 정보에 더 집중할 수 있게 해주는 기법입니다.

     

    4. 모델 아키텍처 설계

    코드 블록:

    
    inputs = tf.keras.Input(shape=input_shape)
    x = tf.keras.layers.Lambda(preprocess_input)(inputs)
    resnet_model = ResNet50(weights='imagenet', include_top=False, input_shape=input_shape, input_tensor=x)
    
    for layer in resnet_model.layers:
        layer.trainable = False
    
    x = tf.keras.layers.GlobalAveragePooling2D()(resnet_model.output)
    x = tf.keras.layers.Dense(256, activation='relu')(x)
    x = tf.keras.layers.Dropout(0.5)(x)
    predictions = tf.keras.layers.Dense(3, activation='softmax')(x)
    
    model = tf.keras.models.Model(inputs=inputs, outputs=predictions)

    사용 기술 설명:

    1. 전이 학습:
      • ImageNet에서 사전 훈련된 ResNet50 모델을 기반으로 합니다.
      • 이는 적은 양의 데이터로도 높은 성능을 달성할 수 있게 해주는 강력한 기법입니다.
    2. 특징 추출기 동결:
      • ResNet50의 레이어들을 동결(trainable=False)하여 특징 추출기로 사용합니다.
      • 이는 과적합을 방지하고 학습 속도를 높이는 기법입니다.
    3. Global Average Pooling:
      • 특징 맵의 공간 정보를 압축하여 파라미터 수를 대폭 줄입니다.
      • 이는 모델의 일반화 능력을 높이고 과적합을 방지하는 기법입니다.
    4. Dropout:
      • 학습 중 무작위로 뉴런을 비활성화하여 과적합을 방지합니다.
      • 이는 앙상블 효과를 내는 정규화 기법입니다.
    5. Softmax 활성화:
      • 다중 클래스 분류를 위한 출력 층으로 사용됩니다.
      • 각 클래스에 대한 확률 분포를 생성합니다.

     

    5. 모델 컴파일 및 학습

    코드 블록:

    
    optimizer = tf.keras.optimizers.Adam(learning_rate=0.001)
    model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])
    
    checkpoint_path = "models/best_resnet.h5"
    model_checkpoint = ModelCheckpoint(checkpoint_path, save_best_only=True, monitor='val_accuracy', mode='max', verbose=1)
    early_stopping = EarlyStopping(monitor='val_accuracy', patience=5)
    
    history = model.fit(train_ds, validation_data=val_ds, epochs=5, callbacks=[model_checkpoint, early_stopping])

    사용 기술 설명:

    1. Adam 옵티마이저:
      • 적응적 학습률을 사용하여 효율적인 최적화를 수행합니다.
      • 이는 빠른 수렴과 안정적인 학습을 가능하게 합니다.
    2. Categorical Crossentropy 손실 함수:
      • 다중 클래스 분류 문제에 적합한 손실 함수입니다.
      • 모델의 예측과 실제 레이블 간의 차이를 효과적으로 측정합니다.
    3. ModelCheckpoint:
      • 검증 정확도가 가장 높은 모델을 저장합니다.
      • 이는 최적의 모델을 선택하는 기법입니다.
    4. EarlyStopping:
      • 검증 정확도가 개선되지 않으면 학습을 조기에 중단합니다.
      • 이는 과적합을 방지하고 컴퓨팅 리소스를 절약하는 기법입니다.

    이러한 기술들은 현대 딥러닝에서 널리 사용되는 best practices로, 효율적인 학습과 높은 성능의 모델 개발을 가능하게 합니다.

    반응형