| """CLIPSeg model loading and freezing utilities.""" | |
| from transformers import CLIPSegForImageSegmentation, CLIPSegProcessor | |
| def load_model_and_processor(model_name: str = "CIDAS/clipseg-rd64-refined", freeze_backbone: bool = True): | |
| """Load CLIPSeg model and processor, optionally freezing the backbone.""" | |
| model = CLIPSegForImageSegmentation.from_pretrained(model_name) | |
| processor = CLIPSegProcessor.from_pretrained(model_name) | |
| if freeze_backbone: | |
| trainable, frozen = 0, 0 | |
| for name, param in model.named_parameters(): | |
| if "decoder" in name: | |
| param.requires_grad = True | |
| trainable += param.numel() | |
| else: | |
| param.requires_grad = False | |
| frozen += param.numel() | |
| print(f"Parameters — trainable (decoder): {trainable:,} | frozen (backbone): {frozen:,}") | |
| else: | |
| trainable = sum(p.numel() for p in model.parameters()) | |
| print(f"Parameters — all trainable: {trainable:,}") | |
| return model, processor | |