AIManage/src/views/simulationEvaluation/addReport.vue

334 lines
13 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div class="app-container add-report">
<div class="scroll div-content-scroll">
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
<el-card>
<template #header><svg-icon icon-class="pause" style="width: 20px; height: 20px" />报告基本信息
</template>
<el-row>
<el-col :span="8">
<el-form-item label="报告名称" prop="reportName">
<el-input v-model="form.reportName" placeholder="请输入数据集名称" />
</el-form-item>
</el-col>
<el-col :span="16">
<el-form-item label="报告说明" prop="reportDesc">
<el-input v-model="form.reportDesc" placeholder="请输入数据集版本" />
</el-form-item>
</el-col>
</el-row>
</el-card>
<el-card style="margin-top: 10px;">
<template #header><svg-icon icon-class="pause" style="width: 20px; height: 20px" />推理任务
</template>
<el-table :data="info.tableData" stripe class="data-table1">
<el-table-column label="任务名称" align="left" prop="task_name" />
<el-table-column label="任务说明" align="left" prop="task_desc" />
<el-table-column label="使用数据集" align="left" prop="dataset_name" />
<el-table-column label="运行模型" align="left" prop="model_name" width="120" />
<el-table-column label="模型网络" align="left" prop="modl_net_type" width="120" />
<el-table-column label="创建时间" align="left" prop="create_time" width="120" v-if="1 == 2" />
<el-table-column label="完成时间" align="left" prop="finish_time" width="120" />
<el-table-column label="操作" fixed="right" align="center" width="100">
<template #default="scope">
<el-button text type="primary" size="small"
@click="doDelete(scope.row)"><i-ep-close-bold />删除</el-button>
</template>
</el-table-column>
<template #empty>
<el-button type="primary" @click="choiceTask">选择推理任务</el-button>
</template>
</el-table>
<div style="margin-top: 10px;"
v-if="['detection', 'classification', 'tracking'].indexOf(info.modl_sub_type) >= 0">
<div class="div-nav-header"><el-icon color="#409eff">
<Warning />
</el-icon>常用性能测评</div>
<el-row class="row-norm">
<el-col :span="12">
<el-form-item label="算法性能指标">
<span v-for="(it, idx) in info.norm.lvl1" :key="idx">{{ it }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="实时响应指标">
<span v-for="(it, idx) in info.norm.lvl2" :key="idx">{{ it }}</span>
</el-form-item>
</el-col>
</el-row>
</div>
<div style="margin-top: 10px;" v-if="['detection', 'classification'].indexOf(info.modl_sub_type) >= 0">
<div class="div-nav-header"><el-icon color="#409eff">
<Warning />
</el-icon>算法阀值指标</div>
<el-row>
<el-col :span="8">
<el-form-item label="置信度阈值" prop="score_threshold">
<el-input v-model="form.score_threshold" style="width: 120px;" class="txt-number"
placeholder="请输入置信度阈值" type="number" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="IoU阈值" prop="nms_threshold">
<el-input v-model="form.nms_threshold" style="width: 120px;" class="txt-number"
placeholder="请输入置信度阈值" type="number" />
</el-form-item>
</el-col>
</el-row>
</div>
</el-card>
<el-card style="margin-top: 10px;" v-if="info.modl_sub_type">
<template #header><svg-icon icon-class="pause" style="width: 20px; height: 20px" />更多测评
</template>
<el-table :data="info.tableData2" stripe class="data-table2">
<el-table-column label="任务名称" align="left" prop="task_name" />
<el-table-column label="任务说明" align="left" prop="task_desc" />
<el-table-column label="使用数据集" align="left" prop="dataset_name" />
<el-table-column label="运行模型" align="left" prop="model_name" width="120" />
<el-table-column label="模型网络" align="left" prop="modl_net_type" width="120" />
<el-table-column label="创建时间" align="left" prop="create_time" width="120" v-if="1 == 2" />
<el-table-column label="完成时间" align="left" prop="finish_time" width="120" />
<el-table-column label="操作" fixed="right" align="center" width="100">
<template #default="scope">
<el-button text type="primary" size="small" v-if="!scope.row.old"
@click="doDeleteComp(scope.row)"><i-ep-close-bold />删除</el-button>
</template>
</el-table-column>
<template #empty>
<el-button type="primary" @click="choiceRobustTask">添加鲁棒性任务</el-button>
<el-button type="primary" @click="choiceCompTask">添加对比任务</el-button>
</template>
</el-table>
</el-card>
</el-form>
</div>
<choiceTaskDlg ref="taskDlg" @success="doChoiceSuccess" />
<el-card class="card-footer">
<el-button type="primary" @click="doSave">生成报告</el-button>
</el-card>
</div>
</template>
<script setup>
import choiceTaskDlg from './components/choiceTaskDlg.vue'
import ReportApi from '@/api/report'
const router = useRouter();
const info = reactive({
tableData: [],
tableData2: [],
modl_sub_type: '',
norm: {
lvl1: [],
lvl2: [],
},
choiceType: '',
})
const formRef=ref();
const form = ref({}); // 基础表单
const taskDlg = ref()
const validateScore = (r, v, callback) => {
if (+v < 0 || +v >= 1) {
return callback(new Error('值在0-1之间'))
}
callback()
}
// 校验规则
const rules = reactive({
reportName: [{ required: true, message: "数据集名称不能为空", trigger: "blur" }],
score_threshold: [
{ required: true, message: "置信度阈值不能为空", trigger: "blur" },
{ validator: validateScore, trigger: 'blur' }
],
nms_threshold: [{ required: true, message: "IoU阈值不能为空", trigger: "blur" },
{ validator: validateScore, trigger: 'blur' }
],
});
//生成报告(验证)
function doSave() {
formRef.value.validate(d=>{
if(d){
if(!info.tableData || info.tableData.length==0){
ElMessage.error("请选择任务!");
return;
}
doMakeReport();//生成报告
}
});
}
//生成报告
function doMakeReport(){
let postData={
report_name:form.value.reportName,
report_desc:form.value.reportDesc,
task_id_list:info.tableData2 && info.tableData2.length>1?info.tableData2.map(d=>d.task_id):info.tableData.map(d=>d.task_id),
extra_evaluation_type:info.choiceType
};
if(info.choiceType=='horizontal_comparison'){
postData.threshold={
score_threshold:form.value.score_threshold,
nms_threshold:form.value.nms_threshold
};
}
ReportApi.addReport(postData).then(d=>{
let reportId=d.data?.data?.report_id||'';
if(reportId){
router.push({ path: "/simulationEvaluation/reportDesc", query: { id:reportId} });
ElMessage.success("生成报告成功!");
}else{
ElMessage.error("生成报告失败!");
}
});
}
//删除已选择
function doDelete(row) {
info.tableData = [];
info.modl_sub_type = "";
}
//删除对比
function doDeleteComp(row) {
let idx = info.tableData2.indexOf(row)
if (idx >= 0) {
info.tableData2 = info.tableData2.splice(idx, 1);
if (info.tableData2.length == 1) {
info.tableData2 = [];
info.choiceType=''
}
}
}
//选择任务
function choiceTask() {
info.choiceType = 'select'
taskDlg.value.showDialog({});
}
//添加鲁棒性任务
function choiceRobustTask() {
info.choiceType = 'robustness'
let taskId = info.tableData && info.tableData.length > 0 ? info.tableData[0].task_id : '';
taskDlg.value.showDialog({
disTaskId: taskId,
mult: false
});
}
//添加对比任务
function choiceCompTask() {
info.choiceType = 'horizontal_comparison'
let taskId = info.tableData && info.tableData.length > 0 ? info.tableData[0].task_id : '';
taskDlg.value.showDialog({
disTaskId: taskId,
mult: true
});
}
function doChoiceSuccess(d) {
if (info.choiceType !== 'select') {
info.tableData2 = [];
let it = info.tableData[0];
it.old = true;
info.tableData2 = [it, ...d];
}
info.tableData = d || [];
info.modl_sub_type = info.tableData != null && info.tableData.length > 0 ? info.tableData[0].modl_sub_type || '' : '';
if (['tracking'].indexOf(info.modl_sub_type) >= 0) {
info.norm = {
lvl1: "1.IDSW (ID跳变),2.MT跟踪轨迹,3.ML丢失轨迹,4.FM打断次数,5.MOTA跟踪准确度".split(","),
lvl2: "1. 平均推理时间,2. 系统延迟时间".split(",")
}
form.value.score_threshold = 0.5;
form.value.nms_threshold = 0.5;
} else if (['detection', 'classification'].indexOf(info.modl_sub_type) >= 0) {
info.norm = {
lvl1: "1.Precision精确度,2.Recall (召回率),3.F1-Score (F1分数),4. Micro F1,5. Macro F1,6.加权F1-Score,7.AP平均精度,8.mAP(多类平均精度),9.PR曲线".split(","),
lvl2: "1. 平均推理时间,2. 系统延迟时间".split(",")
}
form.value.score_threshold = 0.5;
form.value.nms_threshold = 0.5;
} else {
info.norm = {
lvl1: [],
lvl2: []
}
}
}
</script>
<style lang="scss">
.add-report {
.el-card__header {
padding: 8px 4px;
display: flex;
align-items: center;
}
.data-table1 {
.el-table__empty-block {
display: block;
text-align: right;
}
}
.txt-number {
input::-webkit-inner-spin-button,
input::-webkit-outer-spin-button {
-webkit-appearance: none;
}
}
.row-norm {
.el-form-item__content {
background: #eee;
border-radius: 10px;
padding: 10px;
line-height: 20px;
font-weight: bold;
span{
margin-right:8px;
}
}
}
.div-nav-header {
font-size: 14px;
font-weight: bold;
color: #333;
position: relative;
.el-icon {
position: relative;
margin-right: 4px;
top: 2px;
}
}
.card-footer {
position: fixed;
width: calc(100% - 215px);
bottom: 0px;
.el-card__body {
padding: 10px;
.el-pagination {
justify-content: end;
}
}
}
.div-content-scroll{
margin-bottom: 60px;
max-height: calc(100vh - 140px);
overflow-y: auto;
}
}
</style>