Skip to content

Commit 1f1987d

Browse files
authored
删除标注算子,屏蔽自动标注 (#470)
* 删除标注算子,屏蔽自动标注
1 parent f95473c commit 1f1987d

11 files changed

Lines changed: 446 additions & 1679 deletions

File tree

frontend/src/pages/DataAnnotation/Create/components/CreateAnnotationTaskDialog.tsx

Lines changed: 149 additions & 157 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ import { useEffect, useState, useRef } from "react";
66
import {
77
createAnnotationTaskUsingPost,
88
queryAnnotationTemplatesUsingGet,
9-
createAutoAnnotationTaskUsingPost,
9+
// 自动标注创建API已屏蔽(保留代码在注释中)
10+
// createAutoAnnotationTaskUsingPost,
1011
} from "../../annotation.api";
1112
import DatasetFileTransfer from "@/components/business/DatasetFileTransfer";
1213
import { DatasetType, type Dataset, type DatasetFile } from "@/pages/DataManagement/dataset.model";
@@ -329,65 +330,54 @@ export default function CreateAnnotationTask({
329330
}
330331
};
331332

332-
const handleAutoSubmit = async () => {
333-
try {
334-
const values = await autoForm.validateFields();
335-
336-
if (imageFileCount === 0) {
337-
message.error(t('dataAnnotation.create.messages.selectAtLeastOneImageFile'));
338-
return;
339-
}
340-
341-
setSubmitting(true);
342-
343-
const selectedFiles = Object.values(selectedFilesMap) as any[];
344-
345-
// 对于自动标注,后端会根据 fileIds 自动按数据集分组并为每个数据集创建/复用 LS 项目,
346-
// 这里不再强制限制只能选择单一数据集,只需保证至少有一个 datasetId,
347-
// 否则退回到表单中的 datasetId。
348-
const datasetIds = Array.from(
349-
new Set(
350-
selectedFiles
351-
.map((file) => file?.datasetId)
352-
.filter((id) => id !== undefined && id !== null && id !== ""),
353-
),
354-
);
355-
356-
const effectiveDatasetId = values.datasetId || datasetIds[0];
357-
358-
const imageExtensions = [".jpg", ".jpeg", ".png", ".bmp", ".gif", ".tiff", ".webp"];
359-
const imageFileIds = Object.values(selectedFilesMap)
360-
.filter((file) => {
361-
const ext = file.fileName?.toLowerCase().match(/\.[^.]+$/)?.[0] || "";
362-
return imageExtensions.includes(ext);
363-
})
364-
.map((file) => file.id);
365-
366-
const payload = {
367-
name: values.name,
368-
datasetId: effectiveDatasetId,
369-
fileIds: imageFileIds,
370-
config: {
371-
modelSize: values.modelSize,
372-
confThreshold: values.confThreshold,
373-
targetClasses: selectAllClasses ? [] : values.targetClasses || [],
374-
},
375-
};
376-
377-
await createAutoAnnotationTaskUsingPost(payload);
378-
message.success(t('dataAnnotation.create.messages.autoCreateSuccess'));
379-
setShouldResetOnOpen(true); // 标记下次打开时需要重置
380-
// 触发上层刷新自动标注任务列表
381-
(onRefresh as any)?.("auto");
382-
onClose();
383-
} catch (error: any) {
384-
if (error.errorFields) return;
385-
console.error("Failed to create auto annotation task:", error);
386-
message.error(error.message || t('dataAnnotation.create.messages.autoCreateFailed'));
387-
} finally {
388-
setSubmitting(false);
389-
}
390-
};
333+
// 自动标注提交函数已屏蔽(保留代码在注释中)
334+
// const handleAutoSubmit = async () => {
335+
// try {
336+
// const values = await autoForm.validateFields();
337+
// if (imageFileCount === 0) {
338+
// message.error(t('dataAnnotation.create.messages.selectAtLeastOneImageFile'));
339+
// return;
340+
// }
341+
// setSubmitting(true);
342+
// const selectedFiles = Object.values(selectedFilesMap) as any[];
343+
// const datasetIds = Array.from(
344+
// new Set(
345+
// selectedFiles
346+
// .map((file) => file?.datasetId)
347+
// .filter((id) => id !== undefined && id !== null && id !== ""),
348+
// ),
349+
// );
350+
// const effectiveDatasetId = values.datasetId || datasetIds[0];
351+
// const imageExtensions = [".jpg", ".jpeg", ".png", ".bmp", ".gif", ".tiff", ".webp"];
352+
// const imageFileIds = Object.values(selectedFilesMap)
353+
// .filter((file) => {
354+
// const ext = file.fileName?.toLowerCase().match(/\.[^.]+$/)?.[0] || "";
355+
// return imageExtensions.includes(ext);
356+
// })
357+
// .map((file) => file.id);
358+
// const payload = {
359+
// name: values.name,
360+
// datasetId: effectiveDatasetId,
361+
// fileIds: imageFileIds,
362+
// config: {
363+
// modelSize: values.modelSize,
364+
// confThreshold: values.confThreshold,
365+
// targetClasses: selectAllClasses ? [] : values.targetClasses || [],
366+
// },
367+
// };
368+
// await createAutoAnnotationTaskUsingPost(payload);
369+
// message.success(t('dataAnnotation.create.messages.autoCreateSuccess'));
370+
// setShouldResetOnOpen(true);
371+
// (onRefresh as any)?.("auto");
372+
// onClose();
373+
// } catch (error: any) {
374+
// if (error.errorFields) return;
375+
// console.error("Failed to create auto annotation task:", error);
376+
// message.error(error.message || t('dataAnnotation.create.messages.autoCreateFailed'));
377+
// } finally {
378+
// setSubmitting(false);
379+
// }
380+
// };
391381

392382
const handleClassSelectionChange = (checked: boolean) => {
393383
setSelectAllClasses(checked);
@@ -408,7 +398,7 @@ export default function CreateAnnotationTask({
408398
</Button>
409399
<Button
410400
type="primary"
411-
onClick={activeMode === "manual" ? handleManualSubmit : handleAutoSubmit}
401+
onClick={handleManualSubmit}
412402
loading={submitting}
413403
>
414404
{t('dataAnnotation.create.ok')}
@@ -417,6 +407,7 @@ export default function CreateAnnotationTask({
417407
}
418408
width={800}
419409
>
410+
{/* 自动标注功能已屏蔽 - Tabs 结构保留但仅显示手动标注 */}
420411
<Tabs
421412
activeKey={activeMode}
422413
onChange={(key) => setActiveMode(key as "manual" | "auto")}
@@ -548,102 +539,103 @@ export default function CreateAnnotationTask({
548539
</Form>
549540
),
550541
},
551-
{
552-
key: "auto",
553-
label: t('dataAnnotation.create.auto'),
554-
children: (
555-
<Form form={autoForm} layout="vertical" preserve={false}>
556-
{/* 自动标注:任务名称仍然放在第一行,必填 */}
557-
<Form.Item
558-
name="name"
559-
label={t('dataAnnotation.create.form.name')}
560-
rules={[
561-
{ required: true, message: t('dataAnnotation.create.form.nameRequired') },
562-
{ max: 100, message: t('dataAnnotation.create.form.nameMaxLength') },
563-
]}
564-
>
565-
<Input placeholder={t('dataAnnotation.create.form.namePlaceholder')} />
566-
</Form.Item>
567-
568-
<Form.Item label={t('dataAnnotation.create.form.selectDatasetAndFiles')} required>
569-
<DatasetFileTransfer
570-
open
571-
selectedFilesMap={selectedFilesMap}
572-
onSelectedFilesChange={setSelectedFilesMap}
573-
onDatasetSelect={(dataset) => {
574-
setSelectedDataset(dataset as Dataset | null);
575-
autoForm.setFieldsValue({ datasetId: dataset?.id ?? "" });
576-
}}
577-
datasetTypeFilter={DatasetType.IMAGE}
578-
allowedFileExtensions={IMAGE_EXTENSIONS}
579-
singleDatasetOnly
580-
/>
581-
{selectedDataset && (
582-
<div className="mt-2 p-2 bg-blue-50 rounded border border-blue-200 text-xs">
583-
{t('dataAnnotation.create.form.currentDataset', { name: selectedDataset.name, count: imageFileCount })}
584-
</div>
585-
)}
586-
</Form.Item>
587-
588-
<Form.Item
589-
hidden
590-
name="datasetId"
591-
rules={[{ required: true, message: t('dataAnnotation.create.form.datasetRequired') }]}
592-
>
593-
<Input type="hidden" />
594-
</Form.Item>
595-
596-
<Form.Item
597-
name="modelSize"
598-
label={t('dataAnnotation.create.form.modelSize')}
599-
rules={[{ required: true, message: t('dataAnnotation.create.form.modelSizeRequired') }]}
600-
initialValue="l"
601-
>
602-
<Select>
603-
<Option value="n">{t('dataAnnotation.home.autoModelSizeLabels.n')}</Option>
604-
<Option value="s">{t('dataAnnotation.home.autoModelSizeLabels.s')}</Option>
605-
<Option value="m">{t('dataAnnotation.home.autoModelSizeLabels.m')}</Option>
606-
<Option value="l">{t('dataAnnotation.home.autoModelSizeLabels.l')}</Option>
607-
<Option value="x">{t('dataAnnotation.home.autoModelSizeLabels.x')}</Option>
608-
</Select>
609-
</Form.Item>
610-
611-
<Form.Item
612-
name="confThreshold"
613-
label={t('dataAnnotation.create.form.confThreshold')}
614-
rules={[{ required: true, message: t('dataAnnotation.create.form.confThresholdRequired') }]}
615-
initialValue={0.7}
616-
>
617-
<Slider
618-
min={0.1}
619-
max={0.9}
620-
step={0.05}
621-
tooltip={{ formatter: (v) => `${(v || 0) * 100}%` }}
622-
/>
623-
</Form.Item>
624-
625-
<Form.Item label={t('dataAnnotation.create.form.targetClasses')}>
626-
<Checkbox
627-
checked={selectAllClasses}
628-
onChange={(e) => handleClassSelectionChange(e.target.checked)}
629-
>
630-
{t('dataAnnotation.create.form.selectAllClasses')}
631-
</Checkbox>
632-
{!selectAllClasses && (
633-
<Form.Item name="targetClasses" noStyle>
634-
<Select mode="multiple" placeholder={t('dataAnnotation.create.form.selectTargetClasses')} style={{ marginTop: 8 }}>
635-
{COCO_CLASSES.map((cls) => (
636-
<Option key={cls.id} value={cls.id}>
637-
{cls.label} ({cls.name})
638-
</Option>
639-
))}
640-
</Select>
641-
</Form.Item>
642-
)}
643-
</Form.Item>
644-
</Form>
645-
),
646-
},
542+
// 自动标注 Tab 已屏蔽(代码保留在下方注释中,需要恢复时可取消注释)
543+
// {
544+
// key: "auto",
545+
// label: t('dataAnnotation.create.auto'),
546+
// children: (
547+
// <Form form={autoForm} layout="vertical" preserve={false}>
548+
// {/* 自动标注:任务名称仍然放在第一行,必填 */}
549+
// <Form.Item
550+
// name="name"
551+
// label={t('dataAnnotation.create.form.name')}
552+
// rules={[
553+
// { required: true, message: t('dataAnnotation.create.form.nameRequired') },
554+
// { max: 100, message: t('dataAnnotation.create.form.nameMaxLength') },
555+
// ]}
556+
// >
557+
// <Input placeholder={t('dataAnnotation.create.form.namePlaceholder')} />
558+
// </Form.Item>
559+
//
560+
// <Form.Item label={t('dataAnnotation.create.form.selectDatasetAndFiles')} required>
561+
// <DatasetFileTransfer
562+
// open
563+
// selectedFilesMap={selectedFilesMap}
564+
// onSelectedFilesChange={setSelectedFilesMap}
565+
// onDatasetSelect={(dataset) => {
566+
// setSelectedDataset(dataset as Dataset | null);
567+
// autoForm.setFieldsValue({ datasetId: dataset?.id ?? "" });
568+
// }}
569+
// datasetTypeFilter={DatasetType.IMAGE}
570+
// allowedFileExtensions={IMAGE_EXTENSIONS}
571+
// singleDatasetOnly
572+
// />
573+
// {selectedDataset && (
574+
// <div className="mt-2 p-2 bg-blue-50 rounded border border-blue-200 text-xs">
575+
// {t('dataAnnotation.create.form.currentDataset', { name: selectedDataset.name, count: imageFileCount })}
576+
// </div>
577+
// )}
578+
// </Form.Item>
579+
//
580+
// <Form.Item
581+
// hidden
582+
// name="datasetId"
583+
// rules={[{ required: true, message: t('dataAnnotation.create.form.datasetRequired') }]}
584+
// >
585+
// <Input type="hidden" />
586+
// </Form.Item>
587+
//
588+
// <Form.Item
589+
// name="modelSize"
590+
// label={t('dataAnnotation.create.form.modelSize')}
591+
// rules={[{ required: true, message: t('dataAnnotation.create.form.modelSizeRequired') }]}
592+
// initialValue="l"
593+
// >
594+
// <Select>
595+
// <Option value="n">{t('dataAnnotation.home.autoModelSizeLabels.n')}</Option>
596+
// <Option value="s">{t('dataAnnotation.home.autoModelSizeLabels.s')}</Option>
597+
// <Option value="m">{t('dataAnnotation.home.autoModelSizeLabels.m')}</Option>
598+
// <Option value="l">{t('dataAnnotation.home.autoModelSizeLabels.l')}</Option>
599+
// <Option value="x">{t('dataAnnotation.home.autoModelSizeLabels.x')}</Option>
600+
// </Select>
601+
// </Form.Item>
602+
//
603+
// <Form.Item
604+
// name="confThreshold"
605+
// label={t('dataAnnotation.create.form.confThreshold')}
606+
// rules={[{ required: true, message: t('dataAnnotation.create.form.confThresholdRequired') }]}
607+
// initialValue={0.7}
608+
// >
609+
// <Slider
610+
// min={0.1}
611+
// max={0.9}
612+
// step={0.05}
613+
// tooltip={{ formatter: (v) => `${(v || 0) * 100}%` }}
614+
// />
615+
// </Form.Item>
616+
//
617+
// <Form.Item label={t('dataAnnotation.create.form.targetClasses')}>
618+
// <Checkbox
619+
// checked={selectAllClasses}
620+
// onChange={(e) => handleClassSelectionChange(e.target.checked)}
621+
// >
622+
// {t('dataAnnotation.create.form.selectAllClasses')}
623+
// </Checkbox>
624+
// {!selectAllClasses && (
625+
// <Form.Item name="targetClasses" noStyle>
626+
// <Select mode="multiple" placeholder={t('dataAnnotation.create.form.selectTargetClasses')} style={{ marginTop: 8 }}>
627+
// {COCO_CLASSES.map((cls) => (
628+
// <Option key={cls.id} value={cls.id}>
629+
// {cls.label} ({cls.name})
630+
// </Option>
631+
// ))}
632+
// </Select>
633+
// </Form.Item>
634+
// )}
635+
// </Form.Item>
636+
// </Form>
637+
// ),
638+
// },
647639
]}
648640
/>
649641
</Modal>

0 commit comments

Comments
 (0)