Advertisement
Guest User

Untitled

a guest
Dec 10th, 2016
273
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.08 KB | None | 0 0
  1. import os
  2. from flask import Flask, request, session, g, redirect, url_for, abort, \
  3. render_template, flash, send_from_directory, jsonify
  4. from werkzeug.utils import secure_filename
  5.  
  6. # imports for Microsoft Vision API
  7. import httplib, urllib, base64, json
  8.  
  9. # import for YandexTranslate using the Yandex translate API
  10. from Yandex import YandexTranslate
  11.  
  12. app = Flask(__name__)
  13. app.config.from_object(__name__)
  14.  
  15. # Load default config and override config from an environment variable
  16. app.config.update(dict(
  17. SECRET_KEY='y3_m^K_Z',
  18. USERNAME='admin',
  19. PASSWORD='default',
  20. ALLOWED_EXTENSIONS = ['png', 'jpg', 'jpeg', 'gif'],
  21. UPLOAD_FOLDER = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'static/uploads')
  22. ))
  23. app.config.from_envvar('OIT_SETTINGS', silent=True)
  24.  
  25. uploaded_file = None
  26.  
  27. with open('static/yandex_api_key.txt', 'r') as f:
  28. yandex_api_key = f.readline()
  29. translator = YandexTranslate('%s' % yandex_api_key)
  30.  
  31. @app.context_processor
  32. def override_url_for():
  33. return dict(url_for=dated_url_for)
  34.  
  35. def dated_url_for(endpoint, **values):
  36. if endpoint == 'js_static':
  37. filename = values.get('filename', None)
  38. if filename:
  39. file_path = os.path.join(app.root_path,
  40. 'static/js', filename)
  41. values['q'] = int(os.stat(file_path).st_mtime)
  42. if endpoint == 'css_static':
  43. filename = values.get('filename', None)
  44. if filename:
  45. file_path = os.path.join(app.root_path,
  46. 'static/css', filename)
  47. values['q'] = int(os.stat(file_path).st_mtime)
  48. return url_for(endpoint, **values)
  49.  
  50.  
  51. @app.route('/')
  52. def start():
  53. return redirect('/input')
  54.  
  55. @app.route('/input', methods=['GET'])
  56. def input():
  57. to_languages = getLanguageList()
  58. return render_template('input.html', to_languages=to_languages)
  59.  
  60.  
  61. @app.route('/output', methods=['POST'])
  62. def output():
  63.  
  64. with open('static/microsoft_api_key.txt', 'r') as f:
  65. microsoft_api_key = f.readline()
  66.  
  67. headers = {
  68. # Request headers
  69. 'Content-Type': 'application/json',
  70. 'Ocp-Apim-Subscription-Key': '%s' % microsoft_api_key,
  71. }
  72.  
  73. params = urllib.urlencode({
  74. # Request parameters
  75. 'language': 'unk',
  76. 'detectOrientation': 'true',
  77. })
  78.  
  79. # TODO: check whether the dropzone has anything uploaded
  80. # Prioritize uploaded file over URL
  81. #if uploaded_file:
  82. # url = uploaded_file
  83. try:
  84. if request.form['url']:
  85. if uploaded_file:
  86. url = uploaded_file
  87. elif request.form['url'] != "":
  88. url = request.form['url']
  89. except Exception as e:
  90. print e
  91.  
  92. #TODO: need to remove hardcoded url
  93. # url = "https://scontent.cdninstagram.com/hphotos-xtp1/t51.2885-15/e15/10499061_1638243023072781_630896369_n.jpg" # danish
  94. # url = "http://img.auctiva.com/imgdata/1/5/6/5/1/6/4/webimg/600923130_o.jpg" #english
  95. url = "http://images.mydoorsign.com/img/lg/S/korean-feminine-hygiene-sign-s-7355-kr.png" #korean
  96. # url = "https://www.enterprise.com/content/dam/global-vehicle-images/cars/FORD_FOCU_2012-1.png" #no text
  97. # global uploaded_file
  98. # url = uploaded_file
  99.  
  100. data = json.loads(requestOCR(params, url, headers))
  101.  
  102. # check if the image contains any text
  103. if len(data['regions']) == 0:
  104. return redirect('/input')
  105.  
  106. extracted_json = wordgroupJSON(data)
  107.  
  108. to_languages_dict = getLanguageDict()
  109. detected_language = to_languages_dict[getDetectedLanguage(extracted_json)]
  110. to_lang_selection = to_languages_dict[request.form.get('to_lang_select')]
  111. extracted_json = translateJSON(extracted_json, "%s" % to_lang_selection)
  112.  
  113. line_list = getLineList(extracted_json)
  114. line_coord_list = getLineCoordList(extracted_json)
  115. all_text_coord_list = getAllTextCoordList(extracted_json)
  116.  
  117. text = extracted_json['regions'][0]['total']
  118. text_translated = extracted_json['regions'][0]['totaltranslated']
  119.  
  120. to_languages_list = getLanguageList()
  121.  
  122. return render_template('output.html', url=url, text=text, text_translated=text_translated,
  123. line_coord_list = line_coord_list, all_text_coord_list=all_text_coord_list, to_languages=to_languages_list,
  124. detected_language=detected_language, target_language=to_lang_selection)
  125.  
  126. @app.route('/uploadajax', methods=['POST'])
  127. def upldfile():
  128. filename = None
  129. file_size = None
  130. if request.method == 'POST':
  131. files = request.files.getlist('file[]')
  132. for f in files:
  133. if f and allowed_file(f.filename):
  134. filename = secure_filename(f.filename)
  135. file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
  136. global uploaded_file
  137. uploaded_file = file_path
  138. f.save(file_path)
  139. file_size = os.path.getsize(file_path)
  140. else:
  141. app.logger.info('ext name error')
  142. return jsonify(error='ext name error')
  143.  
  144. return jsonify(name=filename, size=file_size)
  145.  
  146. @app.route('/css/<path:filename>')
  147. def css_static(filename):
  148. return send_from_directory(app.root_path + '/static/css/', filename)
  149.  
  150. @app.route('/js/<path:filename>')
  151. def js_static(filename):
  152. return send_from_directory(app.root_path + '/static/js/', filename)
  153.  
  154. def requestOCR(params, url, headers):
  155. try:
  156. conn = httplib.HTTPSConnection('api.projectoxford.ai')
  157. conn.request("POST", "/vision/v1.0/ocr?%s" % params, "{'url': '%s'}" % url, headers)
  158. response = conn.getresponse()
  159. data = response.read()
  160. conn.close()
  161. return data
  162. except Exception as e:
  163. data = None
  164. return data
  165.  
  166. def getDirectionDict():
  167. languagepairs = translator.directions
  168. language_dict = new_dict = {}
  169. for pair in languagepairs:
  170. p1, p2 = pair.split("-")
  171. if p1 not in language_dict:
  172. language_dict[p1] = [p2]
  173. else:
  174. language_dict[p1].append(p2)
  175. return language_dict
  176.  
  177. def wordgroupJSON(json):
  178. lines = json['regions'][0]['lines']
  179. tempstringbig = ""
  180. for line in lines:
  181. if line['words']:
  182. temp_string = ""
  183. for word in line['words']:
  184. temp_string += " " + word['text']
  185. line['linestring'] = temp_string
  186. tempstringbig += " " + temp_string
  187.  
  188. json['regions'][0]['total'] = " ".join(tempstringbig.split())
  189.  
  190. return json
  191.  
  192. def translateJSON(json, lang):
  193. json['regions'][0]['totaltranslated'] = " ".join(translator.translate(json['regions'][0]['total'], lang)['text'])
  194. for line in json['regions'][0]['lines']:
  195. line['linestringtranslated'] = translator.translate(line['linestring'], lang)['text']
  196. return json
  197.  
  198. # def getWordList(json):
  199. # word_list = []
  200. # for line in json['regions'][0]['lines']:
  201. # for w in line['words']:
  202. # word_list.append(w['text'])
  203. # return word_list
  204.  
  205. # def getCoordinateListWord(json):
  206. # coords_list = []
  207. # for line in json['regions'][0]['lines']:
  208. # for w in line['words']:
  209. # coords_list.append(w['boundingBox'].split(","))
  210. # return coords_list
  211.  
  212. def getLineList(json):
  213. line_list = []
  214. for line in json['regions'][0]['lines']:
  215. line_list.append(line['linestringtranslated'][0])
  216. return line_list
  217.  
  218. def getCoordinateListLine(json):
  219. coords_list = []
  220. for line in json['regions'][0]['lines']:
  221. coords = line['boundingBox'].split(",")
  222. coords.append(int(coords[3])*0.5)
  223. coords_list.append(coords)
  224. return coords_list
  225.  
  226. # def getWordCoordList(json):
  227. # word_list = getWordList(json)
  228. # coord_list = getCoordinateListWord(json)
  229. # for i in xrange(len(coord_list)):
  230. # coord_list[i].append(word_list[i])
  231. # return coord_list
  232.  
  233. def getLineCoordList(json):
  234. line_list = getLineList(json)
  235. coord_list = getCoordinateListLine(json)
  236. for i in xrange(len(coord_list)):
  237. coord_list[i].append(line_list[i])
  238. return coord_list
  239.  
  240. def getAllTextCoordList(json):
  241. all_text_coord_list = json['regions'][0]['boundingBox'].split(",")
  242. all_text_coord_list.append(json['regions'][0]['totaltranslated'])
  243. return all_text_coord_list
  244.  
  245. def getLanguageList():
  246. language_list = []
  247. with open("static/language_codes.txt", 'r') as file:
  248. for line in file:
  249. code, lang = line.strip().split(",")
  250. language_list.append([code,lang])
  251. return language_list
  252.  
  253. def getLanguageDict():
  254. language_dict = {}
  255. with open("static/language_codes.txt", 'r') as file:
  256. for line in file:
  257. code, lang = line.strip().split(",")
  258. language_dict[code] = lang
  259. return language_dict
  260.  
  261. def getDetectedLanguage(json):
  262. return json['language']
  263.  
  264. def allowed_file(filename):
  265. return '.' in filename and \
  266. filename.lower().rsplit('.', 1)[1] in app.config['ALLOWED_EXTENSIONS']
  267.  
  268. if __name__ == '__main__':
  269. print(app.root_path)
  270. app.run(debug=True)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement