https://www.kaggle.com/thedownhill/art-images-drawings-painting-sculpture-engraving
이미지 데이터 : https://www.kaggle.com/thedownhill/art-images-drawings-painting-sculpture-engraving
이미지 데이터를 가지고 Drawing/Painting/Sculptures/Engravings/Iconography 구별하기
첫번째. 필요한 모듈 가져오기
두번째, 파라미터 설정
dir_path = 'training_set' #파일 경로
batsize = 100 #batchsize
lr = 0.002 #running rate(학습률)
셋번째, 폴더에 잇는 이미지 파일 torch화 하기
class drawing(Dataset):
def __init__(self,path,transform=None):
self.className = os.listdir(path) #self.className에 우리가 읽어야하는 폴더 이름이 들어감(예를 들면 Drawing...)
self.path = [f"{path}/{x}/" for x in self.className] # 파일 경로+ 우리가 가져왓던 폴더이름을 더해 경로를 지정한다
self.file_list = [glob.glob(f"{x}/*") for x in self.path] # 가져온 경로에 glob메소드를 *을 이용해 모든 파일을 가져온다
self.transform = transform
files = []
for i, Name in enumerate(self.className):
for j in self.file_list[i]:
files.append([i,Name,j])
print(len(files)) # 잘가져왓는지 확인할수잇게 len()함수를 써서 확인한다
self.file_list = files
files= None
def __len__(self):
return len(self.file_list)
def __getitem__(self,idx):
className = self.file_list[idx][0]
fileName = self.file_list[idx][2]
im = Image.open(fileName)
if self.transform: # 원래 이미지가 (Imgsize,Imgsize,channel)인데 이것을 (channel,Imgsize,Imgsize)로 변환한다
im = self.transform(im)
return im,className # 각 폴더에서 가져온 이미지의 라벨과 이미지를 반환한다
# 이미지크기를 (120,120)으로 바꾸고 이미지값을 Normalize를 시키고 trainDataset으로 바꾼다
mean = [0.5, 0.5, 0.5]
std = [0.5, 0.5, 0.5]
transform = transforms.Compose([
transforms.Scale((120,120)),
transforms.ToTensor(),
transforms.Normalize(mean, std)])
trainDataset = drawing(dir_path,transform=transform)
# 데이터 셋을 데이터 로더 형태로 변환해서 batch_size 만큰 데이터를 읽어들인다
<torch.utils.data.dataloader.DataLoader object at 0x000001B1FE41E9E8>
넷번째, 모델 생성
class NNNNN1(nn.Module):
2def __init__(self):
3super(NNNNN1,self).__init__()
4#120*120
5self.layer1 = nn.Sequential(
6nn.Conv2d(3,16,kernel_size=3,stride=1,padding=1),
7nn.Conv2d(16,16,kernel_size=3,stride=1,padding=1),
8nn.BatchNorm2d(16),
9nn.LeakyReLU(),
10nn.MaxPool2d(2,2)
11)
12#60*60
13self.layer2 = nn.Sequential(
14nn.Conv2d(16,32,kernel_size=3,stride=1,padding=1),
15nn.Conv2d(32,32,kernel_size=3,stride=1,padding=1),
16nn.BatchNorm2d(32),
17nn.ReLU(),
18nn.MaxPool2d(2,2),
19)
20#30*30
21self.layer3 = nn.Sequential(
22nn.Conv2d(32,64,kernel_size=3,stride=1,padding=1),
23nn.Conv2d(64,64,kernel_size=3,stride=1,padding=1),
24nn.BatchNorm2d(64),
25nn.ReLU(),
26nn.MaxPool2d(2,2),
27)
28#15*15
29self.layer4 = nn.Sequential(
30nn.Conv2d(32*2,32*4,kernel_size=3,stride=1,padding=1),
31nn.Conv2d(32*4,32*4,kernel_size=3,stride=1,padding=1),
32nn.Conv2d(32*4,32*4,kernel_size=3,stride=1,padding=1),
33nn.BatchNorm2d(32*4),
34nn.ReLU(),
35nn.MaxPool2d(2,2),
36)
#7*7
37self.fc = nn.Sequential(
38nn.Linear(32*4*7*7,1024),
39nn.ReLU(),
40nn.Linear(1024,1024),
41nn.ReLU(),
42nn.Linear(1024,258),
43nn.ReLU(),
44nn.Linear(258,5),
45)
46
47def forward(self,x):
48x = self.layer1(x)
49x = self.layer2(x)
50x = self.layer3(x)
51x = self.layer4(x)
52x = x.view(-1,32*4*7*7)
53output = self.fc(x)
54return output
model = NNNNN1()
model11 = model.state_dict().keys()
for i in model11:
print(i)
layer1.0.weight layer1.0.bias layer1.1.weight layer1.1.bias layer1.2.weight layer1.2.bias layer1.2.running_mean layer1.2.running_var layer1.2.num_batches_tracked layer2.0.weight layer2.0.bias layer2.1.weight layer2.1.bias layer2.2.weight layer2.2.bias layer2.2.running_mean layer2.2.running_var layer2.2.num_batches_tracked layer3.0.weight layer3.0.bias layer3.1.weight layer3.1.bias layer3.2.weight layer3.2.bias layer3.2.running_mean layer3.2.running_var layer3.2.num_batches_tracked layer4.0.weight layer4.0.bias layer4.1.weight layer4.1.bias layer4.2.weight layer4.2.bias layer4.3.weight layer4.3.bias layer4.3.running_mean layer4.3.running_var layer4.3.num_batches_tracked fc.0.weight fc.0.bias fc.2.weight fc.2.bias fc.4.weight fc.4.bias fc.6.weight fc.6.bias
# 손실함수 optimizer 생성
crition = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(),lr = lr , momentum=0.9)
여섯번째, test 데이터 평가하기
test_file = 'validation_set'
transform = transforms.Compose([
transforms.Scale((120,120)),
transforms.ToTensor(),
transforms.Normalize(mean, std)])
testDataset = drawing(test_file,transform=transform)
850
test_loader = DataLoader(dataset = testDataset,
shuffle = False)
print(train_loader)
<torch.utils.data.dataloader.DataLoader object at 0x000001B1FE41E9E8>
#이미지 데이터가 torch화 하면서 채널이 3이 아닌 애들이 발생하면 그 데이터를 제거 해줘야되기때문에 어느 데이터가 잘못되엇는지 확인하는 과정
for i,data in enumerate(test_loader):
2x,y = data
3if x.shape[1] != 3:
4print(x.shape)
5print(y)
# 평가하기
correct = 0
2scroe = 0
3for i , data in enumerate(test_loader):
4x,y = data
5img = Variable(x)
6label = Variable(y.long())
7
8output = model(img)
9_,predict = torch.max(output,1)
10correct += (predict == label).sum().float()
11scroe = 100*(correct/850)
12print("Accursy : {}".format(scroe))
Accursy : 62.0
'이미지 처리' 카테고리의 다른 글
SRCNN 저화질 화질 고화질로 변환 (0) | 2019.03.15 |
---|---|
대학생 1학년이 이해하는 Opencv 와 deel learning을 이용한 영상속에 나를 찾아서 주는 모델 (0) | 2019.01.15 |