Commit 089f62ce authored by Manoj Kumar's avatar Manoj Kumar

Merge branch 'master' of http://gitlab.sliit.lk/2020_077/2020_077

parents 415fabce 98b99872
...@@ -20,3 +20,4 @@ dataq/mask_rcnn_coco.h5 ...@@ -20,3 +20,4 @@ dataq/mask_rcnn_coco.h5
/reveng/output /reveng/output
*.pyc *.pyc
dataq/utils.zip dataq/utils.zip
/static/output
from werkzeug.utils import secure_filename
import requests
import shutil import shutil
from flask import send_file from flask import send_file
from reveng.processInput import checkCommon, processInput from reveng.processInput import checkCommon, processInput
from flask import url_for,flash,Flask, render_template, request, redirect from flask import url_for, flash, Flask, render_template, request, redirect
import json import json
import sys import sys
import os import os
from flask_cors import CORS, cross_origin
REVENG_DIR = os.path.dirname(os.path.abspath(__file__)) REVENG_DIR = os.path.dirname(os.path.abspath(__file__))
TEMPLATE = os.path.join(REVENG_DIR, "\\templates") TEMPLATE = os.path.join(REVENG_DIR, "\\templates")
...@@ -12,6 +16,7 @@ STATIC = os.path.join(REVENG_DIR, "\\static") ...@@ -12,6 +16,7 @@ STATIC = os.path.join(REVENG_DIR, "\\static")
app = Flask(__name__) app = Flask(__name__)
app.config["DEBUG"] = True app.config["DEBUG"] = True
cors = CORS(app)
@app.route('/test', methods=['GET']) @app.route('/test', methods=['GET'])
...@@ -19,7 +24,6 @@ def testApi(): ...@@ -19,7 +24,6 @@ def testApi():
return "<h1>The API is working</h1>" return "<h1>The API is working</h1>"
# DATAQ # DATAQ
# route to redirect Home page # route to redirect Home page
...@@ -31,41 +35,47 @@ def home(): ...@@ -31,41 +35,47 @@ def home():
@app.route('/cam') @app.route('/cam')
def openCam(): def openCam():
os.system('python dataq\detect.py') os.system('python dataq\detect.py')
# END DATAQ # END DATAQ
# route to redirect About Us page
# route to redirect About Us page
@app.route('/about') @app.route('/about')
def about(): def about():
return render_template('about.html') return render_template('about.html')
import requests # route to redirect Sign Translation page
@app.route('/signToText')
def signToTextEngine():
return render_template('signToText.html')
# route to redirect Text Translation page
@app.route('/tts')
def textToSignEngine():
return render_template('textToSign.html')
# route to display GIF image to the user # route to display GIF image to the user
@app.route('/tts/response/', methods=['GET']) @app.route('/tts/get/<msg>', methods=['GET', 'POST'])
def response(): def response(msg):
clearoutputfolder() clearoutputfolder()
message = request.get_json() # message = request.get_json()
responseGIF = processInput(message['message']) # responseGIF = processInput(message['message'])
#print("ithaya none endu soninga?",responseGIF) print(msg)
# URL = 'http://localhost:3000/tts/upload'
# PARAMS = { responseGIF = processInput(msg)
# "files":{ # response = {
# "file":{ # "gifPath": responseGIF
# "filename":responseGIF
# }
# }
# } # }
# requests.post(URL,PARAMS) clearoutputfolder()
print(responseGIF) return responseGIF
return send_file(responseGIF, mimetype='image/gif') # return send_file(responseGIF, mimetype='image/gif')
# clear the OUTPUT folder after displaying the GIF image # clear the OUTPUT folder after displaying the GIF image
def clearoutputfolder(): def clearoutputfolder():
folder = os.path.join(os.path.dirname(__file__), 'reveng\output') folder = os.path.join(os.path.dirname(__file__), 'static\output')
for filename in os.listdir(folder): for filename in os.listdir(folder):
file_path = os.path.join(folder, filename) file_path = os.path.join(folder, filename)
try: try:
...@@ -76,71 +86,13 @@ def clearoutputfolder(): ...@@ -76,71 +86,13 @@ def clearoutputfolder():
except Exception as e: except Exception as e:
print('Failed to delete %s. Reason: %s' % (file_path, e)) print('Failed to delete %s. Reason: %s' % (file_path, e))
from werkzeug.utils import secure_filename
## upload image
UPLOAD_FOLDER = 'static/uploads/'
app.secret_key = "secret key"
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024
@app.route('/tts/upload', methods=['POST'])
def upload_image():
if 'file' not in request.files:
flash('No file part')
return redirect(request.url)
file = request.files['file']
if file.filename == '':
flash('No image selected for uploading')
return redirect(request.url)
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
flash('Image successfully uploaded and displayed')
return render_template('upload.html', filename=filename)
else:
flash('Allowed image types are -> png, jpg, jpeg, gif')
return redirect(request.url)
@app.route('/tts/display/<filename>')
def display_image(filename):
###
# This method is used display the uploaded file back to the user
# @return display the file in the interface
###
return redirect(url_for('static', filename='uploads/' + filename), code=301)
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg', 'gif'])
def allowed_file(filename):
###
# This method is used check the extension of selected file
# @return the extension to check whether it is allowed
###
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
# route to redirect Sign Translation page
@app.route('/tts')
def textToSignEngine():
return render_template('textToSign.html')
# route to redirect Contact Us page # route to redirect Contact Us page
@app.route('/contact') @app.route('/contactUs')
def contactUs(): def contactUs():
return render_template('contactUs.html') return render_template('contactUs.html')
# for testing purpose
@app.route('/signToText')
def signToTextEngine():
return render_template('signToText.html')
host = "localhost" host = "localhost"
app.run(host=host, port=3000) app.run(host=host, port=3000)
......
### ###
# This file is used to create firbase configuration for the application # This file is used to create firbase configuration for the application
# Each application has unique firbase configuration. # Each application has unique firbase configuration.
# @author Amashi Bastiansz | IT17143950 # @author Amashi Bastiansz | IT17143950
# @version 1.0 # @version 1.0
# @since 2020-08-13 # @since 2020-08-13
### ###
import json import json
...@@ -54,3 +54,8 @@ def getStorageInstance(): ...@@ -54,3 +54,8 @@ def getStorageInstance():
### ###
return store return store
def getStorageBucket():
return bucket
### ###
# This file is used to: # This file is used to:
# generate a GIF image # generate a GIF image
# send the generated GIF to the folder # send the generated GIF to the folder
# delete the GIF from cache # delete the GIF from cache
# @author Amashi Bastiansz | IT17143950 # @author Amashi Bastiansz | IT17143950
# @version 1.5 # @version 1.5
# @since 2020-10-01 # @since 2020-10-01
### ###
import imageio import imageio
...@@ -16,41 +16,62 @@ import random ...@@ -16,41 +16,62 @@ import random
import cv2 import cv2
import PIL.Image as pigm import PIL.Image as pigm
import PIL.GifImagePlugin as gifHandler import PIL.GifImagePlugin as gifHandler
from gcloud.storage.blob import Blob
from reveng.firebaseConfig import getStorageInstance, getStorageBucket
PATH = os.path.dirname(os.path.abspath(__file__)) PATH = os.path.dirname(os.path.abspath(__file__))
gifName = ''.join(random.choices(string.ascii_uppercase +
string.digits, k=15)) STATIC_PATH = os.getcwd() + "\\static"
STATIC_PATH = os.getcwd() + '\\static'
Blob.generate_signed_url
store = getStorageInstance()
bucket = getStorageBucket()
def generateGIF(images): def generateGIF(images):
### ###
# This method is used to generate a path for the created GIF image # This method is used to generate a path for the created GIF image
# @return the generated GIF path # @return the generated GIF path
### ###
gifPath = os.path.join(PATH + "\\output\\" + gifName + '.gif') gifName = ''.join(random.choices(string.ascii_uppercase +
string.digits, k=15))
blob = ''
gifPath = ''
blob = bucket.blob("output/"+gifName + ".gif")
gifPath = STATIC_PATH + "\\output\\" + gifName + ".gif"
imageio.mimwrite(gifPath, images, duration=0.5) imageio.mimwrite(gifPath, images, duration=0.5)
print(gifPath)
return gifPath with open(gifPath, 'rb') as gifImage:
blob.upload_from_file(gifImage)
blob.make_public()
response = {
"gifName": gifName,
"gifLocalPath": gifPath,
"gifPublicUrl": blob.public_url
}
return response
def sendGIF(): def sendGIF():
### ###
# This method is used to send the generated GIF to the exact folder to store it # This method is used to send the generated GIF to the exact folder to store it
### ###
x = imageio.mimread(os.path.join(PATH + "\\output\\" + gifName + '.gif')) x = imageio.mimread(os.path.join(PATH + "\\output\\" + gifName + '.gif'))
return x return x
def deleteFromCache(): def deleteFromCache():
### ###
# This method is used to delete the generated GIF from cache after uploading it to # This method is used to delete the generated GIF from cache after uploading it to
# the exact project folder # the exact project folder
# @return call to generateGIF() method with selected hand images # @return call to generateGIF() method with selected hand images
### ###
os.remove(os.path.join(PATH + "\\output\\" + gifName + '.gif')) os.remove(os.path.join(PATH + "\\output\\" + gifName + '.gif'))
...@@ -123,6 +123,35 @@ def processInput(message): ...@@ -123,6 +123,35 @@ def processInput(message):
sendingToGIF.append(img) sendingToGIF.append(img)
return generateGIF(sendingToGIF) return generateGIF(sendingToGIF)
else: else:
print("this is a word")
if checkInCommonWord(message): if checkInCommonWord(message):
return processCommonWord(message) return processCommonSentence(message)
else:
imageArray = []
sendingToGIF = []
images = store.child().list_files()
for i in images:
for item in message.split(" "):
if checkInCommonWord(item):
if i.name.startswith(item):
print("image name =" + i.name)
imageArray.append(i)
break
else:
for letter in list(item):
print("Length ", len(i.name))
if i.name.startswith(letter) and len(i.name) < 8:
print("image name =" + i.name)
imageArray.append(i)
break
for i in imageArray:
url = i.generate_signed_url(
datetime.timedelta(300), method='GET')
response = requests.get(url)
imagesfromFirebase = io.BytesIO(response.content)
img = pigm.open(imagesfromFirebase)
sendingToGIF.append(img)
return generateGIF(sendingToGIF)
* {
margin: 0;
padding: 0;
border: 0;
outline: 0;
}
.chat {
width: 300px;
height: 500px;
background-image: url("http://cdn9.staztic.com/app/a/2063/2063481/whatsapp-wallpaper-pack-hd-600519-0-s-156x156.jpg");
background-size: cover;
background-position: center center;
position: absolute;
border: 5px solid #000;
border-radius: 20px;
overflow: hidden;
box-shadow: 0 0 20px #000;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: auto;
box-sizing: border-box;
}
.chat .messages {
position: absolute;
left: 0;
bottom: 60px;
height: auto;
width: 100%;
}
.chat .messages .message {
padding: 20px 10px;
width: 100%;
box-sizing: border-box;
}
.chat .messages .message .you,
.chat .messages .message .bot {
border-radius: 10px;
padding: 10px;
width: 75%;
position: relative;
}
.chat .messages .message .you img,
.chat .messages .message .bot img {
width: 100%;
border-radius: 10px;
display: block;
}
.chat .messages .message .you:before,
.chat .messages .message .bot:before {
padding: 5px;
border-radius: 5px;
position: absolute;
top: -15px;
font-weight: bold;
color: #fff;
font-size: 12px;
}
.chat .messages .message .you {
background: #2ecc71;
float: right;
}
.chat .messages .message .you:before {
content: "You:";
background-color: #2ecc71;
right: 10px;
}
.chat .messages .message .bot {
background-color: #3498db;
float: left;
}
.chat .messages .message .bot:before {
content: "Bot:";
background-color: #3498db;
left: 10px;
}
.chat .messages .message:after {
content: "";
clear: both;
display: table;
}
.chat .input {
position: absolute;
left: 0;
bottom: 0;
height: 60px;
width: 100%;
background: #ecf0f1;
}
.chat .input .text {
background-color: #fff;
border-radius: 20px;
height: 40px;
position: absolute;
top: 10px;
left: 10px;
width: 270px;
box-shadow: inset 0 0 5px #aaa;
line-height: 40px;
padding: 0 20px;
box-sizing: border-box;
}
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
<div class="messages"> <div class="messages">
<div class="message"> <div class="message">
<div class="bot"> <div class="bot">
Type something with "gif me funny cat" to see what happens ;) Send something like "good morning " or "sorry"
</div> </div>
</div> </div>
</div> </div>
......
...@@ -73,7 +73,7 @@ ...@@ -73,7 +73,7 @@
<a class="dropdown-item" href="tts">English to SSL Translator</a> <a class="dropdown-item" href="tts">English to SSL Translator</a>
</div> </div>
</li> </li>
<li class="nav-item active"> <li class="nav-item">
<a class="nav-link" href="contactUs">Contact Us</a> <a class="nav-link" href="contactUs">Contact Us</a>
</li> </li>
</ul> </ul>
......
...@@ -39,7 +39,15 @@ ...@@ -39,7 +39,15 @@
<!--Favicon--> <!--Favicon-->
<link rel="shortcut icon" href="static/images/EasyTalkFavicon_v1.png" type="image/x-icon"> <link rel="shortcut icon" href="static/images/EasyTalkFavicon_v1.png" type="image/x-icon">
<link rel="icon" href="static/images/EasyTalkFavicon_v1.png" type="image/x-icon"> <link rel="icon" href="static/images/EasyTalkFavicon_v1.png" type="image/x-icon">
<script>
function goPython(){
$.ajax({
url: ""
}).done(function() {
alert('finished python script');;
});
}
</script>
</head> </head>
<body> <body>
...@@ -107,7 +115,7 @@ ...@@ -107,7 +115,7 @@
<div class="col-12"> <div class="col-12">
<form id="cameraForm" class="justify-content-center"> <form id="cameraForm" class="justify-content-center">
<div class="text-center"> <div class="text-center">
<button type="submit" class="btn btn-primary mb-2" id="userButtonInput" style="height: 75%;">Open My Webcamera</button> <button type="submit" class="btn btn-primary mb-2" id="userButtonInput" style="height: 75%;" onclick="goPython()">Open My Webcamera</button>
</div> </div>
</form> </form>
</div> </div>
......
...@@ -39,12 +39,22 @@ ...@@ -39,12 +39,22 @@
<link rel="shortcut icon" href="static/images/EasyTalkFavicon_v1.png" type="image/x-icon"> <link rel="shortcut icon" href="static/images/EasyTalkFavicon_v1.png" type="image/x-icon">
<link rel="icon" href="static/images/EasyTalkFavicon_v1.png" type="image/x-icon"> <link rel="icon" href="static/images/EasyTalkFavicon_v1.png" type="image/x-icon">
<link rel="stylesheet" href="static/styles/chatbot-test.css"/>
<script>window.console = window.console || function(t) {};</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script>
<script>
if (document.location.search.match(/type=embed/gi)) {
window.parent.postMessage("resize", "*");
}
</script>
<script src="chrome-extension://mooikfkahbdckldjjndioackbalphokd/assets/prompt.js"></script>
</head> </head>
<body> <body>
<!-- header --> <!-- header -->
<header class="fixed-top"> <!--<header class="fixed-top">
<!-- navbar -->
<div class="navigation w-100"> <div class="navigation w-100">
<div class="container"> <div class="container">
<nav class="navbar navbar-expand-lg navbar-dark p-0"> <nav class="navbar navbar-expand-lg navbar-dark p-0">
...@@ -80,58 +90,33 @@ ...@@ -80,58 +90,33 @@
</nav> </nav>
</div> </div>
</div> </div>
</header> </header>-->
<!-- /header --> <!-- /header -->
<!-- page title -->
<section class="page-title-section overlay" data-background="static/images/backgrounds/page-title.jpg">
<div class="container">
<div class="row">
<div class="col-md-8">
<ul class="list-inline custom-breadcrumb">
<li class="list-inline-item"><a class="h2 text-primary font-secondary" href="tts">English to SSL Translator</a></li>
</ul>
<br/>
<p class="text-lighten">Now you can translate any English text to SSL only by entering it here!!</p>
</div>
</div>
</div>
</section>
<!-- /page title -->
<!-- Text Translator --> <!-- Text Translator -->
<section class="section">
<div class="container"> <div class="chat">
<div class="row"> <div class="messages">
<div class="col-12"> <div class="message">
<h2 class="section-title text-center" style="margin-top: -5%;">Let's Start!!</h2> <div class="bot">
<div id="chatbox"> Welcome to Text to Sign Language Translator!! Now you can enter any phrase you need to translate into sign language
<p class="botText"> <br/>
<span>Enter the sentence you need to translate into SSL</span> Make sure to enter phrase like "Good Morning" or "Sorry"
</p>
</div>
<br/>
<form id="form" class="justify-content-center" method="POST">
<div class="form-row align-items-center">
<div class="col-auto" id="userInput">
<label class="sr-only" for="userTextInput">Enter Your Text</label>
<input type="text" class="form-control-mb-2" id="userTextInput" placeholder="Enter any text" style="height: 80%; width:100%" name="msg"/>
</div>
<div class="col-auto">
<button type="submit" class="btn btn-primary mb-2" id="userButtonInput" style="height: 75%;">Translate to Sign</button>
</div> </div>
</div> </div>
</form> </div>
</div> <div class="input">
</div> <form action="#" id="chat" method="post">
</div> <input class="text" contenteditable="" placeholder="Type your message here...">
</section> </form>
</div>
</div>
<!-- /Text Translator --> <!-- /Text Translator -->
<!-- footer --> <!-- footer -->
<footer> <!--<footer>
<!-- copyright -->
<div class="copyright py-4 bg-footer"> <div class="copyright py-4 bg-footer">
<div class="container"> <div class="container">
<div class="row"> <div class="row">
...@@ -154,7 +139,7 @@ ...@@ -154,7 +139,7 @@
</div> </div>
</div> </div>
</div> </div>
</footer> </footer>-->
<!-- /footer --> <!-- /footer -->
<!-- jQuery --> <!-- jQuery -->
...@@ -173,38 +158,64 @@ ...@@ -173,38 +158,64 @@
<!-- Main Script --> <!-- Main Script -->
<script src="static/js/script.js"></script> <script src="static/js/script.js"></script>
<script> <script src="https://cpwebassets.codepen.io/assets/common stopExecutionOnTimeout-157cd5b220a5c80d4ff8e0e70ac069bffd87a61252088146915e8726e5d9f147.js"></script>
$("#userTextInput").keypress(function(e){
if(e.which == 13){ <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
//getResponseSign();
} <script id="rendered-js">
}); (function() {
var app;
$("userButtonInput").click(function(){ $(document).ready(function() {
//getResponseSign(); return app.init();
}); });
$("#form").on("submit", function (e) { app = {
var message = $("#userTextInput").val(); init: function() {
e.preventDefault(); return this.bind_events();
$.ajax({ },
//url: "http://127.0.0.1:5000/tts/response/",
url: "http://localhost:3000/tts/response/", bind_events: function() {
data: JSON.stringify({ message: message }), return $(document).on("submit", "#chat", function(e) {
method: "POST", app.send_message();
contentType: "application/json", return e.preventDefault();
success: function (message) {
var text = $("#userTextInput").val();
var userHtml = '<p class="userText"><span>' + text + "</span></p>";
$("#userTextInput").val("");
$("#chatbox").append(userHtml);
document
.getElementById("userInput")
.scrollIntoView({ block: "start", behavior: "smooth" });
},
}); });
}); },
</script>
send_message: function() {
var msg;
msg = $(".text").val().trim();
if (msg) {
$(".text").val("");
$(".messages").append("<div class='message'><div class='you'>" + msg + "</div></div>");
return this.check(msg);
}
},
check: function(msg) {
var keyword;
if (msg != null) {
return this.get_gif(msg);
} else {
return this.bot_post("Wrong syntax ''gif me keyword''.");
}
},
bot_post: function(msg) {
return $(".messages").append("<div class='message'><div class='bot'>" + msg + "</div></div>");
},
get_gif: function(keyword) {
console.log(keyword)
return $.get(`http://localhost:3000/tts/get/${keyword}` , function(data) {
var index;
console.log(data)
return app.bot_post("<img src='" + data.gifPublicUrl + "' alt='' />");
});
}
};
}).call(this);
</script>
</body> </body>
</html> </html>
\ No newline at end of file
...@@ -11,6 +11,8 @@ import numpy as np ...@@ -11,6 +11,8 @@ import numpy as np
import os import os
import string import string
tensorflow.compat.v1.disable_eager_execution()
class Translation: class Translation:
PATH = os.path.dirname(__file__) PATH = os.path.dirname(__file__)
...@@ -58,19 +60,22 @@ class Translation: ...@@ -58,19 +60,22 @@ class Translation:
self.data[0] = normalized_image_array self.data[0] = normalized_image_array
# run the inference # run the inference
print("Before model*****************")
prediction = self.model.predict(self.data) prediction = self.model.predict(self.data)
print("After model*****************")
#print(prediction) #print(prediction)
#print(prediction.shape) #print(prediction.shape)
#print(type(prediction)) #print(type(prediction))
#print(prediction[0, 2]) #print(prediction[0, 2])
for alpha in range(26): for alpha in range(26):
if prediction[0, alpha] >= 0.8: if prediction[0, alpha] >= 0.8:
#print(string.ascii_uppercase[alpha]) print(string.ascii_uppercase[alpha])
return string.ascii_uppercase[alpha] #return string.ascii_uppercase[alpha]
#break break
print("After Classification*****************")
# if os.path.exists(loc): # if os.path.exists(loc):
# os.remove(loc) # os.remove(loc)
# else: # else:
# print("The file does not exist") # print("The file does not exist")
# return return
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