HyperAI초신경
Back to Headlines

다이나믹 SOLOv2 모델 TensorFlow로 구현 및 이해

11시간 전

컴퓨터 비전을 더욱 이해하기 위한 방법: TensorFlow로 구현된 동적 SOLO (SOLOv2) 이 프로젝트는 컴퓨터 비전 분야에서 특히 인스턴스 분할 작업에 사용되는 Dynamic SOLO (SOLOv2) 모델을 TensorFlow 2 프레임워크를 통해 구현한 내용을 담고 있습니다. SOLO는 앵커를 사용하지 않는 완전히 새로운 접근 방식으로, 바운딩 박스 없이 마스크를 예측합니다. 이 프로젝트는 연구 논문을 실제로 구현해봄으로써 기술적인 이해를 높이는 데 중점을 두고 있습니다. 왜 이 프로젝트를 처음부터 구현했는가? 프로젝트를 처음부터 구현하면 특정 접근법이나 원칙의 이론을 깊이 이해할 수 있습니다. 이를 기존 기술 도구를 활용해 구현하는 과정은 문제 해결 능력을 향상시키며, 시간과 자원의 가치를 더 잘 인식할 수 있게 합니다. 이 프로젝트는 SOLOv2 모델의 TensorFlow 2 구현을 다루고 있으며, 먼저 가장 단순한 Vanilla SOLO를 구현했습니다. 그러나 Vanilla SOLO와 Dynamic SOLO 사이에 큰 차이가 없기 때문에, Vanilla SOLO 코드는 공개하지 않았습니다. 모델 구조 Backbone ResNet50를 백본으로 선택했습니다. 이 네트워크는 경량화되어 있어 초보자에게 적합합니다. COCO 데이터셋을 사용할 계획이라면 사전 학습된 파라미터를 이용하면 좋지만, 이 프로젝트에서는 다양한 데이터셋을 실험해 보았습니다. python backbone = ResNet50(weights='imagenet', include_top=False, input_shape=input_shape) backbone.trainable = False Neck FPN (Feature Pyramid Network)을 사용하여 다양한 스케일의 특징을 추출합니다. ResNet50의 각 잔차 블록에서 출력되는 C2, C3, C4, C5를 FPN 입력으로 사용합니다. 각 FPN 레벨은 특정 스케일을 나타내며, 자체 그리드를 가집니다. 주의: 작은 커스텀 데이터셋을 사용할 때는 모든 FPN 레벨을 사용하지 않는 것이 좋습니다. 이 경우 불필요한 파라미터를 학습하게 되어 GPU 자원을 낭비할 수 있습니다. Head FPN 레벨의 출력은 클래스 결정 및 마스크 예측을 위한 두 개의 병렬 브랜치로 입력됩니다: 분류 브랜치와 마스크 커널 브랜치입니다. Vanilla Head 구조에서는 마스크 피처를 제외했습니다. 주의: 작은 커스텀 데이터셋을 사용할 때는 마스크와 분류 브랜치 모두에 하나의 세트를 사용할 수 있습니다. 이렇게 하면 불필요한 파라미터 학습을 피할 수 있습니다. 마스크 피처 마스크 피처 브랜치는 Multi-level FPN 특징을 융합하여 통합된 마스크 피처 맵을 생성합니다. 논문에서는 각 FPN 레벨마다 특정 마스크 피처와 모든 FPN 레벨에 대해 하나의 통합 마스크 피처를 구현하는 두 가지 접근 방식을 평가했습니다. 이 프로젝트에서는 후자의 방식을 선택했습니다. 마스크 피처 브랜치와 마스크 커널 브랜치는 동적 컨볼루션을 통해 결합됩니다. 데이터셋 데이터 확장 데이터 확장을 통해 데이터셋을 확장할 수 있습니다. 이는 다양한 이미지 변환 방법을 적용하여 새로운 샘플을 생성하는 과정으로, 특히 작은 데이터셋에서 중요합니다. 이 프로젝트에서는 수평 뒤집기, 밝기 조정, 임의 스케일링, 임의 크롭핑 등의 방법을 사용했습니다. 타겟 형식으로 변환 SOLO 모델은 입력으로 정규화된 이미지를 사용합니다. 하지만 타겟 형식은 복잡합니다. 이 프로젝트에서는 데이터셋의 메모리 저장과 동적 생성 중 후자를 선택했습니다. tf.data.Dataset.from_generator를 사용하여 데이터셋을 동적으로 생성하는데, 이는 큰 데이터와 높은 해상도의 이미지를 처리할 때 유용한 기술입니다. 학습 과정 손실 함수 SOLO 모델은 TensorFlow에서 내장되어 있지 않은 표준 손실 함수를 사용합니다. 따라서 나는 다음과 같은 손실 함수를 직접 구현했습니다. $$L = L_{cate} + \lambda L_{mask}$$ 여기서: $$L_{mask} = \frac{1}{N_{pos}} \sum_k \mathbb{1}_{{p^{i,j} > 0}} d{mask}(m_k, m^_k)$$ $$L_{Dice} = 1 - D(p, q)$$ $$D(p, q) = \frac{2 \sum_{x,y} (p_{x,y} \cdot q_{x,y})}{\sum_{x,y} p^2_{x,y} + \sum_{x,y} q^2_{x,y}}$$ 이 손실 함수의 모든 세부 사항은 원래 SOLO 논문의 3.3.2 섹션에 설명되어 있습니다. 체크포인트에서 재시작 낮은 성능의 GPU를 사용할 경우, 전체 모델을 한 번에 학습하는 것이 실용적이지 않을 수 있습니다. 따라서 이 프로젝트는 매 n 에폭마다 모델을 저장하고 나중에 학습을 재시작할 수 있는 시스템을 제공합니다. python self.load_previous_model = True self.model_path = './weights/coco_epoch00000001.keras' 평가 과정 평가 과정은 모델이 얼마나 효과적으로 학습되었는지, 그리고 이전에 본 적 없는 이미지에서 어떻게 행동하는지를 확인하는 데 사용됩니다. SOLO 모델의 평가 과정은 다음과 같이 구성됩니다. 테스트 데이터셋 로드 데이터셋을 모델의 입력에 호환되도록 준비 데이터를 모델에 입력 같은 인스턴스를 나타내는 저확률 마스크를 억제 각 인스턴스의 최종 마스크와 예측된 카테고리를 시각화 이 프로젝트에서 가장 어려웠던 부분은 Matrix NMS (non-maximum suppression)를 구현하는 것이었습니다. Matrix NMS는 같은 인스턴스를 여러 번 예측하는 것을 피하기 위해, 저확률 마스크를 제거합니다. 원래 논문에서 제공한 Python 의사코드를 해석하여 TensorFlow로 구현했습니다. python def matrix_nms(masks, scores, labels, pre_nms_k=500, post_nms_k=100, score_threshold=0.5, sigma=0.5): # 코드 생략 return kept_indices 실제 구현에 대한 조언 데이터와 함수의 매핑 모델에 올바른 데이터를 입력하는 것이 매우 중요합니다. 각 레이어는 입력 데이터를 처리하여 다음 레이어에 맞는 출력을 생성해야 하며, 최종적으로 손실 함수를 계산할 때 사용됩니다. 이는 데이터셋 장에서 설명한 것처럼, 일부 목표가 처음에는 간단해 보일 수 있지만 실제로는 그렇지 않을 수 있음을 인식하는 것이 필요합니다. 논문 연구 논문을 읽는 것은 피할 수 없는 과정입니다. 많은 참고 문헌과 논문을 읽어야 할 수도 있지만, 대부분은 오랜 시간 동안 알려져 있었던 원칙을 기반으로 하고 있으므로 인터넷에서 쉽게 설명을 찾을 수 있습니다. LLM 프로그램을 사용하여 정보를 요약하고 예제를 제공하는 것도 도움이 됩니다. 작은 단계부터 시작하기 수백만 개의 파라미터를 가진 컴퓨터 비전 모델을 구현할 때, 초기 개발 단계에서는 불필요한 학습, 데이터셋 준비, 평가 등을 피하는 것이 좋습니다. 특히 성능이 낮은 GPU를 사용할 경우, 학습 과정이 매우 길어질 수 있습니다. 따라서 초기 단계에서는 작은 데이터셋과 적은 파라미터로 모델을 과대적합시키더라도, 모델이 올바르게 작동하는지 확인하는 것이 중요합니다. 코드 디버깅 디버깅은 각 단계에서 코드의 예상 동작과 데이터 값이 올바른지 확인하는 데 필수적입니다. 모델 구축, 손실 함수 작성, 데이터셋 준비 등에서는 많은 수학 연산과 텐서를处理하게 되어, 더욱 집중력이 필요합니다. 결론 이 프로젝트는 Dynamic SOLO (SOLOv2) 모델의 TensorFlow 2 구현에 대한 간략한 설명입니다. 기술적인 세부 사항은 생략되었지만, 독자들의 관심이 있다면 더욱 상세한 분석을 작성할 계획입니다. 이 프로젝트는 컴퓨터 비전 모델 구현에 대한 이해를 깊이 높이는 데 도움이 될 것입니다. 업계 인사들의 평가 및 회사 프로필 이 프로젝트는 컴퓨터 비전 분야에서 새로운 접근 방식을 탐색하는 데 있어 중요한 역할을 하고 있습니다. SOLO 모델은 앵커를 사용하지 않는다는 점에서 독특하며, 이는 바운딩 박스 없이 객체를 분할할 수 있는 효율적인 방법을 제공합니다. TensorFlow 2를 활용한 구현은 모델의 유연성을 더욱 강화하며, 딥러닝 프레임워크를 사용한 고급 기술 구현의 좋은 예시를 제공합니다. 이 프로젝트는 초보자와 고급 사용자 모두에게 유용하며, 실제 문제 해결에 필요한 기술을 향상시키는 데 도움이 됩니다.

Related Links