YOLOv5에서 고정된 레이어를 사용한 전이 학습(Transfer Learning)

📚 This guide explains how to freeze YOLOv5 🚀 layers when implementing transfer learning. Transfer learning is a powerful machine learning (ML) technique that allows you to quickly retrain a model on new data without retraining the entire network from scratch. By freezing the weights of initial layers and only updating the parameters of later layers, you can significantly reduce computational resource requirements and training time. However, this approach might slightly impact the final model accuracy.

시작하기 전에

먼저 YOLOv5 저장소를 복제하고 requirements.txt에 나열된 필수 종속성을 설치합니다. Python>=3.8.0 환경과 PyTorch>=1.8이 설치되어 있는지 확인하십시오. 사전 학습된 모델과 필수 데이터셋은 최신 YOLOv5 릴리스에서 자동으로 다운로드됩니다.

git clone https://github.com/ultralytics/yolov5 # clone repository
cd yolov5
pip install -r requirements.txt # install dependencies

레이어 고정의 작동 원리

신경망에서 레이어를 고정하면 학습 과정 중에 해당 매개변수(가중치 및 편향)가 업데이트되지 않도록 방지합니다. PyTorch에서는 레이어 텐서의 requires_grad 속성을 False로 설정하여 이를 수행합니다. 결과적으로 역전파 중에 이들 레이어에 대한 그래디언트가 계산되지 않아 계산량과 메모리가 절약됩니다.

다음은 YOLOv5의 학습 스크립트에서 레이어 고정을 구현하는 방법입니다:

# Freeze specified layers
freeze = [f"model.{x}." for x in range(freeze)]  # Define layers to freeze based on module index
for k, v in model.named_parameters():
    v.requires_grad = True  # Ensure all parameters are initially trainable
    if any(x in k for x in freeze):
        print(f"Freezing layer: {k}")
        v.requires_grad = False  # Disable gradient calculation for frozen layers

모델 아키텍처 살펴보기

어떤 레이어를 고정할지 결정하려면 YOLOv5 모델의 구조를 이해하는 것이 중요합니다. 다음 파이썬 스니펫을 사용하여 모든 모듈의 이름과 매개변수를 확인할 수 있습니다:

# Assuming 'model' is your loaded YOLOv5 model instance
for name, param in model.named_parameters():
    print(name)

"""
Example Output:
model.0.conv.conv.weight
model.0.conv.bn.weight
model.0.conv.bn.bias
model.1.conv.weight
model.1.bn.weight
model.1.bn.bias
model.2.cv1.conv.weight
model.2.cv1.bn.weight
...
"""

The YOLOv5 architecture typically consists of a backbone (layers 0-9 in standard configurations like YOLOv5s/m/l/x) responsible for feature extraction, and a head (the remaining layers) which performs object detection.

# Example YOLOv5 v6.0 backbone structure
backbone:
    # [from, number, module, args]
    - [-1, 1, Conv, [64, 6, 2, 2]]  # Layer 0: Initial convolution (P1/2 stride)
    - [-1, 1, Conv, [128, 3, 2]] # Layer 1: Downsampling convolution (P2/4 stride)
    - [-1, 3, C3, [128]]          # Layer 2: C3 module
    - [-1, 1, Conv, [256, 3, 2]] # Layer 3: Downsampling convolution (P3/8 stride)
    - [-1, 6, C3, [256]]          # Layer 4: C3 module
    - [-1, 1, Conv, [512, 3, 2]] # Layer 5: Downsampling convolution (P4/16 stride)
    - [-1, 9, C3, [512]]          # Layer 6: C3 module
    - [-1, 1, Conv, [1024, 3, 2]]# Layer 7: Downsampling convolution (P5/32 stride)
    - [-1, 3, C3, [1024]]         # Layer 8: C3 module
    - [-1, 1, SPPF, [1024, 5]]    # Layer 9: Spatial Pyramid Pooling Fast

# Example YOLOv5 v6.0 head structure
head:
    - [-1, 1, Conv, [512, 1, 1]] # Layer 10
    - [-1, 1, nn.Upsample, [None, 2, "nearest"]] # Layer 11
    - [[-1, 6], 1, Concat, [1]] # Layer 12: Concatenate with backbone P4 (from layer 6)
    - [-1, 3, C3, [512, False]] # Layer 13: C3 module
    # ... subsequent head layers for feature fusion and detection

고정 옵션

학습 명령어에서 --freeze 인수를 사용하여 어떤 레이어를 고정할지 제어할 수 있습니다. 이 인수는 고정되지 않은(unfrozen) 첫 번째 모듈의 인덱스를 지정하며, 이 인덱스 이전의 모든 모듈은 가중치가 고정됩니다. 특정 블록이 어떤 인덱스에 해당하는지 확인해야 하는 경우 model.model(nn.Sequential)을 사용하여 모듈 순서를 검사하십시오.

백본만 고정하기

COCO와 같은 대규모 데이터셋에서 학습된 일반적인 특성 추출 기능을 유지하면서 모델을 새로운 객체 클래스에 맞게 조정할 때 흔히 사용되는 전체 백본(레이어 0~9)을 고정하려면 다음과 같이 합니다:

python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 10

이 전략은 타겟 데이터셋이 원래 학습 데이터(예: COCO)와 유사한 저수준 시각적 특성(가장자리, 질감)을 공유하지만 객체 카테고리가 다를 때 효과적입니다.

최종 탐지 레이어를 제외한 모든 레이어 고정

최종 출력 합성곱 레이어(Detect 모듈의 일부, 일반적으로 마지막 모듈, 예: YOLOv5s의 모듈 24)만 학습 가능하게 두고 네트워크 전체를 거의 다 고정하려면 다음과 같이 합니다:

python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 24

이 접근 방식은 학습된 특성의 대부분을 그대로 유지하면서 출력 클래스 수에 맞게 모델을 조정해야 할 때 유용합니다. 파인튜닝을 위한 계산 자원을 최소화할 수 있습니다.

성능 비교

To illustrate the effects of freezing layers, we trained YOLOv5m on the Pascal VOC dataset for 50 epochs, starting from the official COCO pretrained weights (yolov5m.pt). We compared three scenarios: training all layers (--freeze 0), freezing the backbone (--freeze 10), and freezing all but the final detection layers (--freeze 24).

# Example command for training with backbone frozen
python train.py --batch 48 --weights yolov5m.pt --data voc.yaml --epochs 50 --cache --img 512 --hyp hyp.finetune.yaml --freeze 10

정확도 결과

결과를 보면 레이어를 고정하면 학습 속도가 크게 빨라지지만 최종 mAP (평균 정밀도)는 약간 감소할 수 있습니다. 일반적으로 모든 레이어를 학습할 때 가장 좋은 정확도가 나오며, 더 많은 레이어를 고정할수록 성능이 약간 낮아질 위험이 있지만 학습 속도는 빨라집니다.

다양한 고정 전략을 비교한 학습 mAP50 결과 학습 중 mAP50 비교

다양한 고정 전략을 비교한 학습 mAP50-95 결과 학습 중 mAP50-95 비교

YOLOv5 frozen layer training performance *Summary table of performance metrics*

자원 활용

더 많은 레이어를 고정하면 GPU 메모리 요구량과 전체 활용도가 대폭 감소합니다. 따라서 하드웨어 자원이 제한적인 환경에서 고정된 레이어를 사용하는 전이 학습은 매력적인 옵션이 되며, 그렇지 않을 경우보다 더 큰 모델을 학습하거나 더 큰 이미지 크기를 사용할 수 있게 해줍니다.

학습 중 할당된 GPU 메모리 비율 할당된 GPU 메모리(%)

학습 중 GPU 메모리 활용률 GPU 활용률(%)

레이어 고정 사용 시기

전이 학습 중 레이어 고정은 다음과 같은 여러 상황에서 특히 유리합니다:

  1. 제한된 계산 자원: GPU 메모리나 처리 능력에 제약이 있는 경우.
  2. 소규모 데이터셋: 타겟 데이터셋이 원래 사전 학습 데이터셋보다 현저히 작을 때, 고정을 통해 과적합을 방지할 수 있습니다.
  3. 신속한 프로토타이핑: 초기 평가를 위해 기존 모델을 새로운 작업이나 도메인에 빠르게 적용해야 할 때.
  4. 유사한 특성 도메인: 새로운 데이터셋의 저수준 특성이 모델이 사전 학습된 데이터셋의 특성과 매우 유사한 경우.

용어집 항목에서 전이 학습의 미묘한 차이에 대해 더 자세히 알아보고 성능 최적화를 위해 하이퍼파라미터 튜닝과 같은 기법을 고려해 보십시오.

지원되는 환경

Ultralytics는 CUDA, CuDNN, Python, PyTorch 등 필수 종속성이 사전 설치된 다양한 즉시 사용 가능한 환경을 제공합니다.

프로젝트 상태

YOLOv5 지속적 통합 상태

이 배지는 모든 YOLOv5 GitHub Actions 지속적 통합(CI) 테스트가 성공적으로 통과되었음을 확인합니다. 이 CI 테스트는 학습, 검증, 추론, 내보내기, 벤치마크 등 주요 작업 전반에서 YOLOv5의 기능과 성능을 엄격하게 평가합니다. 매 24시간마다 그리고 새로운 코드 커밋이 있을 때마다 자동으로 실행되며 macOS, Windows, Ubuntu에서 일관되고 안정적인 작동을 보장합니다.

댓글