Compare commits

..

No commits in common. "master" and "VIS-29" have entirely different histories.

21 changed files with 65 additions and 218 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

View File

@ -0,0 +1 @@
test txt file

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,12 +1,12 @@
#import tkinter as tk
import sys
import os, subprocess
import os
import shutil
from datetime import datetime
import time
from PyQt5 import QtCore
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtGui import QIcon, QPixmap
from PyQt5.QtCore import *
scriptPath = os.path.dirname(os.path.realpath(__file__))
@ -16,68 +16,30 @@ outputFilePath = scriptPath + '\\files\\output'
LIB_RAW = 0
LIB_VIS = 1
stylesheet = """
MainWindow {
background: qlineargradient(x1:0 y1:0, x2:1 y2:0, stop:0 rgba(255,218,113,1), stop:0.5 rgba(215,137,255,1), stop:1 rgba(105,126,255,1));
}
"""
def files(path):
for subdir, dirs, files_list in os.walk(path):
for file in files_list:
yield os.path.join(subdir, file)
def delete_file(file):
os.remove(file)
def save_input(oldpath):
# add timestamp to the filename, so it wouln't overwrite but the user still knows which file's which
timestamp = str(int(time.time()))
basename = os.path.basename(oldpath)
try:
index_of_dot = basename.index('.')
basename_no_extension = basename[:index_of_dot]
extension = basename[index_of_dot:]
except ValueError:
basename_no_extension = basename
extension = ''
filename = basename_no_extension + '_' + timestamp + extension
newpath = inputFilePath + '\\' + filename
shutil.copy(oldpath, newpath)
return newpath
for file in os.listdir(path):
if os.path.isfile(os.path.join(path, file)):
yield file
class deletePopup(QMessageBox):
def __init__(self, parent=None):
super(deletePopup, self).__init__(parent)
super(deletePopup,self).__init__(parent)
self.setText("Are you sure you want to delete the file?")
self.setIcon(self.Warning)
self.setWindowTitle("Confirm deletion")
self.setStandardButtons(self.Yes | self.No)
class analizePopup(QMessageBox):
def __init__(self, parent=None):
super(analizePopup, self).__init__(parent)
self.setStyleSheet("QLabel{min-width: 100px; max-width: 100px; qproperty-alignment: AlignCenter;}");
self.setWindowIcon(QIcon(scriptPath + os.path.sep + 'static/v_logo.jpg'))
self.setText("Analyzing file...")
self.setWindowTitle("File analysis")
# create Label
self.setIconPixmap(QPixmap(scriptPath + os.path.sep + 'static/loading.gif'))
icon_label = self.findChild(QLabel, "qt_msgboxex_icon_label")
movie = QMovie(scriptPath + os.path.sep + 'static/loading.gif')
# avoid garbage collector
setattr(self, 'icon_label', movie)
icon_label.setMovie(movie)
movie.start()
self.setStandardButtons(self.Cancel)
def save_input(oldpath):
# make timestampt the filename, so it wouln't overwrite
timestamp = str(int(time.time()))
filename = timestamp + '.' + oldpath.split('.')[-1]
newpath = inputFilePath + '\\' + filename
shutil.copy(oldpath, newpath)
return newpath
class LibraryTableButtons(QWidget):
def __init__(self, file, table, type, mainWindow, parent=None):
def __init__(self, file, parent=None):
super(LibraryTableButtons,self).__init__(parent)
def viewFile():
@ -85,34 +47,15 @@ class LibraryTableButtons(QWidget):
def deleteFile():
self.exPopup = deletePopup()
# self.exPopup.setGeometry(100, 200, 100, 100)
ret = self.exPopup.exec()
if ret == self.exPopup.Yes:
delete_file(file)
table.fillTable(type, mainWindow)
def analyzeFile():
self.exPopup = analizePopup()
#cmd = "py detect.py --source {} --view-img".format(str(file))
#popen = subprocess.Popen(cmd, cwd="../yolov5/", stdout=subprocess.PIPE)
cancel = self.exPopup.exec()
if cancel == self.exPopup.Cancel:
#popen.terminate()
pass
#popen.wait()
self.exPopup.close()
# mainWindow.showVisualisation(file) <- ALWAYS shows even if you cancel the process and we don't have time to fix that now
os.remove(file)
layout = QHBoxLayout()
layout.setContentsMargins(0,0,0,0)
layout.setSpacing(0)
if type == LIB_RAW:
analyze_btn = QPushButton('Analyze')
analyze_btn.clicked.connect(analyzeFile)
layout.addWidget(analyze_btn)
view_btn = QPushButton('View')
view_btn.clicked.connect(viewFile)
layout.addWidget(view_btn)
@ -126,45 +69,24 @@ class LibraryTableButtons(QWidget):
class LibraryTable(QTableWidget):
def __init__(self, type, mainWindow, singleFilePath = None, parent = None):
def __init__(self, type, parent=None):
QTableWidget.__init__(self)
self.fillTable(type, mainWindow, singleFilePath)
def fillTable(self, type, mainWindow, singleFilePath = None):
self.setColumnCount(3)
if singleFilePath != None:
self.setRowCount(1)
self.setHorizontalHeaderLabels(['Upload date', 'Filename', 'Options'])
filePath = inputFilePath
self.horizontalHeader().setSectionResizeMode(0, QHeaderView.Stretch)
self.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch)
self.horizontalHeader().setSectionResizeMode(2, QHeaderView.ResizeToContents)
self.setItem(0,0,QTableWidgetItem(str(datetime.fromtimestamp(os.path.getmtime(singleFilePath)))))
self.setItem(0,1,QTableWidgetItem(str(os.path.basename(singleFilePath))))
self.setCellWidget(0,2,LibraryTableButtons(singleFilePath, self, type, mainWindow))
else:
if type == LIB_RAW:
self.setHorizontalHeaderLabels(['Upload date', 'Filename', 'Options'])
filePath = inputFilePath
else:
self.setHorizontalHeaderLabels(['Creation date', 'Filename', 'Options'])
filePath = outputFilePath
self.horizontalHeader().setSectionResizeMode(0, QHeaderView.Stretch)
self.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch)
self.horizontalHeader().setSectionResizeMode(2, QHeaderView.ResizeToContents)
dates = []
names = []
for index, file in enumerate(files(filePath)):
dates.append(QTableWidgetItem(str(datetime.fromtimestamp(os.path.getmtime(file)))))
dates.append(QTableWidgetItem(str(datetime.fromtimestamp(os.path.getmtime(filePath + '/' + file)))))
names.append(QTableWidgetItem(str(file)))
self.setRowCount(len(dates))
@ -172,19 +94,7 @@ class LibraryTable(QTableWidget):
for index, date in enumerate(dates):
self.setItem(index,0,date)
self.setItem(index,1,names[index])
self.setCellWidget(index,2,LibraryTableButtons(names[index].text(), self, type, mainWindow))
class formatHelp(QLabel):
def __init__(self, parent=None):
QLabel.__init__(self)
with open(scriptPath + os.path.sep + 'static/help.txt', 'r', encoding='utf-8') as file:
help_text = file.read().replace('\n', '')
self.setText(help_text)
self.setStyleSheet("padding-left: 20px; padding-right: 20px; padding-top: 10px; padding-bottom: 10px; font-size:32px; background-color: white;")
self.adjustSize()
self.setCellWidget(index,2,LibraryTableButtons(filePath + '\\' + names[index].text()))
class MainWindow(QMainWindow):
@ -193,39 +103,14 @@ class MainWindow(QMainWindow):
super().__init__()
self.initUI()
# todo: split in multiply labels for richer formatting
# Show Help tab
def showHelp(self):
label = formatHelp()
self.setCentralWidget(label)
def showHomepage(self):
# Upload file button + instructions on homepage
label = QLabel('Welcome to VisionScore! Use the button below to upload a file and start analyzing it. If you need further help, please click the "help" item in the menu above.', self)
label.setFont(QFont('Arial', 14))
label.setStyleSheet('color: white;')
label.adjustSize()
label.move(200,200)
shadow = QGraphicsDropShadowEffect()
shadow.setBlurRadius(10)
shadow.setOffset(2)
label.setGraphicsEffect(shadow)
button = QPushButton('Upload file', self)
button.setToolTip('This is an example button')
button.move(850,270)
button.setFixedSize(220, 50)
button.clicked.connect(self.showUploadFile)
# Show raw uploaded files
def showInputLibrary(self):
libTable = LibraryTable(LIB_RAW, self)
libTable = LibraryTable(LIB_RAW)
self.setCentralWidget(libTable)
# Show visualisations
def showVisualisationsLibrary(self):
libTable = LibraryTable(LIB_VIS, self)
libTable = LibraryTable(LIB_VIS)
self.setCentralWidget(libTable)
def showUploadFile(self):
@ -234,63 +119,52 @@ class MainWindow(QMainWindow):
dialog.setFilter(QDir.Files)
if dialog.exec_():
file_path = dialog.selectedFiles()[0] # ['C:/Users/agatha/Desktop/SYI/VisionScore/win_venv/requirements.txt']
newPath = save_input(file_path)
singleFileTable = LibraryTable(LIB_RAW, self, newPath)
self.setCentralWidget(singleFileTable)
def showVisualisation(self, path):
singleFileTable = LibraryTable(LIB_VIS, self, path)
self.setCentralWidget(singleFileTable)
save_input(file_path)
def initUI(self):
self.setGeometry(0, 0, 600, 400)
self.setWindowTitle('VisionScore')
scriptDir = os.path.dirname(os.path.realpath(__file__))
self.setWindowIcon(QIcon(scriptDir + os.path.sep + 'static/v_logo.jpg'))
self.showHomepage()
# File menu
# Toolbar
menuBar = self.menuBar()
fileMenu = QMenu("&File", self)
menuBar.addMenu(fileMenu)
homeMenu = QMenu("&Home", self)
menuBar.addMenu(homeMenu)
# Upload file
uploadAct = QAction('&Upload new file', self)
uploadAct.triggered.connect(self.showUploadFile)
fileMenu.addAction(uploadAct)
homeMenu.addAction(uploadAct)
#Library menu
libraryMenu = QMenu("&Library", self)
menuBar.addMenu(libraryMenu)
#Input files
inputAct = QAction('&Input files', self)
inputAct.triggered.connect(self.showInputLibrary)
libraryMenu.addAction(inputAct)
#Visualisations
visAct = QAction('&Visualisations', self)
visAct.triggered.connect(self.showVisualisationsLibrary)
libraryMenu.addAction(visAct)
# Exit app
exitAct = QAction('&Exit', self)
exitAct.setShortcut('Ctrl+Q')
exitAct.setStatusTip('Exit')
exitAct.triggered.connect(qApp.quit)
fileMenu.addAction(exitAct)
homeMenu.addAction(exitAct)
# Library menu
libraryMenu = QMenu("&Library", self)
menuBar.addMenu(libraryMenu)
helpMenu = menuBar.addMenu("&Help")
# Input files
inputAct = QAction('&Input files', self)
inputAct.triggered.connect(self.showInputLibrary)
libraryMenu.addAction(inputAct)
# Visualisations
visAct = QAction('&Visualisations', self)
visAct.triggered.connect(self.showVisualisationsLibrary)
libraryMenu.addAction(visAct)
# Help
helpAct = QAction('&Help', self)
helpAct.triggered.connect(self.showHelp)
menuBar.addAction(helpAct)
self.showMaximized()
self.show()
def main():
app = QApplication(sys.argv)
app.setStyleSheet(stylesheet)
w = MainWindow()
sys.exit(app.exec_())

View File

@ -1 +0,0 @@
<p>VisionScore to program służący do generowania analizy nagrań lub zdjęć z mecz&oacute;w piłkarskich.<br /><br />By wygenerować taką analizę, należy postępować według następujących krok&oacute;w:<br /><br />1. Wgraj plik z plikiem do przeanalizowania<br /><em>File -&gt; Upload new file</em><br />2. Po wgraniu pliku pojawi się on w <br /><em>Library -&gt; Input files</em><br /> 3. By wygenerować analizę należy kliknąć przycisk<br /><em>Analyze</em><br />znajdujący się obok wgranego pliku. Analizę można wygenerować także do uprzednio wgranych plik&oacute;w.<br />4. Po wygenerowaniu, analiza znajdować się będzie w <br /><em>Library -&gt; Vizusalizations</em><br />możesz tam także zobaczyć wszystkie poprzednio wygenerowane analizy.<br /><br />Każdy plik źr&oacute;dłowy lub wygenerowaną analizę możesz w każdym momencie podejrzeć klikając<br /><em>View</em><br />obok pliku znajdującego się w bibliotekach. Plik możesz też w każdym momencie usunąć klikając<br /><em>Delete</em><br />obok odpowiedniego pliku.<br /><br /><br />Zakończ działanie aplikacji klikąc<br /><em>File -&gt; Exit</em><br />używając skr&oacute;tu klawiszowego Ctrl+Q lub bo prostu zamykając okienko aplikacji.<br /><br /><br /><strong>Kontakt: mikbed@st.amu.edu.pl</strong></p>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

View File

@ -1,4 +0,0 @@
testing
more testing

View File

@ -22,7 +22,6 @@ class savingFileTest(unittest.TestCase):
new_file_content += line
self.assertEqual(old_file_content, new_file_content)
os.remove(newpath)
# test using mock checking if a file with analysis had been generated
@ -30,33 +29,12 @@ class generetingOutputFile(unittest.TestCase):
def test_output_file(self):
print('Mock testing outputfile')
print('Moock testing outputfile')
m = Mock()
m.output_file_path = scriptPath + '\\files\\output\\test.pdf'
assert Path(m.output_file_path).is_file()
# test deleting input file
class testDeleteFile(unittest.TestCase):
def test_delete_file(self):
print('Testing deleting the file')
new_file = inputFilePath + os.path.sep + 'new_file.txt'
with open(new_file, 'w') as file:
file.write('teeeest')
with open(new_file) as f:
content = f.read()
assert os.path.exists(new_file)
self.assertEqual(content, 'teeeest')
delete_file(new_file)
self.assertFalse(os.path.exists(new_file))
if __name__ == '__main__':
unittest.main()

View File

@ -237,7 +237,7 @@ def detect(save_img=False):
h = int(vid_cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
vid_writer = cv2.VideoWriter(save_path, cv2.VideoWriter_fourcc(*fourcc), fps, (w, h))
vid_writer.write(im0)
print(save_path)
if save_txt or save_img:
s = f"\n{len(list(save_dir.glob('labels/*.txt')))} labels saved to {save_dir / 'labels'}" if save_txt else ''
print(f"Results saved to {save_dir}{s}")
@ -260,7 +260,7 @@ if __name__ == '__main__':
parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS')
parser.add_argument('--augment', action='store_true', help='augmented inference')
parser.add_argument('--update', action='store_true', help='update all models')
parser.add_argument('--project', default='../win_venv/files/output', help='save results to project/name')
parser.add_argument('--project', default='../files/output', help='save results to project/name')
parser.add_argument('--name', default='exp', help='save results to project/name')
parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')
parser.add_argument("--config_deepsort", type=str, default="deep_sort_pytorch/configs/deep_sort.yaml")

View File

@ -170,8 +170,7 @@ class LoadImages: # for inference
ret_val, img0 = self.cap.read()
self.frame += 1
# print('video %g/%g (%g/%g) %s: ' % (self.count + 1, self.nf, self.frame, self.nframes, path), end='')
print('video %g/%g (%g/%g) : ' % (self.count + 1, self.nf, self.frame, self.nframes), end='')
print('video %g/%g (%g/%g) %s: ' % (self.count + 1, self.nf, self.frame, self.nframes, path), end='')
else:
# Read image