콘텐츠로 건너뛰기

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

📚 이 가이드에서는 YOLOv5 🚀를 구현할 때 레이어를 고정하는 방법을 설명합니다 전이 학습. 전이 학습은 전체 네트워크를 처음부터 다시 학습시키지 않고도 새로운 데이터에 대해 모델을 빠르게 재학습할 수 있도록 하는 강력한 머신 러닝(ML) 기술입니다. 초기 레이어의 가중치를 고정하고 후반 레이어의 파라미터만 업데이트하면 컴퓨팅 리소스 요구 사항과 학습 시간을 크게 줄일 수 있습니다. 그러나 이 접근 방식은 최종 모델 정확도에 약간의 영향을 미칠 수 있습니다.

시작하기 전에

먼저 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 레이어의 텐서(tensor) 속성을 False. 결과적으로, 이러한 레이어에 대해서는 학습 중에 기울기가 계산되지 않습니다. 역전파, 연산 및 메모리를 절약합니다.

다음은 YOLOv5가 학습 스크립트에서 레이어 고정(layer freezing)을 구현하는 방법입니다.

# 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 모델의 구조를 이해하는 것은 어떤 레이어를 고정할지 결정하는 데 매우 중요합니다. 다음 python 스니펫을 사용하여 모든 모듈 이름과 해당 파라미터를 검사할 수 있습니다.

# 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
...
"""

YOLOv5 아키텍처는 일반적으로 특징 추출을 담당하는 백본(YOLOv5s/m/l/x와 같은 표준 구성에서 레이어 0-9)과 객체 감지를 수행하는 헤드(나머지 레이어)로 구성됩니다.

# 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 학습 명령어의 인수입니다. 이 인수는 첫 번째 인덱스를 지정합니다. 고정 해제됨 모듈; 이 인덱스 이전의 모든 모듈은 가중치가 고정됩니다.

백본만 고정

COCO와 같은 대규모 데이터 세트에서 학습된 일반적인 특징 추출 기능을 유지하면서 모델을 새로운 객체 클래스에 적용할 때 일반적인 전체 백본(레이어 0~9)을 고정하려면:

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

이 전략은 대상 데이터 세트가 원본 학습 데이터(예: COCO)와 유사한 저수준 시각적 특징(edges, textures)을 공유하지만, 다른 객체 범주를 포함하는 경우에 효과적입니다.

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

거의 전체 네트워크를 고정하고 최종 출력 컨볼루션 레이어(의 일부)만 남겨두려면 Detect 모듈(일반적으로 마지막 모듈, 예: YOLOv5s의 모듈 24) 학습 가능:

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

이 접근 방식은 학습된 기능의 대부분을 그대로 유지하면서 다른 수의 출력 클래스에 맞게 모델을 조정해야 하는 경우에 유용합니다. 미세 조정에 필요한 계산 리소스가 가장 적습니다.

성능 비교

레이어 고정의 효과를 설명하기 위해 YOLOv5m을 학습했습니다. Pascal VOC 데이터 세트 50회 동안 epochs, 공식 COCO 사전 훈련된 모델부터 시작합니다. 가중치 (yolov5m.pt). 모든 레이어 훈련(--freeze 0), 백본을 고정하고(--freeze 10), 마지막 감지 레이어를 제외한 모든 레이어를 고정하고(--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 비교

성능 결과 요약 테이블 성능 지표 요약 표

리소스 활용

더 많은 레이어를 고정하면 GPU 메모리 요구 사항과 전체 사용률이 크게 줄어듭니다. 따라서 제한된 하드웨어 리소스로 작업할 때 고정된 레이어를 사용한 전이 학습은 매력적인 옵션이 되며, 더 큰 모델을 학습하거나 그렇지 않은 경우보다 더 큰 이미지 크기를 사용할 수 있습니다.

훈련 중 GPU 메모리 할당 백분율 GPU 메모리 할당 (%)

훈련 중 GPU 메모리 사용률 백분율 GPU 사용률 (%)

레이어 고정 사용 시점

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

  1. 제한된 컴퓨팅 리소스: GPU 메모리 또는 처리 능력에 제약이 있는 경우.
  2. 작은 데이터 세트: 대상 데이터 세트가 원래 사전 학습 데이터 세트보다 훨씬 작은 경우, 고정은 과적합을 방지하는 데 도움이 됩니다.
  3. 신속한 프로토타입 제작: 기존 모델을 초기 평가를 위해 새로운 작업 또는 도메인에 빠르게 적용해야 할 때 유용합니다.
  4. 유사한 특징 도메인: 새 데이터 세트의 저수준 특징이 모델이 사전 훈련된 데이터 세트의 특징과 매우 유사한 경우.

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

지원되는 환경

Ultralytics는 CUDA, CuDNN, PythonPyTorch와 같은 필수 종속성이 미리 설치된 다양한 즉시 사용 가능한 환경을 제공합니다.

프로젝트 상태

YOLOv5 지속적 통합 상태

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



📅 1년 전에 생성됨 ✏️ 4개월 전에 업데이트됨

댓글