forked from s444420/AL-2020
product assigning.py to shelf.py; returning coordinates to shelf.py
This commit is contained in:
parent
a08199b267
commit
f4e67bce3b
@ -3,5 +3,5 @@
|
|||||||
<component name="JavaScriptSettings">
|
<component name="JavaScriptSettings">
|
||||||
<option name="languageLevel" value="ES6" />
|
<option name="languageLevel" value="ES6" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.7 (AL-2020)" project-jdk-type="Python SDK" />
|
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.8 (AL-2020)" project-jdk-type="Python SDK" />
|
||||||
</project>
|
</project>
|
@ -4,7 +4,7 @@
|
|||||||
<content url="file://$MODULE_DIR$">
|
<content url="file://$MODULE_DIR$">
|
||||||
<excludeFolder url="file://$MODULE_DIR$/venv" />
|
<excludeFolder url="file://$MODULE_DIR$/venv" />
|
||||||
</content>
|
</content>
|
||||||
<orderEntry type="jdk" jdkName="Python 3.7 (AL-2020)" jdkType="Python SDK" />
|
<orderEntry type="jdk" jdkName="Python 3.8 (AL-2020)" jdkType="Python SDK" />
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
</component>
|
</component>
|
||||||
</module>
|
</module>
|
26
assigning.py
Normal file
26
assigning.py
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import os
|
||||||
|
|
||||||
|
from codes_recognizer.rocognizer import recognizer
|
||||||
|
from board import get_shelfs
|
||||||
|
|
||||||
|
def assigning(product_code_path):
|
||||||
|
|
||||||
|
code = recognizer(product_code_path)
|
||||||
|
shelfs = get_shelfs()
|
||||||
|
|
||||||
|
for shelf in shelfs:
|
||||||
|
if shelf.is_empty():
|
||||||
|
shelf.add_product(code)
|
||||||
|
c = shelf.get_coordinates()
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
if shelf.get_product() == code:
|
||||||
|
shelf.add_product(code)
|
||||||
|
c = shelf.get_coordinates()
|
||||||
|
break
|
||||||
|
|
||||||
|
print("Product", product_code_path, "is on", c)
|
||||||
|
return c
|
||||||
|
|
||||||
|
|
||||||
|
|
7
board.py
7
board.py
@ -1,9 +1,10 @@
|
|||||||
import pygame
|
import pygame
|
||||||
from settings import Settings
|
from settings import Settings
|
||||||
from field import Field
|
from field import Field
|
||||||
|
from shelf import Shelf
|
||||||
|
|
||||||
settings = Settings()
|
settings = Settings()
|
||||||
|
shelfs_o = []
|
||||||
|
|
||||||
def create_board(screen):
|
def create_board(screen):
|
||||||
board = []
|
board = []
|
||||||
@ -19,6 +20,7 @@ def create_board(screen):
|
|||||||
if field.center_x == shelf[0] and field.center_y == shelf[1]:
|
if field.center_x == shelf[0] and field.center_y == shelf[1]:
|
||||||
field.is_shelf = True
|
field.is_shelf = True
|
||||||
field.image = pygame.image.load('img/shelf.png')
|
field.image = pygame.image.load('img/shelf.png')
|
||||||
|
shelfs_o.append(Shelf(x, y))
|
||||||
|
|
||||||
row.append(field)
|
row.append(field)
|
||||||
board.append(row)
|
board.append(row)
|
||||||
@ -46,3 +48,6 @@ def draw_board(board):
|
|||||||
field.blitme()
|
field.blitme()
|
||||||
|
|
||||||
|
|
||||||
|
def get_shelfs():
|
||||||
|
return shelfs_o
|
||||||
|
|
||||||
|
4
coder.py
4
coder.py
@ -68,8 +68,8 @@ def create_image(product):
|
|||||||
print(string)
|
print(string)
|
||||||
img = Image.new('RGB', (560, 112), color='white')
|
img = Image.new('RGB', (560, 112), color='white')
|
||||||
d = ImageDraw.Draw(img)
|
d = ImageDraw.Draw(img)
|
||||||
fnt = ImageFont.truetype('D:\Studia\Projects\AL-2020\img\codes\\arial_bold.ttf', 75)
|
fnt = ImageFont.truetype('img\codes\\arial_bold.ttf', 75)
|
||||||
d.text((30, 30), string, font=fnt, fill=(0, 0, 0))
|
d.text((28, 28), string, font=fnt, fill=(0, 0, 0))
|
||||||
path = 'img/codes/' + product.name + '.png'
|
path = 'img/codes/' + product.name + '.png'
|
||||||
img.save(path)
|
img.save(path)
|
||||||
return path
|
return path
|
||||||
|
@ -1,56 +0,0 @@
|
|||||||
import cv2
|
|
||||||
import torch
|
|
||||||
from nn_model import Net
|
|
||||||
from torchvision.transforms import transforms
|
|
||||||
|
|
||||||
|
|
||||||
def recognizer(paths):
|
|
||||||
|
|
||||||
codes = []
|
|
||||||
code = []
|
|
||||||
|
|
||||||
transform = transforms.Compose([transforms.ToTensor(),
|
|
||||||
transforms.Normalize((0.5,), (0.5,)),
|
|
||||||
])
|
|
||||||
|
|
||||||
# load nn model
|
|
||||||
model = Net()
|
|
||||||
model.load_state_dict(torch.load('model.pt'))
|
|
||||||
model.eval()
|
|
||||||
|
|
||||||
|
|
||||||
for path in paths:
|
|
||||||
img = cv2.imread(path)
|
|
||||||
|
|
||||||
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
|
||||||
img_gray = cv2.GaussianBlur(img_gray, (5, 5), 0)
|
|
||||||
|
|
||||||
ret, im_th = cv2.threshold(img_gray, 90, 255, cv2.THRESH_BINARY_INV)
|
|
||||||
|
|
||||||
ctrs, hier = cv2.findContours(im_th.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
|
|
||||||
|
|
||||||
rects = [cv2.boundingRect(ctr) for ctr in ctrs]
|
|
||||||
|
|
||||||
for rect in rects:
|
|
||||||
# Crop image
|
|
||||||
crop_img = img[rect[1]:rect[1] + rect[3] + 10, rect[0]:rect[0] + rect[2] + 10, 0]
|
|
||||||
# Resize the image
|
|
||||||
roi = cv2.resize(crop_img, (28, 28), interpolation=cv2.INTER_CUBIC)
|
|
||||||
# roi = cv2.dilate(roi, (3, 3))
|
|
||||||
# plt.imshow(roi)
|
|
||||||
# plt.show()
|
|
||||||
im = transform(roi)
|
|
||||||
im = im.view(1, 1, 28, 28)
|
|
||||||
with torch.no_grad():
|
|
||||||
logps = model(im)
|
|
||||||
ps = torch.exp(logps)
|
|
||||||
probab = list(ps.numpy()[0])
|
|
||||||
code.append(probab.index(max(probab)))
|
|
||||||
|
|
||||||
codes.append(code)
|
|
||||||
# cv2.imshow("Code", img)
|
|
||||||
# cv2.waitKey()
|
|
||||||
|
|
||||||
return codes
|
|
||||||
|
|
||||||
|
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
26238
codes_recognizer/dataset/ARIAL.csv
Normal file
26238
codes_recognizer/dataset/ARIAL.csv
Normal file
File diff suppressed because it is too large
Load Diff
@ -18,4 +18,4 @@ class Net(nn.Module):
|
|||||||
x = F.relu(self.fc1(x))
|
x = F.relu(self.fc1(x))
|
||||||
x = F.dropout(x, training=self.training)
|
x = F.dropout(x, training=self.training)
|
||||||
x = self.fc2(x)
|
x = self.fc2(x)
|
||||||
return F.log_softmax(x)
|
return F.log_softmax(x, 1)
|
52
codes_recognizer/rocognizer.py
Normal file
52
codes_recognizer/rocognizer.py
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
import cv2
|
||||||
|
import torch
|
||||||
|
from nn_model import Net
|
||||||
|
from torchvision.transforms import transforms
|
||||||
|
|
||||||
|
|
||||||
|
def recognizer(path):
|
||||||
|
codes = []
|
||||||
|
code = []
|
||||||
|
|
||||||
|
transform = transforms.Compose([transforms.ToTensor(),
|
||||||
|
transforms.Normalize((0.5,), (0.5,)),
|
||||||
|
])
|
||||||
|
|
||||||
|
# load nn model
|
||||||
|
model = Net()
|
||||||
|
model.load_state_dict(torch.load('model.pt'))
|
||||||
|
model.eval()
|
||||||
|
|
||||||
|
img = cv2.imread(path)
|
||||||
|
|
||||||
|
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
||||||
|
img_gray = cv2.GaussianBlur(img_gray, (5, 5), 0)
|
||||||
|
|
||||||
|
ret, im_th = cv2.threshold(img_gray, 90, 255, cv2.THRESH_BINARY_INV)
|
||||||
|
|
||||||
|
ctrs, hier = cv2.findContours(im_th.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
|
||||||
|
|
||||||
|
rects = [cv2.boundingRect(ctr) for ctr in ctrs]
|
||||||
|
|
||||||
|
for rect in rects:
|
||||||
|
# Crop image
|
||||||
|
crop_img = img[rect[1]:rect[1] + rect[3] + 10, rect[0]:rect[0] + rect[2] + 10, 0]
|
||||||
|
# Resize the image
|
||||||
|
roi = cv2.resize(crop_img, (28, 28), interpolation=cv2.INTER_CUBIC)
|
||||||
|
# roi = cv2.dilate(roi, (3, 3))
|
||||||
|
# plt.imshow(roi)
|
||||||
|
# plt.show()
|
||||||
|
im = transform(roi)
|
||||||
|
im = im.view(1, 1, 28, 28)
|
||||||
|
with torch.no_grad():
|
||||||
|
logps = model(im)
|
||||||
|
ps = torch.exp(logps)
|
||||||
|
probab = list(ps.numpy()[0])
|
||||||
|
code.append(probab.index(max(probab)))
|
||||||
|
|
||||||
|
codes.append(code)
|
||||||
|
# cv2.imshow("Code", img)
|
||||||
|
# cv2.waitKey()
|
||||||
|
|
||||||
|
return codes
|
||||||
|
|
3
main.py
3
main.py
@ -7,7 +7,7 @@ import data
|
|||||||
|
|
||||||
from agent import Agent
|
from agent import Agent
|
||||||
from settings import Settings
|
from settings import Settings
|
||||||
from board import create_board, draw_board
|
from board import create_board, draw_board, get_shelfs
|
||||||
from random import randint, choice
|
from random import randint, choice
|
||||||
from mcda import selectedSupply
|
from mcda import selectedSupply
|
||||||
from product import FinalProduct
|
from product import FinalProduct
|
||||||
@ -95,4 +95,5 @@ def run():
|
|||||||
pygame.display.flip()
|
pygame.display.flip()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
run()
|
run()
|
||||||
|
23
shelf.py
23
shelf.py
@ -3,9 +3,24 @@ import pygame
|
|||||||
|
|
||||||
class Shelf:
|
class Shelf:
|
||||||
|
|
||||||
def __init__(self, id):
|
def __init__(self, x, y):
|
||||||
self.id = id
|
self.x = x
|
||||||
|
self.y = y
|
||||||
self.products = []
|
self.products = []
|
||||||
|
|
||||||
def addProduct(self, sweet):
|
def add_product(self, product):
|
||||||
self.products.append(sweet)
|
self.products.append(product)
|
||||||
|
|
||||||
|
def get_product(self):
|
||||||
|
return self.products[0]
|
||||||
|
|
||||||
|
def get_coordinates(self):
|
||||||
|
c = [self.x, self.y]
|
||||||
|
return c
|
||||||
|
|
||||||
|
def is_empty(self):
|
||||||
|
if len(self.products) == 0:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user