├── .gitignore ├── README.md ├── base ├── __init__.py ├── __pycache__ │ ├── __init__.cpython-36.pyc │ ├── base_data_loader.cpython-36.pyc │ ├── base_model.cpython-36.pyc │ └── base_trainer.cpython-36.pyc └── base_model.py ├── demo ├── darknet19_demo.py ├── imagenet.shortnames.list └── samples │ ├── 1 │ ├── sample1.jpg │ ├── sample3.jpg │ └── sample32.jpg │ └── 2 │ ├── 61zwGNbd-OL._SX425_.jpg │ ├── dddd.jpg │ ├── hhhhh.jpg │ ├── hhhhhh.jpg │ ├── mmm.jpg │ ├── sample2.jpg │ ├── strawberry.jpg │ └── z-STRA-T72197P-A_h.jpg ├── model ├── __pycache__ │ └── darknet.cpython-36.pyc └── darknet.py └── requirements.txt /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.gitignore.io/api/python,visualstudiocode 3 | # Edit at https://www.gitignore.io/?templates=python,visualstudiocode 4 | 5 | ### Python ### 6 | # Byte-compiled / optimized / DLL files 7 | __pycache__/ 8 | *.py[cod] 9 | *$py.class 10 | 11 | # C extensions 12 | *.so 13 | 14 | # Distribution / packaging 15 | .Python 16 | build/ 17 | develop-eggs/ 18 | dist/ 19 | downloads/ 20 | eggs/ 21 | .eggs/ 22 | lib/ 23 | lib64/ 24 | parts/ 25 | sdist/ 26 | var/ 27 | wheels/ 28 | pip-wheel-metadata/ 29 | share/python-wheels/ 30 | *.egg-info/ 31 | .installed.cfg 32 | *.egg 33 | MANIFEST 34 | 35 | # PyInstaller 36 | # Usually these files are written by a python script from a template 37 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 38 | *.manifest 39 | *.spec 40 | 41 | # Installer logs 42 | pip-log.txt 43 | pip-delete-this-directory.txt 44 | 45 | # Unit test / coverage reports 46 | htmlcov/ 47 | .tox/ 48 | .nox/ 49 | .coverage 50 | .coverage.* 51 | .cache 52 | nosetests.xml 53 | coverage.xml 54 | *.cover 55 | .hypothesis/ 56 | .pytest_cache/ 57 | 58 | # Translations 59 | *.mo 60 | *.pot 61 | 62 | # Django stuff: 63 | *.log 64 | local_settings.py 65 | db.sqlite3 66 | 67 | # Flask stuff: 68 | instance/ 69 | .webassets-cache 70 | 71 | # Scrapy stuff: 72 | .scrapy 73 | 74 | # Sphinx documentation 75 | docs/_build/ 76 | 77 | # PyBuilder 78 | target/ 79 | 80 | # Jupyter Notebook 81 | .ipynb_checkpoints 82 | 83 | # IPython 84 | profile_default/ 85 | ipython_config.py 86 | 87 | # pyenv 88 | .python-version 89 | 90 | # celery beat schedule file 91 | celerybeat-schedule 92 | 93 | # SageMath parsed files 94 | *.sage.py 95 | 96 | # Environments 97 | .env 98 | .venv 99 | env/ 100 | venv/ 101 | ENV/ 102 | env.bak/ 103 | venv.bak/ 104 | 105 | # Spyder project settings 106 | .spyderproject 107 | .spyproject 108 | 109 | # Rope project settings 110 | .ropeproject 111 | 112 | # mkdocs documentation 113 | /site 114 | 115 | # mypy 116 | .mypy_cache/ 117 | .dmypy.json 118 | dmypy.json 119 | 120 | # Pyre type checker 121 | .pyre/ 122 | 123 | ### Python Patch ### 124 | .venv/ 125 | 126 | ### VisualStudioCode ### 127 | .vscode/* 128 | !.vscode/settings.json 129 | !.vscode/tasks.json 130 | !.vscode/launch.json 131 | !.vscode/extensions.json 132 | 133 | ### VisualStudioCode Patch ### 134 | # Ignore all local history of files 135 | .history 136 | 137 | # End of https://www.gitignore.io/api/python,visualstudiocode 138 | .vscode/ 139 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # pytorch_darknet_19 2 | Implementation of darknet19 in PyTorch 3 | 4 | # Simple Demo 5 | ```python 6 | python ./demo/darknet19_demo.py 7 | ``` 8 | -------------------------------------------------------------------------------- /base/__init__.py: -------------------------------------------------------------------------------- 1 | from .base_model import * 2 | 3 | -------------------------------------------------------------------------------- /base/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/visionNoob/pytorch-darknet19/88313a029bfb9a7af38111477a2d39fbf93e3164/base/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /base/__pycache__/base_data_loader.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/visionNoob/pytorch-darknet19/88313a029bfb9a7af38111477a2d39fbf93e3164/base/__pycache__/base_data_loader.cpython-36.pyc -------------------------------------------------------------------------------- /base/__pycache__/base_model.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/visionNoob/pytorch-darknet19/88313a029bfb9a7af38111477a2d39fbf93e3164/base/__pycache__/base_model.cpython-36.pyc -------------------------------------------------------------------------------- /base/__pycache__/base_trainer.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/visionNoob/pytorch-darknet19/88313a029bfb9a7af38111477a2d39fbf93e3164/base/__pycache__/base_trainer.cpython-36.pyc -------------------------------------------------------------------------------- /base/base_model.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import torch.nn as nn 3 | import numpy as np 4 | 5 | 6 | class BaseModel(nn.Module): 7 | """ 8 | Base class for all models 9 | """ 10 | def __init__(self): 11 | super(BaseModel, self).__init__() 12 | self.logger = logging.getLogger(self.__class__.__name__) 13 | 14 | def forward(self, *input): 15 | """ 16 | Forward pass logic 17 | 18 | :return: Model output 19 | """ 20 | raise NotImplementedError 21 | 22 | def summary(self): 23 | """ 24 | Model summary 25 | """ 26 | 27 | model_parameters = filter(lambda p: p.requires_grad, self.parameters()) 28 | params = sum([np.prod(p.size()) for p in model_parameters]) 29 | self.logger.info('Trainable parameters: {}'.format(params)) 30 | self.logger.info(self) 31 | 32 | def __str__(self): 33 | """ 34 | Model prints with number of trainable parameters 35 | """ 36 | model_parameters = filter(lambda p: p.requires_grad, self.parameters()) 37 | params = sum([np.prod(p.size()) for p in model_parameters]) 38 | return super(BaseModel, self).__str__() + '\nTrainable parameters: {}'.format(params) 39 | -------------------------------------------------------------------------------- /demo/darknet19_demo.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import torch 3 | import torchvision.datasets as dset 4 | import torchvision.transforms as transforms 5 | import matplotlib.pyplot as plt 6 | from model import darknet 7 | 8 | def main(): 9 | imageNet_label = [line.strip() for line in open("demo/imagenet.shortnames.list", 'r')] 10 | 11 | dataset = dset.ImageFolder(root="demo/samples/", 12 | transform=transforms.Compose([ 13 | transforms.Resize((448, 448)), 14 | transforms.ToTensor() 15 | ])) 16 | 17 | dataloader = torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=False) 18 | 19 | darknet19 = darknet.Darknet19(pretrained=True) 20 | darknet19.eval() 21 | 22 | for data, _ in dataloader: 23 | output = darknet19.forward(data) 24 | answer = int(torch.argmax(output)) 25 | print("Class: {}({})".format(imageNet_label[answer],answer)) 26 | plt.imshow(np.array(np.transpose(data[0], (1, 2, 0)))) 27 | plt.show() 28 | 29 | if __name__ == "__main__": 30 | main() 31 | -------------------------------------------------------------------------------- /demo/samples/1/sample1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/visionNoob/pytorch-darknet19/88313a029bfb9a7af38111477a2d39fbf93e3164/demo/samples/1/sample1.jpg -------------------------------------------------------------------------------- /demo/samples/1/sample3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/visionNoob/pytorch-darknet19/88313a029bfb9a7af38111477a2d39fbf93e3164/demo/samples/1/sample3.jpg -------------------------------------------------------------------------------- /demo/samples/1/sample32.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/visionNoob/pytorch-darknet19/88313a029bfb9a7af38111477a2d39fbf93e3164/demo/samples/1/sample32.jpg -------------------------------------------------------------------------------- /demo/samples/2/61zwGNbd-OL._SX425_.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/visionNoob/pytorch-darknet19/88313a029bfb9a7af38111477a2d39fbf93e3164/demo/samples/2/61zwGNbd-OL._SX425_.jpg -------------------------------------------------------------------------------- /demo/samples/2/dddd.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/visionNoob/pytorch-darknet19/88313a029bfb9a7af38111477a2d39fbf93e3164/demo/samples/2/dddd.jpg -------------------------------------------------------------------------------- /demo/samples/2/hhhhh.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/visionNoob/pytorch-darknet19/88313a029bfb9a7af38111477a2d39fbf93e3164/demo/samples/2/hhhhh.jpg -------------------------------------------------------------------------------- /demo/samples/2/hhhhhh.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/visionNoob/pytorch-darknet19/88313a029bfb9a7af38111477a2d39fbf93e3164/demo/samples/2/hhhhhh.jpg -------------------------------------------------------------------------------- /demo/samples/2/mmm.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/visionNoob/pytorch-darknet19/88313a029bfb9a7af38111477a2d39fbf93e3164/demo/samples/2/mmm.jpg -------------------------------------------------------------------------------- /demo/samples/2/sample2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/visionNoob/pytorch-darknet19/88313a029bfb9a7af38111477a2d39fbf93e3164/demo/samples/2/sample2.jpg -------------------------------------------------------------------------------- /demo/samples/2/strawberry.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/visionNoob/pytorch-darknet19/88313a029bfb9a7af38111477a2d39fbf93e3164/demo/samples/2/strawberry.jpg -------------------------------------------------------------------------------- /demo/samples/2/z-STRA-T72197P-A_h.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/visionNoob/pytorch-darknet19/88313a029bfb9a7af38111477a2d39fbf93e3164/demo/samples/2/z-STRA-T72197P-A_h.jpg -------------------------------------------------------------------------------- /model/__pycache__/darknet.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/visionNoob/pytorch-darknet19/88313a029bfb9a7af38111477a2d39fbf93e3164/model/__pycache__/darknet.cpython-36.pyc -------------------------------------------------------------------------------- /model/darknet.py: -------------------------------------------------------------------------------- 1 | from collections import OrderedDict 2 | from torch import nn 3 | import torch.nn.functional as F 4 | import torch.utils.model_zoo as model_zoo 5 | from base import BaseModel 6 | 7 | model_paths = { 8 | 'darknet19': 'https://s3.ap-northeast-2.amazonaws.com/deepbaksuvision/darknet19-deepBakSu-e1b3ec1e.pth' 9 | } 10 | 11 | class GlobalAvgPool2d(nn.Module): 12 | def __init__(self): 13 | super(GlobalAvgPool2d, self).__init__() 14 | 15 | def forward(self, x): 16 | N = x.data.size(0) 17 | C = x.data.size(1) 18 | H = x.data.size(2) 19 | W = x.data.size(3) 20 | x = F.avg_pool2d(x, (H, W)) 21 | x = x.view(N, C) 22 | return x 23 | 24 | 25 | class Darknet19(BaseModel): 26 | def __init__(self, pretrained=True): 27 | super(Darknet19, self).__init__() 28 | 29 | self.features = nn.Sequential(OrderedDict([ 30 | ('layer1', nn.Sequential(OrderedDict([ 31 | ('conv1_1', nn.Conv2d(3, 32, kernel_size=3, stride=1, padding=1, bias=False)), 32 | ('bn1_1', nn.BatchNorm2d(32)), 33 | ('leaky1_1', nn.LeakyReLU(0.1, inplace=True)), 34 | ('maxpool1', nn.MaxPool2d(kernel_size=2, stride=2)) 35 | ]))), 36 | ('layer2', nn.Sequential(OrderedDict([ 37 | ('conv2_1', nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1, bias=False)), 38 | ('bn2_1', nn.BatchNorm2d(64)), 39 | ('leaky2_1', nn.LeakyReLU(0.1, inplace=True)), 40 | ('maxpool2', nn.MaxPool2d(kernel_size=2, stride=2)) 41 | ]))), 42 | ('layer3', nn.Sequential(OrderedDict([ 43 | ('conv3_1', nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1, bias=False)), 44 | ('bn3_1', nn.BatchNorm2d(128)), 45 | ('leaky3_1', nn.LeakyReLU(0.1, inplace=True)), 46 | ('conv3_2', nn.Conv2d(128, 64, kernel_size=1, stride=1, padding=0, bias=False)), 47 | ('bn3_2', nn.BatchNorm2d(64)), 48 | ('leaky3_2', nn.LeakyReLU(0.1, inplace=True)), 49 | ('conv3_3', nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1, bias=False)), 50 | ('bn3_3', nn.BatchNorm2d(128)), 51 | ('leaky3_3', nn.LeakyReLU(0.1, inplace=True)), 52 | ('maxpool3', nn.MaxPool2d(kernel_size=2, stride=2)) 53 | ]))), 54 | ('layer4', nn.Sequential(OrderedDict([ 55 | ('conv4_1', nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1, bias=False)), 56 | ('bn4_1', nn.BatchNorm2d(256)), 57 | ('leaky4_1', nn.LeakyReLU(0.1, inplace=True)), 58 | ('conv4_2', nn.Conv2d(256, 128, kernel_size=1, stride=1, padding=0, bias=False)), 59 | ('bn4_2', nn.BatchNorm2d(128)), 60 | ('leaky4_2', nn.LeakyReLU(0.1, inplace=True)), 61 | ('conv4_3', nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1, bias=False)), 62 | ('bn4_3', nn.BatchNorm2d(256)), 63 | ('leaky4_3', nn.LeakyReLU(0.1, inplace=True)), 64 | ('maxpool4', nn.MaxPool2d(kernel_size=2, stride=2)) 65 | ]))), 66 | ('layer5', nn.Sequential(OrderedDict([ 67 | ('conv5_1', nn.Conv2d(256, 512, kernel_size=3, stride=1, padding=1, bias=False)), 68 | ('bn5_1', nn.BatchNorm2d(512)), 69 | ('leaky5_1', nn.LeakyReLU(0.1, inplace=True)), 70 | ('conv5_2', nn.Conv2d(512, 256, kernel_size=1, stride=1, padding=0, bias=False)), 71 | ('bn5_2', nn.BatchNorm2d(256)), 72 | ('leaky5_2', nn.LeakyReLU(0.1, inplace=True)), 73 | ('conv5_3', nn.Conv2d(256, 512, kernel_size=3, stride=1, padding=1, bias=False)), 74 | ('bn5_3', nn.BatchNorm2d(512)), 75 | ('leaky5_3', nn.LeakyReLU(0.1, inplace=True)), 76 | ('conv5_4', nn.Conv2d(512, 256, kernel_size=1, stride=1, padding=1, bias=False)), 77 | ('bn5_4', nn.BatchNorm2d(256)), 78 | ('leaky5_4', nn.LeakyReLU(0.1, inplace=True)), 79 | ('conv5_5', nn.Conv2d(256, 512, kernel_size=3, stride=1, padding=1, bias=False)), 80 | ('bn5_5', nn.BatchNorm2d(512)), 81 | ('leaky5_5', nn.LeakyReLU(0.1, inplace=True)), 82 | ('maxpool5', nn.MaxPool2d(kernel_size=2, stride=2)) 83 | ]))), 84 | ('layer6', nn.Sequential(OrderedDict([ 85 | ('conv6_1', nn.Conv2d(512, 1024, kernel_size=3, stride=1, padding=1, bias=False)), 86 | ('bn6_1', nn.BatchNorm2d(1024)), 87 | ('leaky6_1', nn.LeakyReLU(0.1, inplace=True)), 88 | ('conv6_2', nn.Conv2d(1024, 512, kernel_size=1, stride=1, padding=0, bias=False)), 89 | ('bn6_2', nn.BatchNorm2d(512)), 90 | ('leaky6_2', nn.LeakyReLU(0.1, inplace=True)), 91 | ('conv6_3', nn.Conv2d(512, 1024, kernel_size=3, stride=1, padding=1, bias=False)), 92 | ('bn6_3', nn.BatchNorm2d(1024)), 93 | ('leaky6_3', nn.LeakyReLU(0.1, inplace=True)), 94 | ('conv6_4', nn.Conv2d(1024, 512, kernel_size=1, stride=1, padding=1, bias=False)), 95 | ('bn6_4', nn.BatchNorm2d(512)), 96 | ('leaky6_4', nn.LeakyReLU(0.1, inplace=True)), 97 | ('conv6_5', nn.Conv2d(512, 1024, kernel_size=3, stride=1, padding=1, bias=False)), 98 | ('bn6_5', nn.BatchNorm2d(1024)), 99 | ('leaky6_5', nn.LeakyReLU(0.1, inplace=True)) 100 | ]))) 101 | ])) 102 | 103 | self.classifier = nn.Sequential(OrderedDict([ 104 | ('conv7_1', nn.Conv2d(1024, 1000, kernel_size=(1, 1), stride=(1, 1))), 105 | ('globalavgpool', GlobalAvgPool2d()), 106 | ('softmax', nn.Softmax(dim=1)) 107 | ])) 108 | 109 | if pretrained: 110 | self.load_state_dict(model_zoo.load_url(model_paths['darknet19'], progress=True)) 111 | print('Model is loaded') 112 | 113 | def forward(self, x): 114 | out = self.features(x) 115 | out = self.classifier(out) 116 | return out 117 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | numpy==1.15.1 2 | matplotlib==2.2.2 3 | torch==1.0.0 4 | torchvision==0.2.1 5 | --------------------------------------------------------------------------------