YOLOv5에서 레이어 동결을 이용한 전이 학습#
📚 이 가이드에서는 전이 학습을 구현할 때 YOLOv5 🚀 레이어를 **고정(freeze)**하는 방법을 설명합니다. 전이 학습은 전체 네트워크를 처음부터 다시 학습시키지 않고도 새로운 데이터에 대해 모델을 빠르게 재학습할 수 있게 해주는 강력한 머신 러닝 (ML) 기법입니다. 초기 레이어의 가중치를 고정하고 후속 레이어의 파라미터만 업데이트함으로써, 연산 자원 요구량과 학습 시간을 크게 줄일 수 있습니다. 그러나 이 접근 방식은 최종 모델 정확도에 약간의 영향을 미칠 수 있습니다.
시작하기 전에#
먼저 YOLOv5 리포지토리를 클론하고 requirements.txt에 나열된 필수 종속성을 설치합니다. Python>=3.8.0 및 PyTorch>=1.8이 설치된 환경인지 확인하십시오. 사전 학습된 models와 필수 datasets은 최신 YOLOv5 release에서 자동으로 다운로드됩니다.
git clone https://github.com/ultralytics/yolov5 # clone repository
cd yolov5
pip install -r requirements.txt # install dependencies레이어 동결 작동 방식#
neural network에서 레이어를 freeze하면 학습 프로세스 동안 해당 파라미터(가중치 및 편향)가 업데이트되는 것을 방지할 수 있습니다. PyTorch에서는 레이어 텐서의 requires_grad 속성을 False로 설정하여 이를 달성합니다. 결과적으로 backpropagation 동안 이러한 레이어에 대한 그래디언트가 계산되지 않아 연산과 메모리가 절약됩니다.
YOLOv5가 training script에서 레이어 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 인수를 사용하여 freeze할 레이어를 제어할 수 있습니다. 이 인수는 unfrozen 상태인 첫 번째 모듈의 인덱스를 지정하며, 이 인덱스 이전의 모든 모듈은 가중치가 고정됩니다. 특정 블록에 어떤 인덱스가 대응하는지 확인해야 하는 경우 model.model (nn.Sequential)을 사용하여 모듈 순서를 검사하십시오.
백본만 동결#
COCO와 같은 대규모 데이터셋에서 학습된 일반적인 특징 추출 능력을 유지하면서 모델을 새로운 객체 클래스에 적응시킬 때 흔히 사용되는 전체 백본(0~9번 레이어)을 freeze하려면:
python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 10이 전략은 타겟 데이터셋이 원래 학습 데이터(예: COCO)와 유사한 저수준 시각적 특징(엣지, 질감)을 공유하지만 객체 카테고리는 다를 때 효과적입니다.
최종 탐지 레이어를 제외하고 모두 동결#
Detect 모듈의 일부인 최종 출력 합성곱 레이어(일반적으로 마지막 모듈, 예를 들어 YOLOv5s의 24번 모듈)만 학습 가능하도록 남겨두고 네트워크 거의 전체를 freeze하려면:
python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 24이 접근 방식은 학습된 특징의 대부분을 그대로 유지하면서 주로 다른 수의 출력 클래스에 맞게 모델을 조정해야 할 때 유용합니다. fine-tuning에 가장 적은 계산 리소스가 필요합니다.
성능 비교#
레이어 고정의 효과를 설명하기 위해, 공식 COCO 사전 학습된 가중치(yolov5m.pt)를 기반으로 Pascal VOC 데이터셋에서 50 에폭 동안 YOLOv5m을 학습시켰습니다. 모든 레이어 학습(--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 data/hyps/hyp.VOC.yaml --freeze 10정확도 결과#
결과에 따르면 레이어 freezing은 학습을 크게 가속화할 수 있지만 최종 mAP (mean Average Precision)이 약간 감소할 수 있습니다. 일반적으로 모든 레이어를 학습시키는 것이 최고의 정확도를 제공하며, 더 많은 레이어를 freeze할수록 성능 저하 가능성을 감수하고 더 빠른 학습을 얻을 수 있습니다.
학습 중 mAP50 비교
학습 중 mAP50-95 비교
*Summary table of performance metrics*
리소스 활용#
더 많은 레이어를 freeze하면 GPU 메모리 요구 사항과 전체 사용량이 크게 감소합니다. 이로 인해 제한된 하드웨어 리소스로 작업할 때 frozen 레이어를 사용한 전이 학습이 매력적인 옵션이 되며, 그렇지 않은 경우보다 더 큰 모델을 학습시키거나 더 큰 이미지 크기를 사용할 수 있습니다.
할당된 GPU 메모리 비율 (%)
GPU 사용률 (%)
레이어 동결을 사용하는 경우#
전이 학습 중 레이어 동결은 특히 다음과 같은 상황에서 유리합니다:
- 제한된 컴퓨팅 리소스: GPU 메모리나 처리 능력에 제약이 있는 경우.
- Small Datasets: 타겟 데이터셋이 원래 사전 학습 데이터셋보다 현저히 작을 때, freezing은 overfitting을 방지하는 데 도움이 됩니다.
- 신속한 프로토타이핑: 초기 평가를 위해 기존 모델을 새로운 작업이나 도메인에 빠르게 적응시켜야 하는 경우.
- 유사한 특징 도메인: 새로운 데이터셋의 저수준 특징이 모델이 사전 학습된 데이터셋과 매우 유사한 경우.
glossary entry에서 전이 학습의 세부 사항을 더 살펴보고 성능 최적화를 위해 hyperparameter tuning 같은 기법을 고려해 보세요.
지원되는 환경#
Ultralytics는 CUDA, CuDNN, Python, PyTorch와 같은 필수 종속성이 미리 설치된 다양한 즉시 사용 가능한 환경을 제공합니다.
- 무료 GPU 노트북:
- Google Cloud: GCP 퀵스타트 가이드
- Amazon: AWS 빠른 시작 가이드
- Azure: AzureML 빠른 시작 가이드
- Docker: Docker 퀵스타트 가이드
프로젝트 상태#
이 배지는 모든 YOLOv5 GitHub Actions 지속적 통합(CI) 테스트가 성공적으로 통과되었음을 확인합니다. 이 CI 테스트는 training, validation, inference, export, benchmarks 등 주요 작업 전반에서 YOLOv5의 기능과 성능을 엄격하게 평가합니다. 이를 통해 24시간마다 및 새로운 코드 커밋마다 자동으로 실행되어 macOS, Windows, Ubuntu에서 일관되고 신뢰할 수 있는 작동을 보장합니다.