Exemple #1
0
def edit_iteration(iteration_id):
    iteration = ModelIteration.query.get(iteration_id)
    model_id = iteration.model_id
    model = MLModel.query.get(model_id)
    project_id = model.project_id
    permission = ManageLabelsPermission(project_id)
    if permission.can():
        form = EditIterationForm()
        if form.validate_on_submit():
            iteration.description = form.notes.data
            iteration.updated = datetime.utcnow()
            db.session.add(iteration)
            db.session.commit()
            flash('Notes updated')
            return redirect(
                url_for('ml.view_iteration', iteration_id=iteration_id))
        form.notes.data = iteration.description
        project = Project.query.get(project_id)
        return render_template('ml/iteration_edit.html',
                               title='Edit Iteration',
                               form=form,
                               iteration=iteration,
                               model=model,
                               project=project)
    # permission denied
    abort(403)
Exemple #2
0
def add_label(iteration_id):
    iteration = ModelIteration.query.get(iteration_id)
    model_id = iteration.model_id
    model = MLModel.query.get(model_id)
    project_id = model.project_id
    permission = ManageLabelsPermission(project_id)
    if permission.can():
        page = request.args.get('page', 1, type=int)
        subq = ModelLabel.query.filter(
            ModelLabel.iteration_id == iteration_id).with_entities(
                ModelLabel.label_id).subquery()
        q = ProjectLabel.query.filter(
            ProjectLabel.project_id == project_id).join(Label).join(
                LabelType).filter(LabelType.parent_type == None).filter(
                    ProjectLabel.label_id.notin_(subq))
        labels = q.paginate(page, current_app.config['ITEMS_PER_PAGE'], False)
        project = Project.query.get(project_id)
        return render_template('ml/unused_labels.html',
                               title='Unused Labels',
                               labels=labels,
                               iteration=iteration,
                               model=model,
                               project=project)
    # permission denied
    abort(403)
Exemple #3
0
def copy_iteration(iteration_id):
    iteration = ModelIteration.query.get(iteration_id)
    model_id = iteration.model_id
    model = MLModel.query.get(model_id)
    project_id = model.project_id
    permission = ManageLabelsPermission(project_id)
    if permission.can():
        form = EditIterationForm()
        if form.validate_on_submit():
            new_iteration = ModelIteration()
            new_iteration.model = iteration.model
            new_iteration.description = form.notes.data
            db.session.add(new_iteration)
            labels = ModelLabel.query.filter(
                ModelLabel.iteration_id == iteration_id).all()
            for label in labels:
                new_label = ModelLabel()
                new_label.iteration = new_iteration
                new_label.label = label.label
                new_label.combine_with = label.combine_with
                db.session.add(new_label)
            db.session.commit()
            flash('New iteration created')
            return redirect(
                url_for('ml.view_iteration', iteration_id=new_iteration.id))
        form.notes.data = iteration.description
        project = Project.query.get(project_id)
        return render_template('ml/iteration_copy.html',
                               title='Copy Iteration',
                               form=form,
                               iteration=iteration,
                               model=model,
                               project=project)
    # permission denied
    abort(403)
Exemple #4
0
def delete_clip_label(file_name, offset, label_id):
    clip_label = LabeledClip.query.get(label_id)
    project_id = clip_label.file.recording_device.station.project.id
    admin_permission = ManageLabelsPermission(project_id)
    if clip_label.user == current_user or admin_permission.can():
        db.session.delete(clip_label)
        db.session.commit()
        flash('Label deleted.')
    return redirect(
        url_for('labels.view_clip', file_name=file_name, offset=offset))
Exemple #5
0
def _delete_project_label():
    data = request.get_json()
    project_label = ProjectLabel.query.get(data['id'])
    project_id = project_label.project_id
    permission = ManageLabelsPermission(project_id)
    if permission.can():
        db.session.delete(project_label)
        db.session.commit()
        return jsonify(success=True)
    else:
        return jsonify({'message': 'Permission denied'}), 403
Exemple #6
0
def list_models(project_id):
    permission = ManageLabelsPermission(project_id)
    if permission.can():
        page = request.args.get('page', 1, type=int)
        project = Project.query.get(project_id)
        q = project.models
        models = q.paginate(page, current_app.config['ITEMS_PER_PAGE'], False)
        return render_template('ml/model_list.html',
                               title='Machine Learning Models',
                               models=models,
                               project=project)
    # permission denied
    abort(403)
Exemple #7
0
def view_clip(file_name, offset):
    delete_form = DeleteForm()
    form = EditForm()
    form.select_type.query = LabelType.query.filter(
        LabelType.parent_id == None)
    wav_file = AudioFile.query.filter_by(name=file_name).first()
    station = wav_file.recording_device.station
    project_id = station.project_id
    lq = Label.query.join(LabelType).join(
        ProjectLabel, Label.id == ProjectLabel.label_id).filter(
            ProjectLabel.project_id == project_id)
    form.select_label.query = lq.filter(LabelType.parent_id == None)
    form.select_sub_label.query = lq.filter(LabelType.parent_id != None)
    add_permission = AddLabelPermission(project_id)
    view_permission = ViewResultsPermission(project_id)
    if form.validate_on_submit():
        if add_permission.can():
            label = LabeledClip(file_name=file_name,
                                offset=offset,
                                duration=current_app.config['CLIP_SECS'],
                                certain=form.certainty.data,
                                label=form.select_label.data,
                                sub_label=form.select_sub_label.data,
                                notes=form.notes.data,
                                user=current_user,
                                modified=datetime.utcnow())
            db.session.add(label)
            db.session.commit()
            flash('Label added.')
            return redirect(
                url_for('labels.view_clip', file_name=file_name,
                        offset=offset))
        # permission denied
        abort(403)
    if view_permission.can():
        admin_permission = ManageLabelsPermission(project_id)
        labels = LabeledClip.query.filter_by(
            file_name=file_name,
            offset=offset).order_by(LabeledClip.modified.desc()).all()
        return render_template('labels/view_clip.html',
                               title='Add/edit labels',
                               delete_form=delete_form,
                               form=form,
                               labels=labels,
                               wav_file=wav_file,
                               offset=offset,
                               station=station,
                               admin=admin_permission.can())
    # permission denied
    abort(403)
Exemple #8
0
def iteration_clips(iteration_id):
    iteration = ModelIteration.query.get(iteration_id)
    project = iteration.model.project
    q = LabeledClip.query.join(AudioFile).join(
        AudioFile.monitoring_station).filter(
            MonitoringStation.project == project)
    filter_form = FilterForm(request.args, meta={'csrf': False})
    fq = Label.query.join(ModelLabel, Label.id == ModelLabel.label_id).filter(
        ModelLabel.iteration == iteration).order_by(Label.name)
    filter_form.select_label.query = fq
    if filter_form.validate():
        if filter_form.select_label.data:
            q = q.filter(LabeledClip.label == filter_form.select_label.data)
        if filter_form.certain.data:
            q = q.filter(LabeledClip.certain == filter_form.certain.data)
    permission = ManageLabelsPermission(project.id)
    labeling = (iteration.status == StatusEnum.labeling)
    use_form = UseTrainingClipsForm()
    if permission.can() and labeling and use_form.validate_on_submit():
        training_clips_q = TrainingClip.query.join(LabeledClip).filter(
            TrainingClip.iteration_id == iteration.id)
        if use_form.use.data:
            selected_clips = q.filter(
                LabeledClip.id.notin_(
                    training_clips_q.with_entities(LabeledClip.id)))
            for clip in selected_clips:
                training_clip = TrainingClip(iteration_id=iteration.id,
                                             labeled_clip_id=clip.id)
                db.session.add(training_clip)
        if use_form.do_not_use.data:
            selected_clips = training_clips_q.filter(
                LabeledClip.id.in_(q.with_entities(LabeledClip.id)))
            for training_clip in selected_clips:
                db.session.delete(training_clip)
        db.session.commit()
    clips_count = q.count()
    page = request.args.get('page', 1, type=int)
    per_page = request.args.get('per_page',
                                current_app.config['ITEMS_PER_PAGE'],
                                type=int)
    clips = q.paginate(page, per_page, False)
    return render_template('ml/iteration_clips.html',
                           title='Labeled Clips',
                           filter_form=filter_form,
                           use_form=use_form,
                           clips_count=clips_count,
                           clips=clips,
                           iteration=iteration,
                           labeling=labeling)
Exemple #9
0
def edit_label(iteration_id, label_id):
    iteration = ModelIteration.query.get(iteration_id)
    model_id = iteration.model_id
    model = MLModel.query.get(model_id)
    project_id = model.project_id
    permission = ManageLabelsPermission(project_id)
    if permission.can() and iteration.status == StatusEnum.labeling:
        model_label = ModelLabel.query.filter(
            ModelLabel.label_id == label_id).filter(
                ModelLabel.iteration_id == iteration_id).first()
        if model_label:
            combine_with = model_label.combine_with
        else:
            combine_with = None
        form = IterationLabelForm(combine_with=combine_with)
        form.combine_with.query = Label.query.join(
            ModelLabel, Label.id == ModelLabel.label_id).filter(
                ModelLabel.iteration_id == iteration_id).filter(
                    ModelLabel.label_id != label_id).order_by(Label.name)
        label = Label.query.get(label_id)
        if form.validate_on_submit():
            if model_label == None:
                model_label = ModelLabel(iteration=iteration, label=label)
                change = 'Added'
            else:
                change = 'Updated'
            model_label.combine_with = form.combine_with.data
            iteration.updated = datetime.utcnow()
            db.session.add(model_label)
            db.session.add(iteration)
            db.session.commit()
            flash(change + ' ' + label.name)
            return redirect(
                url_for('ml.iteration_clips',
                        iteration_id=iteration_id,
                        select_label=label_id))
        project = Project.query.get(project_id)
        return render_template('ml/label_edit.html',
                               title='Add/Edit Label',
                               form=form,
                               iteration=iteration,
                               model=model,
                               project=project,
                               label=label)
    # permission denied
    abort(403)
Exemple #10
0
def list_iterations(model_id):
    model = MLModel.query.get(model_id)
    project_id = model.project_id
    permission = ManageLabelsPermission(project_id)
    if permission.can():
        page = request.args.get('page', 1, type=int)
        q = model.iterations.order_by(ModelIteration.updated.desc())
        iterations = q.paginate(page, current_app.config['ITEMS_PER_PAGE'],
                                False)
        project = Project.query.get(project_id)
        return render_template('ml/iteration_list.html',
                               title='Model Iterations',
                               iterations=iterations,
                               model=model,
                               project=project)
    # permission denied
    abort(403)
Exemple #11
0
def list_sublabels(project_id):
    permission = ManageLabelsPermission(project_id)
    if permission.can():
        page = request.args.get('page', 1, type=int)
        project = Project.query.get(project_id)
        q = project.labels.join(Label).join(LabelType).filter(
            LabelType.parent_id != None).order_by(Label.name)
        labels = q.paginate(page, current_app.config['ITEMS_PER_PAGE'], False)
        labels_schema = ProjectLabelSchema(many=True)
        labels_json = labels_schema.dumps(labels.items)
        return render_template('projects/sublabel_list.html',
                               title='Project Sublabels',
                               labels=labels,
                               labels_json=labels_json,
                               project=project)
    # permission denied
    abort(403)
Exemple #12
0
def view_errors(model_label_id):
    model_label = ModelLabel.query.get(model_label_id)
    iteration = model_label.iteration
    model = iteration.model
    project_id = model.project_id
    permission = ManageLabelsPermission(project_id)
    if permission.can():
        page = request.args.get('page', 1, type=int)
        errors = model_label.training_errors.paginate(
            page, current_app.config['ITEMS_PER_PAGE'], False)
        project = Project.query.get(project_id)
        return render_template('ml/training_errors.html',
                               title='Training Errors',
                               errors=errors,
                               model_label=model_label,
                               iteration=iteration,
                               model=model,
                               project=project)
Exemple #13
0
def _add_project_label():
    data = request.get_json()
    project_id = data['project_id']
    permission = ManageLabelsPermission(project_id)
    if permission.can():
        q = ProjectLabel.query.filter(
            ProjectLabel.project_id == project_id).filter(
                ProjectLabel.label_id == data['label_id'])
        existing_label = q.first()
        if existing_label:
            return jsonify({'message':
                            'You have already added this label'}), 409
        project_label_schema = ProjectLabelSchema()
        new_label = project_label_schema.load(data)
        db.session.add(new_label)
        db.session.commit()
        return project_label_schema.jsonify(new_label)
    else:
        return jsonify({'message': 'Permission denied'}), 403
Exemple #14
0
def delete_label(iteration_id, label_id):
    iteration = ModelIteration.query.get(iteration_id)
    model_id = iteration.model_id
    model = MLModel.query.get(model_id)
    project_id = model.project_id
    permission = ManageLabelsPermission(project_id)
    if permission.can() and iteration.status == StatusEnum.labeling:
        model_label = ModelLabel.query.filter(
            ModelLabel.label_id == label_id).filter(
                ModelLabel.iteration_id == iteration_id).first()
        label = Label.query.get(label_id)
        iteration.updated = datetime.utcnow()
        db.session.delete(model_label)
        db.session.add(iteration)
        db.session.commit()
        flash('Removed ' + label.name)
        return redirect(url_for('ml.view_iteration',
                                iteration_id=iteration_id))
    # permission denied
    abort(403)
Exemple #15
0
def next_status(iteration_id):
    iteration = ModelIteration.query.get(iteration_id)
    model_id = iteration.model_id
    model = MLModel.query.get(model_id)
    project_id = model.project_id
    permission = ManageLabelsPermission(project_id)
    if permission.can():
        next_status = iteration.next_status()
        if next_status:
            iteration.status = next_status
            iteration.updated = datetime.utcnow()
            db.session.add(iteration)
            db.session.commit()
            flash('Updated status')
        else:
            flash('Invalid status change')
        return redirect(url_for('ml.view_iteration',
                                iteration_id=iteration_id))
    # permission denied
    abort(403)
Exemple #16
0
def new_model(project_id):
    permission = ManageLabelsPermission(project_id)
    if permission.can():
        form = EditModelForm()
        if form.validate_on_submit():
            model = MLModel()
            model.project_id = project_id
            model.name = form.name.data
            model.description = form.description.data
            db.session.add(model)
            db.session.commit()
            flash('New model created')
            return redirect(url_for('ml.list_models', project_id=project_id))
        project = Project.query.get(project_id)
        return render_template('ml/model_edit.html',
                               title='New Model',
                               form=form,
                               project=project)
    # permission denied
    abort(403)
Exemple #17
0
def _use_clip(iteration_id, clip_id):
    q = TrainingClip.query.filter(
        TrainingClip.iteration_id == iteration_id).filter(
            TrainingClip.labeled_clip_id == clip_id)
    training_clip = q.first()
    is_used = (training_clip is not None)
    if request.method == 'POST':
        iteration = ModelIteration.query.get(iteration_id)
        project_id = iteration.model.project_id
        permission = ManageLabelsPermission(project_id)
        if permission.can() and iteration.status == StatusEnum.labeling:
            use = request.get_json()
            if use == True and is_used == False:
                training_clip = TrainingClip(iteration_id=iteration_id,
                                             labeled_clip_id=clip_id)
                db.session.add(training_clip)
                is_used = True
            elif use == False and is_used == True:
                db.session.delete(training_clip)
                is_used = False
            db.session.commit()
    return jsonify(is_used)
Exemple #18
0
def new_iteration(model_id):
    model = MLModel.query.get(model_id)
    project_id = model.project_id
    permission = ManageLabelsPermission(project_id)
    if permission.can():
        form = EditIterationForm()
        if form.validate_on_submit():
            iteration = ModelIteration()
            iteration.model = model
            iteration.description = form.notes.data
            db.session.add(iteration)
            db.session.commit()
            flash('New iteration created')
            return redirect(
                url_for('ml.view_iteration', iteration_id=iteration.id))
        project = Project.query.get(project_id)
        return render_template('ml/iteration_new.html',
                               title='New Iteration',
                               form=form,
                               model=model,
                               project=project)
    # permission denied
    abort(403)
Exemple #19
0
def view_iteration(iteration_id):
    iteration = ModelIteration.query.get(iteration_id)
    project_id = iteration.model.project_id
    permission = ManageLabelsPermission(project_id)
    if permission.can():
        page = request.args.get('page', 1, type=int)
        q = ModelLabel.query.filter(
            ModelLabel.iteration_id == iteration_id).join(
                Label, ModelLabel.label_id == Label.id).join(LabelType).filter(
                    LabelType.parent_type == None).order_by(Label.name)
        labels = q.paginate(page, current_app.config['ITEMS_PER_PAGE'], False)
        delete_form = DeleteForm()
        previous_status = iteration.previous_status()
        if previous_status:
            previous_form = PreviousForm()
            previous_form.previous_button.label.text = '\u00AB ' + str(
                previous_status)
        else:
            previous_form = None
        next_status = iteration.next_status()
        if next_status:
            next_form = NextForm()
            next_form.next_button.label.text = str(next_status) + ' \u00BB'
        else:
            next_form = None
        finished = (iteration.status == StatusEnum.finished)
        return render_template('ml/iteration_view.html',
                               title='Model Iteration Labels',
                               labels=labels,
                               iteration=iteration,
                               finished=finished,
                               delete_form=delete_form,
                               previous_form=previous_form,
                               next_form=next_form)
    # permission denied
    abort(403)
Exemple #20
0
def list_labels(project_id=None):
    permission = ViewResultsPermission(project_id)
    if permission.can():
        page = request.args.get('page', 1, type=int)
        filter_form = FilterForm(request.args, meta={'csrf': False})
        fq = Label.query.join(LabelType).filter(LabelType.parent_id == None)
        q = LabeledClip.query.join(AudioFile).join(LabeledClip.label)
        view_restricted = ManageLabelsPermission(project_id)
        if not view_restricted.can():
            q = q.filter((Label.restricted == False)
                         | (Label.restricted == None))
        if project_id:
            q = q.join(AudioFile.monitoring_station).filter(
                MonitoringStation.project_id == project_id)
            fq = fq.join(ProjectLabel,
                         Label.id == ProjectLabel.label_id).filter(
                             ProjectLabel.project_id == project_id)
        filter_form.select_label.query = fq
        if filter_form.validate():
            if filter_form.select_label.data:
                q = q.filter(Label.id == filter_form.select_label.data.id)
            if filter_form.certain.data == '1':
                q = q.filter(LabeledClip.certain == True)
            if filter_form.certain.data == '0':
                q = q.filter(LabeledClip.certain == False)
        clips = q.order_by(AudioFile.timestamp).order_by(
            LabeledClip.offset).paginate(page,
                                         current_app.config['ITEMS_PER_PAGE'],
                                         False)
        return render_template('labels/label_list.html',
                               title='Labels',
                               clips=clips,
                               project_id=project_id,
                               filter_form=filter_form)
    # permission denied
    abort(403)