def reservation(): try: task_name = request.values['task_name'] if not task_name: return {'message':'task 이름이 비어있습니다.'} task_object = request.values['object_name'] if not task_object: return {'message':'object 이름이 비어있습니다.'} except KeyError: return {'message':'키 값 에러가 발생했습니다.'} tfrecord_name = '{}.tfrecord'.format(task_name) tfrecord_path = os.path.dirname(os.path.realpath(__file__)) tfrecord_path = os.path.join(tfrecord_path, os.getenv('TFR_SAVE_PATH')) if tfrecord_name in os.listdir(tfrecord_path): return {'message':'이미 tfrecord 파일이 만들어져 있습니다. 다시하기 위해서 서버에서 제거해 주시기 바랍니다.'} else: # task 이름이 db에 있는지 확인 task_status = database.db_find_task(db, {'name': task_name}, {'_id': 0, 'group': 1, 'kind': 1}) if len(task_status) == 0: return {'message':'{} task 가 존재하지 않습니다.'.format(task_name)} task_status = task_status[0] # task kind 가 detection 인 경우에만 tf record 만듬 if task_status['kind'] != 'detection': return {'message':'아직은 detection 다운로드만 가능합니다'} tfrecord_path = os.path.join(tfrecord_path, tfrecord_name) dataset_list = database.db_find_dataset_group(db, task_name, task_status['group']) total = len(dataset_list)//3 + 1 redis_queue.enqueue(make_tf_record, result_ttl=0, job_timeout=total + 300, args=(dataset_list, task_name, task_object, tfrecord_path)) return {'message':'다운로드중입니다. 완료되면 tensorflow record 페이지에서 다운로드 받을 수 있습니다\n\ 종료까지 {} 남았습니다.'.format('{} 시 {} 분'.format(total//3600, (total - (total//3600)*3600)//60))}
def task_list(): # 현재 등록되어있는 모든 task 들의 정보 # name: task 이름, group: 이미지 그룹이름, comment: 설명, kind: 라벨링 종류 # example,size : 예시 이미지 정보, gen_date: 만든날, gen_user: 만든이, # is_activate: task 활성화 여부, total: 총 이미지 개수, count: 라벨링된 이미지 개수 # 정보를 반환한다. # 예시 이미지 가지고 오는것 때문에 이 api 응답시간이 오래 걸린다. # 그래서 download 페이지랑 task 목록 보여주는 페이지에 부하가 걸린다. try: # 위 문제를 방지하기 위해 option 키 값에 no_image 문자열이 오면 예시 이미지를 # 다운로드 받지 않는다. option = request.args['option'] except KeyError: option = '' tasks = database.db_find_task(db) result = [] for task in tasks: if option == 'no_example_image': task['example'] = None else: img_url = task.get('example') if img_url: task['example'] = storage.download_img_to_base64(img_url, 'example/') else: task['example'] = None taskname = task['name'] total, count = database.db_count_taskimage(db, taskname) task['total'] = total task['count'] = count result.append(task) return jsonify(result)
def download(): try: task_name = request.values['task_name'] if not task_name: return {'message':'task 이름이 비어있습니다.'} task_object = request.values['task_object'] if not task_object: return {'message':'object 이름이 비어있습니다.'} except KeyError: return '키 값 에러가 발생했습니다.' tfrecord_name = '{}.record'.format(task_name) tfrecord_path = os.path.dirname(os.path.realpath(__file__)) tfrecord_path = os.path.join(tfrecord_path, os.getenv('DOWNLOAD_PATH')) if tfrecord_name in os.listdir(tfrecord_path): return {'message':'이미 tfrecord 파일이 만들어져 있습니다.'} # return send_from_directory(dircetory=tfrecord_path, filename=tfrecord_name) else: # task 이름이 db에 있는지 확인 task_status = database.db_find_task(db, {'name': task_name}, {'_id': 0, 'group': 1, 'kind': 1}) if len(task_status) == 0: return {'message':'{} task 가 존재하지 않습니다.'.format(task_name)} task_status = task_status[0] # task kind 가 detection 인 경우에만 tf record 만듬 if task_status['kind'] != 'detection': return {'message':'아직은 detection 다운로드만 가능합니다'} tfrecord_path = os.path.join(tfrecord_path, tfrecord_name) make_tf_record(task_name, task_status['group'], task_object, tfrecord_path) return {'message':'다운로드중입니다. 완료되면 tensorflow record 페이지에서 다운로드 받을 수 있습니다}
def task_list(): tasks = database.db_find_task(db) result = [] for task in tasks: img_url = task['example'] if img_url: task['example'] = storage.download_img_to_base64(img_url, 'example/') else: task['example'] = None result.append(task) return jsonify(result)
def task_create(): # task 생성 함수인데 task 수정, 조건에 맞지 않는 task 수정 요청 무시 # 3가지 기능을 모두 가지고 있다... """ input 선택된 그룹 이름, 라벨링 타입(ocr, seg,...), Task 이름, Task 설명, 설명 첨부 이미지(example 이라는 이름으로 되어있음) 사용자가 새로운 task 를 만들었다면 database에 해당 정보들을 저장 output 선택된 그룹 이름, 라벨링 타입(ocr, seg,...), Task 이름, Task 설명 """ # {선택된 그룹, 라벨링 타입, Task 이름, Task 설명, 설명 이름 } result = {'choose_group': '', 'kind': '', 'name': '', 'comment': '', 'img_group': database.db_find_group(db), 'task_group': database.db_find_task(db)} # 선택된 이미지 그룹 group , 라벨링 kind, Task 이름 name result = utils.request_mapping(request.values, result) try: # 프론트엔드에서 이미지가 1장만 오도록 되어있어서 file.getlist 를 안해도 된다. label_example = request.files[''] except KeyError: # 예시 이미지가 없으면 무시한다. label_example = None filename_list = database.db_find_dataset_filenames(db, result['choose_group']) # 선택된 이미지 그룹(dataset)이 존재 하면 새로운 Task 등록 if len(filename_list) > 0: # test_task_group 에 이름이 중복되는 것이랑 수정 명령인지 구분하는 코드 task_status = database.db_check_taskgroup(db, result['name'], result['choose_group'], result['kind']) session_name = session['username'] # task_status 설명은 database.db_check_taskgroup 에 if task_status == 'create': insert_task_group(result, label_example, session_name) elif task_status == 'update': # task 그룹을 수정할때 과거에 저장된 예시 이미지들을 지우는 작업 # create 함수에 수정하는 코드도 함께들어가 있네 example = database.db_find_example_img(db, result['name']) # 기존에 있던 예시 이미지 파일을 지우고 if label_example: storage.delete_img(s3, example, 'example/') # 새로 바뀐 예시 이미지로 업데이트 insert_task_group(result, label_example, session_name) else: # task_status == drop return error_handler('task 생성', "task 이름이 중복되었습니다. 이름을 변경하거나" + "수정을 원한다면 라벨링타입, 이미지 그룹을 동일하게 해주세요") else: return error_handler('task 생성', '선택된 이미지 그룹이 존재하지 않습니다. 데이터베이스를 확인해주세요') return ''
def img_list(): img_group = database.db_find_group(db) if request.args: img_check = [] result = database.db_find_task(db, {'name': request.args['task_name']}) for img in img_group: try: if result[0]['group'] == img['group']: img['is_checked'] = 1 else: img['is_checked'] = 0 except IndexError: img['is_checked'] = 0 img_check.append(img) img_group = img_check return jsonify(img_group)
def download_raw_json(): taskname = request.values['name'] task_info = database.db_find_task(db, {'name': taskname}) image_group = task_info[0]['group'] label_end_document = database.db_find_dataset_group(db, taskname, image_group) json_file = {'kind': label_end_document[0][taskname]['kind']} annotations = [] def work(): for document in label_end_document: result = {'filename': document['filename'], 'height': document['height'], 'width': document['width'], 'label': document[taskname]['label']} annotations.append(result) json_file['annotations'] = annotations return str(json_file).replace("\'", "\"") return Response(stream_with_context(work()), mimetype='application/octet-stream', headers={'Content-Disposition': 'attachment;filename={}.json'.format(taskname)})
def img_list(): # 현재 생성되어있는 이미지 그룹 중에서 GET 으로 들어온 task_name을 # task_group collection 에서 검색해서 어떤 task 그룹에 활성화 되어있는지 알려준다. img_group = database.db_find_group(db) if request.args: img_check = [] result = database.db_find_task(db, {'name': request.args['task_name']}) for img in img_group: try: if result[0]['group'] == img['group']: img['is_checked'] = 1 else: img['is_checked'] = 0 except IndexError: img['is_checked'] = 0 img_check.append(img) img_group = img_check return jsonify(img_group)
def download_raw_image(): try: taskname = request.values['name'] task_info = database.db_find_task(db, {'name': taskname}) image_group = task_info[0]['group'] filename_list = database.db_find_dataset_filenames(db, image_group) total = len(filename_list) current_path = os.path.dirname(os.path.realpath(__file__)) save_path = os.path.join(current_path,os.getenv('IMAGE_SAVE_PATH')) download_path = os.path.join(save_path, taskname) if taskname + '.zip' in os.listdir(save_path): return send_from_directory(save_path, taskname + '.zip', as_attachment=True) else: t = storage.estimate_time_arrival(filename_list[0]) try: if Worker.all(queue=redis_queue): redis_queue.enqueue(work, result_ttl=0, job_timeout=total*t + 300, args=(download_path, filename_list)) return render_template('download_raw.html', message='{} 시간 {} 분 남았습니다.'.format(total//3600, (total - (total//3600)*3600)//60)) else: return render_template('download_raw.html', message='Redis worker가 동작하지 않습니다.') except Exception: return render_template('download_raw.html', message='Redis docker가 동작하지 않습니다.') except KeyError: return error_handler('raw 데이터 다운로드 페이지','task_name이 유효하지 않습니다.')
def labelling(task_name): img_info = database.db_find_one_label(db, task_name) task_info = database.db_find_task(db, {'name': task_name}) task_info = task_info[0] result = {} if img_info: try: label = img_info[task_name]['label'] is_label = 1 except KeyError: # 라벨링 안되어있는 경우 label = [] is_label = 0 img_base64 = storage.download_img_to_base64(img_info['filename']) if task_info.get('example'): # 예시 이미지가 있으면 예시 이미지 출력 example_base64 = storage.download_img_to_base64(task_info['example'], 'example/') else: # 예시 이미지가 없으면 예시 이미지 출력 안함 example_base64 = None result = { 'filename': img_info['filename'], 'label': label, 'is_labeled': is_label, 'width': img_info['width'], 'height': img_info['height'], 'kind': img_info['kind'], 'image': img_base64, 'image_ext': 'jpg', 'comment': task_info['comment'], 'example_image': example_base64 } if result['kind'] == 'classification': try: result['selection_list'] = task_info['selection_list'] except KeyError: return error_handler('라벨링', "라벨링 종류가 classification인데 selection list 가 존재하지 않습니다." + "task 를 확인바랍니다.") else: return error_handler('라벨링', '해당 task가 없습니다. task 를 확인해주세요') if request.method == 'POST': # 사이트에서 라벨링 한 결과가 POST 로 들어오면 db에 추가 # ''' def post_request_to_json(req): json_str = next(req.values.keys()) return json.loads(json_str) values = post_request_to_json(request) # ''' # values = request.values label = values['label'] if img_info: kind = img_info['kind'] filename = img_info['filename'] # 프론트엔드에서 request.values 가 string 으로 전송하는 바람에 post_requets_to_json이라는 특이한 함수를 필요로 한다. database.db_update_one_label(db, task_name, filename, kind, label) else: return error_handler('라벨링', 'task에 등록된 이미지가 없습니다. DB를 확인해 주세요') # 현재 접속한 user count 와 최근 로그인 정보 저장 status = database.db_count_user(db, session['username'], task_name) if not status: return error_handler('라벨링', '로그인한 사용자가 DB에 등록되어있지 않습니다.') return jsonify(result)
def task_management_list(): # task 그룹 전체 출력 # task_group DB에 저장되어있는 그대로 출력한다. result = database.db_find_task(db) return jsonify(result)
def task_management_list(): result = database.db_find_task(db) return jsonify(result)