Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import os
- from flask import Flask, request, session, g, redirect, url_for, abort, \
- render_template, flash, send_from_directory, jsonify
- from werkzeug.utils import secure_filename
- # imports for Microsoft Vision API
- import httplib, urllib, base64, json
- # import for YandexTranslate using the Yandex translate API
- from Yandex import YandexTranslate
- app = Flask(__name__)
- app.config.from_object(__name__)
- # Load default config and override config from an environment variable
- app.config.update(dict(
- SECRET_KEY='y3_m^K_Z',
- USERNAME='admin',
- PASSWORD='default',
- ALLOWED_EXTENSIONS = ['png', 'jpg', 'jpeg', 'gif'],
- UPLOAD_FOLDER = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'static/uploads')
- ))
- app.config.from_envvar('OIT_SETTINGS', silent=True)
- uploaded_file = None
- with open('static/yandex_api_key.txt', 'r') as f:
- yandex_api_key = f.readline()
- translator = YandexTranslate('%s' % yandex_api_key)
- @app.context_processor
- def override_url_for():
- return dict(url_for=dated_url_for)
- def dated_url_for(endpoint, **values):
- if endpoint == 'js_static':
- filename = values.get('filename', None)
- if filename:
- file_path = os.path.join(app.root_path,
- 'static/js', filename)
- values['q'] = int(os.stat(file_path).st_mtime)
- if endpoint == 'css_static':
- filename = values.get('filename', None)
- if filename:
- file_path = os.path.join(app.root_path,
- 'static/css', filename)
- values['q'] = int(os.stat(file_path).st_mtime)
- return url_for(endpoint, **values)
- @app.route('/')
- def start():
- return redirect('/input')
- @app.route('/input', methods=['GET'])
- def input():
- to_languages = getLanguageList()
- return render_template('input.html', to_languages=to_languages)
- @app.route('/output', methods=['POST'])
- def output():
- with open('static/microsoft_api_key.txt', 'r') as f:
- microsoft_api_key = f.readline()
- headers = {
- # Request headers
- 'Content-Type': 'application/json',
- 'Ocp-Apim-Subscription-Key': '%s' % microsoft_api_key,
- }
- params = urllib.urlencode({
- # Request parameters
- 'language': 'unk',
- 'detectOrientation': 'true',
- })
- # TODO: check whether the dropzone has anything uploaded
- # Prioritize uploaded file over URL
- #if uploaded_file:
- # url = uploaded_file
- try:
- if request.form['url']:
- if uploaded_file:
- url = uploaded_file
- elif request.form['url'] != "":
- url = request.form['url']
- except Exception as e:
- print e
- #TODO: need to remove hardcoded url
- # url = "https://scontent.cdninstagram.com/hphotos-xtp1/t51.2885-15/e15/10499061_1638243023072781_630896369_n.jpg" # danish
- # url = "http://img.auctiva.com/imgdata/1/5/6/5/1/6/4/webimg/600923130_o.jpg" #english
- url = "http://images.mydoorsign.com/img/lg/S/korean-feminine-hygiene-sign-s-7355-kr.png" #korean
- # url = "https://www.enterprise.com/content/dam/global-vehicle-images/cars/FORD_FOCU_2012-1.png" #no text
- # global uploaded_file
- # url = uploaded_file
- data = json.loads(requestOCR(params, url, headers))
- # check if the image contains any text
- if len(data['regions']) == 0:
- return redirect('/input')
- extracted_json = wordgroupJSON(data)
- to_languages_dict = getLanguageDict()
- detected_language = to_languages_dict[getDetectedLanguage(extracted_json)]
- to_lang_selection = to_languages_dict[request.form.get('to_lang_select')]
- extracted_json = translateJSON(extracted_json, "%s" % to_lang_selection)
- line_list = getLineList(extracted_json)
- line_coord_list = getLineCoordList(extracted_json)
- all_text_coord_list = getAllTextCoordList(extracted_json)
- text = extracted_json['regions'][0]['total']
- text_translated = extracted_json['regions'][0]['totaltranslated']
- to_languages_list = getLanguageList()
- return render_template('output.html', url=url, text=text, text_translated=text_translated,
- line_coord_list = line_coord_list, all_text_coord_list=all_text_coord_list, to_languages=to_languages_list,
- detected_language=detected_language, target_language=to_lang_selection)
- @app.route('/uploadajax', methods=['POST'])
- def upldfile():
- filename = None
- file_size = None
- if request.method == 'POST':
- files = request.files.getlist('file[]')
- for f in files:
- if f and allowed_file(f.filename):
- filename = secure_filename(f.filename)
- file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
- global uploaded_file
- uploaded_file = file_path
- f.save(file_path)
- file_size = os.path.getsize(file_path)
- else:
- app.logger.info('ext name error')
- return jsonify(error='ext name error')
- return jsonify(name=filename, size=file_size)
- @app.route('/css/<path:filename>')
- def css_static(filename):
- return send_from_directory(app.root_path + '/static/css/', filename)
- @app.route('/js/<path:filename>')
- def js_static(filename):
- return send_from_directory(app.root_path + '/static/js/', filename)
- def requestOCR(params, url, headers):
- try:
- conn = httplib.HTTPSConnection('api.projectoxford.ai')
- conn.request("POST", "/vision/v1.0/ocr?%s" % params, "{'url': '%s'}" % url, headers)
- response = conn.getresponse()
- data = response.read()
- conn.close()
- return data
- except Exception as e:
- data = None
- return data
- def getDirectionDict():
- languagepairs = translator.directions
- language_dict = new_dict = {}
- for pair in languagepairs:
- p1, p2 = pair.split("-")
- if p1 not in language_dict:
- language_dict[p1] = [p2]
- else:
- language_dict[p1].append(p2)
- return language_dict
- def wordgroupJSON(json):
- lines = json['regions'][0]['lines']
- tempstringbig = ""
- for line in lines:
- if line['words']:
- temp_string = ""
- for word in line['words']:
- temp_string += " " + word['text']
- line['linestring'] = temp_string
- tempstringbig += " " + temp_string
- json['regions'][0]['total'] = " ".join(tempstringbig.split())
- return json
- def translateJSON(json, lang):
- json['regions'][0]['totaltranslated'] = " ".join(translator.translate(json['regions'][0]['total'], lang)['text'])
- for line in json['regions'][0]['lines']:
- line['linestringtranslated'] = translator.translate(line['linestring'], lang)['text']
- return json
- # def getWordList(json):
- # word_list = []
- # for line in json['regions'][0]['lines']:
- # for w in line['words']:
- # word_list.append(w['text'])
- # return word_list
- # def getCoordinateListWord(json):
- # coords_list = []
- # for line in json['regions'][0]['lines']:
- # for w in line['words']:
- # coords_list.append(w['boundingBox'].split(","))
- # return coords_list
- def getLineList(json):
- line_list = []
- for line in json['regions'][0]['lines']:
- line_list.append(line['linestringtranslated'][0])
- return line_list
- def getCoordinateListLine(json):
- coords_list = []
- for line in json['regions'][0]['lines']:
- coords = line['boundingBox'].split(",")
- coords.append(int(coords[3])*0.5)
- coords_list.append(coords)
- return coords_list
- # def getWordCoordList(json):
- # word_list = getWordList(json)
- # coord_list = getCoordinateListWord(json)
- # for i in xrange(len(coord_list)):
- # coord_list[i].append(word_list[i])
- # return coord_list
- def getLineCoordList(json):
- line_list = getLineList(json)
- coord_list = getCoordinateListLine(json)
- for i in xrange(len(coord_list)):
- coord_list[i].append(line_list[i])
- return coord_list
- def getAllTextCoordList(json):
- all_text_coord_list = json['regions'][0]['boundingBox'].split(",")
- all_text_coord_list.append(json['regions'][0]['totaltranslated'])
- return all_text_coord_list
- def getLanguageList():
- language_list = []
- with open("static/language_codes.txt", 'r') as file:
- for line in file:
- code, lang = line.strip().split(",")
- language_list.append([code,lang])
- return language_list
- def getLanguageDict():
- language_dict = {}
- with open("static/language_codes.txt", 'r') as file:
- for line in file:
- code, lang = line.strip().split(",")
- language_dict[code] = lang
- return language_dict
- def getDetectedLanguage(json):
- return json['language']
- def allowed_file(filename):
- return '.' in filename and \
- filename.lower().rsplit('.', 1)[1] in app.config['ALLOWED_EXTENSIONS']
- if __name__ == '__main__':
- print(app.root_path)
- app.run(debug=True)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement