├── README.md ├── dataset.py ├── image ├── model.png └── per.JPG ├── models-Depthwise-Inception3.py ├── models-Depthwise.py ├── models-paper.py ├── models.py ├── run_demo.ipynb ├── saved_models └── decision_net_100.pth ├── test.py ├── train_decision.py └── train_segment.py /README.md: -------------------------------------------------------------------------------- 1 | # Surface-Defect-Detection 2 | PyTorch implementation of "Segmentation-Based Deep-Learning Approach for Surface-Defect Detection" . 3 | 4 | 5 | 6 | ### Done 7 | 8 | * add Depthwise+Pointwise 9 | * add Inception 10 | * add SE 11 | 12 | Get started quickly [run_demo.ipynb](https://github.com/mengcius/Surface-Defect-Detection/blob/master/run_demo.ipynb) 13 | 14 | 15 | 16 | ### Paper Model 17 | 18 | ![model](./image/model.png) 19 | 20 | 21 | 22 | ### Performance 23 | 24 | ![1577236972283](./image/per.JPG) 25 | 26 | 27 | 28 | Trained model: 29 | 30 | [segment_net_100.pth](https://mengcius.coding.net/s/0d5a3e8f-2305-47c6-a85f-5954e005dfaa) 31 | 32 | [decision_net_100.pth](https://github.com/mengcius/Surface-Defect-Detection/blob/master/saved_models/decision_net_100.pth) 33 | 34 | 35 | DATASET: 36 | 37 | [KolektorSDD_Data](https://mengcius.coding.net/api/share/download/2e3e085d-d26c-4c63-b57d-a3f066443d89) 38 | 39 | 40 | Fork https://github.com/seanXYZ/SegDecNet 41 | 42 | -------------------------------------------------------------------------------- /dataset.py: -------------------------------------------------------------------------------- 1 | import glob 2 | import os 3 | import numpy as np 4 | import cv2 5 | from torch.utils.data import Dataset 6 | from PIL import Image 7 | import torchvision.transforms as transforms 8 | import torchvision.transforms.functional as VF 9 | 10 | class KolektorDataset(Dataset): 11 | def __init__(self, dataRoot, transforms_= None, transforms_mask = None, 12 | subFold="Train_NG", isTrain=True): 13 | 14 | self.isTrain = isTrain 15 | if transforms_mask == None: 16 | self.maskTransform = transforms.Compose([transforms.ToTensor()]) 17 | else: 18 | self.maskTransform = transforms_mask 19 | 20 | if transforms_== None: 21 | self.transform = self.maskTransform 22 | else: 23 | self.transform = transforms_ 24 | 25 | self.imgFiles = sorted(glob.glob(os.path.join(dataRoot, subFold) + "/*.jpg")) 26 | 27 | if isTrain: 28 | self.labelFiles = sorted(glob.glob(os.path.join(dataRoot, subFold) + "/*.bmp")) 29 | 30 | self.len = len(self.imgFiles) 31 | 32 | def __getitem__(self, index): 33 | 34 | idx = index % self.len 35 | if self.isTrain==True: 36 | img = Image.open(self.imgFiles[idx]).convert("RGB") 37 | 38 | #mask = Image.open(self.labelFiles[idx]).convert("RGB") 39 | mat = cv2.imread(self.labelFiles[idx], cv2.IMREAD_GRAYSCALE) 40 | kernel = np.ones((5, 5), np.uint8) # dilate=0、5、9、13、15 41 | matD = cv2.dilate(mat, kernel) 42 | mask = Image.fromarray(matD) # image2 is a PIL image 43 | 44 | if np.random.rand(1) > 0.5: 45 | mask = VF.hflip(mask) 46 | img = VF.hflip(img) 47 | 48 | if np.random.rand(1) > 0.5: 49 | mask = VF.vflip(mask) 50 | img = VF.vflip(img) 51 | 52 | img = self.transform(img) 53 | mask = self.maskTransform(mask) 54 | 55 | return {"img":img, "mask":mask} 56 | else: 57 | img = Image.open(self.imgFiles[idx]).convert("RGB") 58 | img = self.transform(img) 59 | return {"img":img} 60 | 61 | def __len__(self): 62 | return len(self.imgFiles) 63 | -------------------------------------------------------------------------------- /image/model.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengcius/Surface-Defect-Detection/1f42670e55d9ab0d328e139faa17a33c9149ec32/image/model.png -------------------------------------------------------------------------------- /image/per.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengcius/Surface-Defect-Detection/1f42670e55d9ab0d328e139faa17a33c9149ec32/image/per.JPG -------------------------------------------------------------------------------- /models-Depthwise-Inception3.py: -------------------------------------------------------------------------------- 1 | import torch.nn as nn 2 | import torch 3 | import torch.nn.functional as F 4 | 5 | def weights_init_normal(m): 6 | classname = m.__class__.__name__ 7 | if classname.find("Conv2d") != -1: 8 | torch.nn.init.normal_(m.weight.data, 0.0, 0.02) 9 | elif classname.find("BatchNorm2d") != -1: 10 | torch.nn.init.normal_(m.weight.data, 1.0, 0.02) 11 | torch.nn.init.constant_(m.bias.data, 0.0) 12 | elif classname.find("Linear") != -1: 13 | torch.nn.init.constant_(m.weight.data, 0.0) 14 | if m.bias is not None: 15 | torch.nn.init.constant_(m.bias.data, 0.0) 16 | 17 | class InceptionA(nn.Module): 18 | 19 | def __init__(self, in_channels, pool_features, conv_block=None): 20 | super(InceptionA, self).__init__() 21 | if conv_block is None: 22 | conv_block = nn.Conv2d 23 | self.branch1x1 = conv_block(in_channels, 16, kernel_size=1) 24 | 25 | self.branch5x5_1 = conv_block(in_channels, 24, kernel_size=1) 26 | self.branch5x5_2 = conv_block(24, 32, kernel_size=5, padding=2) 27 | 28 | self.branch3x3dbl_1 = conv_block(in_channels, 32, kernel_size=1) 29 | self.branch3x3dbl_2 = conv_block(32, 32, kernel_size=3, padding=1) 30 | self.branch3x3dbl_3 = conv_block(32, 32, kernel_size=3, padding=1) 31 | 32 | self.branch_pool = conv_block(in_channels, pool_features, kernel_size=1) 33 | 34 | def _forward(self, x): 35 | branch1x1 = self.branch1x1(x) 36 | 37 | branch5x5 = self.branch5x5_1(x) 38 | branch5x5 = self.branch5x5_2(branch5x5) 39 | 40 | branch3x3dbl = self.branch3x3dbl_1(x) 41 | branch3x3dbl = self.branch3x3dbl_2(branch3x3dbl) 42 | branch3x3dbl = self.branch3x3dbl_3(branch3x3dbl) 43 | 44 | branch_pool = F.avg_pool2d(x, kernel_size=3, stride=1, padding=1) 45 | branch_pool = self.branch_pool(branch_pool) 46 | 47 | outputs = [branch1x1, branch5x5, branch3x3dbl, branch_pool] 48 | return outputs 49 | 50 | def forward(self, x): 51 | outputs = self._forward(x) 52 | return torch.cat(outputs, 1) 53 | 54 | 55 | class SegmentNet(nn.Module): 56 | def __init__(self, in_channels=3, init_weights=True): 57 | super(SegmentNet, self).__init__() 58 | 59 | # self.conv1 = nn.Conv2d(3, 32, kernel_size=3, stride=1, padding=1, bias=False) 60 | # self.bn1 = nn.BatchNorm2d(32) 61 | 62 | self.layer1 = nn.Sequential( 63 | nn.Conv2d(in_channels, 32, 5, stride=1, padding=2), 64 | nn.BatchNorm2d(32), 65 | nn.ReLU(inplace=True), 66 | nn.Conv2d(32, 32, 5, stride=1, padding=2), 67 | nn.BatchNorm2d(32), 68 | nn.ReLU(inplace=True), 69 | nn.MaxPool2d(2) 70 | ) 71 | 72 | self.Mixed_1b = InceptionA(32, pool_features=2) 73 | # self.Mixed_1c = InceptionA(82, pool_features=2) 74 | 75 | self.layer3 = nn.Sequential( 76 | nn.Conv2d(82, 64, 5, stride=1, padding=2), 77 | nn.BatchNorm2d(64), 78 | nn.ReLU(inplace=True), 79 | nn.Conv2d(64, 64, 5, stride=1, padding=2), 80 | nn.BatchNorm2d(64), 81 | nn.ReLU(inplace=True), 82 | nn.Conv2d(64, 64, 5, stride=1, padding=2), 83 | nn.BatchNorm2d(64), 84 | nn.ReLU(inplace=True), 85 | nn.Conv2d(64, 64, 5, stride=1, padding=2), 86 | nn.BatchNorm2d(64), 87 | nn.ReLU(inplace=True), 88 | nn.MaxPool2d(2) 89 | ) 90 | 91 | self.layer4 = nn.Sequential( 92 | nn.Conv2d(64, 1024, 15, stride=1, padding=7), # 64,1024 93 | nn.BatchNorm2d(1024), 94 | nn.ReLU(inplace=True) 95 | ) 96 | 97 | self.layer5 = nn.Sequential( 98 | nn.Conv2d(1024, 1, 1), 99 | nn.ReLU(inplace=True) 100 | ) 101 | 102 | if init_weights == True: 103 | pass 104 | 105 | def forward(self, x): 106 | x = self.layer1(x) 107 | # x = F.max_pool2d(x, kernel_size=3, stride=2) 108 | 109 | x1 = self.Mixed_1b(x) 110 | x1 = F.max_pool2d(x1, kernel_size=3, stride=2, padding=1) 111 | # print('x1:', x1.shape) 112 | 113 | # x2 = self.Mixed_1c(x1) 114 | # x2 = F.max_pool2d(x2, kernel_size=5, stride=2, padding=2) 115 | # print('x2:', x2.shape) 116 | 117 | # x3 = self.Mixed_1d(x2) 118 | # x3 = F.max_pool2d(x3, kernel_size=5, stride=2, padding=2) 119 | # x3 = self.layers(x) # torch.Size([4, 64, 88, 32]), torch.Size([4, 256, 88, 32]) 120 | # print('x3:', x3.shape) 121 | 122 | x3 = self.layer3(x1) 123 | x4 = self.layer4(x3) # torch.Size([4, 1024, 88, 32]) 124 | x5 = self.layer5(x4) # torch.Size([4, 1, 88, 32]) 125 | # print('x:', x4.shape, x5.shape) 126 | 127 | return {"f":x4, "seg":x5} 128 | 129 | 130 | class DecisionNet(nn.Module): 131 | 132 | def __init__(self, init_weights=True): 133 | super(DecisionNet, self).__init__() 134 | 135 | self.layer1 = nn.Sequential( 136 | # nn.MaxPool2d(2), 137 | 138 | # nn.Conv2d(1025, 8, 5, stride=1, padding=2), 139 | # nn.BatchNorm2d(8), 140 | # nn.ReLU(inplace=True), 141 | # nn.MaxPool2d(2), 142 | 143 | # Depthwise+Pointwise 144 | nn.Conv2d(1025, 1025, kernel_size=5, stride=1, padding=2, groups=1025, bias=False), 145 | nn.BatchNorm2d(1025), 146 | nn.Conv2d(1025, 8, kernel_size=1, stride=1, padding=0, bias=False), 147 | nn.BatchNorm2d(8), 148 | nn.MaxPool2d(2), 149 | 150 | # nn.Conv2d(8, 16, 5, stride=1, padding=2), 151 | # nn.BatchNorm2d(16), 152 | # nn.ReLU(inplace=True), 153 | # # nn.MaxPool2d(2), 154 | 155 | # Depthwise+Pointwise 156 | nn.Conv2d(8, 8, kernel_size=5, stride=1, padding=2, groups=8, bias=False), 157 | nn.BatchNorm2d(8), 158 | nn.Conv2d(8, 16, kernel_size=1, stride=1, padding=0, bias=False), 159 | nn.BatchNorm2d(16), 160 | nn.MaxPool2d(2), 161 | 162 | nn.Conv2d(16, 32, 5, stride=1, padding=2), 163 | nn.BatchNorm2d(32), 164 | nn.ReLU(inplace=True) 165 | ) 166 | 167 | self.fc = nn.Sequential( 168 | nn.Linear(66, 1, bias=False), 169 | nn.Sigmoid() 170 | ) 171 | 172 | if init_weights == True: 173 | pass 174 | 175 | def forward(self, f, s): 176 | xx = torch.cat((f, s), 1) 177 | x1 = self.layer1(xx) 178 | x2 = x1.view(x1.size(0), x1.size(1), -1) 179 | s2 = s.view(s.size(0), s.size(1), -1) 180 | 181 | x_max, x_max_idx = torch.max(x2, dim=2) 182 | x_avg = torch.mean(x2, dim=2) 183 | s_max, s_max_idx = torch.max(s2, dim=2) 184 | s_avg = torch.mean(s2, dim=2) 185 | 186 | y = torch.cat((x_max, x_avg, s_avg, s_max), 1) 187 | y = y.view(y.size(0), -1) 188 | 189 | return self.fc(y) 190 | 191 | 192 | if __name__=='__main__': 193 | 194 | snet = SegmentNet() 195 | dnet = DecisionNet() 196 | img = torch.randn(4, 3, 704, 256) 197 | 198 | snet.eval() 199 | snet = snet.cuda() 200 | dnet = dnet.cuda() 201 | img = img.cuda() 202 | 203 | ret = snet(img) 204 | f = ret["f"] 205 | s = ret["seg"] 206 | 207 | c = dnet(f, s) 208 | print(c) 209 | pass 210 | 211 | -------------------------------------------------------------------------------- /models-Depthwise.py: -------------------------------------------------------------------------------- 1 | import torch.nn as nn 2 | import torch 3 | 4 | 5 | def weights_init_normal(m): 6 | classname = m.__class__.__name__ 7 | if classname.find("Conv2d") != -1: 8 | torch.nn.init.normal_(m.weight.data, 0.0, 0.02) 9 | elif classname.find("BatchNorm2d") != -1: 10 | torch.nn.init.normal_(m.weight.data, 1.0, 0.02) 11 | torch.nn.init.constant_(m.bias.data, 0.0) 12 | elif classname.find("Linear") != -1: 13 | torch.nn.init.constant_(m.weight.data, 0.0) 14 | if m.bias is not None: 15 | torch.nn.init.constant_(m.bias.data, 0.0) 16 | 17 | 18 | class SegmentNet(nn.Module): 19 | def __init__(self, in_channels=3, init_weights=True): 20 | super(SegmentNet, self).__init__() 21 | 22 | self.layer1 = nn.Sequential( 23 | nn.Conv2d(in_channels, 32, 5, stride=1, padding=2), 24 | nn.BatchNorm2d(32), 25 | nn.ReLU(inplace=True), 26 | nn.Conv2d(32, 32, 5, stride=1, padding=2), 27 | nn.BatchNorm2d(32), 28 | nn.ReLU(inplace=True), 29 | nn.MaxPool2d(2) 30 | ) 31 | 32 | self.layer2 = nn.Sequential( 33 | nn.Conv2d(32, 64, 5, stride=1, padding=2), 34 | nn.BatchNorm2d(64), 35 | nn.ReLU(inplace=True), 36 | nn.Conv2d(64, 64, 5, stride=1, padding=2), 37 | nn.BatchNorm2d(64), 38 | nn.ReLU(inplace=True), 39 | nn.Conv2d(64, 64, 5, stride=1, padding=2), 40 | nn.BatchNorm2d(64), 41 | nn.ReLU(inplace=True), 42 | nn.MaxPool2d(2) 43 | ) 44 | 45 | self.layer3 = nn.Sequential( 46 | nn.Conv2d(64, 64, 5, stride=1, padding=2), 47 | nn.BatchNorm2d(64), 48 | nn.ReLU(inplace=True), 49 | nn.Conv2d(64, 64, 5, stride=1, padding=2), 50 | nn.BatchNorm2d(64), 51 | nn.ReLU(inplace=True), 52 | nn.Conv2d(64, 64, 5, stride=1, padding=2), 53 | nn.BatchNorm2d(64), 54 | nn.ReLU(inplace=True), 55 | nn.Conv2d(64, 64, 5, stride=1, padding=2), 56 | nn.BatchNorm2d(64), 57 | nn.ReLU(inplace=True), 58 | nn.MaxPool2d(2) 59 | ) 60 | 61 | self.layer4 = nn.Sequential( 62 | nn.Conv2d(64, 1024, 15, stride=1, padding=7), 63 | nn.BatchNorm2d(1024), 64 | nn.ReLU(inplace=True) 65 | ) 66 | 67 | self.layer5 = nn.Sequential( 68 | nn.Conv2d(1024, 1, 1), 69 | nn.ReLU(inplace=True) 70 | ) 71 | 72 | if init_weights == True: 73 | pass 74 | 75 | def forward(self, x): 76 | x1 = self.layer1(x) 77 | x2 = self.layer2(x1) 78 | x3 = self.layer3(x2) 79 | x4 = self.layer4(x3) 80 | x5 = self.layer5(x4) 81 | 82 | return {"f":x4, "seg":x5} 83 | 84 | 85 | class DecisionNet(nn.Module): 86 | 87 | def __init__(self, init_weights=True): 88 | super(DecisionNet, self).__init__() 89 | 90 | self.layer1 = nn.Sequential( 91 | # nn.MaxPool2d(2), 92 | 93 | # nn.Conv2d(1025, 8, 5, stride=1, padding=2), 94 | # nn.BatchNorm2d(8), 95 | # nn.ReLU(inplace=True), 96 | # nn.MaxPool2d(2), 97 | 98 | # Depthwise+Pointwise 99 | nn.Conv2d(1025, 1025, kernel_size=5, stride=1, padding=2, groups=1025, bias=False), 100 | nn.BatchNorm2d(1025), 101 | nn.Conv2d(1025, 8, kernel_size=1, stride=1, padding=0, bias=False), 102 | nn.BatchNorm2d(8), 103 | nn.MaxPool2d(2), 104 | 105 | # nn.Conv2d(8, 16, 5, stride=1, padding=2), 106 | # nn.BatchNorm2d(16), 107 | # nn.ReLU(inplace=True), 108 | # # nn.MaxPool2d(2), 109 | 110 | # Depthwise+Pointwise 111 | nn.Conv2d(8, 8, kernel_size=5, stride=1, padding=2, groups=8, bias=False), 112 | nn.BatchNorm2d(8), 113 | nn.Conv2d(8, 16, kernel_size=1, stride=1, padding=0, bias=False), 114 | nn.BatchNorm2d(16), 115 | nn.MaxPool2d(2), 116 | 117 | nn.Conv2d(16, 32, 5, stride=1, padding=2), 118 | nn.BatchNorm2d(32), 119 | nn.ReLU(inplace=True) 120 | ) 121 | 122 | self.fc = nn.Sequential( 123 | nn.Linear(66, 1, bias=False), 124 | nn.Sigmoid() 125 | ) 126 | 127 | if init_weights == True: 128 | pass 129 | 130 | def forward(self, f, s): 131 | xx = torch.cat((f, s), 1) 132 | x1 = self.layer1(xx) 133 | x2 = x1.view(x1.size(0), x1.size(1), -1) 134 | s2 = s.view(s.size(0), s.size(1), -1) 135 | 136 | x_max, x_max_idx = torch.max(x2, dim=2) 137 | x_avg = torch.mean(x2, dim=2) 138 | s_max, s_max_idx = torch.max(s2, dim=2) 139 | s_avg = torch.mean(s2, dim=2) 140 | 141 | y = torch.cat((x_max, x_avg, s_avg, s_max), 1) 142 | y = y.view(y.size(0), -1) 143 | 144 | return self.fc(y) 145 | 146 | 147 | if __name__=='__main__': 148 | 149 | snet = SegmentNet() 150 | dnet = DecisionNet() 151 | img = torch.randn(4, 3, 704, 256) 152 | 153 | snet.eval() 154 | snet = snet.cuda() 155 | dnet = dnet.cuda() 156 | img = img.cuda() 157 | 158 | ret = snet(img) 159 | f = ret["f"] 160 | s = ret["seg"] 161 | 162 | c = dnet(f, s) 163 | print(c) 164 | pass 165 | 166 | 167 | 168 | -------------------------------------------------------------------------------- /models-paper.py: -------------------------------------------------------------------------------- 1 | import torch.nn as nn 2 | import torch 3 | 4 | 5 | def weights_init_normal(m): 6 | classname = m.__class__.__name__ 7 | if classname.find("Conv2d") != -1: 8 | torch.nn.init.normal_(m.weight.data, 0.0, 0.02) 9 | elif classname.find("BatchNorm2d") != -1: 10 | torch.nn.init.normal_(m.weight.data, 1.0, 0.02) 11 | torch.nn.init.constant_(m.bias.data, 0.0) 12 | elif classname.find("Linear") != -1: 13 | torch.nn.init.constant_(m.weight.data, 0.0) 14 | if m.bias is not None: 15 | torch.nn.init.constant_(m.bias.data, 0.0) 16 | 17 | 18 | class SegmentNet(nn.Module): 19 | def __init__(self, in_channels=3, init_weights=True): 20 | super(SegmentNet, self).__init__() 21 | 22 | self.layer1 = nn.Sequential( 23 | nn.Conv2d(in_channels, 32, 5, stride=1, padding=2), 24 | nn.BatchNorm2d(32), 25 | nn.ReLU(inplace=True), 26 | nn.Conv2d(32, 32, 5, stride=1, padding=2), 27 | nn.BatchNorm2d(32), 28 | nn.ReLU(inplace=True), 29 | nn.MaxPool2d(2) 30 | ) 31 | 32 | self.layer2 = nn.Sequential( 33 | nn.Conv2d(32, 64, 5, stride=1, padding=2), 34 | nn.BatchNorm2d(64), 35 | nn.ReLU(inplace=True), 36 | nn.Conv2d(64, 64, 5, stride=1, padding=2), 37 | nn.BatchNorm2d(64), 38 | nn.ReLU(inplace=True), 39 | nn.Conv2d(64, 64, 5, stride=1, padding=2), 40 | nn.BatchNorm2d(64), 41 | nn.ReLU(inplace=True), 42 | nn.MaxPool2d(2) 43 | ) 44 | 45 | self.layer3 = nn.Sequential( 46 | nn.Conv2d(64, 64, 5, stride=1, padding=2), 47 | nn.BatchNorm2d(64), 48 | nn.ReLU(inplace=True), 49 | nn.Conv2d(64, 64, 5, stride=1, padding=2), 50 | nn.BatchNorm2d(64), 51 | nn.ReLU(inplace=True), 52 | nn.Conv2d(64, 64, 5, stride=1, padding=2), 53 | nn.BatchNorm2d(64), 54 | nn.ReLU(inplace=True), 55 | nn.Conv2d(64, 64, 5, stride=1, padding=2), 56 | nn.BatchNorm2d(64), 57 | nn.ReLU(inplace=True), 58 | nn.MaxPool2d(2) 59 | ) 60 | 61 | self.layer4 = nn.Sequential( 62 | nn.Conv2d(64, 1024, 15, stride=1, padding=7), 63 | nn.BatchNorm2d(1024), 64 | nn.ReLU(inplace=True) 65 | ) 66 | 67 | self.layer5 = nn.Sequential( 68 | nn.Conv2d(1024, 1, 1), 69 | nn.ReLU(inplace=True) 70 | ) 71 | 72 | if init_weights == True: 73 | pass 74 | 75 | def forward(self, x): 76 | x1 = self.layer1(x) 77 | x2 = self.layer2(x1) 78 | x3 = self.layer3(x2) 79 | x4 = self.layer4(x3) 80 | x5 = self.layer5(x4) 81 | 82 | return {"f":x4, "seg":x5} 83 | 84 | 85 | class DecisionNet(nn.Module): 86 | 87 | def __init__(self, init_weights=True): 88 | super(DecisionNet, self).__init__() 89 | 90 | self.layer1 = nn.Sequential( 91 | nn.MaxPool2d(2), 92 | nn.Conv2d(1025, 8, 5, stride=1, padding=2), 93 | nn.BatchNorm2d(8), 94 | nn.ReLU(inplace=True), 95 | nn.MaxPool2d(2), 96 | nn.Conv2d(8, 16, 5, stride=1, padding=2), 97 | nn.BatchNorm2d(16), 98 | nn.ReLU(inplace=True), 99 | nn.Conv2d(16, 32, 5, stride=1, padding=2), 100 | nn.BatchNorm2d(32), 101 | nn.ReLU(inplace=True) 102 | ) 103 | 104 | self.fc = nn.Sequential( 105 | nn.Linear(66, 1, bias=False), 106 | nn.Sigmoid() 107 | ) 108 | 109 | if init_weights == True: 110 | pass 111 | 112 | def forward(self, f, s): 113 | xx = torch.cat((f, s), 1) 114 | x1 = self.layer1(xx) 115 | x2 = x1.view(x1.size(0), x1.size(1), -1) 116 | s2 = s.view(s.size(0), s.size(1), -1) 117 | 118 | x_max, x_max_idx = torch.max(x2, dim=2) 119 | x_avg = torch.mean(x2, dim=2) 120 | s_max, s_max_idx = torch.max(s2, dim=2) 121 | s_avg = torch.mean(s2, dim=2) 122 | 123 | y = torch.cat((x_max, x_avg, s_avg, s_max), 1) 124 | y = y.view(y.size(0), -1) 125 | 126 | return self.fc(y) 127 | 128 | 129 | if __name__=='__main__': 130 | 131 | snet = SegmentNet() 132 | dnet = DecisionNet() 133 | img = torch.randn(4, 3, 704, 256) 134 | 135 | snet.eval() 136 | snet = snet.cuda() 137 | dnet = dnet.cuda() 138 | img = img.cuda() 139 | 140 | ret = snet(img) 141 | f = ret["f"] 142 | s = ret["seg"] 143 | 144 | c = dnet(f, s) 145 | print(c) 146 | pass 147 | 148 | 149 | 150 | -------------------------------------------------------------------------------- /models.py: -------------------------------------------------------------------------------- 1 | # Depthwise+SE 2 | import torch.nn as nn 3 | import torch 4 | import torch.nn.functional as F 5 | 6 | def weights_init_normal(m): 7 | classname = m.__class__.__name__ 8 | if classname.find("Conv2d") != -1: 9 | torch.nn.init.normal_(m.weight.data, 0.0, 0.02) 10 | elif classname.find("BatchNorm2d") != -1: 11 | torch.nn.init.normal_(m.weight.data, 1.0, 0.02) 12 | torch.nn.init.constant_(m.bias.data, 0.0) 13 | elif classname.find("Linear") != -1: 14 | torch.nn.init.constant_(m.weight.data, 0.0) 15 | if m.bias is not None: 16 | torch.nn.init.constant_(m.bias.data, 0.0) 17 | 18 | 19 | class SegmentNet(nn.Module): 20 | def __init__(self, in_channels=3, init_weights=True): 21 | super(SegmentNet, self).__init__() 22 | 23 | self.layer1 = nn.Sequential( 24 | nn.Conv2d(in_channels, 32, 5, stride=1, padding=2), 25 | nn.BatchNorm2d(32), 26 | nn.ReLU(inplace=True), 27 | nn.Conv2d(32, 32, 5, stride=1, padding=2), 28 | nn.BatchNorm2d(32), 29 | nn.ReLU(inplace=True), 30 | nn.MaxPool2d(2) 31 | ) 32 | 33 | self.layer2 = nn.Sequential( 34 | nn.Conv2d(32, 64, 5, stride=1, padding=2), 35 | nn.BatchNorm2d(64), 36 | nn.ReLU(inplace=True), 37 | nn.Conv2d(64, 64, 5, stride=1, padding=2), 38 | nn.BatchNorm2d(64), 39 | nn.ReLU(inplace=True), 40 | nn.Conv2d(64, 64, 5, stride=1, padding=2), 41 | nn.BatchNorm2d(64), 42 | nn.ReLU(inplace=True), 43 | nn.MaxPool2d(2) 44 | ) 45 | 46 | self.layer3 = nn.Sequential( 47 | nn.Conv2d(64, 64, 5, stride=1, padding=2), 48 | nn.BatchNorm2d(64), 49 | nn.ReLU(inplace=True), 50 | nn.Conv2d(64, 64, 5, stride=1, padding=2), 51 | nn.BatchNorm2d(64), 52 | nn.ReLU(inplace=True), 53 | nn.Conv2d(64, 64, 5, stride=1, padding=2), 54 | nn.BatchNorm2d(64), 55 | nn.ReLU(inplace=True), 56 | nn.Conv2d(64, 64, 5, stride=1, padding=2), 57 | nn.BatchNorm2d(64), 58 | nn.ReLU(inplace=True), 59 | nn.MaxPool2d(2) 60 | ) 61 | 62 | # SE layers 63 | self.fc1 = nn.Conv2d(64, 64//16, kernel_size=1) 64 | self.fc2 = nn.Conv2d(64//16, 64, kernel_size=1) 65 | 66 | self.layer4 = nn.Sequential( 67 | nn.Conv2d(64, 1024, 15, stride=1, padding=7), 68 | nn.BatchNorm2d(1024), 69 | nn.ReLU(inplace=True) 70 | ) 71 | 72 | self.layer5 = nn.Sequential( 73 | nn.Conv2d(1024, 1, 1), 74 | nn.ReLU(inplace=True) 75 | ) 76 | 77 | 78 | if init_weights == True: 79 | pass 80 | 81 | def forward(self, x): 82 | x1 = self.layer1(x) 83 | x2 = self.layer2(x1) 84 | x3 = self.layer3(x2) 85 | 86 | # Squeeze 87 | w = F.avg_pool2d(x3, x3.size(2)) 88 | w = F.relu(self.fc1(w)) 89 | w = torch.sigmoid(self.fc2(w)) 90 | # Excitation 91 | x3 = x3 * w 92 | 93 | x4 = self.layer4(x3) 94 | x5 = self.layer5(x4) 95 | # print('x:', x4.shape, x5.shape) 96 | 97 | return {"f":x4, "seg":x5} 98 | 99 | 100 | class DecisionNet(nn.Module): 101 | 102 | def __init__(self, init_weights=True): 103 | super(DecisionNet, self).__init__() 104 | 105 | self.layer1 = nn.Sequential( 106 | # nn.MaxPool2d(2), 107 | 108 | # Depthwise+Pointwise 109 | nn.Conv2d(1025, 1025, kernel_size=5, stride=1, padding=2, groups=1025, bias=False), 110 | nn.BatchNorm2d(1025), 111 | nn.Conv2d(1025, 8, kernel_size=1, stride=1, padding=0, bias=False), 112 | nn.BatchNorm2d(8), 113 | nn.MaxPool2d(2), 114 | 115 | # Depthwise+Pointwise 116 | nn.Conv2d(8, 8, kernel_size=5, stride=1, padding=2, groups=8, bias=False), 117 | nn.BatchNorm2d(8), 118 | nn.Conv2d(8, 16, kernel_size=1, stride=1, padding=0, bias=False), 119 | nn.BatchNorm2d(16), 120 | nn.MaxPool2d(2), 121 | 122 | nn.Conv2d(16, 32, 5, stride=1, padding=2), 123 | nn.BatchNorm2d(32), 124 | nn.ReLU(inplace=True) 125 | ) 126 | 127 | self.fc = nn.Sequential( 128 | nn.Linear(66, 1, bias=False), 129 | nn.Sigmoid() 130 | ) 131 | 132 | if init_weights == True: 133 | pass 134 | 135 | def forward(self, f, s): 136 | xx = torch.cat((f, s), 1) 137 | x1 = self.layer1(xx) 138 | x2 = x1.view(x1.size(0), x1.size(1), -1) 139 | s2 = s.view(s.size(0), s.size(1), -1) 140 | 141 | x_max, x_max_idx = torch.max(x2, dim=2) 142 | x_avg = torch.mean(x2, dim=2) 143 | s_max, s_max_idx = torch.max(s2, dim=2) 144 | s_avg = torch.mean(s2, dim=2) 145 | 146 | y = torch.cat((x_max, x_avg, s_avg, s_max), 1) 147 | y = y.view(y.size(0), -1) 148 | 149 | return self.fc(y) 150 | 151 | 152 | if __name__=='__main__': 153 | 154 | snet = SegmentNet() 155 | dnet = DecisionNet() 156 | img = torch.randn(4, 3, 704, 256) 157 | 158 | snet.eval() 159 | snet = snet.cuda() 160 | dnet = dnet.cuda() 161 | img = img.cuda() 162 | 163 | ret = snet(img) 164 | f = ret["f"] 165 | s = ret["seg"] 166 | 167 | c = dnet(f, s) 168 | print(c) 169 | pass 170 | 171 | 172 | 173 | -------------------------------------------------------------------------------- /run_demo.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## 表面缺陷检测\n", 8 | "\n", 9 | "\n", 10 | "### 划分好的KolektorSDD数据集" 11 | ] 12 | }, 13 | { 14 | "cell_type": "code", 15 | "execution_count": 1, 16 | "metadata": { 17 | "colab": { 18 | "base_uri": "https://localhost:8080/", 19 | "height": 1000 20 | }, 21 | "colab_type": "code", 22 | "id": "_IRZq6frzDc2", 23 | "outputId": "6942f01f-ffed-495c-df8b-4d249d95f129" 24 | }, 25 | "outputs": [ 26 | { 27 | "name": "stdout", 28 | "output_type": "stream", 29 | "text": [ 30 | "--2019-12-24 10:37:52-- https://mengcius.coding.net/api/share/download/2e3e085d-d26c-4c63-b57d-a3f066443d89\n", 31 | "Resolving mengcius.coding.net (mengcius.coding.net)... 118.126.70.252\n", 32 | "Connecting to mengcius.coding.net (mengcius.coding.net)|118.126.70.252|:443... connected.\n", 33 | "HTTP request sent, awaiting response... 302 Found\n", 34 | "Location: http://coding-net-production-file-1257242599.cos.ap-shanghai.myqcloud.com/8f337510-261e-11ea-90b7-8dff683e72c8.zip?sign=q-sign-algorithm%3Dsha1%26q-ak%3DAKIDay83lFmaS6Y4LTdzMVO1SdZOyJSNOYpr%26q-sign-time%3D1577201872%3B1577205472%26q-key-time%3D1577201872%3B1577205472%26q-header-list%3D%26q-url-param-list%3Dresponse-content-disposition%3Bresponse-expires%26q-signature%3D97733c7c9a70e8c3c9f00f6aaa263b0df28f19ea&response-content-disposition=attachment%3Bfilename%3DKolektorSDD_Data.zip&response-expires=Fri%2C%2027%20Dec%202019%2003%3A37%3A52%20GMT [following]\n", 35 | "--2019-12-24 10:37:53-- http://coding-net-production-file-1257242599.cos.ap-shanghai.myqcloud.com/8f337510-261e-11ea-90b7-8dff683e72c8.zip?sign=q-sign-algorithm%3Dsha1%26q-ak%3DAKIDay83lFmaS6Y4LTdzMVO1SdZOyJSNOYpr%26q-sign-time%3D1577201872%3B1577205472%26q-key-time%3D1577201872%3B1577205472%26q-header-list%3D%26q-url-param-list%3Dresponse-content-disposition%3Bresponse-expires%26q-signature%3D97733c7c9a70e8c3c9f00f6aaa263b0df28f19ea&response-content-disposition=attachment%3Bfilename%3DKolektorSDD_Data.zip&response-expires=Fri%2C%2027%20Dec%202019%2003%3A37%3A52%20GMT\n", 36 | "Resolving coding-net-production-file-1257242599.cos.ap-shanghai.myqcloud.com (coding-net-production-file-1257242599.cos.ap-shanghai.myqcloud.com)... 119.28.38.63, 119.28.206.40\n", 37 | "Connecting to coding-net-production-file-1257242599.cos.ap-shanghai.myqcloud.com (coding-net-production-file-1257242599.cos.ap-shanghai.myqcloud.com)|119.28.38.63|:80... connected.\n", 38 | "HTTP request sent, awaiting response... 200 OK\n", 39 | "Length: 101986944 (97M) [application/zip]\n", 40 | "Saving to: './KolektorSDD_Data.zip'\n", 41 | "\n", 42 | "./KolektorSDD_Data. 100%[===================>] 97.26M 7.91MB/s in 20s \n", 43 | "\n", 44 | "2019-12-24 10:38:14 (4.96 MB/s) - './KolektorSDD_Data.zip' saved [101986944/101986944]\n", 45 | "\n", 46 | "Archive: KolektorSDD_Data.zip\n", 47 | " creating: KolektorSDD_Data/Test/\n", 48 | " creating: KolektorSDD_Data/Test/Train_NG/\n", 49 | " inflating: KolektorSDD_Data/Test/Train_NG/kos02_Part6.jpg \n", 50 | " inflating: KolektorSDD_Data/Test/Train_NG/kos02_Part6_label.bmp \n", 51 | " inflating: KolektorSDD_Data/Test/Train_NG/kos03_Part2.jpg \n", 52 | " inflating: KolektorSDD_Data/Test/Train_NG/kos03_Part2_label.bmp \n", 53 | " inflating: KolektorSDD_Data/Test/Train_NG/kos04_Part3.jpg \n", 54 | " inflating: KolektorSDD_Data/Test/Train_NG/kos04_Part3_label.bmp \n", 55 | " inflating: KolektorSDD_Data/Test/Train_NG/kos05_Part5.jpg \n", 56 | " inflating: KolektorSDD_Data/Test/Train_NG/kos05_Part5_label.bmp \n", 57 | " inflating: KolektorSDD_Data/Test/Train_NG/kos07_Part1.jpg \n", 58 | " inflating: KolektorSDD_Data/Test/Train_NG/kos07_Part1_label.bmp \n", 59 | " inflating: KolektorSDD_Data/Test/Train_NG/kos08_Part2.jpg \n", 60 | " inflating: KolektorSDD_Data/Test/Train_NG/kos08_Part2_label.bmp \n", 61 | " inflating: KolektorSDD_Data/Test/Train_NG/kos10_Part3.jpg \n", 62 | " inflating: KolektorSDD_Data/Test/Train_NG/kos10_Part3_label.bmp \n", 63 | " inflating: KolektorSDD_Data/Test/Train_NG/kos21_Part5.jpg \n", 64 | " inflating: KolektorSDD_Data/Test/Train_NG/kos21_Part5_label.bmp \n", 65 | " inflating: KolektorSDD_Data/Test/Train_NG/kos22_Part6.jpg \n", 66 | " inflating: KolektorSDD_Data/Test/Train_NG/kos22_Part6_label.bmp \n", 67 | " inflating: KolektorSDD_Data/Test/Train_NG/kos23_Part6.jpg \n", 68 | " inflating: KolektorSDD_Data/Test/Train_NG/kos23_Part6_label.bmp \n", 69 | " inflating: KolektorSDD_Data/Test/Train_NG/kos24_Part1.jpg \n", 70 | " inflating: KolektorSDD_Data/Test/Train_NG/kos24_Part1_label.bmp \n", 71 | " inflating: KolektorSDD_Data/Test/Train_NG/kos37_Part0.jpg \n", 72 | " inflating: KolektorSDD_Data/Test/Train_NG/kos37_Part0_label.bmp \n", 73 | " inflating: KolektorSDD_Data/Test/Train_NG/kos38_Part1.jpg \n", 74 | " inflating: KolektorSDD_Data/Test/Train_NG/kos38_Part1_label.bmp \n", 75 | " inflating: KolektorSDD_Data/Test/Train_NG/kos39_Part6.jpg \n", 76 | " inflating: KolektorSDD_Data/Test/Train_NG/kos39_Part6_label.bmp \n", 77 | " inflating: KolektorSDD_Data/Test/Train_NG/kos48_Part5.jpg \n", 78 | " inflating: KolektorSDD_Data/Test/Train_NG/kos48_Part5_label.bmp \n", 79 | " inflating: KolektorSDD_Data/Test/Train_NG/kos49_Part2.jpg \n", 80 | " inflating: KolektorSDD_Data/Test/Train_NG/kos49_Part2_label.bmp \n", 81 | " inflating: KolektorSDD_Data/Test/Train_NG/kos50_Part4.jpg \n", 82 | " inflating: KolektorSDD_Data/Test/Train_NG/kos50_Part4_label.bmp \n", 83 | " creating: KolektorSDD_Data/Test/Train_OK/\n", 84 | " inflating: KolektorSDD_Data/Test/Train_OK/kos02_Part7.jpg \n", 85 | " inflating: KolektorSDD_Data/Test/Train_OK/kos02_Part7_label.bmp \n", 86 | " inflating: KolektorSDD_Data/Test/Train_OK/kos03_Part0.jpg \n", 87 | " inflating: KolektorSDD_Data/Test/Train_OK/kos03_Part0_label.bmp \n", 88 | " inflating: KolektorSDD_Data/Test/Train_OK/kos03_Part1.jpg \n", 89 | " inflating: KolektorSDD_Data/Test/Train_OK/kos03_Part1_label.bmp \n", 90 | " inflating: KolektorSDD_Data/Test/Train_OK/kos03_Part3.jpg \n", 91 | " inflating: KolektorSDD_Data/Test/Train_OK/kos03_Part3_label.bmp \n", 92 | " inflating: KolektorSDD_Data/Test/Train_OK/kos03_Part4.jpg \n", 93 | " inflating: KolektorSDD_Data/Test/Train_OK/kos03_Part4_label.bmp \n", 94 | " inflating: KolektorSDD_Data/Test/Train_OK/kos03_Part6.jpg \n", 95 | " inflating: KolektorSDD_Data/Test/Train_OK/kos03_Part6_label.bmp \n", 96 | " inflating: KolektorSDD_Data/Test/Train_OK/kos03_Part7.jpg \n", 97 | " inflating: KolektorSDD_Data/Test/Train_OK/kos03_Part7_label.bmp \n", 98 | " inflating: KolektorSDD_Data/Test/Train_OK/kos04_Part0.jpg \n", 99 | " inflating: KolektorSDD_Data/Test/Train_OK/kos04_Part0_label.bmp \n", 100 | " inflating: KolektorSDD_Data/Test/Train_OK/kos04_Part1.jpg \n", 101 | " inflating: KolektorSDD_Data/Test/Train_OK/kos04_Part1_label.bmp \n", 102 | " inflating: KolektorSDD_Data/Test/Train_OK/kos04_Part2.jpg \n", 103 | " inflating: KolektorSDD_Data/Test/Train_OK/kos04_Part2_label.bmp \n", 104 | " inflating: KolektorSDD_Data/Test/Train_OK/kos04_Part4.jpg \n", 105 | " inflating: KolektorSDD_Data/Test/Train_OK/kos04_Part4_label.bmp \n", 106 | " inflating: KolektorSDD_Data/Test/Train_OK/kos04_Part5.jpg \n", 107 | " inflating: KolektorSDD_Data/Test/Train_OK/kos04_Part5_label.bmp \n", 108 | " inflating: KolektorSDD_Data/Test/Train_OK/kos04_Part6.jpg \n", 109 | " inflating: KolektorSDD_Data/Test/Train_OK/kos04_Part6_label.bmp \n", 110 | " inflating: KolektorSDD_Data/Test/Train_OK/kos04_Part7.jpg \n", 111 | " inflating: KolektorSDD_Data/Test/Train_OK/kos04_Part7_label.bmp \n", 112 | " inflating: KolektorSDD_Data/Test/Train_OK/kos05_Part0.jpg \n", 113 | " inflating: KolektorSDD_Data/Test/Train_OK/kos05_Part0_label.bmp \n", 114 | " inflating: KolektorSDD_Data/Test/Train_OK/kos05_Part1.jpg \n", 115 | " inflating: KolektorSDD_Data/Test/Train_OK/kos05_Part1_label.bmp \n", 116 | " inflating: KolektorSDD_Data/Test/Train_OK/kos05_Part2.jpg \n", 117 | " inflating: KolektorSDD_Data/Test/Train_OK/kos05_Part2_label.bmp \n", 118 | " inflating: KolektorSDD_Data/Test/Train_OK/kos05_Part3.jpg \n", 119 | " inflating: KolektorSDD_Data/Test/Train_OK/kos05_Part3_label.bmp \n", 120 | " inflating: KolektorSDD_Data/Test/Train_OK/kos05_Part4.jpg \n", 121 | " inflating: KolektorSDD_Data/Test/Train_OK/kos05_Part4_label.bmp \n", 122 | " inflating: KolektorSDD_Data/Test/Train_OK/kos05_Part6.jpg \n", 123 | " inflating: KolektorSDD_Data/Test/Train_OK/kos05_Part6_label.bmp \n", 124 | " inflating: KolektorSDD_Data/Test/Train_OK/kos05_Part7.jpg \n", 125 | " inflating: KolektorSDD_Data/Test/Train_OK/kos05_Part7_label.bmp \n", 126 | " inflating: KolektorSDD_Data/Test/Train_OK/kos06_Part0.jpg \n", 127 | " inflating: KolektorSDD_Data/Test/Train_OK/kos06_Part0_label.bmp \n", 128 | " inflating: KolektorSDD_Data/Test/Train_OK/kos06_Part2.jpg \n", 129 | " inflating: KolektorSDD_Data/Test/Train_OK/kos06_Part2_label.bmp \n", 130 | " inflating: KolektorSDD_Data/Test/Train_OK/kos06_Part4.jpg \n", 131 | " inflating: KolektorSDD_Data/Test/Train_OK/kos06_Part4_label.bmp \n", 132 | " inflating: KolektorSDD_Data/Test/Train_OK/kos07_Part5.jpg \n", 133 | " inflating: KolektorSDD_Data/Test/Train_OK/kos07_Part5_label.bmp \n", 134 | " inflating: KolektorSDD_Data/Test/Train_OK/kos07_Part6.jpg \n", 135 | " inflating: KolektorSDD_Data/Test/Train_OK/kos07_Part6_label.bmp \n", 136 | " inflating: KolektorSDD_Data/Test/Train_OK/kos08_Part0.jpg \n", 137 | " inflating: KolektorSDD_Data/Test/Train_OK/kos08_Part0_label.bmp \n", 138 | " inflating: KolektorSDD_Data/Test/Train_OK/kos08_Part1.jpg \n", 139 | " inflating: KolektorSDD_Data/Test/Train_OK/kos08_Part1_label.bmp \n", 140 | " inflating: KolektorSDD_Data/Test/Train_OK/kos08_Part5.jpg \n", 141 | " inflating: KolektorSDD_Data/Test/Train_OK/kos08_Part5_label.bmp \n", 142 | " inflating: KolektorSDD_Data/Test/Train_OK/kos08_Part6.jpg \n", 143 | " inflating: KolektorSDD_Data/Test/Train_OK/kos08_Part6_label.bmp \n", 144 | " inflating: KolektorSDD_Data/Test/Train_OK/kos09_Part1.jpg \n", 145 | " inflating: KolektorSDD_Data/Test/Train_OK/kos09_Part1_label.bmp \n", 146 | " inflating: KolektorSDD_Data/Test/Train_OK/kos09_Part2.jpg \n", 147 | " inflating: KolektorSDD_Data/Test/Train_OK/kos09_Part2_label.bmp \n", 148 | " inflating: KolektorSDD_Data/Test/Train_OK/kos09_Part3.jpg \n", 149 | " inflating: KolektorSDD_Data/Test/Train_OK/kos09_Part3_label.bmp \n", 150 | " inflating: KolektorSDD_Data/Test/Train_OK/kos09_Part4.jpg \n", 151 | " inflating: KolektorSDD_Data/Test/Train_OK/kos09_Part4_label.bmp \n", 152 | " inflating: KolektorSDD_Data/Test/Train_OK/kos09_Part7.jpg \n", 153 | " inflating: KolektorSDD_Data/Test/Train_OK/kos09_Part7_label.bmp \n", 154 | " inflating: KolektorSDD_Data/Test/Train_OK/kos10_Part0.jpg \n", 155 | " inflating: KolektorSDD_Data/Test/Train_OK/kos10_Part0_label.bmp \n", 156 | " inflating: KolektorSDD_Data/Test/Train_OK/kos10_Part4.jpg \n", 157 | " inflating: KolektorSDD_Data/Test/Train_OK/kos10_Part4_label.bmp \n" 158 | ] 159 | }, 160 | { 161 | "name": "stdout", 162 | "output_type": "stream", 163 | "text": [ 164 | " inflating: KolektorSDD_Data/Test/Train_OK/kos10_Part7.jpg \n", 165 | " inflating: KolektorSDD_Data/Test/Train_OK/kos10_Part7_label.bmp \n", 166 | " inflating: KolektorSDD_Data/Test/Train_OK/kos11_Part1.jpg \n", 167 | " inflating: KolektorSDD_Data/Test/Train_OK/kos11_Part1_label.bmp \n", 168 | " inflating: KolektorSDD_Data/Test/Train_OK/kos11_Part2.jpg \n", 169 | " inflating: KolektorSDD_Data/Test/Train_OK/kos11_Part2_label.bmp \n", 170 | " inflating: KolektorSDD_Data/Test/Train_OK/kos11_Part6.jpg \n", 171 | " inflating: KolektorSDD_Data/Test/Train_OK/kos11_Part6_label.bmp \n", 172 | " inflating: KolektorSDD_Data/Test/Train_OK/kos12_Part1.jpg \n", 173 | " inflating: KolektorSDD_Data/Test/Train_OK/kos12_Part1_label.bmp \n", 174 | " inflating: KolektorSDD_Data/Test/Train_OK/kos20_Part6.jpg \n", 175 | " inflating: KolektorSDD_Data/Test/Train_OK/kos20_Part6_label.bmp \n", 176 | " inflating: KolektorSDD_Data/Test/Train_OK/kos20_Part7.jpg \n", 177 | " inflating: KolektorSDD_Data/Test/Train_OK/kos20_Part7_label.bmp \n", 178 | " inflating: KolektorSDD_Data/Test/Train_OK/kos21_Part0.jpg \n", 179 | " inflating: KolektorSDD_Data/Test/Train_OK/kos21_Part0_label.bmp \n", 180 | " inflating: KolektorSDD_Data/Test/Train_OK/kos21_Part1.jpg \n", 181 | " inflating: KolektorSDD_Data/Test/Train_OK/kos21_Part1_label.bmp \n", 182 | " inflating: KolektorSDD_Data/Test/Train_OK/kos21_Part2.jpg \n", 183 | " inflating: KolektorSDD_Data/Test/Train_OK/kos21_Part2_label.bmp \n", 184 | " inflating: KolektorSDD_Data/Test/Train_OK/kos21_Part3.jpg \n", 185 | " inflating: KolektorSDD_Data/Test/Train_OK/kos21_Part3_label.bmp \n", 186 | " inflating: KolektorSDD_Data/Test/Train_OK/kos21_Part4.jpg \n", 187 | " inflating: KolektorSDD_Data/Test/Train_OK/kos21_Part4_label.bmp \n", 188 | " inflating: KolektorSDD_Data/Test/Train_OK/kos21_Part6.jpg \n", 189 | " inflating: KolektorSDD_Data/Test/Train_OK/kos21_Part6_label.bmp \n", 190 | " inflating: KolektorSDD_Data/Test/Train_OK/kos22_Part0.jpg \n", 191 | " inflating: KolektorSDD_Data/Test/Train_OK/kos22_Part0_label.bmp \n", 192 | " inflating: KolektorSDD_Data/Test/Train_OK/kos22_Part1.jpg \n", 193 | " inflating: KolektorSDD_Data/Test/Train_OK/kos22_Part1_label.bmp \n", 194 | " inflating: KolektorSDD_Data/Test/Train_OK/kos22_Part2.jpg \n", 195 | " inflating: KolektorSDD_Data/Test/Train_OK/kos22_Part2_label.bmp \n", 196 | " inflating: KolektorSDD_Data/Test/Train_OK/kos22_Part3.jpg \n", 197 | " inflating: KolektorSDD_Data/Test/Train_OK/kos22_Part3_label.bmp \n", 198 | " inflating: KolektorSDD_Data/Test/Train_OK/kos22_Part4.jpg \n", 199 | " inflating: KolektorSDD_Data/Test/Train_OK/kos22_Part4_label.bmp \n", 200 | " inflating: KolektorSDD_Data/Test/Train_OK/kos22_Part5.jpg \n", 201 | " inflating: KolektorSDD_Data/Test/Train_OK/kos22_Part5_label.bmp \n", 202 | " inflating: KolektorSDD_Data/Test/Train_OK/kos22_Part7.jpg \n", 203 | " inflating: KolektorSDD_Data/Test/Train_OK/kos22_Part7_label.bmp \n", 204 | " inflating: KolektorSDD_Data/Test/Train_OK/kos23_Part0.jpg \n", 205 | " inflating: KolektorSDD_Data/Test/Train_OK/kos23_Part0_label.bmp \n", 206 | " inflating: KolektorSDD_Data/Test/Train_OK/kos23_Part1.jpg \n", 207 | " inflating: KolektorSDD_Data/Test/Train_OK/kos23_Part1_label.bmp \n", 208 | " inflating: KolektorSDD_Data/Test/Train_OK/kos23_Part2.jpg \n", 209 | " inflating: KolektorSDD_Data/Test/Train_OK/kos23_Part2_label.bmp \n", 210 | " inflating: KolektorSDD_Data/Test/Train_OK/kos23_Part3.jpg \n", 211 | " inflating: KolektorSDD_Data/Test/Train_OK/kos23_Part3_label.bmp \n", 212 | " inflating: KolektorSDD_Data/Test/Train_OK/kos23_Part4.jpg \n", 213 | " inflating: KolektorSDD_Data/Test/Train_OK/kos23_Part4_label.bmp \n", 214 | " inflating: KolektorSDD_Data/Test/Train_OK/kos23_Part7.jpg \n", 215 | " inflating: KolektorSDD_Data/Test/Train_OK/kos23_Part7_label.bmp \n", 216 | " inflating: KolektorSDD_Data/Test/Train_OK/kos24_Part0.jpg \n", 217 | " inflating: KolektorSDD_Data/Test/Train_OK/kos24_Part0_label.bmp \n", 218 | " inflating: KolektorSDD_Data/Test/Train_OK/kos24_Part2.jpg \n", 219 | " inflating: KolektorSDD_Data/Test/Train_OK/kos24_Part2_label.bmp \n", 220 | " inflating: KolektorSDD_Data/Test/Train_OK/kos24_Part3.jpg \n", 221 | " inflating: KolektorSDD_Data/Test/Train_OK/kos24_Part3_label.bmp \n", 222 | " inflating: KolektorSDD_Data/Test/Train_OK/kos24_Part4.jpg \n", 223 | " inflating: KolektorSDD_Data/Test/Train_OK/kos24_Part4_label.bmp \n", 224 | " inflating: KolektorSDD_Data/Test/Train_OK/kos24_Part7.jpg \n", 225 | " inflating: KolektorSDD_Data/Test/Train_OK/kos24_Part7_label.bmp \n", 226 | " inflating: KolektorSDD_Data/Test/Train_OK/kos25_Part0.jpg \n", 227 | " inflating: KolektorSDD_Data/Test/Train_OK/kos25_Part0_label.bmp \n", 228 | " inflating: KolektorSDD_Data/Test/Train_OK/kos25_Part1.jpg \n", 229 | " inflating: KolektorSDD_Data/Test/Train_OK/kos25_Part1_label.bmp \n", 230 | " inflating: KolektorSDD_Data/Test/Train_OK/kos25_Part7.jpg \n", 231 | " inflating: KolektorSDD_Data/Test/Train_OK/kos25_Part7_label.bmp \n", 232 | " inflating: KolektorSDD_Data/Test/Train_OK/kos26_Part6.jpg \n", 233 | " inflating: KolektorSDD_Data/Test/Train_OK/kos26_Part6_label.bmp \n", 234 | " inflating: KolektorSDD_Data/Test/Train_OK/kos27_Part1.jpg \n", 235 | " inflating: KolektorSDD_Data/Test/Train_OK/kos27_Part1_label.bmp \n", 236 | " inflating: KolektorSDD_Data/Test/Train_OK/kos29_Part1.jpg \n", 237 | " inflating: KolektorSDD_Data/Test/Train_OK/kos29_Part1_label.bmp \n", 238 | " inflating: KolektorSDD_Data/Test/Train_OK/kos29_Part6.jpg \n", 239 | " inflating: KolektorSDD_Data/Test/Train_OK/kos29_Part6_label.bmp \n", 240 | " inflating: KolektorSDD_Data/Test/Train_OK/kos35_Part7.jpg \n", 241 | " inflating: KolektorSDD_Data/Test/Train_OK/kos35_Part7_label.bmp \n", 242 | " inflating: KolektorSDD_Data/Test/Train_OK/kos36_Part0.jpg \n", 243 | " inflating: KolektorSDD_Data/Test/Train_OK/kos36_Part0_label.bmp \n", 244 | " inflating: KolektorSDD_Data/Test/Train_OK/kos36_Part1.jpg \n", 245 | " inflating: KolektorSDD_Data/Test/Train_OK/kos36_Part1_label.bmp \n", 246 | " inflating: KolektorSDD_Data/Test/Train_OK/kos36_Part2.jpg \n", 247 | " inflating: KolektorSDD_Data/Test/Train_OK/kos36_Part2_label.bmp \n", 248 | " inflating: KolektorSDD_Data/Test/Train_OK/kos36_Part4.jpg \n", 249 | " inflating: KolektorSDD_Data/Test/Train_OK/kos36_Part4_label.bmp \n", 250 | " inflating: KolektorSDD_Data/Test/Train_OK/kos36_Part5.jpg \n", 251 | " inflating: KolektorSDD_Data/Test/Train_OK/kos36_Part5_label.bmp \n", 252 | " inflating: KolektorSDD_Data/Test/Train_OK/kos36_Part6.jpg \n", 253 | " inflating: KolektorSDD_Data/Test/Train_OK/kos36_Part6_label.bmp \n", 254 | " inflating: KolektorSDD_Data/Test/Train_OK/kos36_Part7.jpg \n", 255 | " inflating: KolektorSDD_Data/Test/Train_OK/kos36_Part7_label.bmp \n", 256 | " inflating: KolektorSDD_Data/Test/Train_OK/kos37_Part1.jpg \n", 257 | " inflating: KolektorSDD_Data/Test/Train_OK/kos37_Part1_label.bmp \n", 258 | " inflating: KolektorSDD_Data/Test/Train_OK/kos37_Part2.jpg \n", 259 | " inflating: KolektorSDD_Data/Test/Train_OK/kos37_Part2_label.bmp \n", 260 | " inflating: KolektorSDD_Data/Test/Train_OK/kos37_Part3.jpg \n", 261 | " inflating: KolektorSDD_Data/Test/Train_OK/kos37_Part3_label.bmp \n", 262 | " inflating: KolektorSDD_Data/Test/Train_OK/kos37_Part4.jpg \n", 263 | " inflating: KolektorSDD_Data/Test/Train_OK/kos37_Part4_label.bmp \n", 264 | " inflating: KolektorSDD_Data/Test/Train_OK/kos37_Part5.jpg \n", 265 | " inflating: KolektorSDD_Data/Test/Train_OK/kos37_Part5_label.bmp \n", 266 | " inflating: KolektorSDD_Data/Test/Train_OK/kos37_Part6.jpg \n", 267 | " inflating: KolektorSDD_Data/Test/Train_OK/kos37_Part6_label.bmp \n", 268 | " inflating: KolektorSDD_Data/Test/Train_OK/kos38_Part2.jpg \n", 269 | " inflating: KolektorSDD_Data/Test/Train_OK/kos38_Part2_label.bmp \n", 270 | " inflating: KolektorSDD_Data/Test/Train_OK/kos38_Part3.jpg \n", 271 | " inflating: KolektorSDD_Data/Test/Train_OK/kos38_Part3_label.bmp \n", 272 | " inflating: KolektorSDD_Data/Test/Train_OK/kos38_Part4.jpg \n", 273 | " inflating: KolektorSDD_Data/Test/Train_OK/kos38_Part4_label.bmp \n", 274 | " inflating: KolektorSDD_Data/Test/Train_OK/kos38_Part5.jpg \n", 275 | " inflating: KolektorSDD_Data/Test/Train_OK/kos38_Part5_label.bmp \n", 276 | " inflating: KolektorSDD_Data/Test/Train_OK/kos38_Part6.jpg \n", 277 | " inflating: KolektorSDD_Data/Test/Train_OK/kos38_Part6_label.bmp \n", 278 | " inflating: KolektorSDD_Data/Test/Train_OK/kos38_Part7.jpg \n", 279 | " inflating: KolektorSDD_Data/Test/Train_OK/kos38_Part7_label.bmp \n", 280 | " inflating: KolektorSDD_Data/Test/Train_OK/kos39_Part0.jpg \n", 281 | " inflating: KolektorSDD_Data/Test/Train_OK/kos39_Part0_label.bmp \n", 282 | " inflating: KolektorSDD_Data/Test/Train_OK/kos39_Part2.jpg \n", 283 | " inflating: KolektorSDD_Data/Test/Train_OK/kos39_Part2_label.bmp \n", 284 | " inflating: KolektorSDD_Data/Test/Train_OK/kos39_Part3.jpg \n", 285 | " inflating: KolektorSDD_Data/Test/Train_OK/kos39_Part3_label.bmp \n", 286 | " inflating: KolektorSDD_Data/Test/Train_OK/kos39_Part4.jpg \n", 287 | " inflating: KolektorSDD_Data/Test/Train_OK/kos39_Part4_label.bmp \n", 288 | " inflating: KolektorSDD_Data/Test/Train_OK/kos39_Part5.jpg \n", 289 | " inflating: KolektorSDD_Data/Test/Train_OK/kos39_Part5_label.bmp \n", 290 | " inflating: KolektorSDD_Data/Test/Train_OK/kos40_Part0.jpg \n", 291 | " inflating: KolektorSDD_Data/Test/Train_OK/kos40_Part0_label.bmp \n", 292 | " inflating: KolektorSDD_Data/Test/Train_OK/kos40_Part1.jpg \n", 293 | " inflating: KolektorSDD_Data/Test/Train_OK/kos40_Part1_label.bmp \n", 294 | " inflating: KolektorSDD_Data/Test/Train_OK/kos40_Part2.jpg \n", 295 | " inflating: KolektorSDD_Data/Test/Train_OK/kos40_Part2_label.bmp \n", 296 | " inflating: KolektorSDD_Data/Test/Train_OK/kos40_Part6.jpg \n", 297 | " inflating: KolektorSDD_Data/Test/Train_OK/kos40_Part6_label.bmp \n", 298 | " inflating: KolektorSDD_Data/Test/Train_OK/kos47_Part6.jpg \n", 299 | " inflating: KolektorSDD_Data/Test/Train_OK/kos47_Part6_label.bmp \n", 300 | " inflating: KolektorSDD_Data/Test/Train_OK/kos47_Part7.jpg \n", 301 | " inflating: KolektorSDD_Data/Test/Train_OK/kos47_Part7_label.bmp \n", 302 | " inflating: KolektorSDD_Data/Test/Train_OK/kos48_Part0.jpg \n", 303 | " inflating: KolektorSDD_Data/Test/Train_OK/kos48_Part0_label.bmp \n", 304 | " inflating: KolektorSDD_Data/Test/Train_OK/kos48_Part1.jpg \n", 305 | " inflating: KolektorSDD_Data/Test/Train_OK/kos48_Part1_label.bmp \n", 306 | " inflating: KolektorSDD_Data/Test/Train_OK/kos48_Part2.jpg \n" 307 | ] 308 | }, 309 | { 310 | "name": "stdout", 311 | "output_type": "stream", 312 | "text": [ 313 | " inflating: KolektorSDD_Data/Test/Train_OK/kos48_Part2_label.bmp \n", 314 | " inflating: KolektorSDD_Data/Test/Train_OK/kos48_Part3.jpg \n", 315 | " inflating: KolektorSDD_Data/Test/Train_OK/kos48_Part3_label.bmp \n", 316 | " inflating: KolektorSDD_Data/Test/Train_OK/kos48_Part6.jpg \n", 317 | " inflating: KolektorSDD_Data/Test/Train_OK/kos48_Part6_label.bmp \n", 318 | " inflating: KolektorSDD_Data/Test/Train_OK/kos48_Part7.jpg \n", 319 | " inflating: KolektorSDD_Data/Test/Train_OK/kos48_Part7_label.bmp \n", 320 | " inflating: KolektorSDD_Data/Test/Train_OK/kos49_Part0.jpg \n", 321 | " inflating: KolektorSDD_Data/Test/Train_OK/kos49_Part0_label.bmp \n", 322 | " inflating: KolektorSDD_Data/Test/Train_OK/kos49_Part1.jpg \n", 323 | " inflating: KolektorSDD_Data/Test/Train_OK/kos49_Part1_label.bmp \n", 324 | " inflating: KolektorSDD_Data/Test/Train_OK/kos49_Part3.jpg \n", 325 | " inflating: KolektorSDD_Data/Test/Train_OK/kos49_Part3_label.bmp \n", 326 | " inflating: KolektorSDD_Data/Test/Train_OK/kos49_Part4.jpg \n", 327 | " inflating: KolektorSDD_Data/Test/Train_OK/kos49_Part4_label.bmp \n", 328 | " inflating: KolektorSDD_Data/Test/Train_OK/kos49_Part5.jpg \n", 329 | " inflating: KolektorSDD_Data/Test/Train_OK/kos49_Part5_label.bmp \n", 330 | " inflating: KolektorSDD_Data/Test/Train_OK/kos49_Part6.jpg \n", 331 | " inflating: KolektorSDD_Data/Test/Train_OK/kos49_Part6_label.bmp \n", 332 | " inflating: KolektorSDD_Data/Test/Train_OK/kos49_Part7.jpg \n", 333 | " inflating: KolektorSDD_Data/Test/Train_OK/kos49_Part7_label.bmp \n", 334 | " inflating: KolektorSDD_Data/Test/Train_OK/kos50_Part0.jpg \n", 335 | " inflating: KolektorSDD_Data/Test/Train_OK/kos50_Part0_label.bmp \n", 336 | " inflating: KolektorSDD_Data/Test/Train_OK/kos50_Part2.jpg \n", 337 | " inflating: KolektorSDD_Data/Test/Train_OK/kos50_Part2_label.bmp \n", 338 | " inflating: KolektorSDD_Data/Test/Train_OK/kos50_Part3.jpg \n", 339 | " inflating: KolektorSDD_Data/Test/Train_OK/kos50_Part3_label.bmp \n", 340 | " inflating: KolektorSDD_Data/Test/Train_OK/kos50_Part5.jpg \n", 341 | " inflating: KolektorSDD_Data/Test/Train_OK/kos50_Part5_label.bmp \n", 342 | " creating: KolektorSDD_Data/Train_NG/\n", 343 | " inflating: KolektorSDD_Data/Train_NG/kos01_Part5.jpg \n", 344 | " inflating: KolektorSDD_Data/Train_NG/kos01_Part5_label.bmp \n", 345 | " inflating: KolektorSDD_Data/Train_NG/kos06_Part7.jpg \n", 346 | " inflating: KolektorSDD_Data/Train_NG/kos06_Part7_label.bmp \n", 347 | " inflating: KolektorSDD_Data/Train_NG/kos09_Part6.jpg \n", 348 | " inflating: KolektorSDD_Data/Train_NG/kos09_Part6_label.bmp \n", 349 | " inflating: KolektorSDD_Data/Train_NG/kos11_Part4.jpg \n", 350 | " inflating: KolektorSDD_Data/Train_NG/kos11_Part4_label.bmp \n", 351 | " inflating: KolektorSDD_Data/Train_NG/kos12_Part5.jpg \n", 352 | " inflating: KolektorSDD_Data/Train_NG/kos12_Part5_label.bmp \n", 353 | " inflating: KolektorSDD_Data/Train_NG/kos13_Part3.jpg \n", 354 | " inflating: KolektorSDD_Data/Train_NG/kos13_Part3_label.bmp \n", 355 | " inflating: KolektorSDD_Data/Train_NG/kos14_Part7.jpg \n", 356 | " inflating: KolektorSDD_Data/Train_NG/kos14_Part7_label.bmp \n", 357 | " inflating: KolektorSDD_Data/Train_NG/kos15_Part3.jpg \n", 358 | " inflating: KolektorSDD_Data/Train_NG/kos15_Part3_label.bmp \n", 359 | " inflating: KolektorSDD_Data/Train_NG/kos16_Part5.jpg \n", 360 | " inflating: KolektorSDD_Data/Train_NG/kos16_Part5_label.bmp \n", 361 | " inflating: KolektorSDD_Data/Train_NG/kos17_Part5.jpg \n", 362 | " inflating: KolektorSDD_Data/Train_NG/kos17_Part5_label.bmp \n", 363 | " inflating: KolektorSDD_Data/Train_NG/kos18_Part3.jpg \n", 364 | " inflating: KolektorSDD_Data/Train_NG/kos18_Part3_label.bmp \n", 365 | " inflating: KolektorSDD_Data/Train_NG/kos19_Part5.jpg \n", 366 | " inflating: KolektorSDD_Data/Train_NG/kos19_Part5_label.bmp \n", 367 | " inflating: KolektorSDD_Data/Train_NG/kos20_Part4.jpg \n", 368 | " inflating: KolektorSDD_Data/Train_NG/kos20_Part4_label.bmp \n", 369 | " inflating: KolektorSDD_Data/Train_NG/kos25_Part4.jpg \n", 370 | " inflating: KolektorSDD_Data/Train_NG/kos25_Part4_label.bmp \n", 371 | " inflating: KolektorSDD_Data/Train_NG/kos26_Part5.jpg \n", 372 | " inflating: KolektorSDD_Data/Train_NG/kos26_Part5_label.bmp \n", 373 | " inflating: KolektorSDD_Data/Train_NG/kos27_Part0.jpg \n", 374 | " inflating: KolektorSDD_Data/Train_NG/kos27_Part0_label.bmp \n", 375 | " inflating: KolektorSDD_Data/Train_NG/kos28_Part3.jpg \n", 376 | " inflating: KolektorSDD_Data/Train_NG/kos28_Part3_label.bmp \n", 377 | " inflating: KolektorSDD_Data/Train_NG/kos29_Part0.jpg \n", 378 | " inflating: KolektorSDD_Data/Train_NG/kos29_Part0_label.bmp \n", 379 | " inflating: KolektorSDD_Data/Train_NG/kos30_Part0.jpg \n", 380 | " inflating: KolektorSDD_Data/Train_NG/kos30_Part0_label.bmp \n", 381 | " inflating: KolektorSDD_Data/Train_NG/kos31_Part1.jpg \n", 382 | " inflating: KolektorSDD_Data/Train_NG/kos31_Part1_label.bmp \n", 383 | " inflating: KolektorSDD_Data/Train_NG/kos32_Part2.jpg \n", 384 | " inflating: KolektorSDD_Data/Train_NG/kos32_Part2_label.bmp \n", 385 | " inflating: KolektorSDD_Data/Train_NG/kos33_Part6.jpg \n", 386 | " inflating: KolektorSDD_Data/Train_NG/kos33_Part6_label.bmp \n", 387 | " inflating: KolektorSDD_Data/Train_NG/kos34_Part0.jpg \n", 388 | " inflating: KolektorSDD_Data/Train_NG/kos34_Part0_label.bmp \n", 389 | " inflating: KolektorSDD_Data/Train_NG/kos35_Part5.jpg \n", 390 | " inflating: KolektorSDD_Data/Train_NG/kos35_Part5_label.bmp \n", 391 | " inflating: KolektorSDD_Data/Train_NG/kos36_Part3.jpg \n", 392 | " inflating: KolektorSDD_Data/Train_NG/kos36_Part3_label.bmp \n", 393 | " inflating: KolektorSDD_Data/Train_NG/kos38_Part0.jpg \n", 394 | " inflating: KolektorSDD_Data/Train_NG/kos38_Part0_label.bmp \n", 395 | " inflating: KolektorSDD_Data/Train_NG/kos39_Part7.jpg \n", 396 | " inflating: KolektorSDD_Data/Train_NG/kos39_Part7_label.bmp \n", 397 | " inflating: KolektorSDD_Data/Train_NG/kos40_Part5.jpg \n", 398 | " inflating: KolektorSDD_Data/Train_NG/kos40_Part5_label.bmp \n", 399 | " inflating: KolektorSDD_Data/Train_NG/kos41_Part7.jpg \n", 400 | " inflating: KolektorSDD_Data/Train_NG/kos41_Part7_label.bmp \n", 401 | " inflating: KolektorSDD_Data/Train_NG/kos42_Part3.jpg \n", 402 | " inflating: KolektorSDD_Data/Train_NG/kos42_Part3_label.bmp \n", 403 | " inflating: KolektorSDD_Data/Train_NG/kos43_Part1.jpg \n", 404 | " inflating: KolektorSDD_Data/Train_NG/kos43_Part1_label.bmp \n", 405 | " inflating: KolektorSDD_Data/Train_NG/kos44_Part6.jpg \n", 406 | " inflating: KolektorSDD_Data/Train_NG/kos44_Part6_label.bmp \n", 407 | " inflating: KolektorSDD_Data/Train_NG/kos45_Part3.jpg \n", 408 | " inflating: KolektorSDD_Data/Train_NG/kos45_Part3_label.bmp \n", 409 | " inflating: KolektorSDD_Data/Train_NG/kos46_Part7.jpg \n", 410 | " inflating: KolektorSDD_Data/Train_NG/kos46_Part7_label.bmp \n", 411 | " inflating: KolektorSDD_Data/Train_NG/kos47_Part2.jpg \n", 412 | " inflating: KolektorSDD_Data/Train_NG/kos47_Part2_label.bmp \n", 413 | " creating: KolektorSDD_Data/Train_OK/\n", 414 | " inflating: KolektorSDD_Data/Train_OK/kos01_Part0.jpg \n", 415 | " inflating: KolektorSDD_Data/Train_OK/kos01_Part0_label.bmp \n", 416 | " inflating: KolektorSDD_Data/Train_OK/kos01_Part1.jpg \n", 417 | " inflating: KolektorSDD_Data/Train_OK/kos01_Part1_label.bmp \n", 418 | " inflating: KolektorSDD_Data/Train_OK/kos01_Part2.jpg \n", 419 | " inflating: KolektorSDD_Data/Train_OK/kos01_Part2_label.bmp \n", 420 | " inflating: KolektorSDD_Data/Train_OK/kos01_Part3.jpg \n", 421 | " inflating: KolektorSDD_Data/Train_OK/kos01_Part3_label.bmp \n", 422 | " inflating: KolektorSDD_Data/Train_OK/kos01_Part4.jpg \n", 423 | " inflating: KolektorSDD_Data/Train_OK/kos01_Part4_label.bmp \n", 424 | " inflating: KolektorSDD_Data/Train_OK/kos01_Part6.jpg \n", 425 | " inflating: KolektorSDD_Data/Train_OK/kos01_Part6_label.bmp \n", 426 | " inflating: KolektorSDD_Data/Train_OK/kos01_Part7.jpg \n", 427 | " inflating: KolektorSDD_Data/Train_OK/kos01_Part7_label.bmp \n", 428 | " inflating: KolektorSDD_Data/Train_OK/kos02_Part0.jpg \n", 429 | " inflating: KolektorSDD_Data/Train_OK/kos02_Part0_label.bmp \n", 430 | " inflating: KolektorSDD_Data/Train_OK/kos02_Part1.jpg \n", 431 | " inflating: KolektorSDD_Data/Train_OK/kos02_Part1_label.bmp \n", 432 | " inflating: KolektorSDD_Data/Train_OK/kos02_Part2.jpg \n", 433 | " inflating: KolektorSDD_Data/Train_OK/kos02_Part2_label.bmp \n", 434 | " inflating: KolektorSDD_Data/Train_OK/kos02_Part3.jpg \n", 435 | " inflating: KolektorSDD_Data/Train_OK/kos02_Part3_label.bmp \n", 436 | " inflating: KolektorSDD_Data/Train_OK/kos02_Part4.jpg \n", 437 | " inflating: KolektorSDD_Data/Train_OK/kos02_Part4_label.bmp \n", 438 | " inflating: KolektorSDD_Data/Train_OK/kos02_Part5.jpg \n", 439 | " inflating: KolektorSDD_Data/Train_OK/kos02_Part5_label.bmp \n", 440 | " inflating: KolektorSDD_Data/Train_OK/kos03_Part5.jpg \n", 441 | " inflating: KolektorSDD_Data/Train_OK/kos03_Part5_label.bmp \n", 442 | " inflating: KolektorSDD_Data/Train_OK/kos06_Part1.jpg \n", 443 | " inflating: KolektorSDD_Data/Train_OK/kos06_Part1_label.bmp \n", 444 | " inflating: KolektorSDD_Data/Train_OK/kos06_Part3.jpg \n", 445 | " inflating: KolektorSDD_Data/Train_OK/kos06_Part3_label.bmp \n", 446 | " inflating: KolektorSDD_Data/Train_OK/kos06_Part5.jpg \n", 447 | " inflating: KolektorSDD_Data/Train_OK/kos06_Part5_label.bmp \n", 448 | " inflating: KolektorSDD_Data/Train_OK/kos06_Part6.jpg \n", 449 | " inflating: KolektorSDD_Data/Train_OK/kos06_Part6_label.bmp \n", 450 | " inflating: KolektorSDD_Data/Train_OK/kos07_Part0.jpg \n", 451 | " inflating: KolektorSDD_Data/Train_OK/kos07_Part0_label.bmp \n", 452 | " inflating: KolektorSDD_Data/Train_OK/kos07_Part2.jpg \n", 453 | " inflating: KolektorSDD_Data/Train_OK/kos07_Part2_label.bmp \n", 454 | " inflating: KolektorSDD_Data/Train_OK/kos07_Part3.jpg \n", 455 | " inflating: KolektorSDD_Data/Train_OK/kos07_Part3_label.bmp \n", 456 | " inflating: KolektorSDD_Data/Train_OK/kos07_Part4.jpg \n", 457 | " inflating: KolektorSDD_Data/Train_OK/kos07_Part4_label.bmp \n", 458 | " inflating: KolektorSDD_Data/Train_OK/kos07_Part7.jpg \n" 459 | ] 460 | }, 461 | { 462 | "name": "stdout", 463 | "output_type": "stream", 464 | "text": [ 465 | " inflating: KolektorSDD_Data/Train_OK/kos07_Part7_label.bmp \n", 466 | " inflating: KolektorSDD_Data/Train_OK/kos08_Part3.jpg \n", 467 | " inflating: KolektorSDD_Data/Train_OK/kos08_Part3_label.bmp \n", 468 | " inflating: KolektorSDD_Data/Train_OK/kos08_Part4.jpg \n", 469 | " inflating: KolektorSDD_Data/Train_OK/kos08_Part4_label.bmp \n", 470 | " inflating: KolektorSDD_Data/Train_OK/kos08_Part7.jpg \n", 471 | " inflating: KolektorSDD_Data/Train_OK/kos08_Part7_label.bmp \n", 472 | " inflating: KolektorSDD_Data/Train_OK/kos09_Part0.jpg \n", 473 | " inflating: KolektorSDD_Data/Train_OK/kos09_Part0_label.bmp \n", 474 | " inflating: KolektorSDD_Data/Train_OK/kos09_Part5.jpg \n", 475 | " inflating: KolektorSDD_Data/Train_OK/kos09_Part5_label.bmp \n", 476 | " inflating: KolektorSDD_Data/Train_OK/kos10_Part1.jpg \n", 477 | " inflating: KolektorSDD_Data/Train_OK/kos10_Part1_label.bmp \n", 478 | " inflating: KolektorSDD_Data/Train_OK/kos10_Part2.jpg \n", 479 | " inflating: KolektorSDD_Data/Train_OK/kos10_Part2_label.bmp \n", 480 | " inflating: KolektorSDD_Data/Train_OK/kos10_Part5.jpg \n", 481 | " inflating: KolektorSDD_Data/Train_OK/kos10_Part5_label.bmp \n", 482 | " inflating: KolektorSDD_Data/Train_OK/kos10_Part6.jpg \n", 483 | " inflating: KolektorSDD_Data/Train_OK/kos10_Part6_label.bmp \n", 484 | " inflating: KolektorSDD_Data/Train_OK/kos11_Part0.jpg \n", 485 | " inflating: KolektorSDD_Data/Train_OK/kos11_Part0_label.bmp \n", 486 | " inflating: KolektorSDD_Data/Train_OK/kos11_Part3.jpg \n", 487 | " inflating: KolektorSDD_Data/Train_OK/kos11_Part3_label.bmp \n", 488 | " inflating: KolektorSDD_Data/Train_OK/kos11_Part5.jpg \n", 489 | " inflating: KolektorSDD_Data/Train_OK/kos11_Part5_label.bmp \n", 490 | " inflating: KolektorSDD_Data/Train_OK/kos11_Part7.jpg \n", 491 | " inflating: KolektorSDD_Data/Train_OK/kos11_Part7_label.bmp \n", 492 | " inflating: KolektorSDD_Data/Train_OK/kos12_Part0.jpg \n", 493 | " inflating: KolektorSDD_Data/Train_OK/kos12_Part0_label.bmp \n", 494 | " inflating: KolektorSDD_Data/Train_OK/kos12_Part2.jpg \n", 495 | " inflating: KolektorSDD_Data/Train_OK/kos12_Part2_label.bmp \n", 496 | " inflating: KolektorSDD_Data/Train_OK/kos12_Part3.jpg \n", 497 | " inflating: KolektorSDD_Data/Train_OK/kos12_Part3_label.bmp \n", 498 | " inflating: KolektorSDD_Data/Train_OK/kos12_Part4.jpg \n", 499 | " inflating: KolektorSDD_Data/Train_OK/kos12_Part4_label.bmp \n", 500 | " inflating: KolektorSDD_Data/Train_OK/kos12_Part6.jpg \n", 501 | " inflating: KolektorSDD_Data/Train_OK/kos12_Part6_label.bmp \n", 502 | " inflating: KolektorSDD_Data/Train_OK/kos12_Part7.jpg \n", 503 | " inflating: KolektorSDD_Data/Train_OK/kos12_Part7_label.bmp \n", 504 | " inflating: KolektorSDD_Data/Train_OK/kos13_Part0.jpg \n", 505 | " inflating: KolektorSDD_Data/Train_OK/kos13_Part0_label.bmp \n", 506 | " inflating: KolektorSDD_Data/Train_OK/kos13_Part1.jpg \n", 507 | " inflating: KolektorSDD_Data/Train_OK/kos13_Part1_label.bmp \n", 508 | " inflating: KolektorSDD_Data/Train_OK/kos13_Part2.jpg \n", 509 | " inflating: KolektorSDD_Data/Train_OK/kos13_Part2_label.bmp \n", 510 | " inflating: KolektorSDD_Data/Train_OK/kos13_Part4.jpg \n", 511 | " inflating: KolektorSDD_Data/Train_OK/kos13_Part4_label.bmp \n", 512 | " inflating: KolektorSDD_Data/Train_OK/kos13_Part5.jpg \n", 513 | " inflating: KolektorSDD_Data/Train_OK/kos13_Part5_label.bmp \n", 514 | " inflating: KolektorSDD_Data/Train_OK/kos13_Part6.jpg \n", 515 | " inflating: KolektorSDD_Data/Train_OK/kos13_Part6_label.bmp \n", 516 | " inflating: KolektorSDD_Data/Train_OK/kos13_Part7.jpg \n", 517 | " inflating: KolektorSDD_Data/Train_OK/kos13_Part7_label.bmp \n", 518 | " inflating: KolektorSDD_Data/Train_OK/kos14_Part0.jpg \n", 519 | " inflating: KolektorSDD_Data/Train_OK/kos14_Part0_label.bmp \n", 520 | " inflating: KolektorSDD_Data/Train_OK/kos14_Part1.jpg \n", 521 | " inflating: KolektorSDD_Data/Train_OK/kos14_Part1_label.bmp \n", 522 | " inflating: KolektorSDD_Data/Train_OK/kos14_Part2.jpg \n", 523 | " inflating: KolektorSDD_Data/Train_OK/kos14_Part2_label.bmp \n", 524 | " inflating: KolektorSDD_Data/Train_OK/kos14_Part3.jpg \n", 525 | " inflating: KolektorSDD_Data/Train_OK/kos14_Part3_label.bmp \n", 526 | " inflating: KolektorSDD_Data/Train_OK/kos14_Part4.jpg \n", 527 | " inflating: KolektorSDD_Data/Train_OK/kos14_Part4_label.bmp \n", 528 | " inflating: KolektorSDD_Data/Train_OK/kos14_Part5.jpg \n", 529 | " inflating: KolektorSDD_Data/Train_OK/kos14_Part5_label.bmp \n", 530 | " inflating: KolektorSDD_Data/Train_OK/kos14_Part6.jpg \n", 531 | " inflating: KolektorSDD_Data/Train_OK/kos14_Part6_label.bmp \n", 532 | " inflating: KolektorSDD_Data/Train_OK/kos15_Part0.jpg \n", 533 | " inflating: KolektorSDD_Data/Train_OK/kos15_Part0_label.bmp \n", 534 | " inflating: KolektorSDD_Data/Train_OK/kos15_Part1.jpg \n", 535 | " inflating: KolektorSDD_Data/Train_OK/kos15_Part1_label.bmp \n", 536 | " inflating: KolektorSDD_Data/Train_OK/kos15_Part2.jpg \n", 537 | " inflating: KolektorSDD_Data/Train_OK/kos15_Part2_label.bmp \n", 538 | " inflating: KolektorSDD_Data/Train_OK/kos15_Part4.jpg \n", 539 | " inflating: KolektorSDD_Data/Train_OK/kos15_Part4_label.bmp \n", 540 | " inflating: KolektorSDD_Data/Train_OK/kos15_Part5.jpg \n", 541 | " inflating: KolektorSDD_Data/Train_OK/kos15_Part5_label.bmp \n", 542 | " inflating: KolektorSDD_Data/Train_OK/kos15_Part6.jpg \n", 543 | " inflating: KolektorSDD_Data/Train_OK/kos15_Part6_label.bmp \n", 544 | " inflating: KolektorSDD_Data/Train_OK/kos15_Part7.jpg \n", 545 | " inflating: KolektorSDD_Data/Train_OK/kos15_Part7_label.bmp \n", 546 | " inflating: KolektorSDD_Data/Train_OK/kos16_Part0.jpg \n", 547 | " inflating: KolektorSDD_Data/Train_OK/kos16_Part0_label.bmp \n", 548 | " inflating: KolektorSDD_Data/Train_OK/kos16_Part1.jpg \n", 549 | " inflating: KolektorSDD_Data/Train_OK/kos16_Part1_label.bmp \n", 550 | " inflating: KolektorSDD_Data/Train_OK/kos16_Part2.jpg \n", 551 | " inflating: KolektorSDD_Data/Train_OK/kos16_Part2_label.bmp \n", 552 | " inflating: KolektorSDD_Data/Train_OK/kos16_Part3.jpg \n", 553 | " inflating: KolektorSDD_Data/Train_OK/kos16_Part3_label.bmp \n", 554 | " inflating: KolektorSDD_Data/Train_OK/kos16_Part4.jpg \n", 555 | " inflating: KolektorSDD_Data/Train_OK/kos16_Part4_label.bmp \n", 556 | " inflating: KolektorSDD_Data/Train_OK/kos16_Part6.jpg \n", 557 | " inflating: KolektorSDD_Data/Train_OK/kos16_Part6_label.bmp \n", 558 | " inflating: KolektorSDD_Data/Train_OK/kos16_Part7.jpg \n", 559 | " inflating: KolektorSDD_Data/Train_OK/kos16_Part7_label.bmp \n", 560 | " inflating: KolektorSDD_Data/Train_OK/kos17_Part0.jpg \n", 561 | " inflating: KolektorSDD_Data/Train_OK/kos17_Part0_label.bmp \n", 562 | " inflating: KolektorSDD_Data/Train_OK/kos17_Part1.jpg \n", 563 | " inflating: KolektorSDD_Data/Train_OK/kos17_Part1_label.bmp \n", 564 | " inflating: KolektorSDD_Data/Train_OK/kos17_Part2.jpg \n", 565 | " inflating: KolektorSDD_Data/Train_OK/kos17_Part2_label.bmp \n", 566 | " inflating: KolektorSDD_Data/Train_OK/kos17_Part3.jpg \n", 567 | " inflating: KolektorSDD_Data/Train_OK/kos17_Part3_label.bmp \n", 568 | " inflating: KolektorSDD_Data/Train_OK/kos17_Part4.jpg \n", 569 | " inflating: KolektorSDD_Data/Train_OK/kos17_Part4_label.bmp \n", 570 | " inflating: KolektorSDD_Data/Train_OK/kos17_Part6.jpg \n", 571 | " inflating: KolektorSDD_Data/Train_OK/kos17_Part6_label.bmp \n", 572 | " inflating: KolektorSDD_Data/Train_OK/kos17_Part7.jpg \n", 573 | " inflating: KolektorSDD_Data/Train_OK/kos17_Part7_label.bmp \n", 574 | " inflating: KolektorSDD_Data/Train_OK/kos18_Part0.jpg \n", 575 | " inflating: KolektorSDD_Data/Train_OK/kos18_Part0_label.bmp \n", 576 | " inflating: KolektorSDD_Data/Train_OK/kos18_Part1.jpg \n", 577 | " inflating: KolektorSDD_Data/Train_OK/kos18_Part1_label.bmp \n", 578 | " inflating: KolektorSDD_Data/Train_OK/kos18_Part2.jpg \n", 579 | " inflating: KolektorSDD_Data/Train_OK/kos18_Part2_label.bmp \n", 580 | " inflating: KolektorSDD_Data/Train_OK/kos18_Part4.jpg \n", 581 | " inflating: KolektorSDD_Data/Train_OK/kos18_Part4_label.bmp \n", 582 | " inflating: KolektorSDD_Data/Train_OK/kos18_Part5.jpg \n", 583 | " inflating: KolektorSDD_Data/Train_OK/kos18_Part5_label.bmp \n", 584 | " inflating: KolektorSDD_Data/Train_OK/kos18_Part6.jpg \n", 585 | " inflating: KolektorSDD_Data/Train_OK/kos18_Part6_label.bmp \n", 586 | " inflating: KolektorSDD_Data/Train_OK/kos18_Part7.jpg \n", 587 | " inflating: KolektorSDD_Data/Train_OK/kos18_Part7_label.bmp \n", 588 | " inflating: KolektorSDD_Data/Train_OK/kos19_Part0.jpg \n", 589 | " inflating: KolektorSDD_Data/Train_OK/kos19_Part0_label.bmp \n", 590 | " inflating: KolektorSDD_Data/Train_OK/kos19_Part1.jpg \n", 591 | " inflating: KolektorSDD_Data/Train_OK/kos19_Part1_label.bmp \n", 592 | " inflating: KolektorSDD_Data/Train_OK/kos19_Part2.jpg \n", 593 | " inflating: KolektorSDD_Data/Train_OK/kos19_Part2_label.bmp \n", 594 | " inflating: KolektorSDD_Data/Train_OK/kos19_Part3.jpg \n", 595 | " inflating: KolektorSDD_Data/Train_OK/kos19_Part3_label.bmp \n", 596 | " inflating: KolektorSDD_Data/Train_OK/kos19_Part4.jpg \n", 597 | " inflating: KolektorSDD_Data/Train_OK/kos19_Part4_label.bmp \n", 598 | " inflating: KolektorSDD_Data/Train_OK/kos19_Part6.jpg \n", 599 | " inflating: KolektorSDD_Data/Train_OK/kos19_Part6_label.bmp \n", 600 | " inflating: KolektorSDD_Data/Train_OK/kos19_Part7.jpg \n", 601 | " inflating: KolektorSDD_Data/Train_OK/kos19_Part7_label.bmp \n", 602 | " inflating: KolektorSDD_Data/Train_OK/kos20_Part0.jpg \n", 603 | " inflating: KolektorSDD_Data/Train_OK/kos20_Part0_label.bmp \n", 604 | " inflating: KolektorSDD_Data/Train_OK/kos20_Part1.jpg \n", 605 | " inflating: KolektorSDD_Data/Train_OK/kos20_Part1_label.bmp \n" 606 | ] 607 | }, 608 | { 609 | "name": "stdout", 610 | "output_type": "stream", 611 | "text": [ 612 | " inflating: KolektorSDD_Data/Train_OK/kos20_Part2.jpg \n", 613 | " inflating: KolektorSDD_Data/Train_OK/kos20_Part2_label.bmp \n", 614 | " inflating: KolektorSDD_Data/Train_OK/kos20_Part3.jpg \n", 615 | " inflating: KolektorSDD_Data/Train_OK/kos20_Part3_label.bmp \n", 616 | " inflating: KolektorSDD_Data/Train_OK/kos20_Part5.jpg \n", 617 | " inflating: KolektorSDD_Data/Train_OK/kos20_Part5_label.bmp \n", 618 | " inflating: KolektorSDD_Data/Train_OK/kos23_Part5.jpg \n", 619 | " inflating: KolektorSDD_Data/Train_OK/kos23_Part5_label.bmp \n", 620 | " inflating: KolektorSDD_Data/Train_OK/kos24_Part5.jpg \n", 621 | " inflating: KolektorSDD_Data/Train_OK/kos24_Part5_label.bmp \n", 622 | " inflating: KolektorSDD_Data/Train_OK/kos24_Part6.jpg \n", 623 | " inflating: KolektorSDD_Data/Train_OK/kos24_Part6_label.bmp \n", 624 | " inflating: KolektorSDD_Data/Train_OK/kos25_Part2.jpg \n", 625 | " inflating: KolektorSDD_Data/Train_OK/kos25_Part2_label.bmp \n", 626 | " inflating: KolektorSDD_Data/Train_OK/kos25_Part3.jpg \n", 627 | " inflating: KolektorSDD_Data/Train_OK/kos25_Part3_label.bmp \n", 628 | " inflating: KolektorSDD_Data/Train_OK/kos25_Part5.jpg \n", 629 | " inflating: KolektorSDD_Data/Train_OK/kos25_Part5_label.bmp \n", 630 | " inflating: KolektorSDD_Data/Train_OK/kos25_Part6.jpg \n", 631 | " inflating: KolektorSDD_Data/Train_OK/kos25_Part6_label.bmp \n", 632 | " inflating: KolektorSDD_Data/Train_OK/kos26_Part0.jpg \n", 633 | " inflating: KolektorSDD_Data/Train_OK/kos26_Part0_label.bmp \n", 634 | " inflating: KolektorSDD_Data/Train_OK/kos26_Part1.jpg \n", 635 | " inflating: KolektorSDD_Data/Train_OK/kos26_Part1_label.bmp \n", 636 | " inflating: KolektorSDD_Data/Train_OK/kos26_Part2.jpg \n", 637 | " inflating: KolektorSDD_Data/Train_OK/kos26_Part2_label.bmp \n", 638 | " inflating: KolektorSDD_Data/Train_OK/kos26_Part3.jpg \n", 639 | " inflating: KolektorSDD_Data/Train_OK/kos26_Part3_label.bmp \n", 640 | " inflating: KolektorSDD_Data/Train_OK/kos26_Part4.jpg \n", 641 | " inflating: KolektorSDD_Data/Train_OK/kos26_Part4_label.bmp \n", 642 | " inflating: KolektorSDD_Data/Train_OK/kos26_Part7.jpg \n", 643 | " inflating: KolektorSDD_Data/Train_OK/kos26_Part7_label.bmp \n", 644 | " inflating: KolektorSDD_Data/Train_OK/kos27_Part2.jpg \n", 645 | " inflating: KolektorSDD_Data/Train_OK/kos27_Part2_label.bmp \n", 646 | " inflating: KolektorSDD_Data/Train_OK/kos27_Part3.jpg \n", 647 | " inflating: KolektorSDD_Data/Train_OK/kos27_Part3_label.bmp \n", 648 | " inflating: KolektorSDD_Data/Train_OK/kos27_Part4.jpg \n", 649 | " inflating: KolektorSDD_Data/Train_OK/kos27_Part4_label.bmp \n", 650 | " inflating: KolektorSDD_Data/Train_OK/kos27_Part5.jpg \n", 651 | " inflating: KolektorSDD_Data/Train_OK/kos27_Part5_label.bmp \n", 652 | " inflating: KolektorSDD_Data/Train_OK/kos27_Part6.jpg \n", 653 | " inflating: KolektorSDD_Data/Train_OK/kos27_Part6_label.bmp \n", 654 | " inflating: KolektorSDD_Data/Train_OK/kos27_Part7.jpg \n", 655 | " inflating: KolektorSDD_Data/Train_OK/kos27_Part7_label.bmp \n", 656 | " inflating: KolektorSDD_Data/Train_OK/kos28_Part0.jpg \n", 657 | " inflating: KolektorSDD_Data/Train_OK/kos28_Part0_label.bmp \n", 658 | " inflating: KolektorSDD_Data/Train_OK/kos28_Part1.jpg \n", 659 | " inflating: KolektorSDD_Data/Train_OK/kos28_Part1_label.bmp \n", 660 | " inflating: KolektorSDD_Data/Train_OK/kos28_Part2.jpg \n", 661 | " inflating: KolektorSDD_Data/Train_OK/kos28_Part2_label.bmp \n", 662 | " inflating: KolektorSDD_Data/Train_OK/kos28_Part4.jpg \n", 663 | " inflating: KolektorSDD_Data/Train_OK/kos28_Part4_label.bmp \n", 664 | " inflating: KolektorSDD_Data/Train_OK/kos28_Part5.jpg \n", 665 | " inflating: KolektorSDD_Data/Train_OK/kos28_Part5_label.bmp \n", 666 | " inflating: KolektorSDD_Data/Train_OK/kos28_Part6.jpg \n", 667 | " inflating: KolektorSDD_Data/Train_OK/kos28_Part6_label.bmp \n", 668 | " inflating: KolektorSDD_Data/Train_OK/kos28_Part7.jpg \n", 669 | " inflating: KolektorSDD_Data/Train_OK/kos28_Part7_label.bmp \n", 670 | " inflating: KolektorSDD_Data/Train_OK/kos29_Part2.jpg \n", 671 | " inflating: KolektorSDD_Data/Train_OK/kos29_Part2_label.bmp \n", 672 | " inflating: KolektorSDD_Data/Train_OK/kos29_Part3.jpg \n", 673 | " inflating: KolektorSDD_Data/Train_OK/kos29_Part3_label.bmp \n", 674 | " inflating: KolektorSDD_Data/Train_OK/kos29_Part4.jpg \n", 675 | " inflating: KolektorSDD_Data/Train_OK/kos29_Part4_label.bmp \n", 676 | " inflating: KolektorSDD_Data/Train_OK/kos29_Part5.jpg \n", 677 | " inflating: KolektorSDD_Data/Train_OK/kos29_Part5_label.bmp \n", 678 | " inflating: KolektorSDD_Data/Train_OK/kos29_Part7.jpg \n", 679 | " inflating: KolektorSDD_Data/Train_OK/kos29_Part7_label.bmp \n", 680 | " inflating: KolektorSDD_Data/Train_OK/kos30_Part1.jpg \n", 681 | " inflating: KolektorSDD_Data/Train_OK/kos30_Part1_label.bmp \n", 682 | " inflating: KolektorSDD_Data/Train_OK/kos30_Part2.jpg \n", 683 | " inflating: KolektorSDD_Data/Train_OK/kos30_Part2_label.bmp \n", 684 | " inflating: KolektorSDD_Data/Train_OK/kos30_Part3.jpg \n", 685 | " inflating: KolektorSDD_Data/Train_OK/kos30_Part3_label.bmp \n", 686 | " inflating: KolektorSDD_Data/Train_OK/kos30_Part4.jpg \n", 687 | " inflating: KolektorSDD_Data/Train_OK/kos30_Part4_label.bmp \n", 688 | " inflating: KolektorSDD_Data/Train_OK/kos30_Part5.jpg \n", 689 | " inflating: KolektorSDD_Data/Train_OK/kos30_Part5_label.bmp \n", 690 | " inflating: KolektorSDD_Data/Train_OK/kos30_Part6.jpg \n", 691 | " inflating: KolektorSDD_Data/Train_OK/kos30_Part6_label.bmp \n", 692 | " inflating: KolektorSDD_Data/Train_OK/kos30_Part7.jpg \n", 693 | " inflating: KolektorSDD_Data/Train_OK/kos30_Part7_label.bmp \n", 694 | " inflating: KolektorSDD_Data/Train_OK/kos31_Part0.jpg \n", 695 | " inflating: KolektorSDD_Data/Train_OK/kos31_Part0_label.bmp \n", 696 | " inflating: KolektorSDD_Data/Train_OK/kos31_Part2.jpg \n", 697 | " inflating: KolektorSDD_Data/Train_OK/kos31_Part2_label.bmp \n", 698 | " inflating: KolektorSDD_Data/Train_OK/kos31_Part3.jpg \n", 699 | " inflating: KolektorSDD_Data/Train_OK/kos31_Part3_label.bmp \n", 700 | " inflating: KolektorSDD_Data/Train_OK/kos31_Part4.jpg \n", 701 | " inflating: KolektorSDD_Data/Train_OK/kos31_Part4_label.bmp \n", 702 | " inflating: KolektorSDD_Data/Train_OK/kos31_Part5.jpg \n", 703 | " inflating: KolektorSDD_Data/Train_OK/kos31_Part5_label.bmp \n", 704 | " inflating: KolektorSDD_Data/Train_OK/kos31_Part6.jpg \n", 705 | " inflating: KolektorSDD_Data/Train_OK/kos31_Part6_label.bmp \n", 706 | " inflating: KolektorSDD_Data/Train_OK/kos31_Part7.jpg \n", 707 | " inflating: KolektorSDD_Data/Train_OK/kos31_Part7_label.bmp \n", 708 | " inflating: KolektorSDD_Data/Train_OK/kos32_Part0.jpg \n", 709 | " inflating: KolektorSDD_Data/Train_OK/kos32_Part0_label.bmp \n", 710 | " inflating: KolektorSDD_Data/Train_OK/kos32_Part1.jpg \n", 711 | " inflating: KolektorSDD_Data/Train_OK/kos32_Part1_label.bmp \n", 712 | " inflating: KolektorSDD_Data/Train_OK/kos32_Part3.jpg \n", 713 | " inflating: KolektorSDD_Data/Train_OK/kos32_Part3_label.bmp \n", 714 | " inflating: KolektorSDD_Data/Train_OK/kos32_Part4.jpg \n", 715 | " inflating: KolektorSDD_Data/Train_OK/kos32_Part4_label.bmp \n", 716 | " inflating: KolektorSDD_Data/Train_OK/kos32_Part5.jpg \n", 717 | " inflating: KolektorSDD_Data/Train_OK/kos32_Part5_label.bmp \n", 718 | " inflating: KolektorSDD_Data/Train_OK/kos32_Part6.jpg \n", 719 | " inflating: KolektorSDD_Data/Train_OK/kos32_Part6_label.bmp \n", 720 | " inflating: KolektorSDD_Data/Train_OK/kos32_Part7.jpg \n", 721 | " inflating: KolektorSDD_Data/Train_OK/kos32_Part7_label.bmp \n", 722 | " inflating: KolektorSDD_Data/Train_OK/kos33_Part0.jpg \n", 723 | " inflating: KolektorSDD_Data/Train_OK/kos33_Part0_label.bmp \n", 724 | " inflating: KolektorSDD_Data/Train_OK/kos33_Part1.jpg \n", 725 | " inflating: KolektorSDD_Data/Train_OK/kos33_Part1_label.bmp \n", 726 | " inflating: KolektorSDD_Data/Train_OK/kos33_Part2.jpg \n", 727 | " inflating: KolektorSDD_Data/Train_OK/kos33_Part2_label.bmp \n", 728 | " inflating: KolektorSDD_Data/Train_OK/kos33_Part3.jpg \n", 729 | " inflating: KolektorSDD_Data/Train_OK/kos33_Part3_label.bmp \n", 730 | " inflating: KolektorSDD_Data/Train_OK/kos33_Part4.jpg \n", 731 | " inflating: KolektorSDD_Data/Train_OK/kos33_Part4_label.bmp \n", 732 | " inflating: KolektorSDD_Data/Train_OK/kos33_Part5.jpg \n", 733 | " inflating: KolektorSDD_Data/Train_OK/kos33_Part5_label.bmp \n", 734 | " inflating: KolektorSDD_Data/Train_OK/kos33_Part7.jpg \n", 735 | " inflating: KolektorSDD_Data/Train_OK/kos33_Part7_label.bmp \n", 736 | " inflating: KolektorSDD_Data/Train_OK/kos34_Part1.jpg \n", 737 | " inflating: KolektorSDD_Data/Train_OK/kos34_Part1_label.bmp \n", 738 | " inflating: KolektorSDD_Data/Train_OK/kos34_Part2.jpg \n", 739 | " inflating: KolektorSDD_Data/Train_OK/kos34_Part2_label.bmp \n", 740 | " inflating: KolektorSDD_Data/Train_OK/kos34_Part3.jpg \n", 741 | " inflating: KolektorSDD_Data/Train_OK/kos34_Part3_label.bmp \n", 742 | " inflating: KolektorSDD_Data/Train_OK/kos34_Part4.jpg \n", 743 | " inflating: KolektorSDD_Data/Train_OK/kos34_Part4_label.bmp \n", 744 | " inflating: KolektorSDD_Data/Train_OK/kos34_Part5.jpg \n", 745 | " inflating: KolektorSDD_Data/Train_OK/kos34_Part5_label.bmp \n", 746 | " inflating: KolektorSDD_Data/Train_OK/kos34_Part6.jpg \n", 747 | " inflating: KolektorSDD_Data/Train_OK/kos34_Part6_label.bmp \n", 748 | " inflating: KolektorSDD_Data/Train_OK/kos34_Part7.jpg \n", 749 | " inflating: KolektorSDD_Data/Train_OK/kos34_Part7_label.bmp \n", 750 | " inflating: KolektorSDD_Data/Train_OK/kos35_Part0.jpg \n", 751 | " inflating: KolektorSDD_Data/Train_OK/kos35_Part0_label.bmp \n", 752 | " inflating: KolektorSDD_Data/Train_OK/kos35_Part1.jpg \n", 753 | " inflating: KolektorSDD_Data/Train_OK/kos35_Part1_label.bmp \n" 754 | ] 755 | }, 756 | { 757 | "name": "stdout", 758 | "output_type": "stream", 759 | "text": [ 760 | " inflating: KolektorSDD_Data/Train_OK/kos35_Part2.jpg \n", 761 | " inflating: KolektorSDD_Data/Train_OK/kos35_Part2_label.bmp \n", 762 | " inflating: KolektorSDD_Data/Train_OK/kos35_Part3.jpg \n", 763 | " inflating: KolektorSDD_Data/Train_OK/kos35_Part3_label.bmp \n", 764 | " inflating: KolektorSDD_Data/Train_OK/kos35_Part4.jpg \n", 765 | " inflating: KolektorSDD_Data/Train_OK/kos35_Part4_label.bmp \n", 766 | " inflating: KolektorSDD_Data/Train_OK/kos35_Part6.jpg \n", 767 | " inflating: KolektorSDD_Data/Train_OK/kos35_Part6_label.bmp \n", 768 | " inflating: KolektorSDD_Data/Train_OK/kos37_Part7.jpg \n", 769 | " inflating: KolektorSDD_Data/Train_OK/kos37_Part7_label.bmp \n", 770 | " inflating: KolektorSDD_Data/Train_OK/kos39_Part1.jpg \n", 771 | " inflating: KolektorSDD_Data/Train_OK/kos39_Part1_label.bmp \n", 772 | " inflating: KolektorSDD_Data/Train_OK/kos40_Part3.jpg \n", 773 | " inflating: KolektorSDD_Data/Train_OK/kos40_Part3_label.bmp \n", 774 | " inflating: KolektorSDD_Data/Train_OK/kos40_Part4.jpg \n", 775 | " inflating: KolektorSDD_Data/Train_OK/kos40_Part4_label.bmp \n", 776 | " inflating: KolektorSDD_Data/Train_OK/kos40_Part7.jpg \n", 777 | " inflating: KolektorSDD_Data/Train_OK/kos40_Part7_label.bmp \n", 778 | " inflating: KolektorSDD_Data/Train_OK/kos41_Part0.jpg \n", 779 | " inflating: KolektorSDD_Data/Train_OK/kos41_Part0_label.bmp \n", 780 | " inflating: KolektorSDD_Data/Train_OK/kos41_Part1.jpg \n", 781 | " inflating: KolektorSDD_Data/Train_OK/kos41_Part1_label.bmp \n", 782 | " inflating: KolektorSDD_Data/Train_OK/kos41_Part2.jpg \n", 783 | " inflating: KolektorSDD_Data/Train_OK/kos41_Part2_label.bmp \n", 784 | " inflating: KolektorSDD_Data/Train_OK/kos41_Part3.jpg \n", 785 | " inflating: KolektorSDD_Data/Train_OK/kos41_Part3_label.bmp \n", 786 | " inflating: KolektorSDD_Data/Train_OK/kos41_Part4.jpg \n", 787 | " inflating: KolektorSDD_Data/Train_OK/kos41_Part4_label.bmp \n", 788 | " inflating: KolektorSDD_Data/Train_OK/kos41_Part5.jpg \n", 789 | " inflating: KolektorSDD_Data/Train_OK/kos41_Part5_label.bmp \n", 790 | " inflating: KolektorSDD_Data/Train_OK/kos41_Part6.jpg \n", 791 | " inflating: KolektorSDD_Data/Train_OK/kos41_Part6_label.bmp \n", 792 | " inflating: KolektorSDD_Data/Train_OK/kos42_Part0.jpg \n", 793 | " inflating: KolektorSDD_Data/Train_OK/kos42_Part0_label.bmp \n", 794 | " inflating: KolektorSDD_Data/Train_OK/kos42_Part1.jpg \n", 795 | " inflating: KolektorSDD_Data/Train_OK/kos42_Part1_label.bmp \n", 796 | " inflating: KolektorSDD_Data/Train_OK/kos42_Part2.jpg \n", 797 | " inflating: KolektorSDD_Data/Train_OK/kos42_Part2_label.bmp \n", 798 | " inflating: KolektorSDD_Data/Train_OK/kos42_Part4.jpg \n", 799 | " inflating: KolektorSDD_Data/Train_OK/kos42_Part4_label.bmp \n", 800 | " inflating: KolektorSDD_Data/Train_OK/kos42_Part5.jpg \n", 801 | " inflating: KolektorSDD_Data/Train_OK/kos42_Part5_label.bmp \n", 802 | " inflating: KolektorSDD_Data/Train_OK/kos42_Part6.jpg \n", 803 | " inflating: KolektorSDD_Data/Train_OK/kos42_Part6_label.bmp \n", 804 | " inflating: KolektorSDD_Data/Train_OK/kos42_Part7.jpg \n", 805 | " inflating: KolektorSDD_Data/Train_OK/kos42_Part7_label.bmp \n", 806 | " inflating: KolektorSDD_Data/Train_OK/kos43_Part0.jpg \n", 807 | " inflating: KolektorSDD_Data/Train_OK/kos43_Part0_label.bmp \n", 808 | " inflating: KolektorSDD_Data/Train_OK/kos43_Part2.jpg \n", 809 | " inflating: KolektorSDD_Data/Train_OK/kos43_Part2_label.bmp \n", 810 | " inflating: KolektorSDD_Data/Train_OK/kos43_Part3.jpg \n", 811 | " inflating: KolektorSDD_Data/Train_OK/kos43_Part3_label.bmp \n", 812 | " inflating: KolektorSDD_Data/Train_OK/kos43_Part4.jpg \n", 813 | " inflating: KolektorSDD_Data/Train_OK/kos43_Part4_label.bmp \n", 814 | " inflating: KolektorSDD_Data/Train_OK/kos43_Part5.jpg \n", 815 | " inflating: KolektorSDD_Data/Train_OK/kos43_Part5_label.bmp \n", 816 | " inflating: KolektorSDD_Data/Train_OK/kos43_Part6.jpg \n", 817 | " inflating: KolektorSDD_Data/Train_OK/kos43_Part6_label.bmp \n", 818 | " inflating: KolektorSDD_Data/Train_OK/kos43_Part7.jpg \n", 819 | " inflating: KolektorSDD_Data/Train_OK/kos43_Part7_label.bmp \n", 820 | " inflating: KolektorSDD_Data/Train_OK/kos44_Part0.jpg \n", 821 | " inflating: KolektorSDD_Data/Train_OK/kos44_Part0_label.bmp \n", 822 | " inflating: KolektorSDD_Data/Train_OK/kos44_Part1.jpg \n", 823 | " inflating: KolektorSDD_Data/Train_OK/kos44_Part1_label.bmp \n", 824 | " inflating: KolektorSDD_Data/Train_OK/kos44_Part2.jpg \n", 825 | " inflating: KolektorSDD_Data/Train_OK/kos44_Part2_label.bmp \n", 826 | " inflating: KolektorSDD_Data/Train_OK/kos44_Part3.jpg \n", 827 | " inflating: KolektorSDD_Data/Train_OK/kos44_Part3_label.bmp \n", 828 | " inflating: KolektorSDD_Data/Train_OK/kos44_Part4.jpg \n", 829 | " inflating: KolektorSDD_Data/Train_OK/kos44_Part4_label.bmp \n", 830 | " inflating: KolektorSDD_Data/Train_OK/kos44_Part5.jpg \n", 831 | " inflating: KolektorSDD_Data/Train_OK/kos44_Part5_label.bmp \n", 832 | " inflating: KolektorSDD_Data/Train_OK/kos44_Part7.jpg \n", 833 | " inflating: KolektorSDD_Data/Train_OK/kos44_Part7_label.bmp \n", 834 | " inflating: KolektorSDD_Data/Train_OK/kos45_Part0.jpg \n", 835 | " inflating: KolektorSDD_Data/Train_OK/kos45_Part0_label.bmp \n", 836 | " inflating: KolektorSDD_Data/Train_OK/kos45_Part1.jpg \n", 837 | " inflating: KolektorSDD_Data/Train_OK/kos45_Part1_label.bmp \n", 838 | " inflating: KolektorSDD_Data/Train_OK/kos45_Part2.jpg \n", 839 | " inflating: KolektorSDD_Data/Train_OK/kos45_Part2_label.bmp \n", 840 | " inflating: KolektorSDD_Data/Train_OK/kos45_Part4.jpg \n", 841 | " inflating: KolektorSDD_Data/Train_OK/kos45_Part4_label.bmp \n", 842 | " inflating: KolektorSDD_Data/Train_OK/kos45_Part5.jpg \n", 843 | " inflating: KolektorSDD_Data/Train_OK/kos45_Part5_label.bmp \n", 844 | " inflating: KolektorSDD_Data/Train_OK/kos45_Part6.jpg \n", 845 | " inflating: KolektorSDD_Data/Train_OK/kos45_Part6_label.bmp \n", 846 | " inflating: KolektorSDD_Data/Train_OK/kos45_Part7.jpg \n", 847 | " inflating: KolektorSDD_Data/Train_OK/kos45_Part7_label.bmp \n", 848 | " inflating: KolektorSDD_Data/Train_OK/kos46_Part0.jpg \n", 849 | " inflating: KolektorSDD_Data/Train_OK/kos46_Part0_label.bmp \n", 850 | " inflating: KolektorSDD_Data/Train_OK/kos46_Part1.jpg \n", 851 | " inflating: KolektorSDD_Data/Train_OK/kos46_Part1_label.bmp \n", 852 | " inflating: KolektorSDD_Data/Train_OK/kos46_Part2.jpg \n", 853 | " inflating: KolektorSDD_Data/Train_OK/kos46_Part2_label.bmp \n", 854 | " inflating: KolektorSDD_Data/Train_OK/kos46_Part3.jpg \n", 855 | " inflating: KolektorSDD_Data/Train_OK/kos46_Part3_label.bmp \n", 856 | " inflating: KolektorSDD_Data/Train_OK/kos46_Part4.jpg \n", 857 | " inflating: KolektorSDD_Data/Train_OK/kos46_Part4_label.bmp \n", 858 | " inflating: KolektorSDD_Data/Train_OK/kos46_Part5.jpg \n", 859 | " inflating: KolektorSDD_Data/Train_OK/kos46_Part5_label.bmp \n", 860 | " inflating: KolektorSDD_Data/Train_OK/kos46_Part6.jpg \n", 861 | " inflating: KolektorSDD_Data/Train_OK/kos46_Part6_label.bmp \n", 862 | " inflating: KolektorSDD_Data/Train_OK/kos47_Part0.jpg \n", 863 | " inflating: KolektorSDD_Data/Train_OK/kos47_Part0_label.bmp \n", 864 | " inflating: KolektorSDD_Data/Train_OK/kos47_Part1.jpg \n", 865 | " inflating: KolektorSDD_Data/Train_OK/kos47_Part1_label.bmp \n", 866 | " inflating: KolektorSDD_Data/Train_OK/kos47_Part3.jpg \n", 867 | " inflating: KolektorSDD_Data/Train_OK/kos47_Part3_label.bmp \n", 868 | " inflating: KolektorSDD_Data/Train_OK/kos47_Part4.jpg \n", 869 | " inflating: KolektorSDD_Data/Train_OK/kos47_Part4_label.bmp \n", 870 | " inflating: KolektorSDD_Data/Train_OK/kos47_Part5.jpg \n", 871 | " inflating: KolektorSDD_Data/Train_OK/kos47_Part5_label.bmp \n", 872 | " inflating: KolektorSDD_Data/Train_OK/kos48_Part4.jpg \n", 873 | " inflating: KolektorSDD_Data/Train_OK/kos48_Part4_label.bmp \n", 874 | " inflating: KolektorSDD_Data/Train_OK/kos50_Part1.jpg \n", 875 | " inflating: KolektorSDD_Data/Train_OK/kos50_Part1_label.bmp \n", 876 | " inflating: KolektorSDD_Data/Train_OK/kos50_Part6.jpg \n", 877 | " inflating: KolektorSDD_Data/Train_OK/kos50_Part6_label.bmp \n", 878 | " inflating: KolektorSDD_Data/Train_OK/kos50_Part7.jpg \n", 879 | " inflating: KolektorSDD_Data/Train_OK/kos50_Part7_label.bmp \n" 880 | ] 881 | } 882 | ], 883 | "source": [ 884 | "!wget https://mengcius.coding.net/api/share/download/2e3e085d-d26c-4c63-b57d-a3f066443d89 -O ./KolektorSDD_Data.zip\n", 885 | "!unzip -d KolektorSDD_Data KolektorSDD_Data.zip " 886 | ] 887 | }, 888 | { 889 | "cell_type": "markdown", 890 | "metadata": {}, 891 | "source": [ 892 | "### 下载代码" 893 | ] 894 | }, 895 | { 896 | "cell_type": "code", 897 | "execution_count": 1, 898 | "metadata": { 899 | "colab": {}, 900 | "colab_type": "code", 901 | "id": "0h4ZAaF7KEWt" 902 | }, 903 | "outputs": [ 904 | { 905 | "name": "stdout", 906 | "output_type": "stream", 907 | "text": [ 908 | "Cloning into 'Surface-Defect-Detection'...\n", 909 | "remote: Enumerating objects: 17, done.\u001b[K\n", 910 | "remote: Counting objects: 100% (17/17), done.\u001b[K\n", 911 | "remote: Compressing objects: 100% (15/15), done.\u001b[K\n", 912 | "remote: Total 17 (delta 5), reused 0 (delta 0), pack-reused 0\u001b[K\n", 913 | "Unpacking objects: 100% (17/17), done.\n", 914 | "Checking connectivity... done.\n", 915 | "rm: cannot remove 'Surface-Defect-Detection': Is a directory\n" 916 | ] 917 | } 918 | ], 919 | "source": [ 920 | "!git clone https://github.com/mengcius/Surface-Defect-Detection.git\n", 921 | "!cp -r Surface-Defect-Detection/* ./\n", 922 | "!rm -r Surface-Defect-Detection" 923 | ] 924 | }, 925 | { 926 | "cell_type": "markdown", 927 | "metadata": {}, 928 | "source": [ 929 | "### 训练分割网络\n", 930 | "\n", 931 | "默认使用models.py" 932 | ] 933 | }, 934 | { 935 | "cell_type": "code", 936 | "execution_count": 1, 937 | "metadata": {}, 938 | "outputs": [ 939 | { 940 | "name": "stdout", 941 | "output_type": "stream", 942 | "text": [ 943 | "Namespace(b1=0.5, b2=0.999, batch_size=2, begin_epoch=0, cuda=True, end_epoch=101, gpu_num=1, img_height=1408, img_width=512, lr=0.0001, need_save=True, need_test=True, save_interval=10, test_interval=10, worker_num=4)\n", 944 | " [Epoch 10/101] [Batch 33/34] [loss 0.001782]\n", 945 | "a image avg time 0.003614s\n", 946 | "save weights ! epoch = 10\n", 947 | " [Epoch 20/101] [Batch 33/34] [loss 0.001093]\n", 948 | "a image avg time 0.003439s\n", 949 | "save weights ! epoch = 20\n", 950 | " [Epoch 30/101] [Batch 33/34] [loss 0.000678]\n", 951 | "a image avg time 0.003323s\n", 952 | "save weights ! epoch = 30\n", 953 | " [Epoch 40/101] [Batch 33/34] [loss 0.000464]\n", 954 | "a image avg time 0.003238s\n", 955 | "save weights ! epoch = 40\n", 956 | " [Epoch 50/101] [Batch 33/34] [loss 0.000226]\n", 957 | "a image avg time 0.003402s\n", 958 | "save weights ! epoch = 50\n", 959 | " [Epoch 60/101] [Batch 33/34] [loss 0.000228]\n", 960 | "a image avg time 0.003271s\n", 961 | "save weights ! epoch = 60\n", 962 | " [Epoch 70/101] [Batch 33/34] [loss 0.002756]\n", 963 | "a image avg time 0.003317s\n", 964 | "save weights ! epoch = 70\n", 965 | " [Epoch 80/101] [Batch 33/34] [loss 0.002603]\n", 966 | "a image avg time 0.003236s\n", 967 | "save weights ! epoch = 80\n", 968 | " [Epoch 90/101] [Batch 33/34] [loss 0.000806]\n", 969 | "a image avg time 0.003151s\n", 970 | "save weights ! epoch = 90\n", 971 | " [Epoch 100/101] [Batch 33/34] [loss 0.000734]\n", 972 | "a image avg time 0.003177s\n", 973 | "save weights ! epoch = 100\n" 974 | ] 975 | } 976 | ], 977 | "source": [ 978 | "# SE\n", 979 | "!python3 train_segment.py --end_epoch 101 --lr 0.0001 --save_interval 10" 980 | ] 981 | }, 982 | { 983 | "cell_type": "markdown", 984 | "metadata": { 985 | "colab_type": "text", 986 | "id": "mXYCExxAL408" 987 | }, 988 | "source": [ 989 | "### 训练决策网络" 990 | ] 991 | }, 992 | { 993 | "cell_type": "code", 994 | "execution_count": 3, 995 | "metadata": {}, 996 | "outputs": [ 997 | { 998 | "name": "stdout", 999 | "output_type": "stream", 1000 | "text": [ 1001 | "Namespace(b1=0.5, b2=0.999, batch_size=4, begin_epoch=0, cuda=True, end_epoch=101, gpu_num=1, img_height=1408, img_width=512, lr=0.001, need_save=True, need_test=True, save_interval=10, seg_epoch=100, test_interval=10, worker_num=4)\n", 1002 | " [Epoch 10/101] [Batch 15/16] [loss 0.001286]\n", 1003 | "a image avg time 0.004267s\n", 1004 | "save weights ! epoch = 10\n", 1005 | " [Epoch 20/101] [Batch 15/16] [loss 0.002263]\n", 1006 | "a image avg time 0.004749s\n", 1007 | "save weights ! epoch = 20\n", 1008 | " [Epoch 30/101] [Batch 15/16] [loss 0.000403]\n", 1009 | "a image avg time 0.004758s\n", 1010 | "save weights ! epoch = 30\n", 1011 | " [Epoch 40/101] [Batch 15/16] [loss 0.000833]\n", 1012 | "a image avg time 0.004356s\n", 1013 | "save weights ! epoch = 40\n", 1014 | " [Epoch 50/101] [Batch 15/16] [loss 0.005532]\n", 1015 | "a image avg time 0.004588s\n", 1016 | "save weights ! epoch = 50\n", 1017 | " [Epoch 60/101] [Batch 15/16] [loss 0.000163]\n", 1018 | "a image avg time 0.004297s\n", 1019 | "save weights ! epoch = 60\n", 1020 | " [Epoch 70/101] [Batch 15/16] [loss 0.000197]\n", 1021 | "a image avg time 0.004256s\n", 1022 | "save weights ! epoch = 70\n", 1023 | " [Epoch 80/101] [Batch 15/16] [loss 0.000215]\n", 1024 | "a image avg time 0.004213s\n", 1025 | "save weights ! epoch = 80\n", 1026 | " [Epoch 90/101] [Batch 15/16] [loss 0.000205]\n", 1027 | "a image avg time 0.004214s\n", 1028 | "save weights ! epoch = 90\n", 1029 | " [Epoch 100/101] [Batch 15/16] [loss 0.000020]\n", 1030 | "a image avg time 0.004418s\n", 1031 | "save weights ! epoch = 100\n" 1032 | ] 1033 | } 1034 | ], 1035 | "source": [ 1036 | "# SE + Depthwise\n", 1037 | "!python3 train_decision.py --seg_epoch 100 --end_epoch 101" 1038 | ] 1039 | }, 1040 | { 1041 | "cell_type": "markdown", 1042 | "metadata": { 1043 | "colab_type": "text", 1044 | "id": "XQUBU6nZLuoY" 1045 | }, 1046 | "source": [ 1047 | "### 测试评估\n", 1048 | "\n", 1049 | "test.py默认全分辨率img_height=1408, img_width=512" 1050 | ] 1051 | }, 1052 | { 1053 | "cell_type": "code", 1054 | "execution_count": 8, 1055 | "metadata": {}, 1056 | "outputs": [ 1057 | { 1058 | "name": "stdout", 1059 | "output_type": "stream", 1060 | "text": [ 1061 | "Namespace(cuda=True, img_height=1408, img_width=512, test_dec_epoch=100, test_seg_epoch=100)\n", 1062 | "Image NO 0, Score 0.933785\n", 1063 | "Image NO 1, Score 0.996436\n", 1064 | "Image NO 2, Score 0.994278\n", 1065 | "Image NO 3, Score 0.996007\n", 1066 | "Image NO 4, Score 0.991723\n", 1067 | "Image NO 5, Score 0.966489\n", 1068 | "Image NO 6, Score 0.991962\n", 1069 | "Image NO 7, Score 0.976129\n", 1070 | "Image NO 8, Score 0.993666\n", 1071 | "Image NO 9, Score 0.948688\n", 1072 | "Image NO 10, Score 0.995171\n", 1073 | "Image NO 11, Score 0.994978\n", 1074 | "Image NO 12, Score 0.853001\n", 1075 | "Image NO 13, Score 0.983495\n", 1076 | "Image NO 14, Score 0.991451\n", 1077 | "Image NO 15, Score 0.741835\n", 1078 | "Image NO 16, Score 0.995223\n", 1079 | "Image NO 0, Score 0.000581\n", 1080 | "Image NO 1, Score 0.009707\n", 1081 | "Image NO 2, Score 0.001580\n", 1082 | "Image NO 3, Score 0.000668\n", 1083 | "Image NO 4, Score 0.005339\n", 1084 | "Image NO 5, Score 0.011969\n", 1085 | "Image NO 6, Score 0.001065\n", 1086 | "Image NO 7, Score 0.007879\n", 1087 | "Image NO 8, Score 0.000819\n", 1088 | "Image NO 9, Score 0.001155\n", 1089 | "Image NO 10, Score 0.000755\n", 1090 | "Image NO 11, Score 0.013575\n", 1091 | "Image NO 12, Score 0.000581\n", 1092 | "Image NO 13, Score 0.000584\n", 1093 | "Image NO 14, Score 0.002680\n", 1094 | "Image NO 15, Score 0.006324\n", 1095 | "Image NO 16, Score 0.007151\n", 1096 | "Image NO 17, Score 0.000841\n", 1097 | "Image NO 18, Score 0.000517\n", 1098 | "Image NO 19, Score 0.000758\n", 1099 | "Image NO 20, Score 0.000501\n", 1100 | "Image NO 21, Score 0.002582\n", 1101 | "Image NO 22, Score 0.000975\n", 1102 | "Image NO 23, Score 0.000478\n", 1103 | "Image NO 24, Score 0.002015\n", 1104 | "Image NO 25, Score 0.000706\n", 1105 | "Image NO 26, Score 0.000687\n", 1106 | "Image NO 27, Score 0.000954\n", 1107 | "Image NO 28, Score 0.002128\n", 1108 | "Image NO 29, Score 0.001432\n", 1109 | "Image NO 30, Score 0.001268\n", 1110 | "Image NO 31, Score 0.001016\n", 1111 | "Image NO 32, Score 0.004307\n", 1112 | "Image NO 33, Score 0.001806\n", 1113 | "Image NO 34, Score 0.000795\n", 1114 | "Image NO 35, Score 0.007604\n", 1115 | "Image NO 36, Score 0.001014\n", 1116 | "Image NO 37, Score 0.001734\n", 1117 | "Image NO 38, Score 0.000452\n", 1118 | "Image NO 39, Score 0.002342\n", 1119 | "Image NO 40, Score 0.000445\n", 1120 | "Image NO 41, Score 0.000610\n", 1121 | "Image NO 42, Score 0.002540\n", 1122 | "Image NO 43, Score 0.001468\n", 1123 | "Image NO 44, Score 0.001938\n", 1124 | "Image NO 45, Score 0.000478\n", 1125 | "Image NO 46, Score 0.004817\n", 1126 | "Image NO 47, Score 0.003993\n", 1127 | "Image NO 48, Score 0.002165\n", 1128 | "Image NO 49, Score 0.002010\n", 1129 | "Image NO 50, Score 0.000670\n", 1130 | "Image NO 51, Score 0.002764\n", 1131 | "Image NO 52, Score 0.001229\n", 1132 | "Image NO 53, Score 0.000858\n", 1133 | "Image NO 54, Score 0.000905\n", 1134 | "Image NO 55, Score 0.003510\n", 1135 | "Image NO 56, Score 0.000577\n", 1136 | "Image NO 57, Score 0.001266\n", 1137 | "Image NO 58, Score 0.000534\n", 1138 | "Image NO 59, Score 0.001011\n", 1139 | "Image NO 60, Score 0.000286\n", 1140 | "Image NO 61, Score 0.001306\n", 1141 | "Image NO 62, Score 0.002151\n", 1142 | "Image NO 63, Score 0.008452\n", 1143 | "Image NO 64, Score 0.001484\n", 1144 | "Image NO 65, Score 0.001998\n", 1145 | "Image NO 66, Score 0.001276\n", 1146 | "Image NO 67, Score 0.002656\n", 1147 | "Image NO 68, Score 0.000971\n", 1148 | "Image NO 69, Score 0.001425\n", 1149 | "Image NO 70, Score 0.002314\n", 1150 | "Image NO 71, Score 0.000889\n", 1151 | "Image NO 72, Score 0.000625\n", 1152 | "Image NO 73, Score 0.000945\n", 1153 | "Image NO 74, Score 0.001231\n", 1154 | "Image NO 75, Score 0.000825\n", 1155 | "Image NO 76, Score 0.001009\n", 1156 | "Image NO 77, Score 0.003243\n", 1157 | "Image NO 78, Score 0.001234\n", 1158 | "Image NO 79, Score 0.000585\n", 1159 | "Image NO 80, Score 0.000625\n", 1160 | "Image NO 81, Score 0.000456\n", 1161 | "Image NO 82, Score 0.000608\n", 1162 | "Image NO 83, Score 0.001930\n", 1163 | "Image NO 84, Score 0.002328\n", 1164 | "Image NO 85, Score 0.000978\n", 1165 | "Image NO 86, Score 0.000502\n", 1166 | "Image NO 87, Score 0.000504\n", 1167 | "Image NO 88, Score 0.000697\n", 1168 | "Image NO 89, Score 0.000887\n", 1169 | "Image NO 90, Score 0.002075\n", 1170 | "Image NO 91, Score 0.001773\n", 1171 | "Image NO 92, Score 0.000683\n", 1172 | "Image NO 93, Score 0.000722\n", 1173 | "Image NO 94, Score 0.000565\n", 1174 | "Image NO 95, Score 0.000487\n", 1175 | "Image NO 96, Score 0.002670\n", 1176 | "Image NO 97, Score 0.001766\n", 1177 | "Image NO 98, Score 0.000609\n", 1178 | "Image NO 99, Score 0.011432\n", 1179 | "Image NO 100, Score 0.000470\n", 1180 | "Image NO 101, Score 0.000942\n", 1181 | "Image NO 102, Score 0.001142\n", 1182 | "Image NO 103, Score 0.017124\n", 1183 | "Image NO 104, Score 0.001158\n", 1184 | "Image NO 105, Score 0.000492\n", 1185 | "Image NO 106, Score 0.000586\n", 1186 | "Image NO 107, Score 0.001677\n", 1187 | "Image NO 108, Score 0.002806\n", 1188 | "Image NO 109, Score 0.000345\n", 1189 | "Image NO 110, Score 0.001011\n", 1190 | "Image NO 111, Score 0.000743\n", 1191 | "Image NO 112, Score 0.001295\n", 1192 | "Image NO 113, Score 0.001174\n", 1193 | "Image NO 114, Score 0.000499\n", 1194 | "Image NO 115, Score 0.000817\n", 1195 | "Image NO 116, Score 0.003333\n", 1196 | "Image NO 117, Score 0.000538\n", 1197 | "Image NO 118, Score 0.001114\n", 1198 | "Image NO 119, Score 0.002050\n", 1199 | "Image NO 120, Score 0.002293\n", 1200 | "Image NO 121, Score 0.009026\n", 1201 | "Image NO 122, Score 0.002475\n", 1202 | "\n", 1203 | "a image avg time 0.123273s\n", 1204 | "total number of samples = 140\n", 1205 | "positive = 17\n", 1206 | "negative = 123\n", 1207 | "TP = 17\n", 1208 | "FP = 0\n", 1209 | "TN = 123\n", 1210 | "FN = 0\n", 1211 | "accuracy = 1.0000\n", 1212 | "precision = 1.0000\n", 1213 | "recall = 1.0000\n" 1214 | ] 1215 | } 1216 | ], 1217 | "source": [ 1218 | "# Test \n", 1219 | "!python3 test.py --test_seg_epoch 100 --test_dec_epoch 100" 1220 | ] 1221 | }, 1222 | { 1223 | "cell_type": "code", 1224 | "execution_count": 7, 1225 | "metadata": {}, 1226 | "outputs": [ 1227 | { 1228 | "name": "stdout", 1229 | "output_type": "stream", 1230 | "text": [ 1231 | "Namespace(cuda=True, img_height=1408, img_width=512, test_dec_epoch=100, test_seg_epoch=100)\n", 1232 | "Image NO 0, Score 0.994805\n", 1233 | "Image NO 1, Score 0.329152\n", 1234 | "Image NO 2, Score 0.995809\n", 1235 | "Image NO 3, Score 0.975609\n", 1236 | "Image NO 4, Score 0.988455\n", 1237 | "Image NO 5, Score 0.960680\n", 1238 | "Image NO 6, Score 0.992206\n", 1239 | "Image NO 7, Score 0.889676\n", 1240 | "Image NO 8, Score 0.942427\n", 1241 | "Image NO 9, Score 0.996240\n", 1242 | "Image NO 10, Score 0.990369\n", 1243 | "Image NO 11, Score 0.995599\n", 1244 | "Image NO 12, Score 0.994438\n", 1245 | "Image NO 13, Score 0.989073\n", 1246 | "Image NO 14, Score 0.902207\n", 1247 | "Image NO 15, Score 0.988098\n", 1248 | "Image NO 16, Score 0.993575\n", 1249 | "Image NO 0, Score 0.000437\n", 1250 | "Image NO 1, Score 0.001589\n", 1251 | "Image NO 2, Score 0.001184\n", 1252 | "Image NO 3, Score 0.001775\n", 1253 | "Image NO 4, Score 0.000893\n", 1254 | "Image NO 5, Score 0.000520\n", 1255 | "Image NO 6, Score 0.006639\n", 1256 | "Image NO 7, Score 0.000429\n", 1257 | "Image NO 8, Score 0.001166\n", 1258 | "Image NO 9, Score 0.000355\n", 1259 | "Image NO 10, Score 0.000549\n", 1260 | "Image NO 11, Score 0.001036\n", 1261 | "Image NO 12, Score 0.000427\n", 1262 | "Image NO 13, Score 0.000645\n", 1263 | "Image NO 14, Score 0.000536\n", 1264 | "Image NO 15, Score 0.000483\n", 1265 | "Image NO 16, Score 0.000322\n", 1266 | "Image NO 17, Score 0.007624\n", 1267 | "Image NO 18, Score 0.003282\n", 1268 | "Image NO 19, Score 0.001568\n", 1269 | "Image NO 20, Score 0.006493\n", 1270 | "Image NO 21, Score 0.001312\n", 1271 | "Image NO 22, Score 0.000469\n", 1272 | "Image NO 23, Score 0.001769\n", 1273 | "Image NO 24, Score 0.001046\n", 1274 | "Image NO 25, Score 0.002205\n", 1275 | "Image NO 26, Score 0.000846\n", 1276 | "Image NO 27, Score 0.001138\n", 1277 | "Image NO 28, Score 0.001313\n", 1278 | "Image NO 29, Score 0.001746\n", 1279 | "Image NO 30, Score 0.003274\n", 1280 | "Image NO 31, Score 0.010005\n", 1281 | "Image NO 32, Score 0.006281\n", 1282 | "Image NO 33, Score 0.000344\n", 1283 | "Image NO 34, Score 0.000478\n", 1284 | "Image NO 35, Score 0.000405\n", 1285 | "Image NO 36, Score 0.002558\n", 1286 | "Image NO 37, Score 0.001228\n", 1287 | "Image NO 38, Score 0.001874\n", 1288 | "Image NO 39, Score 0.002220\n", 1289 | "Image NO 40, Score 0.002120\n", 1290 | "Image NO 41, Score 0.001123\n", 1291 | "Image NO 42, Score 0.000721\n", 1292 | "Image NO 43, Score 0.006387\n", 1293 | "Image NO 44, Score 0.001428\n", 1294 | "Image NO 45, Score 0.000988\n", 1295 | "Image NO 46, Score 0.000373\n", 1296 | "Image NO 47, Score 0.000964\n", 1297 | "Image NO 48, Score 0.000835\n", 1298 | "Image NO 49, Score 0.001292\n", 1299 | "Image NO 50, Score 0.001950\n", 1300 | "Image NO 51, Score 0.000785\n", 1301 | "Image NO 52, Score 0.003955\n", 1302 | "Image NO 53, Score 0.002164\n", 1303 | "Image NO 54, Score 0.000771\n", 1304 | "Image NO 55, Score 0.000621\n", 1305 | "Image NO 56, Score 0.009093\n", 1306 | "Image NO 57, Score 0.000427\n", 1307 | "Image NO 58, Score 0.013054\n", 1308 | "Image NO 59, Score 0.000305\n", 1309 | "Image NO 60, Score 0.000583\n", 1310 | "Image NO 61, Score 0.005288\n", 1311 | "Image NO 62, Score 0.003253\n", 1312 | "Image NO 63, Score 0.000904\n", 1313 | "Image NO 64, Score 0.007000\n", 1314 | "Image NO 65, Score 0.000581\n", 1315 | "Image NO 66, Score 0.003001\n", 1316 | "Image NO 67, Score 0.001723\n", 1317 | "Image NO 68, Score 0.000560\n", 1318 | "Image NO 69, Score 0.000411\n", 1319 | "Image NO 70, Score 0.003553\n", 1320 | "Image NO 71, Score 0.003514\n", 1321 | "Image NO 72, Score 0.000769\n", 1322 | "Image NO 73, Score 0.000351\n", 1323 | "Image NO 74, Score 0.000282\n", 1324 | "Image NO 75, Score 0.000915\n", 1325 | "Image NO 76, Score 0.001095\n", 1326 | "Image NO 77, Score 0.005309\n", 1327 | "Image NO 78, Score 0.000638\n", 1328 | "Image NO 79, Score 0.000551\n", 1329 | "Image NO 80, Score 0.002237\n", 1330 | "Image NO 81, Score 0.000573\n", 1331 | "Image NO 82, Score 0.001346\n", 1332 | "Image NO 83, Score 0.004410\n", 1333 | "Image NO 84, Score 0.001623\n", 1334 | "Image NO 85, Score 0.010157\n", 1335 | "Image NO 86, Score 0.002432\n", 1336 | "Image NO 87, Score 0.000424\n", 1337 | "Image NO 88, Score 0.000802\n", 1338 | "Image NO 89, Score 0.000672\n", 1339 | "Image NO 90, Score 0.005569\n", 1340 | "Image NO 91, Score 0.001488\n", 1341 | "Image NO 92, Score 0.000694\n", 1342 | "Image NO 93, Score 0.000428\n", 1343 | "Image NO 94, Score 0.001503\n", 1344 | "Image NO 95, Score 0.003277\n", 1345 | "Image NO 96, Score 0.003012\n", 1346 | "Image NO 97, Score 0.001035\n", 1347 | "Image NO 98, Score 0.001274\n", 1348 | "Image NO 99, Score 0.136710\n", 1349 | "Image NO 100, Score 0.000746\n", 1350 | "Image NO 101, Score 0.002010\n", 1351 | "Image NO 102, Score 0.000380\n", 1352 | "Image NO 103, Score 0.000409\n", 1353 | "Image NO 104, Score 0.000730\n", 1354 | "Image NO 105, Score 0.007454\n", 1355 | "Image NO 106, Score 0.005101\n", 1356 | "Image NO 107, Score 0.000390\n", 1357 | "Image NO 108, Score 0.002114\n", 1358 | "Image NO 109, Score 0.000370\n", 1359 | "Image NO 110, Score 0.010448\n", 1360 | "Image NO 111, Score 0.005553\n", 1361 | "Image NO 112, Score 0.001639\n", 1362 | "Image NO 113, Score 0.002348\n", 1363 | "Image NO 114, Score 0.000280\n", 1364 | "Image NO 115, Score 0.001822\n", 1365 | "Image NO 116, Score 0.000980\n", 1366 | "Image NO 117, Score 0.000938\n", 1367 | "Image NO 118, Score 0.003194\n", 1368 | "Image NO 119, Score 0.001539\n", 1369 | "Image NO 120, Score 0.014883\n", 1370 | "Image NO 121, Score 0.001822\n", 1371 | "Image NO 122, Score 0.000736\n", 1372 | "\n", 1373 | "a image avg time 0.109568s\n", 1374 | "total number of samples = 140\n", 1375 | "positive = 17\n", 1376 | "negative = 123\n", 1377 | "TP = 16\n", 1378 | "FP = 0\n", 1379 | "TN = 123\n", 1380 | "FN = 1\n", 1381 | "accuracy = 0.9929\n", 1382 | "precision = 1.0000\n", 1383 | "recall = 0.9412\n" 1384 | ] 1385 | } 1386 | ], 1387 | "source": [ 1388 | "# # Test img_height=1408, img_width=512 \n", 1389 | "# !python3 test.py --test_seg_epoch 100 --test_dec_epoch 100" 1390 | ] 1391 | }, 1392 | { 1393 | "cell_type": "code", 1394 | "execution_count": 0, 1395 | "metadata": { 1396 | "colab": {}, 1397 | "colab_type": "code", 1398 | "id": "r3GptxeMHVNI" 1399 | }, 1400 | "outputs": [], 1401 | "source": [] 1402 | } 1403 | ], 1404 | "metadata": { 1405 | "colab": { 1406 | "collapsed_sections": [], 1407 | "name": "SegDecNet.ipynb", 1408 | "provenance": [], 1409 | "toc_visible": true 1410 | }, 1411 | "kernelspec": { 1412 | "display_name": "Python 3", 1413 | "language": "python", 1414 | "name": "python3" 1415 | }, 1416 | "language_info": { 1417 | "codemirror_mode": { 1418 | "name": "ipython", 1419 | "version": 3 1420 | }, 1421 | "file_extension": ".py", 1422 | "mimetype": "text/x-python", 1423 | "name": "python", 1424 | "nbconvert_exporter": "python", 1425 | "pygments_lexer": "ipython3", 1426 | "version": "3.5.2" 1427 | } 1428 | }, 1429 | "nbformat": 4, 1430 | "nbformat_minor": 1 1431 | } 1432 | -------------------------------------------------------------------------------- /saved_models/decision_net_100.pth: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengcius/Surface-Defect-Detection/1f42670e55d9ab0d328e139faa17a33c9149ec32/saved_models/decision_net_100.pth -------------------------------------------------------------------------------- /test.py: -------------------------------------------------------------------------------- 1 | 2 | import torch 3 | import torch.nn as nn 4 | from torchvision import datasets 5 | from torchvision.utils import save_image 6 | import torchvision.transforms as transforms 7 | from torch.autograd import Variable 8 | from torch.utils.data import DataLoader 9 | import os 10 | import sys 11 | import argparse 12 | import time 13 | import PIL.Image as Image 14 | import numpy as np 15 | 16 | from models import SegmentNet, DecisionNet, weights_init_normal 17 | from dataset import KolektorDataset 18 | 19 | parser = argparse.ArgumentParser() 20 | parser.add_argument("--cuda", type=bool, default=True, help="number of gpu") 21 | parser.add_argument("--test_seg_epoch", type=int, default=100, help="test segment epoch") 22 | parser.add_argument("--test_dec_epoch", type=int, default=60, help="test segment epoch") 23 | 24 | parser.add_argument("--img_height", type=int, default=1408, help="size of image height") # 1408x512 704x256 25 | parser.add_argument("--img_width", type=int, default=512, help="size of image width") 26 | opt = parser.parse_args() 27 | print(opt) 28 | 29 | dataSetRoot = "./KolektorSDD_Data/Test" 30 | 31 | # Build nets 32 | segment_net = SegmentNet(init_weights=True) 33 | decision_net = DecisionNet(init_weights=True) 34 | 35 | if opt.cuda: 36 | segment_net = segment_net.cuda() 37 | decision_net = decision_net.cuda() 38 | 39 | if opt.test_seg_epoch != 0: 40 | # Load pretrained models 41 | segment_net.load_state_dict(torch.load("./saved_models/segment_net_%d.pth" % (opt.test_seg_epoch))) 42 | 43 | if opt.test_dec_epoch != 0: 44 | # Load pretrained models 45 | decision_net.load_state_dict(torch.load("./saved_models/decision_net_%d.pth" % (opt.test_dec_epoch))) 46 | 47 | transforms_ = transforms.Compose([ 48 | transforms.Resize((opt.img_height, opt.img_width), Image.BICUBIC), 49 | transforms.ToTensor(), 50 | #transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)), 51 | ]) 52 | testloader = DataLoader( 53 | KolektorDataset(dataSetRoot, transforms_=transforms_, transforms_mask= None, 54 | subFold="Train_NG", isTrain=False), 55 | batch_size=1, 56 | shuffle=True, 57 | num_workers=0, 58 | ) 59 | testloader2 = DataLoader( 60 | KolektorDataset(dataSetRoot, transforms_=transforms_, transforms_mask= None, 61 | subFold="Train_OK", isTrain=False), 62 | batch_size=1, 63 | shuffle=True, 64 | num_workers=0, 65 | ) 66 | 67 | segment_net.eval() 68 | # decision_net.eval() 69 | 70 | all_time = 0 71 | count_time = 0 72 | count = 0 73 | count_TP = 0 # Pii 74 | count_FP = 0 # Pij 75 | count_TN = 0 # Pjj 76 | count_FN = 0 # Pji 77 | 78 | for i, testBatch in enumerate(testloader): 79 | torch.cuda.synchronize() 80 | iterNG = testloader.__iter__() 81 | batchData = iterNG.__next__() 82 | 83 | # Train_NG 84 | gt_c = Variable(torch.Tensor(np.ones((batchData["img"].size(0), 1))), requires_grad=False) 85 | # Train_OK 86 | # gt_c = Variable(torch.Tensor(np.zeros((batchData["img"].size(0), 1))), requires_grad=False) 87 | 88 | # print(gt_c.numpy()[0,0]) # Train_NG:1.0,Train_OK:0.0 89 | 90 | gt = gt_c.numpy()[0,0] 91 | t1 = time.time() 92 | 93 | imgTest = testBatch["img"].cuda() 94 | with torch.no_grad(): 95 | rstTest = segment_net(imgTest) 96 | 97 | fTest = rstTest["f"] 98 | segTest = rstTest["seg"] 99 | with torch.no_grad(): 100 | cTest = decision_net(fTest, segTest) 101 | 102 | torch.cuda.synchronize() 103 | t2 = time.time() 104 | 105 | print("Image NO %d, Score %f"% (i, cTest.item())) 106 | if cTest.item() > 0.45: 107 | labelStr = "NG" # 0.51 108 | else: 109 | labelStr = "OK" # 0.45 110 | 111 | save_path_str = "./testResult" 112 | if os.path.exists(save_path_str) == False: 113 | os.makedirs(save_path_str, exist_ok=True) 114 | save_image(imgTest.data, "%s/img_%d_%s.jpg"% (save_path_str, i, labelStr)) 115 | save_image(segTest.data, "%s/img_%d_seg_%s.jpg"% (save_path_str, i, labelStr)) 116 | 117 | count +=1 118 | if gt == 1 and labelStr == "NG": 119 | count_TP += 1 120 | elif gt == 1: 121 | count_FN += 1 122 | elif labelStr == "NG": 123 | count_FP += 1 124 | else: 125 | count_TN += 1 126 | 127 | # print("processing image NO %d, time comsuption %fs"%(i, t2 - t1)) 128 | all_time = (t2-t1) + all_time 129 | count_time = count_time + 1 130 | # print(all_time, count_time) 131 | 132 | for i, testBatch in enumerate(testloader2): 133 | torch.cuda.synchronize() 134 | iterNG = testloader.__iter__() 135 | batchData = iterNG.__next__() 136 | 137 | # Train_NG 138 | # gt_c = Variable(torch.Tensor(np.ones((batchData["img"].size(0), 1))), requires_grad=False) 139 | # Train_OK 140 | gt_c = Variable(torch.Tensor(np.zeros((batchData["img"].size(0), 1))), requires_grad=False) 141 | 142 | # print(gt_c.numpy()[0,0]) # Train_NG:1.0,Train_OK:0.0 143 | 144 | gt = gt_c.numpy()[0,0] 145 | t1 = time.time() 146 | 147 | imgTest = testBatch["img"].cuda() 148 | with torch.no_grad(): 149 | rstTest = segment_net(imgTest) 150 | 151 | fTest = rstTest["f"] 152 | segTest = rstTest["seg"] 153 | with torch.no_grad(): 154 | cTest = decision_net(fTest, segTest) 155 | 156 | torch.cuda.synchronize() 157 | t2 = time.time() 158 | 159 | print("Image NO %d, Score %f"% (i, cTest.item())) 160 | if cTest.item() > 0.45: 161 | labelStr = "NG" # 0.51 162 | else: 163 | labelStr = "OK" # 0.45 164 | 165 | save_path_str = "./testResult" 166 | if os.path.exists(save_path_str) == False: 167 | os.makedirs(save_path_str, exist_ok=True) 168 | save_image(imgTest.data, "%s/img_%d_%s.jpg"% (save_path_str, i, labelStr)) 169 | save_image(segTest.data, "%s/img_%d_seg_%s.jpg"% (save_path_str, i, labelStr)) 170 | 171 | count +=1 172 | if gt == 1 and labelStr == "NG": 173 | count_TP += 1 174 | elif gt == 1: 175 | count_FN += 1 176 | elif labelStr == "NG": 177 | count_FP += 1 178 | else: 179 | count_TN += 1 180 | 181 | # print("processing image NO %d, time comsuption %fs"%(i, t2 - t1)) 182 | all_time = (t2-t1) + all_time 183 | count_time = count_time + 1 184 | # print(all_time, count_time) 185 | 186 | avg_time = all_time/count_time 187 | print("\na image avg time %fs" % avg_time) 188 | 189 | accuracy = (count_TP + count_TN) / count 190 | precision = count_TP / (count_TP + count_FP) 191 | recall = count_TP / (count_TP + count_FN) 192 | 193 | print("total number of samples = {}".format(count)) 194 | print("positive = {}".format(count_TP + count_FN)) 195 | print("negative = {}".format(count_FP + count_TN)) 196 | print("TP = {}".format(count_TP )) 197 | print("FP = {}".format(count_FP)) 198 | print("TN = {}".format(count_TN )) 199 | print("FN = {}".format(count_FN )) 200 | print("accuracy = {:.4f}".format((count_TP + count_TN) / count)) 201 | print("precision = {:.4f}".format(precision)) 202 | print("recall = {:.4f}".format(recall)) -------------------------------------------------------------------------------- /train_decision.py: -------------------------------------------------------------------------------- 1 | import torch.nn as nn 2 | import torch 3 | from torchvision import datasets 4 | from torchvision.utils import save_image 5 | import torchvision.transforms as transforms 6 | from torch.autograd import Variable 7 | from torch.utils.data import DataLoader 8 | import os 9 | import sys 10 | import argparse 11 | import time 12 | import PIL.Image as Image 13 | import numpy as np 14 | 15 | from models import SegmentNet, DecisionNet, weights_init_normal 16 | from dataset import KolektorDataset 17 | 18 | parser = argparse.ArgumentParser() 19 | 20 | parser.add_argument("--cuda", type=bool, default=True, help="number of gpu") 21 | parser.add_argument("--gpu_num", type=int, default=1, help="number of gpu") 22 | parser.add_argument("--worker_num", type=int, default=4, help="number of input workers") 23 | parser.add_argument("--batch_size", type=int, default=4, help="batch size of input") 24 | parser.add_argument("--lr", type=float, default=0.001, help="adam: learning rate") 25 | parser.add_argument("--b1", type=float, default=0.5, help="adam: decay of first order momentum of gradient") 26 | parser.add_argument("--b2", type=float, default=0.999, help="adam: decay of first order momentum of gradient") 27 | 28 | parser.add_argument("--begin_epoch", type=int, default=0, help="begin_epoch") 29 | parser.add_argument("--end_epoch", type=int, default=61, help="end_epoch") 30 | parser.add_argument("--seg_epoch", type=int, default=50, help="pretrained segment epoch") 31 | 32 | parser.add_argument("--need_test", type=bool, default=True, help="need to test") 33 | parser.add_argument("--test_interval", type=int, default=10, help="interval of test") 34 | parser.add_argument("--need_save", type=bool, default=True, help="need to save") 35 | parser.add_argument("--save_interval", type=int, default=10, help="interval of save weights") 36 | 37 | parser.add_argument("--img_height", type=int, default=1408, help="size of image height") # 1408x512 704x256 38 | parser.add_argument("--img_width", type=int, default=512, help="size of image width") 39 | 40 | opt = parser.parse_args() 41 | print(opt) 42 | 43 | dataSetRoot = "./KolektorSDD_Data" 44 | 45 | # Build nets 46 | segment_net = SegmentNet(init_weights=True) 47 | decision_net = DecisionNet(init_weights=True) 48 | 49 | # Loss functions 50 | #criterion_segment = torch.nn.MSELoss() 51 | criterion_decision = torch.nn.MSELoss() 52 | 53 | # Optimizers 54 | optimizer_dec = torch.optim.Adam(decision_net.parameters(), lr=opt.lr, betas=(opt.b1, opt.b2)) 55 | 56 | if opt.cuda: 57 | segment_net = segment_net.cuda() 58 | decision_net = decision_net.cuda() 59 | # criterion_segment.cuda() 60 | criterion_decision.cuda() 61 | 62 | if opt.gpu_num > 1: 63 | segment_net = torch.nn.DataParallel(segment_net, device_ids=list(range(opt.gpu_num))) 64 | decision_net = torch.nn.DataParallel(decision_net, device_ids=list(range(opt.gpu_num))) 65 | 66 | if opt.begin_epoch != 0: 67 | # Load pretrained models 68 | decision_net.load_state_dict(torch.load("./saved_models/decision_net_%d.pth" % (opt.begin_epoch))) 69 | else: 70 | # Initialize weights 71 | decision_net.apply(weights_init_normal) 72 | 73 | # load pretrained segment parameters 74 | segment_net.load_state_dict(torch.load("./saved_models/segment_net_%d.pth" % (opt.seg_epoch))) 75 | segment_net.eval() 76 | 77 | 78 | transforms_ = transforms.Compose([ 79 | transforms.Resize((opt.img_height, opt.img_width), Image.BICUBIC), 80 | transforms.ToTensor(), 81 | #transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)), 82 | ]) 83 | 84 | transforms_mask = transforms.Compose([ 85 | transforms.Resize((opt.img_height//8, opt.img_width//8)), 86 | transforms.ToTensor(), 87 | #transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)), 88 | ]) 89 | 90 | trainOKloader = DataLoader( 91 | KolektorDataset(dataSetRoot, transforms_=transforms_, transforms_mask= transforms_mask, 92 | subFold="Train_OK", isTrain=True), 93 | batch_size=opt.batch_size, 94 | shuffle=True, 95 | num_workers=opt.worker_num, 96 | ) 97 | trainNGloader = DataLoader( 98 | KolektorDataset(dataSetRoot, transforms_=transforms_, transforms_mask= transforms_mask, 99 | subFold="Train_NG", isTrain=True), 100 | batch_size=opt.batch_size, 101 | shuffle=True, 102 | num_workers=opt.worker_num, 103 | ) 104 | ''' 105 | trainloader = DataLoader( 106 | KolektorDataset(dataSetRoot, transforms_=transforms_, transforms_mask= transforms_mask, 107 | subFold="Train_ALL", isTrain=True), 108 | batch_size=opt.batch_size, 109 | shuffle=True, 110 | num_workers=opt.worker_num, 111 | ) 112 | ''' 113 | testloader = DataLoader( 114 | KolektorDataset(dataSetRoot, transforms_=transforms_, transforms_mask= transforms_mask, 115 | subFold="Test/Train_NG", isTrain=False), 116 | batch_size=1, 117 | shuffle=False, 118 | num_workers=0, 119 | ) 120 | 121 | 122 | for epoch in range(opt.begin_epoch, opt.end_epoch): 123 | 124 | iterOK = trainOKloader.__iter__() 125 | iterNG = trainNGloader.__iter__() 126 | 127 | lenNum = min( len(trainNGloader), len(trainOKloader)) 128 | lenNum = 2*(lenNum-1) 129 | 130 | decision_net.train() 131 | segment_net.eval() 132 | # train 133 | for i in range(0, lenNum): 134 | if i % 2 == 0: 135 | batchData = iterOK.__next__() 136 | #idx, batchData = enumerate(trainOKloader) 137 | gt_c = Variable(torch.Tensor(np.zeros((batchData["img"].size(0), 1))), requires_grad=False) 138 | else : 139 | batchData = iterNG.__next__() 140 | gt_c = Variable(torch.Tensor(np.ones((batchData["img"].size(0), 1))), requires_grad=False) 141 | #idx, batchData = enumerate(trainNGloader) 142 | 143 | if opt.cuda: 144 | img = batchData["img"].cuda() 145 | mask = batchData["mask"].cuda() 146 | gt_c = gt_c.cuda() 147 | else: 148 | img = batchData["img"] 149 | mask = batchData["mask"] 150 | 151 | rst = segment_net(img) 152 | f = rst["f"] 153 | seg = rst["seg"] 154 | 155 | optimizer_dec.zero_grad() 156 | 157 | rst_d = decision_net(f, seg) 158 | # rst_d = torch.Tensor.long(rst_d) 159 | 160 | loss_dec = criterion_decision(rst_d, gt_c) 161 | loss_dec.backward() 162 | optimizer_dec.step() 163 | 164 | sys.stdout.write( 165 | "\r [Epoch %d/%d] [Batch %d/%d] [loss %f]" 166 | %( 167 | epoch, 168 | opt.end_epoch, 169 | i, 170 | lenNum, 171 | loss_dec.item() 172 | ) 173 | ) 174 | 175 | # test 176 | if opt.need_test and epoch % opt.test_interval == 0 and epoch >= opt.test_interval: 177 | decision_net.eval() 178 | # segment_net.eval() 179 | all_time = 0 180 | for i, testBatch in enumerate(testloader): 181 | imgTest = testBatch["img"].cuda() 182 | t1 = time.time() 183 | 184 | rstTest = segment_net(imgTest) 185 | fTest = rstTest["f"] 186 | segTest = rstTest["seg"] 187 | cTest = decision_net(fTest, segTest) 188 | 189 | t2 = time.time() 190 | save_path_str = "./testResultDec/epoch_%d"%epoch 191 | if os.path.exists(save_path_str) == False: 192 | os.makedirs(save_path_str, exist_ok=True) 193 | # os.mkdir(save_path_str) 194 | if cTest.item() > 0.5: 195 | labelStr = "NG" 196 | else: 197 | labelStr = "OK" 198 | save_image(imgTest.data, "%s/img_%d_%s.jpg"% (save_path_str, i , labelStr)) 199 | save_image(segTest.data, "%s/img_%d_seg_%s.jpg"% (save_path_str, i, labelStr)) 200 | 201 | # print("processing image NO %d, time comsuption %fs"%(i, t2 - t1)) 202 | all_time = (t2-t1) + all_time 203 | count_time = i + 1 204 | # print(all_time, count_time) 205 | 206 | avg_time = all_time/count_time 207 | print("\na image avg time %fs" % avg_time) 208 | decision_net.train() 209 | 210 | # save model parameters 211 | if opt.need_save and epoch % opt.save_interval == 0 and epoch >= opt.save_interval: 212 | # decision_net.eval() 213 | save_path_str = "./saved_models" 214 | if os.path.exists(save_path_str) == False: 215 | os.makedirs(save_path_str, exist_ok=True) 216 | torch.save(decision_net.state_dict(), "%s/decision_net_%d.pth" % (save_path_str, epoch)) 217 | print("save weights ! epoch = %d"%epoch) 218 | # decision_net.train() 219 | pass 220 | -------------------------------------------------------------------------------- /train_segment.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | from torchvision import datasets 4 | from torchvision.utils import save_image 5 | import torchvision.transforms as transforms 6 | from torch.autograd import Variable 7 | from torch.utils.data import DataLoader 8 | import os 9 | import sys 10 | import argparse 11 | import time 12 | import PIL.Image as Image 13 | 14 | from models import SegmentNet, DecisionNet, weights_init_normal 15 | from dataset import KolektorDataset 16 | 17 | parser = argparse.ArgumentParser() 18 | 19 | parser.add_argument("--cuda", type=bool, default=True, help="number of gpu") 20 | parser.add_argument("--gpu_num", type=int, default=1, help="number of gpu") 21 | parser.add_argument("--worker_num", type=int, default=4, help="number of input workers") 22 | parser.add_argument("--batch_size", type=int, default=2, help="batch size of input") 23 | parser.add_argument("--lr", type=float, default=0.001, help="adam: learning rate") 24 | parser.add_argument("--b1", type=float, default=0.5, help="adam: decay of first order momentum of gradient") 25 | parser.add_argument("--b2", type=float, default=0.999, help="adam: decay of first order momentum of gradient") 26 | 27 | parser.add_argument("--begin_epoch", type=int, default=0, help="begin_epoch") 28 | parser.add_argument("--end_epoch", type=int, default=101, help="end_epoch") 29 | 30 | parser.add_argument("--need_test", type=bool, default=True, help="need to test") 31 | parser.add_argument("--test_interval", type=int, default=10, help="interval of test") 32 | parser.add_argument("--need_save", type=bool, default=True, help="need to save") 33 | parser.add_argument("--save_interval", type=int, default=10, help="interval of save weights") 34 | 35 | parser.add_argument("--img_height", type=int, default=1408, help="size of image height") # 1408x512 704x256 36 | parser.add_argument("--img_width", type=int, default=512, help="size of image width") 37 | 38 | opt = parser.parse_args() 39 | print(opt) 40 | 41 | dataSetRoot = "./KolektorSDD_Data" 42 | 43 | # Build nets 44 | segment_net = SegmentNet(init_weights=True) 45 | 46 | # Loss functions 47 | criterion_segment = torch.nn.MSELoss() # mean squared error (squared L2 norm) 48 | # criterion_segment = torch.nn.BCEWithLogitsLoss() # non convergence 49 | 50 | # Optimizers 51 | optimizer_seg = torch.optim.Adam(segment_net.parameters(), lr=opt.lr, betas=(opt.b1, opt.b2)) 52 | # optimizer_seg = torch.optim.SGD(segment_net.parameters(),lr=opt.lr) 53 | 54 | if opt.cuda: 55 | segment_net = segment_net.cuda() 56 | criterion_segment.cuda() 57 | 58 | if opt.gpu_num > 1: 59 | segment_net = torch.nn.DataParallel(segment_net, device_ids=list(range(opt.gpu_num))) 60 | 61 | if opt.begin_epoch != 0: 62 | # Load pretrained models 63 | segment_net.load_state_dict(torch.load("./saved_models/segment_net_%d.pth" % (opt.begin_epoch))) 64 | else: 65 | # Initialize weights 66 | segment_net.apply(weights_init_normal) 67 | 68 | # DataLoader 69 | transforms_ = transforms.Compose([ 70 | transforms.Resize((opt.img_height, opt.img_width), Image.BICUBIC), 71 | transforms.ToTensor(), 72 | #transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)), 73 | ]) 74 | 75 | transforms_mask = transforms.Compose([ 76 | transforms.Resize((opt.img_height//8, opt.img_width//8)), 77 | transforms.ToTensor(), 78 | #transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)), 79 | ]) 80 | 81 | trainOKloader = DataLoader( 82 | KolektorDataset(dataSetRoot, transforms_=transforms_, transforms_mask= transforms_mask, 83 | subFold="Train_OK", isTrain=True), 84 | batch_size=opt.batch_size, 85 | shuffle=True, 86 | num_workers=opt.worker_num, 87 | ) 88 | trainNGloader = DataLoader( 89 | KolektorDataset(dataSetRoot, transforms_=transforms_, transforms_mask= transforms_mask, 90 | subFold="Train_NG", isTrain=True), 91 | batch_size=opt.batch_size, 92 | shuffle=True, 93 | num_workers=opt.worker_num, 94 | ) 95 | ''' 96 | trainloader = DataLoader( 97 | KolektorDataset(dataSetRoot, transforms_=transforms_, transforms_mask= transforms_mask, 98 | subFold="Train_ALL", isTrain=True), 99 | batch_size=opt.batch_size, 100 | shuffle=True, 101 | num_workers=opt.worker_num, 102 | ) 103 | ''' 104 | testloader = DataLoader( 105 | KolektorDataset(dataSetRoot, transforms_=transforms_, transforms_mask= transforms_mask, 106 | subFold="Test/Train_NG", isTrain=False), 107 | batch_size=1, 108 | shuffle=False, 109 | num_workers=opt.worker_num, 110 | ) 111 | 112 | # device = torch.device('cuda') 113 | 114 | for epoch in range(opt.begin_epoch, opt.end_epoch): 115 | iterOK = trainOKloader.__iter__() 116 | iterNG = trainNGloader.__iter__() 117 | 118 | lenNum = min( len(trainNGloader), len(trainOKloader)) 119 | lenNum = 2*(lenNum-1) 120 | 121 | # train 122 | segment_net.train() 123 | for i in range(0, lenNum): 124 | if i % 2 == 0: 125 | batchData = iterOK.__next__() 126 | #idx, batchData = enumerate(trainOKloader) 127 | else : 128 | batchData = iterNG.__next__() 129 | #idx, batchData = enumerate(trainNGloader) 130 | 131 | if opt.cuda: 132 | img = batchData["img"].cuda() 133 | mask = batchData["mask"].cuda() 134 | else: 135 | img = batchData["img"] 136 | mask = batchData["mask"] 137 | 138 | optimizer_seg.zero_grad() 139 | 140 | rst = segment_net(img) 141 | seg = rst["seg"] 142 | 143 | loss_seg = criterion_segment(seg, mask) 144 | loss_seg.backward() 145 | optimizer_seg.step() 146 | 147 | sys.stdout.write( 148 | "\r [Epoch %d/%d] [Batch %d/%d] [loss %f]" 149 | %( 150 | epoch, 151 | opt.end_epoch, 152 | i, 153 | lenNum, 154 | loss_seg.item() 155 | ) 156 | ) 157 | 158 | # test 159 | if opt.need_test and epoch % opt.test_interval == 0 and epoch >= opt.test_interval: 160 | segment_net.eval() 161 | all_time = 0 162 | for i, testBatch in enumerate(testloader): 163 | imgTest = testBatch["img"].cuda() 164 | t1 = time.time() 165 | rstTest = segment_net(imgTest) 166 | segTest = rstTest["seg"] 167 | t2 = time.time() 168 | 169 | save_path_str = "./testResultSeg/epoch_%d"%epoch 170 | if os.path.exists(save_path_str) == False: 171 | os.makedirs(save_path_str, exist_ok=True) 172 | # os.mkdir(save_path_str) 173 | save_image(imgTest.data, "%s/img_%d.jpg"% (save_path_str, i)) 174 | save_image(segTest.data, "%s/img_%d_seg.jpg"% (save_path_str, i)) 175 | 176 | # print("processing image NO %d, time comsuption %fs"%(i, t2 - t1)) 177 | all_time = (t2-t1) + all_time 178 | count_time = i + 1 179 | # print(all_time, count_time) 180 | 181 | avg_time = all_time/count_time 182 | print("\na image avg time %fs" % avg_time) 183 | segment_net.train() 184 | 185 | # save model parameters 186 | if opt.need_save and epoch % opt.save_interval == 0 and epoch >= opt.save_interval: 187 | save_path_str = "./saved_models" 188 | if os.path.exists(save_path_str) == False: 189 | os.makedirs(save_path_str, exist_ok=True) 190 | torch.save(segment_net.state_dict(), "%s/segment_net_%d.pth" % (save_path_str, epoch)) 191 | print("save weights ! epoch = %d"%epoch) 192 | pass 193 | --------------------------------------------------------------------------------