perf(web):优化图片检测切换到视频检测的模型切换问题
This commit is contained in:
@@ -5,7 +5,7 @@
|
|||||||
<DetectionConfig
|
<DetectionConfig
|
||||||
:models="models"
|
:models="models"
|
||||||
:default-type="'image'"
|
:default-type="'image'"
|
||||||
:default-model="config.model"
|
:default-model="selectedModel || (models.length > 0 ? models[0].id : '')"
|
||||||
@type-change="onTypeChange"
|
@type-change="onTypeChange"
|
||||||
@config-change="onConfigChange"
|
@config-change="onConfigChange"
|
||||||
/>
|
/>
|
||||||
@@ -351,13 +351,17 @@ const props = defineProps({
|
|||||||
models: {
|
models: {
|
||||||
type: Array,
|
type: Array,
|
||||||
default: () => []
|
default: () => []
|
||||||
|
},
|
||||||
|
selectedModel: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
const emit = defineEmits(['type-change'])
|
const emit = defineEmits(['type-change', 'model-change'])
|
||||||
|
|
||||||
const config = ref({
|
const config = ref({
|
||||||
model: props.models.length > 0 ? props.models[0].id : 'fire_detection',
|
model: props.selectedModel || (props.models.length > 0 ? props.models[0].id : 'fire_detection'),
|
||||||
confidence: 0.5,
|
confidence: 0.5,
|
||||||
iou: 0.45,
|
iou: 0.45,
|
||||||
composite: false,
|
composite: false,
|
||||||
@@ -369,7 +373,12 @@ const onTypeChange = (type) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const onConfigChange = (newConfig) => {
|
const onConfigChange = (newConfig) => {
|
||||||
|
const oldModel = config.value.model
|
||||||
config.value = { ...newConfig }
|
config.value = { ...newConfig }
|
||||||
|
// 模型变化时通知父组件
|
||||||
|
if (newConfig.model && newConfig.model !== oldModel) {
|
||||||
|
emit('model-change', newConfig.model)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 可拖拽调整宽度相关
|
// 可拖拽调整宽度相关
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<DetectionConfig
|
<DetectionConfig
|
||||||
:models="models"
|
:models="models"
|
||||||
:default-type="'video'"
|
:default-type="'video'"
|
||||||
:default-model="config.model"
|
:default-model="selectedModel || (models.length > 0 ? models[0].id : '')"
|
||||||
@type-change="onTypeChange"
|
@type-change="onTypeChange"
|
||||||
@config-change="onConfigChange"
|
@config-change="onConfigChange"
|
||||||
/>
|
/>
|
||||||
@@ -223,13 +223,17 @@ const props = defineProps({
|
|||||||
models: {
|
models: {
|
||||||
type: Array,
|
type: Array,
|
||||||
default: () => []
|
default: () => []
|
||||||
|
},
|
||||||
|
selectedModel: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
const emit = defineEmits(['type-change'])
|
const emit = defineEmits(['type-change', 'model-change'])
|
||||||
|
|
||||||
const config = ref({
|
const config = ref({
|
||||||
model: props.models.length > 0 ? props.models[0].id : 'fire_detection',
|
model: props.selectedModel || (props.models.length > 0 ? props.models[0].id : 'fire_detection'),
|
||||||
confidence: 0.5,
|
confidence: 0.5,
|
||||||
iou: 0.45,
|
iou: 0.45,
|
||||||
composite: false,
|
composite: false,
|
||||||
@@ -241,7 +245,12 @@ const onTypeChange = (type) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const onConfigChange = (newConfig) => {
|
const onConfigChange = (newConfig) => {
|
||||||
|
const oldModel = config.value.model
|
||||||
config.value = { ...newConfig }
|
config.value = { ...newConfig }
|
||||||
|
// 模型变化时通知父组件
|
||||||
|
if (newConfig.model && newConfig.model !== oldModel) {
|
||||||
|
emit('model-change', newConfig.model)
|
||||||
|
}
|
||||||
|
|
||||||
// 如果摄像头已连接,实时更新配置
|
// 如果摄像头已连接,实时更新配置
|
||||||
if (websocket.value && cameraConnected.value) {
|
if (websocket.value && cameraConnected.value) {
|
||||||
|
|||||||
@@ -4,14 +4,18 @@
|
|||||||
<ImageDetection
|
<ImageDetection
|
||||||
v-if="activeTab === 'image'"
|
v-if="activeTab === 'image'"
|
||||||
:models="models"
|
:models="models"
|
||||||
|
:selected-model="selectedModel"
|
||||||
@type-change="handleTypeChange"
|
@type-change="handleTypeChange"
|
||||||
|
@model-change="handleModelChange"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<!-- 视频检测模块 -->
|
<!-- 视频检测模块 -->
|
||||||
<VideoDetection
|
<VideoDetection
|
||||||
v-if="activeTab === 'video'"
|
v-if="activeTab === 'video'"
|
||||||
:models="models"
|
:models="models"
|
||||||
|
:selected-model="selectedModel"
|
||||||
@type-change="handleTypeChange"
|
@type-change="handleTypeChange"
|
||||||
|
@model-change="handleModelChange"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -26,15 +30,24 @@ import VideoDetection from '@/components/VideoDetection.vue'
|
|||||||
|
|
||||||
const activeTab = ref('image')
|
const activeTab = ref('image')
|
||||||
const models = ref([])
|
const models = ref([])
|
||||||
|
const selectedModel = ref('')
|
||||||
|
|
||||||
const handleTypeChange = (type) => {
|
const handleTypeChange = (type) => {
|
||||||
activeTab.value = type
|
activeTab.value = type
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const handleModelChange = (modelId) => {
|
||||||
|
selectedModel.value = modelId
|
||||||
|
}
|
||||||
|
|
||||||
const loadModels = async () => {
|
const loadModels = async () => {
|
||||||
try {
|
try {
|
||||||
const response = await detectionApi.getModels()
|
const response = await detectionApi.getModels()
|
||||||
models.value = response.data
|
models.value = response.data
|
||||||
|
// 初始化默认选中第一个模型
|
||||||
|
if (models.value.length > 0 && !selectedModel.value) {
|
||||||
|
selectedModel.value = models.value[0].id
|
||||||
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
ElMessage.error('加载模型列表失败')
|
ElMessage.error('加载模型列表失败')
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user