--- layout: hub_detail background-class: hub-background body-class: hub title: ResNeSt summary: A new ResNet variant. category: researchers image: resnest.jpg author: Hang Zhang tags: [vision] github-link: https://github.com/zhanghang1989/ResNeSt github-id: zhanghang1989/ResNeSt featured_image_1: resnest.jpg featured_image_2: no-image accelerator: cuda-optional order: 10 demo-model-link: https://huggingface.co/spaces/pytorch/ResNeSt --- ```python import torch # get list of models torch.hub.list('zhanghang1989/ResNeSt', force_reload=True) # load pretrained models, using ResNeSt-50 as an example model = torch.hub.load('zhanghang1989/ResNeSt', 'resnest50', pretrained=True) model.eval() ``` All pre-trained models expect input images normalized in the same way, i.e. mini-batches of 3-channel RGB images of shape `(3 x H x W)`, where `H` and `W` are expected to be at least `224`. The images have to be loaded in to a range of `[0, 1]` and then normalized using `mean = [0.485, 0.456, 0.406]` and `std = [0.229, 0.224, 0.225]`. Here's a sample execution. ```python # Download an example image from the pytorch website import urllib url, filename = ("https://github.com/pytorch/hub/raw/master/images/dog.jpg", "dog.jpg") try: urllib.URLopener().retrieve(url, filename) except: urllib.request.urlretrieve(url, filename) ``` ```python # sample execution (requires torchvision) from PIL import Image from torchvision import transforms input_image = Image.open(filename) preprocess = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), ]) input_tensor = preprocess(input_image) input_batch = input_tensor.unsqueeze(0) # create a mini-batch as expected by the model # move the input and model to GPU for speed if available if torch.cuda.is_available(): input_batch = input_batch.to('cuda') model.to('cuda') with torch.no_grad(): output = model(input_batch) # Tensor of shape 1000, with confidence scores over ImageNet's 1000 classes print(output[0]) # The output has unnormalized scores. To get probabilities, you can run a softmax on it. probabilities = torch.nn.functional.softmax(output[0], dim=0) print(probabilities) ``` ``` # Download ImageNet labels !wget https://raw.githubusercontent.com/pytorch/hub/master/imagenet_classes.txt ``` ``` # Read the categories with open("imagenet_classes.txt", "r") as f: categories = [s.strip() for s in f.readlines()] # Show top categories per image top5_prob, top5_catid = torch.topk(probabilities, 5) for i in range(top5_prob.size(0)): print(categories[top5_catid[i]], top5_prob[i].item()) ``` ### Model Description ResNeSt models are from the [ResNeSt: Split-Attention Networks](https://arxiv.org/pdf/2004.08955.pdf) paper. While image classification models have recently continued to advance, most downstream applications such as object detection and semantic segmentation still employ ResNet variants as the backbone network due to their simple and modular structure. We present a simple and modular Split-Attention block that enables attention across feature-map groups. By stacking these Split-Attention blocks ResNet-style, we obtain a new ResNet variant which we call ResNeSt. Our network preserves the overall ResNet structure to be used in downstream tasks straightforwardly without introducing additional computational costs. ResNeSt models outperform other networks with similar model complexities, and also help downstream tasks including object detection, instance segmentation and semantic segmentation. | | crop size | PyTorch | |-------------|-----------|---------| | ResNeSt-50 | 224 | 81.03 | | ResNeSt-101 | 256 | 82.83 | | ResNeSt-200 | 320 | 83.84 | | ResNeSt-269 | 416 | 84.54 | ### References - [ResNeSt: Split-Attention Networks](https://arxiv.org/abs/2004.08955).