Projekt_AI-Automatyczny_saper/Engine/Neurons.py

125 lines
4.0 KiB
Python
Raw Normal View History

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):
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()])
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()