Commit 4f2fb7ce authored by Weerasinghe D.N.H's avatar Weerasinghe D.N.H

Merge branch 'revert-2fe6ad38' into 'master'

Revert "Merge branch 'IT19041926' into 'master'"

See merge request !102
parents 2fe6ad38 a0b409d9
......@@ -11,7 +11,7 @@ from routes.module_routes import module
from routes.assignment_routes import assignment
from routes.diagram_routes import diagram
from routes.submission_routes import submission
from routes.plagiarism_routes import use_case_diagram_plagiarism
APP_ROOT = os.path.dirname(os.path.abspath(__file__))
OUTPUTS_GENERATED_DOT_FILES_PATH = os.path.join('outputs', 'generated_dot_files')
......@@ -47,7 +47,6 @@ app.register_blueprint(module)
app.register_blueprint(assignment)
app.register_blueprint(diagram)
app.register_blueprint(submission)
app.register_blueprint(use_case_diagram_plagiarism)
@app.before_first_request
......
No preview for this file type
......@@ -3,9 +3,9 @@ from config.database import db
class Attribute(db.Model):
id = db.Column(db.Integer, primary_key=True)
data_type = db.Column(db.String(50), nullable=False)
data_type = db.Column(db.String(50))
name = db.Column(db.String(50), nullable=False)
access_spec = db.Column(db.String(50), nullable=False)
access_spec = db.Column(db.String(50))
class_id = db.Column(db.Integer)
def __repr__(self) -> str:
......
from config.database import db
class Method(db.Model):
id = db.Column(db.Integer, primary_key=True)
return_type = db.Column(db.String(50))
name = db.Column(db.String(50), nullable=False)
access_spec = db.Column(db.String(50))
class_id = db.Column(db.Integer)
def __repr__(self) -> str:
return 'Method>>> {self.content}'
[paths]
train = "./training_data.spacy"
dev = "./training_data.spacy"
vectors = null
init_tok2vec = null
[system]
gpu_allocator = null
seed = 0
[nlp]
lang = "en"
pipeline = ["tok2vec","ner"]
batch_size = 1000
disabled = []
before_creation = null
after_creation = null
after_pipeline_creation = null
tokenizer = {"@tokenizers":"spacy.Tokenizer.v1"}
[components]
[components.ner]
factory = "ner"
incorrect_spans_key = null
moves = null
scorer = {"@scorers":"spacy.ner_scorer.v1"}
update_with_oracle_cut_size = 100
[components.ner.model]
@architectures = "spacy.TransitionBasedParser.v2"
state_type = "ner"
extra_state_tokens = false
hidden_width = 64
maxout_pieces = 2
use_upper = true
nO = null
[components.ner.model.tok2vec]
@architectures = "spacy.Tok2VecListener.v1"
width = ${components.tok2vec.model.encode.width}
upstream = "*"
[components.tok2vec]
factory = "tok2vec"
[components.tok2vec.model]
@architectures = "spacy.Tok2Vec.v2"
[components.tok2vec.model.embed]
@architectures = "spacy.MultiHashEmbed.v2"
width = ${components.tok2vec.model.encode.width}
attrs = ["NORM","PREFIX","SUFFIX","SHAPE"]
rows = [5000,2500,2500,2500]
include_static_vectors = false
[components.tok2vec.model.encode]
@architectures = "spacy.MaxoutWindowEncoder.v2"
width = 96
depth = 4
window_size = 1
maxout_pieces = 3
[corpora]
[corpora.dev]
@readers = "spacy.Corpus.v1"
path = ${paths.dev}
max_length = 0
gold_preproc = false
limit = 0
augmenter = null
[corpora.train]
@readers = "spacy.Corpus.v1"
path = ${paths.train}
max_length = 0
gold_preproc = false
limit = 0
augmenter = null
[training]
dev_corpus = "corpora.dev"
train_corpus = "corpora.train"
seed = ${system.seed}
gpu_allocator = ${system.gpu_allocator}
dropout = 0.1
accumulate_gradient = 1
patience = 1600
max_epochs = 0
max_steps = 20000
eval_frequency = 200
frozen_components = []
annotating_components = []
before_to_disk = null
[training.batcher]
@batchers = "spacy.batch_by_words.v1"
discard_oversize = false
tolerance = 0.2
get_length = null
[training.batcher.size]
@schedules = "compounding.v1"
start = 100
stop = 1000
compound = 1.001
t = 0.0
[training.logger]
@loggers = "spacy.ConsoleLogger.v1"
progress_bar = false
[training.optimizer]
@optimizers = "Adam.v1"
beta1 = 0.9
beta2 = 0.999
L2_is_weight_decay = true
L2 = 0.01
grad_clip = 1.0
use_averages = false
eps = 0.00000001
learn_rate = 0.001
[training.score_weights]
ents_f = 1.0
ents_p = 0.0
ents_r = 0.0
ents_per_type = null
[pretraining]
[initialize]
vectors = ${paths.vectors}
init_tok2vec = ${paths.init_tok2vec}
vocab_data = null
lookups = null
before_init = null
after_init = null
[initialize.components]
[initialize.tokenizer]
\ No newline at end of file
{
"lang":"en",
"name":"pipeline",
"version":"0.0.0",
"spacy_version":">=3.4.1,<3.5.0",
"description":"",
"author":"",
"email":"",
"url":"",
"license":"",
"spacy_git_version":"Unknown",
"vectors":{
"width":0,
"vectors":0,
"keys":0,
"name":null,
"mode":"default"
},
"labels":{
"tok2vec":[
],
"ner":[
"ACCESS_SP",
"ATTRIBUTE_NAME",
"DATA_TYPE",
"METHOD_NAME",
"MULTIPLICITY",
"PARAMETERS"
]
},
"pipeline":[
"tok2vec",
"ner"
],
"components":[
"tok2vec",
"ner"
],
"disabled":[
],
"performance":{
"ents_f":0.9938850387,
"ents_p":0.9918633035,
"ents_r":0.9959150327,
"ents_per_type":{
"ACCESS_SP":{
"p":0.995157385,
"r":0.9927536232,
"f":0.9939540508
},
"ATTRIBUTE_NAME":{
"p":0.9959183673,
"r":0.9959183673,
"f":0.9959183673
},
"DATA_TYPE":{
"p":0.9856321839,
"r":1.0,
"f":0.99276411
},
"METHOD_NAME":{
"p":0.993902439,
"r":0.993902439,
"f":0.993902439
},
"MULTIPLICITY":{
"p":0.9756097561,
"r":1.0,
"f":0.987654321
},
"PARAMETERS":{
"p":1.0,
"r":1.0,
"f":1.0
}
},
"tok2vec_loss":78.7692795898,
"ner_loss":1014.2115147574
}
}
\ No newline at end of file
{
"moves":null,
"update_with_oracle_cut_size":100,
"multitasks":[
],
"min_action_freq":1,
"learn_tokens":false,
"beam_width":1,
"beam_density":0.0,
"beam_update_prob":0.0,
"incorrect_spans_key":null
}
\ No newline at end of file
moves{"0":{},"1":{"ACCESS_SP":414,"DATA_TYPE":346,"ATTRIBUTE_NAME":256,"METHOD_NAME":166,"MULTIPLICITY":102,"PARAMETERS":26},"2":{"ACCESS_SP":414,"DATA_TYPE":346,"ATTRIBUTE_NAME":256,"METHOD_NAME":166,"MULTIPLICITY":102,"PARAMETERS":26},"3":{"ACCESS_SP":414,"DATA_TYPE":346,"ATTRIBUTE_NAME":256,"METHOD_NAME":166,"MULTIPLICITY":102,"PARAMETERS":26},"4":{"ACCESS_SP":414,"DATA_TYPE":346,"ATTRIBUTE_NAME":256,"METHOD_NAME":166,"MULTIPLICITY":102,"PARAMETERS":26,"":1},"5":{"":1}}cfgneg_key
\ No newline at end of file
{
}
\ No newline at end of file
This diff is collapsed.
\ No newline at end of file
This diff is collapsed.
{
"mode":"default"
}
\ No newline at end of file
import requests
from sqlalchemy import func
from flask import Blueprint, jsonify, request
from constants.http_status_codes_constant import HTTP_200_OK, HTTP_400_BAD_REQUEST, HTTP_201_CREATED, \
HTTP_500_INTERNAL_SERVER_ERROR
from config.database import db
# from datetime import datetime
from models.actor_and_use_case import ActorANDUseCase
from models.extend_relationship import ExtendRelationship
from models.include_relationship import IncludeRelationship
from models.use_case_generalization_relationship import UseCaseGeneralizationRelationship
from models.use_case_association_relationship import UseCaseAssociationRelationship
from models.use_case_answer import UseCaseAnswer
from models.actor_generalization_relationship import ActorGeneralizationRelationship
from services.similarity import similarity_components
use_case_diagram_plagiarism = Blueprint('use_case_diagram_plagiarism', __name__,
url_prefix='/api/v1/use_case_diagram_plagiarism')
@use_case_diagram_plagiarism.get('/similarities')
def get_use_case():
extent_component = None
include_component = None
user_case_association_component = None
user_cases_generalization_component = None
actor_generalization_component = None
actor_association_component = None
includes = IncludeRelationship.query.all()
extents = ExtendRelationship.query.all()
user_cases = ActorANDUseCase.query.all()
user_case_associations = UseCaseAssociationRelationship.query.all()
user_cases_generalizations = UseCaseGeneralizationRelationship.query.all()
actor_generalizations = ActorGeneralizationRelationship.query.all()
for user_case in user_cases:
if user_case.type == "use case":
for extent in extents:
if user_case.id == extent.connected_component_01:
extent_component = user_case
similarity_components(extent_component.use_case_answer, extent_component.text)
print("Extend component 1 : ", extent_component.text)
elif user_case.id == extent.connected_component_02:
extent_component = user_case
similarity_components(extent_component.use_case_answer, extent_component.text)
print("Extend component 2 : ", extent_component.text)
for include in includes:
if user_case.id == include.connected_component_01:
include_component = user_case
similarity_components(include_component.use_case_answer, include_component.text)
print("Include component 1 : ", include_component.text)
elif user_case.id == include.connected_component_02:
include_component = user_case
similarity_components(include_component.use_case_answer, include_component.text)
print("Include component 2 : ", include_component.text)
for user_case_association in user_case_associations:
if user_case.id == user_case_association.connected_component_01:
user_case_association_component = user_case
similarity_components(user_case_association_component.use_case_answer,
user_case_association_component.text)
print("User cases association component 1 : ", user_case_association_component.text)
elif user_case.id == user_case_association.connected_component_02:
user_case_association_component = user_case
similarity_components(user_case_association_component.use_case_answer,
user_case_association_component.text)
print("User cases association component 2 : ", user_case_association_component.text)
for user_cases_generalization in user_cases_generalizations:
if user_case.id == user_cases_generalization.connected_component_01:
user_cases_generalization_component = user_case
similarity_components(user_cases_generalization_component.use_case_answer,
user_cases_generalization_component.text)
print("User cases generalization Component 1 : ", user_cases_generalization_component.text)
elif user_case.id == user_cases_generalization.connected_component_02:
user_cases_generalization_component = user_case
similarity_components(user_cases_generalization_component.use_case_answer,
user_cases_generalization_component.text)
print("User cases generalization Component 2 : ", user_cases_generalization_component.text)
elif user_case.type == "actor":
for actor_generalization in actor_generalizations:
if user_case.id == actor_generalization.connected_component_01:
actor_generalization_component = user_case
similarity_components(actor_generalization_component.use_case_answer,
actor_generalization_component.text)
print("Actor generalization component 1 : ", actor_generalization_component.text)
elif user_case.id == actor_generalization.connected_component_02:
actor_generalization_component = user_case
similarity_components(actor_generalization_component.use_case_answer,
actor_generalization_component.text)
print("Actor generalization component 2 : ", actor_generalization_component.text)
for actor_association in user_case_associations:
if user_case.id == actor_association.connected_component_01:
actor_association_component = user_case
similarity_components(actor_association_component.use_case_answer,
actor_association_component.text)
print("Actor association component 1 : ", actor_association_component.text)
elif user_case.id == actor_association.connected_component_02:
actor_association_component = user_case
similarity_components(actor_association_component.use_case_answer,
actor_association_component.text)
print("Actor association component 2 : ", actor_association_component.text)
return jsonify({"Message": "Success"}), HTTP_200_OK
@use_case_diagram_plagiarism.get('/use_case_plagiarism_percentage')
def get_actor():
user_cases = ActorANDUseCase.query.all()
use_case_answers = UseCaseAnswer.query.all()
all_count = db.session.query(ActorANDUseCase.use_case_answer,
func.count(ActorANDUseCase.use_case_answer)).group_by(
ActorANDUseCase.use_case_answer).all()
actor_similarity = db.session.query(ActorANDUseCase.use_case_answer,
func.count(ActorANDUseCase.plagiarism_count)).filter_by(
plagiarism_count=1).group_by(
ActorANDUseCase.use_case_answer).all()
for use_case_answer in use_case_answers:
print(use_case_answer.id)
counter = 0
counter1 = 0
for user_case in user_cases:
if user_case.use_case_answer == use_case_answer.id:
counter += 1
if user_case.plagiarism_count == "1":
counter1 += 1
print("All use cases and actors count :", counter)
print("similarity count :", counter1)
if counter != 0:
plagirism_count = counter1/counter * 100
print("Plagiarism Percentage :", plagirism_count)
return jsonify({"Message": "Success"}), HTTP_200_OK
......@@ -5,7 +5,7 @@ from flask_jwt_extended import jwt_required, get_jwt_identity
from constants.http_status_codes_constant import HTTP_400_BAD_REQUEST, HTTP_200_OK
from services.class_model_detection_service import component_separation
from services.class_diagram_class_detection_service import component_separation
from models.actor_and_use_case import ActorANDUseCase
from services.submission_service import save_submission
from services.use_case_model_detection_service import model_object_detection
......
import operator
import os
import re
import cv2
import numpy as np
import pytesseract as ts
from PIL import Image
from models.attribute_model import Attribute
from object_detection.utils import label_map_util
import app
import tensorflow as tf
import spacy
from config.database import db
from models.component_model import Component
from models.method_model import Method
ts.pytesseract.tesseract_cmd = r'C:\Users\DELL\AppData\Local\Programs\Tesseract-OCR\tesseract.exe'
def component_separation(filename, class_comp_id):
mdl1_path = app.CLASS_SAVED_MODEL_PATH
lbl1_path = app.CLASS_SAVED_LABEL_PATH
img1_path = app.SUBMISSION_PATH_CLASS + '/' + filename
image_nparray = np.array(Image.open(img1_path))
# print(img1_path)
boxes, num_entities, accurate_indexes, num_entities, category_index, class_id = class_object_detection(mdl1_path,
lbl1_path,
image_nparray)
# Convert the class id in their name
if num_entities > 0:
for index in range(0, len(accurate_indexes)):
if category_index[class_id[index]]['name'] == 'class':
print(filename)
_image = crop_image_(image_nparray, boxes, index)
_image = cv2.resize(_image, None, fx=2, fy=2)
class_details_detection(_image, class_comp_id)
elif category_index[class_id[index]]['name'] == 'interface':
_image = crop_image_(image_nparray, boxes, index)
_image = cv2.resize(_image, None, fx=2, fy=2)
def class_object_detection(model_path, label_path, image_nparray):
detect_fn = tf.saved_model.load(model_path)
category_index = label_map_util.create_category_index_from_labelmap(label_path, use_display_name=True)
image_np = image_nparray
input_tensor = tf.convert_to_tensor(image_np)
input_tensor = input_tensor[tf.newaxis, ...]
detections = detect_fn(input_tensor)
num_detections = int(detections.pop('num_detections'))
detections = {key: value[0, :num_detections].numpy()
for key, value in detections.items()}
detections['num_detections'] = num_detections
detections['detection_classes'] = detections['detection_classes'].astype(np.int64)
accurate_indexes = [k for k, v in enumerate(detections['detection_scores']) if (v > 0.7)]
num_entities = len(accurate_indexes)
class_id = operator.itemgetter(*accurate_indexes)(detections['detection_classes'])
boxes = detections['detection_boxes']
return boxes, num_entities, accurate_indexes, num_entities, category_index, class_id
def class_details_detection(_image, class_comp_id):
attributes_methods = []
mdl2_path = app.CLASS_COMP_SAVED_MODEL_PATH
lbl2_path = app.CLASS_COMP_SAVED_LABEL_PATH
boxes_class, num_entities, accurate_indexes, num_entities, category_index, class_id = class_object_detection(
mdl2_path, lbl2_path, _image)
comp = class_name_detection(class_comp_id, _image, boxes_class, accurate_indexes)
if num_entities > 1:
for j in range(0, len(accurate_indexes)):
if category_index[class_id[j]]['name'] == 'class_attributes':
class_attributes = crop_image_(_image, boxes_class, j)
text = text_extraction(class_attributes)
attributes = save_attributes_methods(text, 'attribute')
alter_attributes_methods(attributes, comp.id)
elif category_index[class_id[j]]['name'] == 'class_methods':
class_methods = crop_image_(_image, boxes_class, j)
text = text_extraction(class_methods)
print(text)
methods = save_attributes_methods(text, 'method')
alter_attributes_methods(methods, comp.id)
print(text)
def crop_image_(image, boxes, index):
# image = cv2.imread(path)
height, width, c = image.shape
# crop box format: xmin, ymin, xmax, ymax
ymin = boxes[index][0] * height
xmin = boxes[index][1] * width
ymax = boxes[index][2] * height
xmax = boxes[index][3] * width
cropped_image = image[int(ymin):int(ymax), int(xmin):int(xmax)]
# image = cv2.cvtColor(cropped_image, cv2.COLOR_BGR2GRAY)
# image = cv2.resize(image, (800, 500))
return cropped_image
def text_extraction(image):
config = '-l eng --oem 1 --psm 4'
text = ts.image_to_string(image, config=config)
text = text.splitlines()
text = [x.strip(' ') for x in text]
text = list(filter(None, text))
return text
def save_attributes_methods(text, typ):
global saved_data
nlp = spacy.load('en_core_web_sm')
for element in text:
print(element)
# removable = str.maketrans('', '', '()')
nlp_ner = spacy.load('ner_models/model-best')
nlp_output = nlp_ner(element)
attr = Attribute()
method = Method()
for token in nlp_output.ents:
if typ == 'attribute':
if token.label_ == 'ATTRIBUTE_NAME':
attr.name = token.text
elif token.label_ == 'ACCESS_SP':
attr.access_spec = covert_to_access_specifier(token.text)
elif token.label_ == 'DATA_TYPE':
attr.data_type = token.text
elif typ == 'method':
if token.label_ == 'METHOD_NAME':
method.name = token.text
elif token.label_ == 'ACCESS_SP':
method.access_spec = covert_to_access_specifier(token.text)
elif token.label_ == 'DATA_TYPE':
method.return_type = token.text
if typ == 'attribute':
print(attr)
db.session.add(attr)
db.session.commit()
saved_data.append(attr)
else:
print(method)
db.session.add(method)
db.session.commit()
saved_data.append(method)
return saved_data
def alter_attributes_methods(element_list, class_id):
for element in element_list:
print(class_id)
print(element_list)
element.class_id = class_id
db.session.commit()
def covert_to_access_specifier(access):
if access == "-":
return "Private"
elif access == "#":
return "Protected"
if access == "+":
return "Public"
elif access == "~":
return "Package"
else:
return ''
def crop_and_hide(image, boxes, index):
height, width, c = image.shape
for i in range(0, len(index)):
ymin = boxes[i][0] * height
xmin = boxes[i][1] * width
ymax = boxes[i][2] * height
xmax = boxes[i][3] * width
cv2.rectangle(image, (int(xmin), int(ymin)), (int(xmax), int(ymax)), (255, 255, 255), -1)
return image
def class_name_detection(class_comp_id, image, boxes, index):
image = crop_and_hide(image, boxes, index)
class_name = text_extraction(image)
if ''.join(class_name) != '':
if "interface" in ''.join(class_name):
name = ''.join(class_name).replace("<<interface>>", "")
comp = Component(class_answer=class_comp_id, name=name, type="interface")
else:
name = ''.join(class_name)
comp = Component(class_answer=class_comp_id, name=name, type="class")
db.session.add(comp)
db.session.commit()
return comp
from models.actor_and_use_case import ActorANDUseCase
from config.database import db
def similarity_components(use_case_answer, use_case_text):
user_cases = ActorANDUseCase.query.all()
for use_case1 in user_cases:
if use_case1.use_case_answer != use_case_answer and use_case1.text == use_case_text:
use_case1.plagiarism_count = 1
db.session.add(use_case1)
db.session.commit()
item {
id: 1
name: 'class'
name: 'association'
}
item {
id: 2
name: 'relationship'
name: 'class'
}
item {
id: 3
name: 'composition'
}
item {
id: 4
name: 'indirect association'
}
item {
id: 5
name: 'inheritance'
}
item {
id: 6
name: 'interface'
}
item {
id: 7
name: 'realization'
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment