12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013 |
- # @Author : lightXu
- # @File : sheet_views.py
- # @Time : 2018/12/19 0019 下午 14:28
- import json
- import os
- import shutil
- import time
- import traceback
- import cv2
- from django.conf import settings
- from django.http import HttpResponse
- from django.shortcuts import render
- from django.views.decorators.csrf import csrf_exempt
- import segment.logging_config as logging
- from segment.form import SubmitSeriesNumberForm, UploadFileForm
- from segment.form import UploadImageForm, UploadImageWithPaperIdForm, DownloadImage
- from segment.image_operation.utils import resize_by_percent, write_single_img
- from segment.models import SheetBigBoxes, SheetBoxes
- from segment.sheet_resolve.tools.tf_sess import TfSess
- from segment.sheet_resolve.tools.utils import read_xml_to_json, read_single_img, NpEncoder
- from segment.sheet_server import handle_uploaded_xml_file, generate_serial_number
- from segment.sheet_server import save_raw_image_without_segment, save_raw_image_with_paper_id
- from segment.sheet_server import sheet_big_boxes_resolve, sheet_small_boxes_resolve, gen_xml, decide_blank_sheet
- from segment.sheet_server import sheet_row_col_resolve, sheet_detail_resolve, sheet_format_output, sheet_points, \
- sheet_anchor
- from segment.sheet_resolve.analysis.sheet.sheet_infer import subfield_answer_sheet
- from segment.sheet_resolve.tools.brain_api import get_ocr_text_and_coordinate
- logger = logging.getLogger(settings.LOGGING_TYPE)
- subject_id_dict = {0: 'unknown_subject',
- 3: 'math',
- 6: 'math_zxhx',
- 8: 'english',
- 9: 'chinese',
- 12: 'physics',
- 13: 'chemistry',
- 14: 'biology',
- 15: 'politics',
- 16: 'history',
- 17: 'geography',
- 18: 'science_comprehensive',
- 19: 'arts_comprehensive'
- }
- tf_sess_dict = {
- # 'choice_m': TfSess('choice_m'),
- # 'cloze': TfSess('cloze'),
- # 'math_zxhx': TfSess('math_zxhx'),
- # 'math_zxhx_detail': TfSess('math_zxhx_detail'),
- # 'math': TfSess('math'),
- # 'english': TfSess('english'),
- # 'chinese': TfSess('chinese'),
- # 'physics': TfSess('physics'),
- # 'chemistry': TfSess('chemistry'),
- # 'biology': TfSess('biology'),
- # 'politics': TfSess('politics'),
- # 'history': TfSess('history'),
- # 'geography': TfSess('geography'),
- # 'science_comprehensive': TfSess('science_comprehensive'),
- # 'arts_comprehensive': TfSess('arts_comprehensive'),
- # 'math_blank': TfSess('math_blank'),
- # 'chinese_blank': TfSess('chinese_blank'),
- # 'science_comprehensive_blank': TfSess('science_comprehensive_blank'),
- # 'arts_comprehensive_blank': TfSess('arts_comprehensive_blank'),
- }
- with_blank_subjects = ["math", "chinese", "science_comprehensive", "arts_comprehensive"]
- # Create your views here.
- def index(request):
- return render(request, 'sheet.html')
- @csrf_exempt
- def analysis_big_box(request):
- if request.method == 'POST':
- time_str = time.strftime('%Y-%m-%d', time.localtime(time.time()))
- form = UploadImageForm(request.POST, request.FILES)
- if form.is_valid():
- subject_id = int(form.cleaned_data['subject'])
- subject = subject_id_dict.get(subject_id)
- if not subject:
- subject = 'unknown_subject'
- upload_img_list = request.FILES.getlist('img_data')
- res_info_list = []
- error_info = ''
- is_success = 1
- try:
- save_path = ''
- image = ''
- series_number = ''
- for img in upload_img_list:
- start_time = time.time()
- raw_name = img.name
- try:
- save_path, image, _ = save_raw_image_without_segment(subject, time_str, img, subject)
- series_number = generate_serial_number(time_str.replace('-', ''), SheetBigBoxes)
- img_instance = SheetBigBoxes(series_number=series_number,
- raw_name=raw_name, save_path=save_path,
- subject_id=subject_id, subject=subject)
- img_instance.save()
- logger.info('{}试卷: {} 存储成功: {}'.format(subject, raw_name, save_path))
- except Exception as e:
- traceback.print_exc()
- logger.info('{}试卷: {} 存储失败: {}'.format(subject, raw_name, e))
- sheet_sess = tf_sess_dict[subject]
- status, bbox_info, raw_xml_path = sheet_big_boxes_resolve(series_number, image,
- save_path, subject, sheet_sess)
- bbox_info['series_number'] = series_number
- bbox_info["img_name"] = raw_name
- SheetBigBoxes.objects.filter(series_number=series_number).update(raw_big_box_path=raw_xml_path)
- is_success = status
- end_time = time.time()
- cost_time = '{:.2f}s'.format(float(end_time - start_time))
- bbox_info.update({'cost_time': cost_time})
- ocr_res = get_ocr_text_and_coordinate(image)
- bbox_info.update({'ocr': ocr_res})
- res_info_list.append(bbox_info)
- except Exception as e:
- traceback.print_exc()
- logger.info('big box resolve error: ', e)
- is_success = 0
- error_info = 'big box resolve error'
- res = {'is_success': is_success, 'imgs_info': res_info_list}
- if error_info:
- res['error'] = error_info
- res_json = json.dumps(res, ensure_ascii=False, cls=NpEncoder)
- logger.info('segment_info: {}\n'.format(res_json))
- return HttpResponse(res_json)
- else:
- error_json = form.errors.as_json()
- is_success = 99
- res = {'is_success': is_success, 'error': error_json}
- return HttpResponse('{}'.format(res))
- else:
- form_img = UploadImageForm()
- form_xml = UploadFileForm()
- return render(request, 'sheet.html', {'form_img': form_img, 'form_xml': form_xml})
- @csrf_exempt
- def analysis_small_box(request):
- if request.method == 'POST':
- form = UploadFileForm(request.POST, request.FILES)
- if form.is_valid():
- upload_xml_list = request.FILES.getlist('xml_file')
- res_info_list = []
- error_info = ''
- is_success = 1
- try:
- for xml in upload_xml_list:
- raw_name = xml.name
- reviewed_xml_save_path = os.path.join(settings.XML_ROOT, raw_name.replace('.xml', '_review.xml'))
- handle_uploaded_xml_file(xml, reviewed_xml_save_path)
- sheet_dict = read_xml_to_json(reviewed_xml_save_path)
- start_time = time.time()
- series_number = sheet_dict['series_number']
- raw_image_path = SheetBigBoxes.objects.get(series_number=series_number).save_path
- final_xml_path = raw_image_path.replace('.jpg', '.xml')
- shutil.move(reviewed_xml_save_path, final_xml_path)
- raw_img = read_single_img(raw_image_path)
- small_box_sheet_dict = sheet_small_boxes_resolve(raw_img, sheet_dict,
- tf_sess_dict['choice'], tf_sess_dict['cloze'],
- final_xml_path)
- is_success = 1
- end_time = time.time()
- cost_time = '{:.2f}s'.format(float(end_time - start_time))
- small_box_sheet_dict.update({'cost_time': cost_time})
- res_info_list.append(small_box_sheet_dict)
- except Exception as e:
- logger.info('small box resolve error: {}'.format(e))
- is_success = 0
- error_info = 'small box resolve error'
- res = {'is_success': is_success, 'imgs_info': res_info_list}
- if error_info:
- res['error'] = error_info
- res_json = json.dumps(res, ensure_ascii=False, cls=NpEncoder)
- # logger.info('resolve: {}\n'.format(res_json))
- return HttpResponse(res_json)
- else:
- error_json = form.errors.as_json()
- is_sucecss = 99
- res = {'is_success': is_sucecss, 'error': error_json}
- return HttpResponse('{}'.format(res))
- else:
- form_img = UploadImageForm()
- form_xml = UploadFileForm()
- return render(request, 'sheet.html', {'form_img': form_img, 'form_xml': form_xml})
- @csrf_exempt
- def upload_exam(request):
- if request.method == 'POST':
- time_str = time.strftime('%Y-%m-%d', time.localtime(time.time()))
- form = UploadImageForm(request.POST, request.FILES)
- if form.is_valid():
- subject_id = int(form.cleaned_data['subject'])
- subject = subject_id_dict.get(subject_id)
- if not subject:
- subject = 'unknown_subject'
- upload_img_list = request.FILES.getlist('img_data')
- res_info_list = []
- error_info = ''
- is_success = 1
- for img in upload_img_list:
- raw_name = img.name
- try:
- save_path, image, _ = save_raw_image_without_segment(subject, time_str, img, 'sheet')
- series_number = generate_serial_number(time_str.replace('-', ''), SheetBigBoxes)
- img_instance = SheetBigBoxes(series_number=series_number,
- raw_name=raw_name, save_path=save_path,
- subject_id=subject_id, subject=subject)
- img_instance.save()
- res_info_list.append({'raw_name': raw_name,
- 'series_number': series_number,
- raw_name: series_number})
- logger.info('{}试卷: {} 存储成功: {}'.format(subject, raw_name, save_path))
- except Exception as e:
- # traceback.print_exc()
- logger.info('{}试卷: {} 存储失败: {}'.format(subject, raw_name, e))
- res = {'is_success': is_success, 'imgs_info': res_info_list}
- if error_info:
- res['error'] = error_info
- res_json = json.dumps(res, ensure_ascii=False, cls=NpEncoder)
- return HttpResponse(res_json)
- else:
- error_json = form.errors.as_json()
- is_success = 99
- res = {'is_success': is_success, 'error': error_json}
- return HttpResponse('{}'.format(res))
- else:
- form_img = UploadImageForm()
- form_xml = UploadFileForm()
- return render(request, 'sheet.html', {'form_img': form_img, 'form_xml': form_xml})
- @csrf_exempt
- def analysis_box(request):
- if request.method == 'POST':
- form = SubmitSeriesNumberForm(request.POST)
- if form.is_valid():
- series_number = form.cleaned_data['series_number']
- small_box_path = SheetBigBoxes.objects.get(series_number=series_number).small_box_path
- if not small_box_path:
- res = {'series_number': series_number, 'info': '尚未处理完成', 'status': 100}
- return HttpResponse('{}'.format(res))
- else:
- res = json.load(small_box_path.replace('.xml', '.json'))
- res['series_number'] = series_number
- res['status'] = 1000
- return HttpResponse('{}'.format(res))
- else:
- error_json = form.errors.as_json()
- is_success = 99
- res = {'is_success': is_success, 'error': error_json}
- return HttpResponse('{}'.format(res))
- else:
- form_img = UploadImageForm()
- form_xml = UploadFileForm()
- return render(request, 'sheet.html', {'form_img': form_img, 'form_xml': form_xml})
- @csrf_exempt
- def analysis_box_once(request):
- if request.method == 'POST':
- time_str = time.strftime('%Y-%m-%d', time.localtime(time.time()))
- form = UploadImageForm(request.POST, request.FILES)
- if form.is_valid():
- subject_id = int(form.cleaned_data['subject'])
- subject = subject_id_dict.get(subject_id)
- if not subject:
- subject = 'math' # default
- upload_img_list = request.FILES.getlist('img_data')
- res_info_list = []
- error_info = ''
- is_success = 1
- try:
- save_path = ''
- image = ''
- series_number = ''
- for img in upload_img_list:
- start_time = time.time()
- raw_name = img.name
- try:
- save_path, image, _ = save_raw_image_without_segment(subject, time_str, img, 'sheet')
- series_number = generate_serial_number(time_str.replace('-', ''), SheetBigBoxes)
- img_instance = SheetBigBoxes(series_number=series_number,
- raw_name=raw_name, save_path=save_path,
- subject_id=subject_id, subject=subject)
- img_instance.save()
- logger.info('{}试卷: {} 存储成功: {}'.format(subject, raw_name, save_path))
- except Exception as e:
- # traceback.print_exc()
- logger.info('{}试卷: {} 存储失败: {}'.format(subject, raw_name, e))
- status, bbox_info, raw_xml_path = sheet_big_boxes_resolve(series_number, image,
- save_path, 'sheet',
- tf_sess_dict['math_zxhx'])
- bbox_info['series_number'] = series_number
- bbox_info["img_name"] = raw_name
- SheetBigBoxes.objects.filter(series_number=series_number).update(raw_big_box_path=raw_xml_path)
- small_box_xml_path = raw_xml_path.replace('.xml', '_small.xml')
- shutil.copy(raw_xml_path, small_box_xml_path)
- sheet_dict = bbox_info
- small_box_sheet_dict = sheet_small_boxes_resolve(image, sheet_dict,
- tf_sess_dict['choice'], tf_sess_dict['cloze'],
- small_box_xml_path)
- SheetBigBoxes.objects.filter(series_number=series_number).update(small_box_path=small_box_xml_path)
- is_success = status
- end_time = time.time()
- cost_time = '{:.2f}s'.format(float(end_time - start_time))
- small_box_sheet_dict.update({'cost_time': cost_time})
- res_info_list.append(small_box_sheet_dict)
- except Exception as e:
- logger.info('box resolve error: {}'.format(e))
- is_success = 0
- error_info = 'box resolve error'
- res = {'is_success': is_success, 'imgs_info': res_info_list}
- if error_info:
- res['error'] = error_info
- res_json = json.dumps(res, ensure_ascii=False, cls=NpEncoder)
- # logger.info('segment_info: {}\n'.format(res_json))
- return HttpResponse(res_json)
- else:
- error_json = form.errors.as_json()
- is_success = 99
- res = {'is_success': is_success, 'error': error_json}
- return HttpResponse('{}'.format(res))
- else:
- form_img = UploadImageForm()
- form_xml = UploadFileForm()
- return render(request, 'sheet.html', {'form_img': form_img, 'form_xml': form_xml})
- @csrf_exempt
- def analysis_box_once_with_multiple_img(request):
- if request.method == 'POST':
- time_str = time.strftime('%Y-%m-%d', time.localtime(time.time()))
- form = UploadImageForm(request.POST, request.FILES)
- if form.is_valid():
- subject_id = int(form.cleaned_data['subject'])
- subject_init = subject_id_dict.get(subject_id)
- if not subject_init:
- subject_init = 'math'
- upload_img_list = request.FILES.getlist('img_data')
- res_info_list = []
- image_list = []
- detail_xml = []
- ocr_list = []
- error_info = ''
- is_success = 1
- save_path = ''
- image = ''
- series_number = ''
- for img_index, img in enumerate(upload_img_list):
- subject = subject_init
- start_time = time.time()
- raw_name = img.name
- try:
- save_path, image, _ = save_raw_image_without_segment(subject, time_str, img, 'sheet')
- series_number = generate_serial_number(time_str.replace('-', ''), SheetBigBoxes)
- img_instance = SheetBigBoxes(series_number=series_number,
- raw_name=raw_name, save_path=save_path,
- subject_id=subject_id, subject=subject)
- img_instance.save()
- logger.info('{}试卷: {} 存储成功: {}'.format(subject, raw_name, save_path))
- except Exception as e:
- traceback.print_exc()
- logger.info('{}试卷: {} 存储失败: {}'.format(subject, raw_name, e))
- try:
- try:
- ocr_res = get_ocr_text_and_coordinate(image)
- except Exception as e:
- traceback.print_exc()
- error_info = error_info + 'ocr error;'
- ocr_res = ''
- ocr_list.append(ocr_res)
- if subject not in with_blank_subjects:
- sheet_sess = tf_sess_dict[subject]
- answered = "fixed"
- elif decide_blank_sheet(image, subject):
- sheet_sess = tf_sess_dict[subject + '_blank']
- subject = subject + '_blank'
- answered = "blank"
- else:
- sheet_sess = tf_sess_dict[subject]
- answered = "answered"
- status, sheet_dict, raw_xml_path = sheet_big_boxes_resolve(series_number, image,
- save_path, subject,
- sheet_sess, ocr=ocr_res)
- # print(sheet_dict)
- sheet_dict['series_number'] = series_number
- sheet_dict["img_name"] = raw_name
- sheet_dict["answered"] = answered
- SheetBigBoxes.objects.filter(series_number=series_number).update(raw_big_box_path=raw_xml_path)
- small_box_xml_path = raw_xml_path.replace('.xml', '_small.xml')
- detail_xml.append(small_box_xml_path)
- shutil.copy(raw_xml_path, small_box_xml_path)
- try:
- # 找题号
- small_box_sheet_dict = sheet_detail_resolve(image, sheet_dict, small_box_xml_path, shrink=True)
- except Exception as e:
- traceback.print_exc()
- status = 0
- small_box_sheet_dict = sheet_dict
- SheetBigBoxes.objects.filter(series_number=series_number).update(small_box_path=small_box_xml_path)
- is_success = status
- end_time = time.time()
- cost_time = '{:.2f}s'.format(float(end_time - start_time))
- small_box_sheet_dict.update({'cost_time': cost_time})
- res_info_list.append(small_box_sheet_dict)
- image_list.append(image)
- except Exception as e:
- traceback.print_exc()
- logger.info('{}试卷: {} 解析失败: {}'.format(subject, raw_name, e))
- is_success = 0
- error_info = error_info + 'box resolve error;'
- try:
- res_info_list = sheet_points(res_info_list, image_list, ocr_list, if_ocr=False)
- except Exception as e:
- print(e)
- traceback.print_exc()
- error_info = error_info + 'number and points error;'
- try:
- logger.info('before format: {}\n'.format(res_info_list))
- init_number = 500
- crt_numbers = []
- for i, ele in enumerate(res_info_list):
- image = image_list[i]
- res, init_number, crt_numbers = sheet_format_output(init_number, crt_numbers,
- ele, image, subject_init,
- shrink=True)
- res_info_list[i] = res
- except Exception as e:
- print(e)
- traceback.print_exc()
- error_info = error_info + 'format output error ;'
- try:
- for image_index, image in enumerate(image_list):
- anchor_list = sheet_anchor(image)
- res_info_list[image_index]['regions'] = res_info_list[image_index]['regions'] + anchor_list
- except Exception as e:
- print(e)
- traceback.print_exc()
- error_info = error_info + 'anchor error;'
- res = {'is_success': is_success, 'imgs_info': res_info_list}
- try:
- for xml_index, ele in enumerate(res_info_list):
- regions = ele['regions']
- gen_xml(regions, detail_xml[xml_index])
- except Exception as e:
- print(e)
- traceback.print_exc()
- if error_info:
- res['error'] = error_info
- res_json = json.dumps(res, ensure_ascii=False, cls=NpEncoder)
- logger.info('segment_info: {}\n'.format(res_json))
- print('sheet resolve done')
- return HttpResponse(res_json)
- else:
- error_json = form.errors.as_json()
- is_success = 99
- res = {'is_success': is_success, 'error': error_json}
- return HttpResponse('{}'.format(res))
- else:
- form_img = UploadImageForm()
- form_xml = UploadFileForm()
- return render(request, 'sheet.html', {'form_img': form_img, 'form_xml': form_xml})
- @csrf_exempt
- def saas_analysis_box_once_with_multiple_img(request):
- if request.method == 'POST':
- time_str = time.strftime('%Y-%m-%d', time.localtime(time.time()))
- form = UploadImageForm(request.POST, request.FILES)
- if form.is_valid():
- subject_id = int(form.cleaned_data['subject'])
- subject = subject_id_dict.get(subject_id)
- if not subject:
- subject = 'unknown_subject'
- upload_img_list = request.FILES.getlist('img_data')
- res_info_list = []
- image_list = []
- detail_xml = []
- ocr_list = []
- error_info = ''
- is_success = 1
- save_path = ''
- image = ''
- series_number = ''
- for img_index, img in enumerate(upload_img_list):
- start_time = time.time()
- raw_name = img.name
- try:
- save_path, image, _ = save_raw_image_without_segment(subject, time_str, img, 'sheet')
- series_number = generate_serial_number(time_str.replace('-', ''), SheetBigBoxes)
- img_instance = SheetBigBoxes(series_number=series_number,
- raw_name=raw_name, save_path=save_path,
- subject_id=subject_id, subject=subject)
- img_instance.save()
- logger.info('{}试卷: {} 存储成功: {}'.format(subject, raw_name, save_path))
- except Exception as e:
- # traceback.print_exc()
- logger.info('{}试卷: {} 存储失败: {}'.format(subject, raw_name, e))
- try:
- status, sheet_dict, raw_xml_path = sheet_big_boxes_resolve(series_number, image,
- save_path, subject,
- tf_sess_dict[subject])
- sheet_dict['series_number'] = series_number
- sheet_dict["img_name"] = raw_name
- SheetBigBoxes.objects.filter(series_number=series_number).update(raw_big_box_path=raw_xml_path)
- small_box_xml_path = raw_xml_path.replace('.xml', '_small.xml')
- detail_xml.append(small_box_xml_path)
- shutil.copy(raw_xml_path, small_box_xml_path)
- small_box_sheet_dict = sheet_detail_resolve(image, sheet_dict, small_box_xml_path, shrink=False)
- SheetBigBoxes.objects.filter(series_number=series_number) \
- .update(small_box_path=small_box_xml_path)
- is_success = status
- end_time = time.time()
- cost_time = '{:.2f}s'.format(float(end_time - start_time))
- small_box_sheet_dict.update({'cost_time': cost_time})
- res_info_list.append(small_box_sheet_dict)
- image_list.append(image)
- ocr_res = get_ocr_text_and_coordinate(image)
- ocr_list.append(ocr_res)
- except Exception as e:
- logger.info('{}试卷: {} 存储失败: {}'.format(subject, raw_name, e))
- is_success = 0
- error_info = error_info + 'box resolve error;'
- try:
- res_info_list = sheet_points(res_info_list, image_list, ocr_list, if_ocr=True)
- except Exception as e:
- print(e)
- traceback.print_exc()
- is_success = 0
- error_info = error_info + 'number and points error;'
- res_info_list = [ele.update({'ocr': ocr_list[i]}) for i, ele in enumerate(res_info_list)]
- for i, ele in enumerate(res_info_list):
- image = image_list[i]
- res = sheet_format_output(ele, image, subject, shrink=True)
- res_info_list[i] = res
- res = {'is_success': is_success, 'imgs_info': res_info_list}
- for xml_index, ele in enumerate(res_info_list):
- regions = ele['regions']
- gen_xml(regions, detail_xml[xml_index])
- if error_info:
- res['error'] = error_info
- res_json = json.dumps(res, ensure_ascii=False, cls=NpEncoder)
- # logger.info('segment_info: {}\n'.format(res_json))
- print('sheet resolve done')
- return HttpResponse(res_json)
- else:
- error_json = form.errors.as_json()
- is_success = 99
- res = {'is_success': is_success, 'error': error_json}
- return HttpResponse('{}'.format(res))
- else:
- form_img = UploadImageForm()
- form_xml = UploadFileForm()
- return render(request, 'sheet_detail.html', {'form_img': form_img, 'form_xml': form_xml})
- @csrf_exempt
- def analysis_box_once_and_single_img(request):
- if request.method == 'POST':
- time_str = time.strftime('%Y-%m-%d', time.localtime(time.time()))
- form = UploadImageForm(request.POST, request.FILES)
- if form.is_valid():
- subject_id = int(form.cleaned_data['subject'])
- subject = subject_id_dict.get(subject_id)
- if not subject:
- subject = 'unknown_subject'
- upload_img = request.FILES.get('img_data')
- error_info = ''
- detail_box_sheet_dict = dict()
- try:
- save_path = ''
- image = ''
- series_number = ''
- start_time = time.time()
- raw_name = upload_img.name
- try:
- save_path, image, _ = save_raw_image_without_segment(subject, time_str, upload_img, 'sheet')
- series_number = generate_serial_number(time_str.replace('-', ''), SheetBigBoxes)
- img_instance = SheetBigBoxes(series_number=series_number,
- raw_name=raw_name, save_path=save_path,
- subject_id=subject_id, subject=subject)
- img_instance.save()
- logger.info('{}试卷: {} 存储成功: {}'.format(subject, raw_name, save_path))
- except Exception as e:
- # traceback.print_exc()
- logger.info('{}试卷: {} 存储失败: {}'.format(subject, raw_name, e))
- status, bbox_info, raw_xml_path = sheet_big_boxes_resolve(series_number, image, save_path, subject,
- tf_sess_dict[subject])
- bbox_info['series_number'] = series_number
- bbox_info["img_name"] = raw_name
- SheetBigBoxes.objects.filter(series_number=series_number).update(raw_big_box_path=raw_xml_path)
- detail_box_xml_path = raw_xml_path.replace('.xml', '_detail.xml')
- shutil.copy(raw_xml_path, detail_box_xml_path)
- sheet_dict = bbox_info
- # small_box_sheet_dict = sheet_row_col_resolve(image, sheet_dict,
- # tf_sess_dict['choice_m'], tf_sess_dict['cloze'],
- # small_box_xml_path)
- detail_box_sheet_dict = sheet_row_col_resolve(image, sheet_dict,
- '', tf_sess_dict['cloze'],
- detail_box_xml_path)
- SheetBigBoxes.objects.filter(series_number=series_number).update(small_box_path=detail_box_xml_path)
- is_success = status
- # end_time = time.time()
- # cost_time = '{:.2f}s'.format(float(end_time - start_time))
- # small_box_sheet_dict.update({'cost_time': cost_time})
- except Exception as e:
- logger.info('box resolve error: {}'.format(e))
- is_success = 0
- error_info = 'box resolve error'
- detail_box_sheet_dict.update({'is_success': is_success})
- if error_info:
- detail_box_sheet_dict.update({'is_success': is_success, 'error': error_info})
- res_json = json.dumps(detail_box_sheet_dict, ensure_ascii=False)
- # logger.info('segment_info: {}\n'.format(res_json))
- return HttpResponse(res_json)
- else:
- error_json = form.errors.as_json()
- is_success = 99
- res = {'is_success': is_success, 'error': error_json}
- return HttpResponse('{}'.format(res))
- else:
- form_img = UploadImageForm()
- form_xml = UploadFileForm()
- return render(request, 'sheet_detail.html', {'form_img': form_img, 'form_xml': form_xml})
- @csrf_exempt
- def analysis_box_once_and_single_img_with_paperid(request):
- if request.method == 'POST':
- form = UploadImageWithPaperIdForm(request.POST, request.FILES)
- if form.is_valid():
- subject_id = int(form.cleaned_data['subject'])
- subject = subject_id_dict.get(subject_id)
- if not subject:
- subject = 'unknown_subject'
- upload_img = request.FILES.get('img_data')
- paper_id = form.cleaned_data['paper_id']
- error_info = ''
- small_box_sheet_dict = dict()
- try:
- save_path = ''
- image = ''
- start_time = time.time()
- raw_name = upload_img.name
- try:
- save_path, image, image_url = save_raw_image_with_paper_id(subject, paper_id, upload_img, 'sheet')
- # series_number = generate_serial_number(time_str.replace('-', ''), SheetBoxes)
- img_instance = SheetBoxes(paper_id=paper_id,
- raw_name=raw_name, save_path=save_path,
- subject_id=subject_id, subject=subject,
- download_path=image_url)
- img_instance.save()
- logger.info('{}试卷: {} 存储成功: {}'.format(subject, raw_name, save_path))
- except Exception as e:
- # traceback.print_exc()
- logger.info('{}试卷: {} 存储失败: {}'.format(subject, raw_name, e))
- sheet_sess = tf_sess_dict[subject]
- status, sheet_dict, raw_xml_path = sheet_big_boxes_resolve(paper_id, image, save_path, subject,
- sheet_sess)
- sheet_dict['series_number'] = paper_id
- sheet_dict["img_name"] = raw_name
- # small_box_sheet_dict = sheet_small_boxes_resolve(image, sheet_dict,
- # tf_sess_dict['choice'], tf_sess_dict['cloze'],
- # raw_xml_path)
- small_box_xml_path = raw_xml_path.replace('.xml', '_small.xml')
- shutil.copy(raw_xml_path, small_box_xml_path)
- small_box_sheet_dict = sheet_row_col_resolve(image, sheet_dict,
- '', tf_sess_dict['cloze'],
- small_box_xml_path)
- SheetBoxes.objects.filter(paper_id=paper_id).update(xml_box_path=small_box_xml_path)
- is_success = status
- end_time = time.time()
- cost_time = '{:.2f}s'.format(float(end_time - start_time))
- small_box_sheet_dict.update({'cost_time': cost_time})
- except Exception as e:
- logger.info('box resolve error: {}'.format(e))
- is_success = 0
- error_info = 'box resolve error'
- small_box_sheet_dict.update({'is_success': is_success})
- if error_info:
- small_box_sheet_dict.update({'is_success': is_success, 'error': error_info})
- res_json = json.dumps(small_box_sheet_dict, ensure_ascii=False)
- # logger.info('segment_info: {}\n'.format(res_json))
- return HttpResponse(res_json)
- else:
- error_json = form.errors.as_json()
- is_success = 99
- res = {'is_success': is_success, 'error': error_json}
- return HttpResponse('{}'.format(res))
- else:
- form = UploadImageWithPaperIdForm()
- return render(request, 'sheet_with_id.html', {'form': form})
- @csrf_exempt
- def analysis_box_detail(request):
- if request.method == 'POST':
- time_str = time.strftime('%Y-%m-%d', time.localtime(time.time()))
- form = UploadImageForm(request.POST, request.FILES)
- if form.is_valid():
- subject_id = int(form.cleaned_data['subject'])
- subject = subject_id_dict.get(subject_id)
- if not subject:
- subject = 'unknown_subject'
- upload_img = request.FILES.get('img_data')
- error_info = ''
- sheet_dict = dict()
- try:
- save_path = ''
- image = ''
- series_number = ''
- raw_name = upload_img.name
- try:
- save_path, image, _ = save_raw_image_without_segment(subject, time_str, upload_img, 'sheet') # 保存文件
- series_number = generate_serial_number(time_str.replace('-', ''), SheetBigBoxes)
- img_instance = SheetBigBoxes(series_number=series_number,
- raw_name=raw_name, save_path=save_path,
- subject_id=subject_id, subject=subject)
- img_instance.save()
- logger.info('{}试卷: {} 存储成功: {}'.format(subject, raw_name, save_path))
- except Exception as e:
- # traceback.print_exc()
- logger.info('{}试卷: {} 存储失败: {}'.format(subject, raw_name, e))
- sheet_sess = tf_sess_dict[subject]
- status, bbox_info, raw_xml_path = sheet_big_boxes_resolve(series_number, image,
- save_path, subject, sheet_sess)
- bbox_info['series_number'] = series_number
- bbox_info["img_name"] = raw_name
- SheetBigBoxes.objects.filter(series_number=series_number).update(raw_big_box_path=raw_xml_path)
- # small_box_xml_path = raw_xml_path.replace('.xml', '_small.xml')
- # shutil.copy(raw_xml_path, small_box_xml_path)
- sheet_dict = bbox_info
- is_success = status
- except Exception as e:
- logger.info('box resolve error: {}'.format(e))
- is_success = 0
- error_info = 'box resolve error'
- sheet_dict.update({'is_success': is_success})
- if error_info:
- sheet_dict.update({'is_success': is_success, 'error': error_info})
- res_json = json.dumps(sheet_dict, ensure_ascii=False)
- # logger.info('segment_info: {}\n'.format(res_json))
- return HttpResponse(res_json)
- else:
- error_json = form.errors.as_json()
- is_success = 99
- res = {'is_success': is_success, 'error': error_json}
- return HttpResponse('{}'.format(res))
- else:
- form_img = UploadImageForm()
- form_xml = UploadFileForm()
- return render(request, 'sheet_detail.html', {'form_img': form_img, 'form_xml': form_xml})
- @csrf_exempt
- def analysis_box_detail_and_show(request):
- if request.method == 'POST':
- time_str = time.strftime('%Y-%m-%d', time.localtime(time.time()))
- form = UploadImageForm(request.POST, request.FILES)
- if form.is_valid():
- subject_id = int(form.cleaned_data['subject'])
- subject = subject_id_dict.get(subject_id)
- if not subject:
- subject = 'unknown_subject'
- upload_img = request.FILES.get('img_data')
- error_info = ''
- img_url_path = ''
- sheet_dict = dict()
- height, width = 1200, 1600
- try:
- save_path = ''
- image = ''
- series_number = ''
- raw_name = upload_img.name
- try:
- save_path, image, img_url_path = save_raw_image_without_segment(subject, time_str, upload_img,
- 'sheet')
- # small_img_path = save_path.replace('.jpg', '_small.jpg').replace('\\', '/')
- series_number = generate_serial_number(time_str.replace('-', ''), SheetBigBoxes)
- img_instance = SheetBigBoxes(series_number=series_number,
- raw_name=raw_name, save_path=save_path,
- subject_id=subject_id, subject=subject)
- img_instance.save()
- logger.info('{}试卷: {} 存储成功: {}'.format(subject, raw_name, save_path))
- except Exception as e:
- # traceback.print_exc()
- logger.info('{}试卷: {} 存储失败: {}'.format(subject, raw_name, e))
- sheet_sess = tf_sess_dict[subject]
- status, bbox_info, raw_xml_path = sheet_big_boxes_resolve(series_number, image,
- save_path, subject, sheet_sess)
- bbox_info['series_number'] = series_number
- bbox_info["img_name"] = raw_name
- SheetBigBoxes.objects.filter(series_number=series_number).update(raw_big_box_path=raw_xml_path)
- # small_box_xml_path = raw_xml_path.replace('.xml', '_small.xml')
- # shutil.copy(raw_xml_path, small_box_xml_path)
- sheet_dict = bbox_info
- is_success = status
- show_ratio = 0.4
- img_small = resize_by_percent(image, show_ratio)
- font = cv2.FONT_HERSHEY_COMPLEX
- for ele in bbox_info['regions']:
- name = ele['class_name']
- xmin = int(int(ele['bounding_box']['xmin']) * show_ratio)
- ymin = int(int(ele['bounding_box']['ymin']) * show_ratio)
- xmax = int(int(ele['bounding_box']['xmax']) * show_ratio)
- ymax = int(int(ele['bounding_box']['ymax']) * show_ratio)
- cv2.rectangle(img_small, (int(xmin), int(ymin)), (int(xmax), int(ymax)), (0, 255, 0), 1)
- cv2.putText(img_small, name, (xmin, ymax), font, 0.7, (255, 106, 106), 2, False)
- height, width = img_small.shape[0], img_small.shape[1]
- line_xmax1, line_xmax2 = subfield_answer_sheet(image, bbox_info)
- if line_xmax1 != 0 and line_xmax2 != 0:
- line_xmax1_1 = int(line_xmax1 * show_ratio)
- line_xmax2_1 = int(line_xmax2 * show_ratio)
- cv2.rectangle(img_small, (20, 20), (line_xmax1_1, height - 20), (0, 0, 255), 1)
- cv2.putText(img_small, 'subfield_line', (20, height - 20), font, 0.7, (0, 0, 255), 2, False)
- cv2.rectangle(img_small, (line_xmax1_1, 20), (line_xmax2_1, height - 20), (0, 0, 255), 1)
- cv2.putText(img_small, 'subfield_line', (line_xmax1_1, height - 20), font, 0.7, (0, 0, 255), 2,
- False)
- cv2.rectangle(img_small, (line_xmax2_1, 20), (width - 20, height - 20), (0, 0, 255), 1)
- cv2.putText(img_small, 'subfield_line', (line_xmax2_1, height - 20), font, 0.7, (0, 0, 255), 2,
- False)
- elif line_xmax1 != 0 and line_xmax2 == 0:
- if int(line_xmax1 * show_ratio) == width:
- line_xmax1_1 = int(line_xmax1 * show_ratio)
- cv2.rectangle(img_small, (20, 20), (line_xmax1_1 - 20, height - 20), (0, 0, 255), 1)
- cv2.putText(img_small, 'subfield_line', (20, height - 20), font, 0.7, (0, 0, 255), 2, False)
- else:
- line_xmax1_1 = int(line_xmax1 * show_ratio)
- cv2.rectangle(img_small, (20, 20), (line_xmax1_1, height - 20), (0, 0, 255), 1)
- cv2.putText(img_small, 'subfield_line', (20, height - 20), font, 0.7, (0, 0, 255), 2, False)
- cv2.rectangle(img_small, (line_xmax1_1, 20), (width - 20, height - 20), (0, 0, 255), 1)
- cv2.putText(img_small, 'subfield_line', (line_xmax1_1, height - 20), font, 0.7, (0, 0, 255), 2,
- False)
- write_single_img(img_small, save_path)
- height, width = img_small.shape[0], img_small.shape[1]
- except Exception as e:
- logger.info('box resolve error: {}'.format(e))
- is_success = 0
- error_info = 'box resolve error'
- sheet_dict.update({'is_success': is_success})
- if error_info:
- sheet_dict.update({'is_success': is_success, 'error': error_info})
- res_json = json.dumps(sheet_dict, ensure_ascii=False)
- # logger.info('segment_info: {}\n'.format(res_json))
- res_dict = {'url': img_url_path,
- 'img_height': height,
- 'text_height': 0.9 * height,
- 'texts': res_json,
- 'raw_texts': ''
- }
- return render(request, 'showimg.html', res_dict)
- # return HttpResponse(res_json)
- else:
- error_json = form.errors.as_json()
- is_success = 99
- res = {'is_success': is_success, 'error': error_json}
- return HttpResponse('{}'.format(res))
- else:
- form_img = UploadImageForm()
- form_xml = UploadFileForm()
- return render(request, 'sheet_detail.html', {'form_img': form_img, 'form_xml': form_xml})
- @csrf_exempt
- def download_image(request):
- if request.method == 'POST':
- form = DownloadImage(request.POST, request.FILES)
- if form.is_valid():
- is_success = 1
- try:
- paper_id = form.cleaned_data['paper_id']
- # download_path = SheetBoxes.objects.get(paper_id=paper_id).download_path
- paper_id_obj = SheetBoxes.objects.filter(paper_id__icontains=paper_id)
- paper_id_list = [ele.paper_id for ele in paper_id_obj]
- download_path_list = [SheetBoxes.objects.get(paper_id=ele).download_path for ele in paper_id_list]
- res_dict = {'paper_id': paper_id_list,
- 'image_url': download_path_list,
- # 'img_height': 1000,
- # 'text_height': 10,
- # 'texts': download_path,
- # 'raw_texts': '',
- 'is_success': is_success
- }
- except Exception as e:
- logger.info('image address load failed: {}'.format(e))
- is_success = 0
- error_info = 'image address load failed'
- res_dict = {'is_success': is_success, 'error': error_info}
- res_json = json.dumps(res_dict, ensure_ascii=False)
- # return render(request, 'showimg.html', res_dict)
- return HttpResponse(res_json)
- else:
- error_json = form.errors.as_json()
- is_success = 99
- res = {'is_success': is_success, 'error': error_json}
- return HttpResponse('{}'.format(res))
- else:
- form = DownloadImage()
- return render(request, 'downloadimg.html', {'form': form})
|