From d3cf3940672dd3fa4cf1b2da5ce2fd15bb8bf0a0 Mon Sep 17 00:00:00 2001 From: Boris Sekachev Date: Mon, 17 Jul 2023 15:11:54 +0300 Subject: [PATCH 1/3] Fixed computing statistics on removed frames --- cvat-core/src/annotations-collection.ts | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/cvat-core/src/annotations-collection.ts b/cvat-core/src/annotations-collection.ts index 8755867c4e79..a32c7d9a63ff 100644 --- a/cvat-core/src/annotations-collection.ts +++ b/cvat-core/src/annotations-collection.ts @@ -664,13 +664,20 @@ export default class Collection { labels[label][track.shapeType].track++; const keyframes = Object.keys(track.shapes) .sort((a, b) => +a - +b) - .map((el) => +el); + .map((el) => +el) + .filter((frame) => !this.frameMeta.deleted_frames[frame]); let prevKeyframe = keyframes[0]; let visible = false; for (const keyframe of keyframes) { if (visible) { - const interpolated = keyframe - prevKeyframe - 1; + let removedFrames = 0; + for (let f = prevKeyframe; f < keyframe; f++) { + if (this.frameMeta.deleted_frames[f]) { + removedFrames++; + } + } + const interpolated = keyframe - prevKeyframe - 1 - removedFrames; labels[label].interpolated += interpolated; labels[label].total += interpolated; } @@ -719,13 +726,13 @@ export default class Collection { } const { name: label } = object.label; - if (objectType === 'tag') { + if (objectType === 'tag' && !this.frameMeta.deleted_frames[object.frame]) { labels[label].tag++; labels[label].manually++; labels[label].total++; } else if (objectType === 'track') { scanTrack(object); - } else { + } else if (!this.frameMeta.deleted_frames[object.frame]) { const { shapeType } = object as Shape; labels[label][shapeType].shape++; labels[label].manually++; From 1b847658086a8e6f86cd3f6af44a7ec332ced0e6 Mon Sep 17 00:00:00 2001 From: Boris Sekachev Date: Mon, 17 Jul 2023 16:28:31 +0300 Subject: [PATCH 2/3] Fixed corner case, added test --- cvat-core/src/annotations-collection.ts | 23 +++++++++++++++-------- cvat-core/tests/api/annotations.js | 22 ++++++++++++++++++++++ 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/cvat-core/src/annotations-collection.ts b/cvat-core/src/annotations-collection.ts index a32c7d9a63ff..cf6be26c2da3 100644 --- a/cvat-core/src/annotations-collection.ts +++ b/cvat-core/src/annotations-collection.ts @@ -659,6 +659,19 @@ export default class Collection { fillBody(Object.values(this.labels).filter((label) => !label.hasParent)); const scanTrack = (track, prefix = ''): void => { + const countInterpolatedFrames = (start: number, stop: number, lastIsKeyframe: boolean): number => { + let count = stop - start; + if (lastIsKeyframe) { + count -= 1; + } + for (let i = start + 1; lastIsKeyframe ? i < stop : i <= stop; i++) { + if (this.frameMeta.deleted_frames[i]) { + count--; + } + } + return count; + }; + const pref = prefix ? `${prefix}${sep}` : ''; const label = `${pref}${track.label.name}`; labels[label][track.shapeType].track++; @@ -671,13 +684,7 @@ export default class Collection { let visible = false; for (const keyframe of keyframes) { if (visible) { - let removedFrames = 0; - for (let f = prevKeyframe; f < keyframe; f++) { - if (this.frameMeta.deleted_frames[f]) { - removedFrames++; - } - } - const interpolated = keyframe - prevKeyframe - 1 - removedFrames; + const interpolated = countInterpolatedFrames(prevKeyframe, keyframe, true); labels[label].interpolated += interpolated; labels[label].total += interpolated; } @@ -699,7 +706,7 @@ export default class Collection { } if (lastKey !== this.stopFrame && !track.get(lastKey).outside) { - const interpolated = this.stopFrame - lastKey; + const interpolated = countInterpolatedFrames(lastKey, this.stopFrame, false); labels[label].interpolated += interpolated; labels[label].total += interpolated; } diff --git a/cvat-core/tests/api/annotations.js b/cvat-core/tests/api/annotations.js index 3fd6727b78a9..a8bb9ba57154 100644 --- a/cvat-core/tests/api/annotations.js +++ b/cvat-core/tests/api/annotations.js @@ -872,7 +872,29 @@ describe('Feature: get statistics', () => { expect(statistics.label[labelName].manually).toBe(2); expect(statistics.label[labelName].interpolated).toBe(3); expect(statistics.label[labelName].total).toBe(5); + }); + test('get statistics from a job with skeletons', async () => { + const job = (await window.cvat.jobs.get({ jobID: 102 }))[0]; + await job.annotations.clear(true); + let statistics = await job.annotations.statistics(); + expect(statistics.total.manually).toBe(5); + expect(statistics.total.interpolated).toBe(443); + expect(statistics.total.tag).toBe(1); + expect(statistics.total.rectangle.shape).toBe(1); + expect(statistics.total.rectangle.track).toBe(1); + await job.frames.delete(500); // track frame + await job.frames.delete(510); // rectangle shape frame + await job.frames.delete(550); // the first keyframe of a track + statistics = await job.annotations.statistics(); + expect(statistics.total.manually).toBe(2); + expect(statistics.total.tag).toBe(0); + expect(statistics.total.rectangle.shape).toBe(0); + expect(statistics.total.interpolated).toBe(394); + await job.frames.delete(650); // intermediate frame in a track + statistics = await job.annotations.statistics(); + expect(statistics.total.interpolated).toBe(393); + await job.close(); }); }); From 9346e9ea2d2dddc6190d0cebcea4b6c6d673abdc Mon Sep 17 00:00:00 2001 From: Boris Sekachev Date: Mon, 17 Jul 2023 16:30:46 +0300 Subject: [PATCH 3/3] Updated package version && changelog --- CHANGELOG.md | 2 ++ cvat-core/package.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a08bcdf77f02..34e1b5882ea7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - TDB ### Fixed +- Calculating number of objects on annotation view when frames are deleted + () - \[SDK\] Ability to create attributes with blank default values () - \[SDK\] SDK should not change input data in models () diff --git a/cvat-core/package.json b/cvat-core/package.json index b35b9122a9f0..5aca1d1ab763 100644 --- a/cvat-core/package.json +++ b/cvat-core/package.json @@ -1,6 +1,6 @@ { "name": "cvat-core", - "version": "9.2.0", + "version": "9.2.1", "description": "Part of Computer Vision Tool which presents an interface for client-side integration", "main": "src/api.ts", "scripts": {