2021-06-01 17:38:31 +02:00
|
|
|
import numpy as np
|
|
|
|
import torch
|
|
|
|
from numpy import asarray
|
|
|
|
from torch import nn
|
|
|
|
from torch import optim
|
2021-06-01 19:41:41 +02:00
|
|
|
from torch.autograd import Variable
|
2021-06-01 17:38:31 +02:00
|
|
|
from torch.utils.data import Dataset
|
|
|
|
import os
|
|
|
|
import pandas as pd
|
|
|
|
from PIL import Image
|
|
|
|
from torchvision.io import read_image
|
2021-06-01 18:53:56 +02:00
|
|
|
|
2021-06-01 17:38:31 +02:00
|
|
|
from torchvision.transforms import Resize, Lambda, transforms, ToTensor
|
2021-06-01 19:41:41 +02:00
|
|
|
from mnist import MNIST
|
2021-06-01 17:38:31 +02:00
|
|
|
|
|
|
|
from Constants import *
|
|
|
|
from torch.utils.data import DataLoader
|
|
|
|
|
2021-06-01 19:41:41 +02:00
|
|
|
|
2021-06-01 17:38:31 +02:00
|
|
|
class Neurons:
|
|
|
|
def __init__(self):
|
2021-06-15 13:12:20 +02:00
|
|
|
dataset = MNIST('C:\\Users\\Konrad\\PycharmProjects\\Projekt_AI-Automatyczny_saper\\Engine', gz=True, return_type='numpy')
|
2021-06-01 19:41:41 +02:00
|
|
|
images, labels = dataset.load_training()
|
|
|
|
test_images, test_labels = dataset.load_testing()
|
|
|
|
images = images / 255
|
|
|
|
test_images = test_images / 255
|
|
|
|
|
|
|
|
self.train_images = [torch.tensor(image, dtype=torch.float32) for image in images]
|
|
|
|
self.train_labels = [torch.tensor(label, dtype=torch.long) for label in labels]
|
|
|
|
test_images = [torch.tensor(image, dtype=torch.float32) for image in test_images]
|
|
|
|
test_labels = [torch.tensor(label, dtype=torch.long) for label in test_labels]
|
|
|
|
|
|
|
|
input_dim = 28 * 28
|
2021-06-01 17:38:31 +02:00
|
|
|
output_dim = 10
|
2021-06-01 19:41:41 +02:00
|
|
|
|
2021-06-01 17:38:31 +02:00
|
|
|
self.model = nn.Sequential(
|
2021-06-01 19:41:41 +02:00
|
|
|
nn.Linear(input_dim, output_dim),
|
2021-06-01 17:38:31 +02:00
|
|
|
nn.LogSoftmax()
|
|
|
|
)
|
2021-06-01 19:41:41 +02:00
|
|
|
self.model.eval()
|
2021-06-01 17:38:31 +02:00
|
|
|
torch.save(self.train(self.model, 100), 'model.pth')
|
2021-06-01 19:41:41 +02:00
|
|
|
imsize = 28
|
|
|
|
loader = transforms.Compose([transforms.Resize((imsize, imsize)), transforms.ToTensor()])
|
2021-06-15 13:12:20 +02:00
|
|
|
image = Image.open("C:\\Users\\Konrad\\PycharmProjects\\JPG-PNG-to-MNIST-NN-Format\\test-images\\1\\claymore (1).png")
|
2021-06-01 19:41:41 +02:00
|
|
|
image = image.convert("1")
|
|
|
|
image = loader(image).float()
|
|
|
|
image = Variable(image, requires_grad=True)
|
|
|
|
predicted = self.model(image)
|
|
|
|
print(predicted)
|
2021-06-01 17:38:31 +02:00
|
|
|
|
|
|
|
def train(self,model, n_iter):
|
|
|
|
criterion = nn.NLLLoss()
|
|
|
|
optimizer = optim.SGD(model.parameters(), lr=0.001)
|
|
|
|
|
|
|
|
for epoch in range(n_iter):
|
2021-06-01 19:41:41 +02:00
|
|
|
for image, label in zip(self.train_images, self.train_labels):
|
2021-06-01 17:38:31 +02:00
|
|
|
optimizer.zero_grad()
|
|
|
|
|
|
|
|
output = model(image)
|
|
|
|
loss = criterion(output.unsqueeze(0), label.unsqueeze(0))
|
|
|
|
loss.backward()
|
|
|
|
optimizer.step()
|
|
|
|
|
|
|
|
print(f'epoch: {epoch:03}')
|
|
|
|
return model
|
|
|
|
|
|
|
|
|
|
|
|
def accuracy(self,expected, predicted):
|
2021-06-01 19:41:41 +02:00
|
|
|
return len([int for e, p in zip(expected, predicted) if e == p])/len(expected)
|
2021-06-01 17:38:31 +02:00
|
|
|
|
|
|
|
|
|
|
|
def loadImages(self):
|
|
|
|
col_dir = 'D:\\fotyProjekt\\clowns'
|
|
|
|
images = []
|
|
|
|
labels = []
|
|
|
|
imgs = os.listdir(col_dir)
|
|
|
|
for i in imgs:
|
|
|
|
images.append(i)
|
|
|
|
print("Load clowns")
|
|
|
|
print(imgs)
|
|
|
|
for i in imgs:
|
|
|
|
labels.append(self.getLabelsForImages(DECOY))
|
|
|
|
col_dir = 'D:\\fotyProjekt\\chemical'
|
|
|
|
imgs = os.listdir(col_dir)
|
|
|
|
for i in imgs:
|
|
|
|
images.append(i)
|
|
|
|
print("Load chemical")
|
|
|
|
for i in imgs:
|
|
|
|
labels.append(self.getLabelsForImages(CHEMICAL_BOMB))
|
|
|
|
col_dir = 'D:\\fotyProjekt\\atomic'
|
|
|
|
imgs = os.listdir(col_dir)
|
|
|
|
for i in imgs:
|
|
|
|
images.append(i)
|
|
|
|
print("Load atomic")
|
|
|
|
for i in imgs:
|
|
|
|
labels.append(self.getLabelsForImages(ATOMIC_BOMB))
|
|
|
|
col_dir = 'D:\\fotyProjekt\\landmine'
|
|
|
|
imgs = os.listdir(col_dir)
|
|
|
|
for i in imgs:
|
|
|
|
images.append(i)
|
|
|
|
print("Load landmine")
|
|
|
|
for i in imgs:
|
|
|
|
labels.append(self.getLabelsForImages(LAND_MINE))
|
|
|
|
col_dir = 'D:\\fotyProjekt\\claymore'
|
|
|
|
imgs = os.listdir(col_dir)
|
|
|
|
for i in imgs:
|
|
|
|
images.append(i)
|
|
|
|
print("Load claymore")
|
|
|
|
for i in imgs:
|
|
|
|
labels.append(self.getLabelsForImages(CLAYMORE))
|
|
|
|
f = open('labels.csv', 'w')
|
|
|
|
while images:
|
|
|
|
img = images.pop()
|
|
|
|
lb = labels.pop()
|
|
|
|
f.write(os.path.basename(img) + ", " + lb.__str__() + "\n")
|
|
|
|
f.close()
|
|
|
|
|
|
|
|
def getLabelsForImages(self,imageType):
|
|
|
|
return self.d.get(imageType)
|
|
|
|
|
2021-06-01 19:41:41 +02:00
|
|
|
|
2021-06-01 17:38:31 +02:00
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
Neurons()
|