Beispiel #1
0
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))}     
Beispiel #2
0
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)
Beispiel #3
0
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 페이지에서 다운로드 받을 수 있습니다}
Beispiel #4
0
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)
Beispiel #5
0
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 ''
Beispiel #6
0
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)
Beispiel #7
0
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)})
Beispiel #8
0
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)
Beispiel #9
0
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이 유효하지 않습니다.')
Beispiel #10
0
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)
Beispiel #11
0
def task_management_list():
    # task 그룹 전체 출력 
    # task_group DB에 저장되어있는 그대로 출력한다.
    result = database.db_find_task(db)
    return jsonify(result)
Beispiel #12
0
def task_management_list():
    result = database.db_find_task(db)
    return jsonify(result)