Package: densenet-pytorch
DenseNet-PyTorchNote: Now supports the more efficient DenseNet-BC (DenseNet-Bottleneck-Compressed) networks. Using the DenseNet-BC-190-40 model, it obtaines state of the art performance on CIFAR-10 and CIFAR-100.Update (Feb 18, 2020)The update is for ease of use and deployment.Example: Export to ONNXExample: Extract featuresExample: VisualIt is also now incredibly simple to load a pretrained model with a new number of classes for transfer learning:fromdensenet_pytorchimportDenseNetmodel=DenseNet.from_pretrained('densenet121',num_classes=10)Update (January 15, 2020)This update allows you to use NVIDIA's Apex tool for accelerated training. By default choicehybrid training precision+dynamic loss amplifiedversion, if you need to learn more and details aboutapextools, please visithttps://github.com/NVIDIA/apex.Update (January 6, 2020)This update adds a modular neural network, making it more flexible in use. It can be deployed to many common dataset classification tasks. Of course, it can also be used in your products.OverviewThis repository contains an op-for-op PyTorch reimplementation ofDensely Connected Convolutional Networks.The goal of this implementation is to be simple, highly extensible, and easy to integrate into your own projects. This implementation is a work in progress -- new features are currently being implemented.At the moment, you can easily:Load pretrained DenseNet modelsUse DenseNet models for classification or feature extractionUpcoming features: In the next few days, you will be able to:Quickly finetune an DenseNet on your own datasetExport DenseNet models for productionTable of contentsAbout DenseNetInstallationUsageLoad pretrained modelsExample: ClassifyExample: Extract featuresExample: Export to ONNXExample: VisualContributingAbout DenseNetIf you're new to DenseNets, here is an explanation straight from the official PyTorch implementation:Dense Convolutional Network (DenseNet), connects each layer to every other layer in a feed-forward fashion. Whereas traditional convolutional networks with L layers have L connections - one between each layer and its subsequent layer - our network has L(L+1)/2 direct connections. For each layer, the feature-maps of all preceding layers are used as inputs, and its own feature-maps are used as inputs into all subsequent layers. DenseNets have several compelling advantages: they alleviate the vanishing-gradient problem, strengthen feature propagation, encourage feature reuse, and substantially reduce the number of parameters.InstallationInstall from pypi:pipinstalldensenet_pytorchInstall from source:gitclonehttps://github.com/Lornatang/DenseNet-PyTorchcdDenseNet-PyTorch
pipinstall-e.UsageLoading pretrained modelsLoad an densenet121 network:fromdensenet_pytorchimportDenseNetmodel=DenseNet.from_name("densenet121")Load a pretrained densenet11:fromdensenet_pytorchimportDenseNetmodel=DenseNet.from_pretrained("densenet121")Their 1-crop error rates on imagenet dataset with pretrained models are listed below.Model structureTop-1 errorTop-5 errordensenet12125.357.83densenet16924.007.00densenet20122.806.43densenet16122.356.20Example: ClassificationWe assume that in your current directory, there is aimg.jpgfile and alabels_map.txtfile (ImageNet class names). These are both included inexamples/simple.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), whereHandWare expected to be at least224.
The images have to be loaded in to a range of[0, 1]and then normalized usingmean = [0.485, 0.456, 0.406]andstd = [0.229, 0.224, 0.225].Here's a sample execution.importjsonimporttorchimporttorchvision.transformsastransformsfromPILimportImagefromdensenet_pytorchimportDenseNet# Open imageinput_image=Image.open("img.jpg")# Preprocess imagepreprocess=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# Load class nameslabels_map=json.load(open("labels_map.txt"))labels_map=[labels_map[str(i)]foriinrange(1000)]# Classify with DenseNet121model=DenseNet.from_pretrained("densenet121")model.eval()# move the input and model to GPU for speed if availableiftorch.cuda.is_available():input_batch=input_batch.to("cuda")model.to("cuda")withtorch.no_grad():logits=model(input_batch)preds=torch.topk(logits,k=5).indices.squeeze(0).tolist()print("-----")foridxinpreds:label=labels_map[idx]prob=torch.softmax(logits,dim=1)[0,idx].item()print(f"{label:<75}({prob*100:.2f}%)")Example: Feature ExtractionYou can easily extract features withmodel.extract_features:importtorchfromdensenet_pytorchimportDenseNetmodel=DenseNet.from_pretrained('densenet121')# ... image preprocessing as in the classification example ...inputs=torch.randn(1,3,224,224)print(inputs.shape)# torch.Size([1, 3, 224, 224])features=model.extract_features(inputs)print(features.shape)# torch.Size([1, 1024, 7, 7])Example: Export to ONNXExporting to ONNX for deploying to production is now simple:importtorchfromdensenet_pytorchimportDenseNetmodel=DenseNet.from_pretrained('densenet121')dummy_input=torch.randn(16,3,224,224)torch.onnx.export(model,dummy_input,"demo.onnx",verbose=True)Example: Visualcd $REPO$/framework
sh start.shThen open the browser and type in the browser addresshttp://127.0.0.1:10003/.Enjoy it.ImageNetSeeexamples/imagenetfor details about evaluating on ImageNet.For more datasets result. Please seeresearch/README.md.ContributingIf you find a bug, create a GitHub issue, or even better, submit a pull request. Similarly, if you have questions, simply post them as GitHub issues.I look forward to seeing what the community does with these models!CreditDensely Connected Convolutional NetworksGao Huang, Zhuang Liu, Laurens van der Maaten, Kilian Q. WeinbergerAbstractRecent work has shown that convolutional networks can be substantially deeper, more accurate,
and efficient to train if they contain shorter connections between layers close to the input
and those close to the output. In this paper, we embrace this observation and introduce the
Dense Convolutional Network (DenseNet), which connects each layer to every other layer in a
feed-forward fashion. Whereas traditional convolutional networks with L layers have L connectionsone between each layer and its subsequent layer - our network has L(L+1)/2 direct connections.
For each layer, the feature-maps of all preceding layers are used as inputs, and its own feature-maps
are used as inputs into all subsequent layers. DenseNets have several compelling advantages: they
alleviate the vanishing-gradient problem, strengthen feature propagation, encourage feature reuse,
and substantially reduce the number of parameters. We evaluate our proposed architecture on four
highly competitive object recognition benchmark tasks (CIFAR-10, CIFAR-100, SVHN, and ImageNet).
DenseNets obtain significant improvements over the state-of-the-art on most of them, whilst requiring
less computation to achieve high performance. Code and pre-trained models are available at thishttps URL.papercode@article{DenseNet,
title:{Densely Connected Convolutional Networks},
author:{Gao Huang, Zhuang Liu, Laurens van der Maaten, Kilian Q. Weinberger},
journal={cvpr},
year={2016}
}