Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Status of Dataset does not change appropriately, when DataSet is composed of Scenes. #234

Closed
chanyoung1998 opened this issue Apr 15, 2024 · 2 comments
Assignees

Comments

@chanyoung1998
Copy link
Contributor

chanyoung1998 commented Apr 15, 2024

Hello, Basic AI Team!
I am ChanYoung, big fan of you guys and user.

I started annotating on our own datasets. It is composed of 10 Scenes, and there are 200 Single Data in the Scene.
So there are 2000 Single Data.

The problem is that when i submit annotation result of the Scene, there is no change of status of annotation works.
image

And i found the reason is that getDatasetStatisticsByDatasetIds only counts 'SINGLE_DATA' and when submit clicked, the Scene is only annotated.

    <select id="getDatasetStatisticsByDatasetIds" resultType="ai.basic.x1.adapter.port.dao.mybatis.model.DatasetStatistics">
        SELECT dataset_id AS datasetId,
               SUM(CASE `annotation_status` WHEN 'ANNOTATED' THEN 1 ELSE 0 END) AS annotatedCount,
               SUM(CASE `annotation_status` WHEN 'NOT_ANNOTATED' THEN 1 ELSE 0 END) AS notAnnotatedCount,
               SUM(CASE `annotation_status` WHEN 'INVALID' THEN 1 ELSE 0 END) AS invalidCount
        FROM data WHERE dataset_id in
        <foreach collection="datasetIds" item="datasetId" open="(" separator="," close=")">
            #{datasetId}
        </foreach> AND is_deleted = FALSE AND type = 'SINGLE_DATA'
        GROUP BY dataset_id
    </select>


 @Transactional(rollbackFor = Exception.class)
    public void submit(Long itemId) {
        var dataEdit = dataEditUseCase.checkLock(Sets.newHashSet(itemId));
        DataStatusEnum status = Optional.ofNullable(dataInfoDAO.getById(itemId)).orElseThrow().getStatus();
        DataAnnotationStatusEnum annotationStatus = DataAnnotationStatusEnum.INVALID;
        if (DataStatusEnum.VALID.equals(status)) {
            annotationStatus = DataAnnotationStatusEnum.ANNOTATED;
        }
        dataInfoDAO.updateById(DataInfo.builder().id(itemId).annotationStatus(annotationStatus).build());
        var sceneId = dataEdit.getSceneId();
        if (ObjectUtil.isNotNull(sceneId) && DataStatusEnum.INVALID.equals(status)) {
            dataInfoDAO.updateById(DataInfo.builder().id(sceneId).annotationStatus(DataAnnotationStatusEnum.INVALID).build());
        } else if (ObjectUtil.isNotNull(sceneId) &&  DataStatusEnum.VALID.equals(status)) {
            var lambdaQueryWrapper = Wrappers.lambdaQuery(DataInfo.class);
            lambdaQueryWrapper.eq(DataInfo::getDatasetId, dataEdit.getDatasetId());
            lambdaQueryWrapper.eq(DataInfo::getParentId, sceneId);
            lambdaQueryWrapper.eq(DataInfo::getStatus, DataStatusEnum.INVALID);
            if (dataInfoDAO.count() == 0) {
                dataInfoDAO.updateById(DataInfo.builder().id(sceneId).annotationStatus(DataAnnotationStatusEnum.ANNOTATED).build());
            } else {
                dataInfoDAO.updateById(DataInfo.builder().id(sceneId).annotationStatus(DataAnnotationStatusEnum.INVALID).build());
            }
       
        }
    }

Suggestion

and I carefully suggest this code.

    @Transactional(rollbackFor = Exception.class)
    public void submit(Long itemId) {
        var dataEdit = dataEditUseCase.checkLock(Sets.newHashSet(itemId));
        DataStatusEnum status = Optional.ofNullable(dataInfoDAO.getById(itemId)).orElseThrow().getStatus();
        DataAnnotationStatusEnum annotationStatus = DataAnnotationStatusEnum.INVALID;
        if (DataStatusEnum.VALID.equals(status)) {
            annotationStatus = DataAnnotationStatusEnum.ANNOTATED;
        }
        dataInfoDAO.updateById(DataInfo.builder().id(itemId).annotationStatus(annotationStatus).build());
        var sceneId = dataEdit.getSceneId();
        if (ObjectUtil.isNotNull(sceneId) && DataStatusEnum.INVALID.equals(status)) {
            dataInfoDAO.updateById(DataInfo.builder().id(sceneId).annotationStatus(DataAnnotationStatusEnum.INVALID).build());
        } else if (ObjectUtil.isNotNull(sceneId) &&  DataStatusEnum.VALID.equals(status)) {
            var lambdaQueryWrapper = Wrappers.lambdaQuery(DataInfo.class);
            lambdaQueryWrapper.eq(DataInfo::getDatasetId, dataEdit.getDatasetId());
            lambdaQueryWrapper.eq(DataInfo::getParentId, sceneId);
            lambdaQueryWrapper.eq(DataInfo::getStatus, DataStatusEnum.INVALID);
            if (dataInfoDAO.count() == 0) {
                dataInfoDAO.updateById(DataInfo.builder().id(sceneId).annotationStatus(DataAnnotationStatusEnum.ANNOTATED).build());
            } else {
                dataInfoDAO.updateById(DataInfo.builder().id(sceneId).annotationStatus(DataAnnotationStatusEnum.INVALID).build());
            }
            // When Scene is submitted, SingleData of the Scene is also annotated.
            var dataInfoLambdaUpdateWrapper = Wrappers.lambdaUpdate(DataInfo.class)
                    .eq(DataInfo::getDatasetId, dataEdit.getDatasetId())
                    .eq(DataInfo::getParentId, sceneId)
                    .eq(DataInfo::getStatus, DataStatusEnum.VALID);
            dataInfoLambdaUpdateWrapper.set(DataInfo::getAnnotationStatus, DataAnnotationStatusEnum.ANNOTATED);
            dataInfoDAO.update(dataInfoLambdaUpdateWrapper);

           var dataInfoLambdaUpdateWrapper2 = Wrappers.lambdaUpdate(DataInfo.class)
                    .eq(DataInfo::getDatasetId, dataEdit.getDatasetId())
                    .eq(DataInfo::getParentId, sceneId)
                    .eq(DataInfo::getStatus, DataStatusEnum.INVALID);
            dataInfoLambdaUpdateWrapper2.set(DataInfo::getAnnotationStatus, DataAnnotationStatusEnum.INVALID);
            dataInfoDAO.update(dataInfoLambdaUpdateWrapper2);

        }
    }

When you have some free time, Please take a look 🙇‍♂️.
And i also want to contribute xtreme1.
If you think this issue is acceptable, plz assign this issue to me.!

chanyoung1998 added a commit to chanyoung1998/xtreme1 that referenced this issue Apr 15, 2024
@chanyoung1998
Copy link
Contributor Author

I made a commit ! If you don't mind, i ask you to review that commit plz.

@jaggerwang jaggerwang assigned fanyinbo and unassigned jaggerwang Apr 17, 2024
@fanyinbo
Copy link
Collaborator

fanyinbo commented Apr 18, 2024

Thank you, I found a bit of logic error in the code. The logic of the continuous frame is that if there is a data status of INVALID in the continuous frame, the entire continuous frame is INVALID. After submission, if the continuous frame status is INVALID, it is necessary to update the data annotation status of the INVALID data in the continuous frame to INVALID, and the status of VALID to ANNOTATED. If the continuous frame status is VALID, it is necessary to update the continuous frame and all the data annotation status under the continuous frame to ANNOTATED.

    @Transactional(rollbackFor = Exception.class)
    public void submit(Long itemId) {
        var dataEdit = dataEditUseCase.checkLock(Sets.newHashSet(itemId));
        DataStatusEnum status = Optional.ofNullable(dataInfoDAO.getById(itemId)).orElseThrow().getStatus();
        DataAnnotationStatusEnum annotationStatus = DataAnnotationStatusEnum.INVALID;
        if (DataStatusEnum.VALID.equals(status)) {
            annotationStatus = DataAnnotationStatusEnum.ANNOTATED;
        }
        var sceneId = dataEdit.getSceneId();
        if (ObjectUtil.isNull(sceneId)) {
            dataInfoDAO.updateById(DataInfo.builder().id(itemId).annotationStatus(annotationStatus).build());
        }else if (ObjectUtil.isNotNull(sceneId) && DataStatusEnum.INVALID.equals(status)) {
            dataInfoDAO.updateById(DataInfo.builder().id(sceneId).annotationStatus(DataAnnotationStatusEnum.INVALID).build());
            // When Scene is submitted, SingleData of the Scene is also annotated.
            var dataInfoLambdaUpdateWrapper = Wrappers.lambdaUpdate(DataInfo.class)
                    .eq(DataInfo::getDatasetId, dataEdit.getDatasetId())
                    .eq(DataInfo::getParentId, sceneId)
                    .eq(DataInfo::getStatus, DataStatusEnum.VALID);
            dataInfoLambdaUpdateWrapper.set(DataInfo::getAnnotationStatus, DataAnnotationStatusEnum.ANNOTATED);
            dataInfoDAO.update(dataInfoLambdaUpdateWrapper);

            var dataInfoLambdaUpdateWrapper2 = Wrappers.lambdaUpdate(DataInfo.class)
                    .eq(DataInfo::getDatasetId, dataEdit.getDatasetId())
                    .eq(DataInfo::getParentId, sceneId)
                    .eq(DataInfo::getStatus, DataStatusEnum.INVALID);
            dataInfoLambdaUpdateWrapper2.set(DataInfo::getAnnotationStatus, DataAnnotationStatusEnum.INVALID);
            dataInfoDAO.update(dataInfoLambdaUpdateWrapper2);
        }else if (ObjectUtil.isNotNull(sceneId) &&  DataStatusEnum.VALID.equals(status)) {
            dataInfoDAO.updateById(DataInfo.builder().id(sceneId).annotationStatus(DataAnnotationStatusEnum.ANNOTATED).build());
            var dataInfoLambdaUpdateWrapper = Wrappers.lambdaUpdate(DataInfo.class)
                    .eq(DataInfo::getDatasetId, dataEdit.getDatasetId())
                    .eq(DataInfo::getParentId, sceneId);
            dataInfoLambdaUpdateWrapper.set(DataInfo::getAnnotationStatus, DataAnnotationStatusEnum.ANNOTATED);
            dataInfoDAO.update(dataInfoLambdaUpdateWrapper);
        }
    }

Please submit the modified Merge Request (MR), and we will merge it. Thank you for your contribution.

chanyoung1998 added a commit to chanyoung1998/xtreme1 that referenced this issue Apr 19, 2024
jaggerwang added a commit that referenced this issue Apr 19, 2024
fix : AnnotationStatus of Data not changing appropriatly when submitting
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants