@searpent/react-image-annotate 2.0.0 → 2.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Annotator/index.js +169 -0
- package/Annotator/reducers/combine-reducers.js +14 -0
- package/Annotator/reducers/convert-expanding-line-to-polygon.js +73 -0
- package/{src/Annotator → Annotator}/reducers/fix-twisted.js +3 -5
- package/Annotator/reducers/general-reducer.js +1058 -0
- package/Annotator/reducers/get-active-image.js +27 -0
- package/Annotator/reducers/get-implied-video-regions.js +180 -0
- package/Annotator/reducers/history-handler.js +38 -0
- package/Annotator/reducers/image-reducer.js +20 -0
- package/Annotator/reducers/video-reducer.js +88 -0
- package/ClassSelectionMenu/index.js +135 -0
- package/Crosshairs/index.js +53 -0
- package/DebugSidebarBox/index.js +20 -0
- package/DemoSite/Editor.js +194 -0
- package/DemoSite/ErrorBoundaryDialog.js +64 -0
- package/DemoSite/index.js +40 -0
- package/FullImageSegmentationAnnotator/index.js +7 -0
- package/GroupSelectorSidebarBox/index.js +63 -0
- package/HighlightBox/index.js +99 -0
- package/HistorySidebarBox/index.js +71 -0
- package/ImageCanvas/index.js +424 -0
- package/ImageCanvas/region-tools.js +165 -0
- package/{src/ImageCanvas → ImageCanvas}/styles.js +12 -8
- package/ImageCanvas/use-mouse.js +180 -0
- package/ImageCanvas/use-project-box.js +27 -0
- package/ImageCanvas/use-wasd-mode.js +62 -0
- package/ImageMask/index.js +133 -0
- package/ImageMask/load-image.js +25 -0
- package/ImageSelectorSidebarBox/index.js +60 -0
- package/KeyframeTimeline/get-time-string.js +27 -0
- package/KeyframeTimeline/index.js +233 -0
- package/KeyframesSelectorSidebarBox/index.js +93 -0
- package/LandingPage/index.js +159 -0
- package/MainLayout/icon-dictionary.js +104 -0
- package/MainLayout/index.js +366 -0
- package/{src/MainLayout → MainLayout}/styles.js +6 -7
- package/MainLayout/types.js +0 -0
- package/MainLayout/use-implied-video-regions.js +13 -0
- package/PointDistances/index.js +73 -0
- package/PreventScrollToParents/index.js +51 -0
- package/RegionLabel/index.js +191 -0
- package/{src/RegionLabel → RegionLabel}/styles.js +12 -15
- package/RegionSelectAndTransformBoxes/index.js +167 -0
- package/RegionSelectorSidebarBox/index.js +248 -0
- package/{src/RegionSelectorSidebarBox → RegionSelectorSidebarBox}/styles.js +13 -14
- package/RegionShapes/index.js +274 -0
- package/RegionTags/index.js +138 -0
- package/SettingsDialog/index.js +52 -0
- package/SettingsProvider/index.js +53 -0
- package/Shortcuts/ShortcutField.js +46 -0
- package/Shortcuts/index.js +133 -0
- package/ShortcutsManager/index.js +155 -0
- package/Sidebar/index.js +69 -0
- package/SidebarBoxContainer/index.js +93 -0
- package/SmallToolButton/index.js +42 -0
- package/TagsSidebarBox/index.js +105 -0
- package/TaskDescriptionSidebarBox/index.js +58 -0
- package/Theme/index.js +30 -0
- package/VideoOrImageCanvasBackground/index.js +151 -0
- package/colors.js +14 -0
- package/hooks/use-event-callback.js +10 -0
- package/hooks/use-exclude-pattern.js +24 -0
- package/hooks/use-load-image.js +26 -0
- package/hooks/use-window-size.js +46 -0
- package/{src/hooks → hooks}/xpattern.js +1 -1
- package/index.js +3 -0
- package/lib.js +3 -0
- package/package.json +1 -1
- package/stories.js +5 -0
- package/utils/get-from-local-storage.js +7 -0
- package/utils/get-hotkey-help-text.js +9 -0
- package/utils/get-landmarks-with-transform.js +40 -0
- package/utils/set-in-local-storage.js +3 -0
- package/.babelrc +0 -6
- package/.env +0 -1
- package/.flowconfig +0 -2
- package/.github/workflows/release-on-master.yml +0 -32
- package/.github/workflows/test.yml +0 -16
- package/.prettierrc +0 -3
- package/.releaserc.js +0 -18
- package/.storybook/addons.js +0 -2
- package/.storybook/config.js +0 -16
- package/LICENSE +0 -21
- package/public/favicon.ico +0 -0
- package/public/index.html +0 -38
- package/src/Annotator/bike-pic.png +0 -0
- package/src/Annotator/bike-pic2.png +0 -0
- package/src/Annotator/dab-keyframes.story.json +0 -1
- package/src/Annotator/index.js +0 -206
- package/src/Annotator/index.story.js +0 -727
- package/src/Annotator/poses.story.js +0 -150
- package/src/Annotator/reducers/combine-reducers.js +0 -7
- package/src/Annotator/reducers/convert-expanding-line-to-polygon.js +0 -53
- package/src/Annotator/reducers/general-reducer.js +0 -914
- package/src/Annotator/reducers/get-active-image.js +0 -21
- package/src/Annotator/reducers/get-implied-video-regions.js +0 -115
- package/src/Annotator/reducers/history-handler.js +0 -60
- package/src/Annotator/reducers/image-reducer.js +0 -23
- package/src/Annotator/reducers/video-reducer.js +0 -85
- package/src/Annotator/video.story.js +0 -51
- package/src/ClassSelectionMenu/index.js +0 -108
- package/src/Crosshairs/index.js +0 -64
- package/src/DebugSidebarBox/index.js +0 -36
- package/src/DemoSite/Editor.js +0 -235
- package/src/DemoSite/ErrorBoundaryDialog.js +0 -34
- package/src/DemoSite/index.js +0 -41
- package/src/DemoSite/index.story.js +0 -10
- package/src/DemoSite/simple-segmentation-example.json +0 -572
- package/src/FullImageSegmentationAnnotator/hard1.story.jpg +0 -0
- package/src/FullImageSegmentationAnnotator/hard2.story.jpg +0 -0
- package/src/FullImageSegmentationAnnotator/hard3.story.jpg +0 -0
- package/src/FullImageSegmentationAnnotator/index.js +0 -7
- package/src/FullImageSegmentationAnnotator/index.story.js +0 -177
- package/src/FullImageSegmentationAnnotator/orange.story.png +0 -0
- package/src/HighlightBox/index.js +0 -143
- package/src/HistorySidebarBox/index.js +0 -78
- package/src/ImageCanvas/dancing-man.story.jpg +0 -0
- package/src/ImageCanvas/index.js +0 -488
- package/src/ImageCanvas/index.story.js +0 -214
- package/src/ImageCanvas/mouse_mask.story.png +0 -0
- package/src/ImageCanvas/region-tools.js +0 -171
- package/src/ImageCanvas/seves_desk.story.jpg +0 -0
- package/src/ImageCanvas/use-mouse.js +0 -168
- package/src/ImageCanvas/use-project-box.js +0 -23
- package/src/ImageCanvas/use-wasd-mode.js +0 -50
- package/src/ImageMask/index.js +0 -127
- package/src/ImageMask/load-image.js +0 -32
- package/src/ImageSelectorSidebarBox/index.js +0 -54
- package/src/KeyframeTimeline/get-time-string.js +0 -25
- package/src/KeyframeTimeline/index.js +0 -223
- package/src/KeyframesSelectorSidebarBox/index.js +0 -93
- package/src/LandingPage/content.md +0 -57
- package/src/LandingPage/github-markdown.css +0 -964
- package/src/LandingPage/index.js +0 -147
- package/src/MainLayout/icon-dictionary.js +0 -79
- package/src/MainLayout/index.js +0 -420
- package/src/MainLayout/index.story.js +0 -240
- package/src/MainLayout/types.js +0 -156
- package/src/MainLayout/use-implied-video-regions.js +0 -17
- package/src/PointDistances/index.js +0 -90
- package/src/PreventScrollToParents/index.js +0 -48
- package/src/PreventScrollToParents/index.story.js +0 -23
- package/src/RegionLabel/index.js +0 -201
- package/src/RegionSelectAndTransformBoxes/index.js +0 -234
- package/src/RegionSelectorSidebarBox/index.js +0 -216
- package/src/RegionShapes/index.js +0 -236
- package/src/RegionTags/index.js +0 -130
- package/src/SettingsDialog/index.js +0 -58
- package/src/SettingsProvider/index.js +0 -44
- package/src/Shortcuts/ShortcutField.js +0 -44
- package/src/Shortcuts/index.js +0 -129
- package/src/ShortcutsManager/index.js +0 -162
- package/src/Sidebar/index.js +0 -117
- package/src/SidebarBoxContainer/index.js +0 -93
- package/src/SmallToolButton/index.js +0 -57
- package/src/TagsSidebarBox/index.js +0 -93
- package/src/TaskDescriptionSidebarBox/index.js +0 -43
- package/src/Theme/index.js +0 -36
- package/src/VideoOrImageCanvasBackground/index.js +0 -170
- package/src/colors.js +0 -32
- package/src/hooks/use-event-callback.js +0 -11
- package/src/hooks/use-exclude-pattern.js +0 -27
- package/src/hooks/use-load-image.js +0 -21
- package/src/hooks/use-window-size.js +0 -46
- package/src/hooks/xpattern.png +0 -0
- package/src/index.js +0 -18
- package/src/lib.js +0 -7
- package/src/screenshot.png +0 -0
- package/src/site.css +0 -5
- package/src/stories.js +0 -2
- package/src/utils/get-from-local-storage.js +0 -7
- package/src/utils/get-hotkey-help-text.js +0 -11
- package/src/utils/get-landmarks-with-transform.js +0 -23
- package/src/utils/set-in-local-storage.js +0 -6
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
2
|
+
import React, { useRef, useEffect, useMemo, useState } from "react";
|
|
3
|
+
import { styled } from "@mui/material/styles";
|
|
4
|
+
import { createTheme, ThemeProvider } from "@mui/material/styles";
|
|
5
|
+
import useEventCallback from "use-event-callback";
|
|
6
|
+
import { useSettings } from "../SettingsProvider";
|
|
7
|
+
var theme = createTheme();
|
|
8
|
+
var Video = styled("video")(function (_ref) {
|
|
9
|
+
var theme = _ref.theme;
|
|
10
|
+
return {
|
|
11
|
+
zIndex: 0,
|
|
12
|
+
position: "absolute"
|
|
13
|
+
};
|
|
14
|
+
});
|
|
15
|
+
var StyledImage = styled("img")(function (_ref2) {
|
|
16
|
+
var theme = _ref2.theme;
|
|
17
|
+
return {
|
|
18
|
+
zIndex: 0,
|
|
19
|
+
position: "absolute"
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
var Error = styled("div")(function (_ref3) {
|
|
23
|
+
var theme = _ref3.theme;
|
|
24
|
+
return {
|
|
25
|
+
zIndex: 0,
|
|
26
|
+
position: "absolute",
|
|
27
|
+
left: 0,
|
|
28
|
+
right: 0,
|
|
29
|
+
bottom: 0,
|
|
30
|
+
top: 0,
|
|
31
|
+
backgroundColor: "rgba(255,0,0,0.2)",
|
|
32
|
+
color: "#ff0000",
|
|
33
|
+
fontWeight: "bold",
|
|
34
|
+
whiteSpace: "pre-wrap",
|
|
35
|
+
padding: 50
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
|
+
export default (function (_ref4) {
|
|
39
|
+
var imagePosition = _ref4.imagePosition,
|
|
40
|
+
mouseEvents = _ref4.mouseEvents,
|
|
41
|
+
videoTime = _ref4.videoTime,
|
|
42
|
+
videoSrc = _ref4.videoSrc,
|
|
43
|
+
imageSrc = _ref4.imageSrc,
|
|
44
|
+
onLoad = _ref4.onLoad,
|
|
45
|
+
_ref4$useCrossOrigin = _ref4.useCrossOrigin,
|
|
46
|
+
useCrossOrigin = _ref4$useCrossOrigin === void 0 ? false : _ref4$useCrossOrigin,
|
|
47
|
+
videoPlaying = _ref4.videoPlaying,
|
|
48
|
+
onChangeVideoTime = _ref4.onChangeVideoTime,
|
|
49
|
+
onChangeVideoPlaying = _ref4.onChangeVideoPlaying;
|
|
50
|
+
var settings = useSettings();
|
|
51
|
+
var videoRef = useRef();
|
|
52
|
+
var imageRef = useRef();
|
|
53
|
+
|
|
54
|
+
var _useState = useState(),
|
|
55
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
56
|
+
error = _useState2[0],
|
|
57
|
+
setError = _useState2[1];
|
|
58
|
+
|
|
59
|
+
useEffect(function () {
|
|
60
|
+
if (!videoPlaying && videoRef.current) {
|
|
61
|
+
videoRef.current.currentTime = (videoTime || 0) / 1000;
|
|
62
|
+
}
|
|
63
|
+
}, [videoTime]);
|
|
64
|
+
useEffect(function () {
|
|
65
|
+
var renderLoopRunning = false;
|
|
66
|
+
|
|
67
|
+
if (videoRef.current) {
|
|
68
|
+
if (videoPlaying) {
|
|
69
|
+
videoRef.current.play();
|
|
70
|
+
renderLoopRunning = true;
|
|
71
|
+
|
|
72
|
+
if (settings.videoPlaybackSpeed) {
|
|
73
|
+
videoRef.current.playbackRate = parseFloat(settings.videoPlaybackSpeed);
|
|
74
|
+
}
|
|
75
|
+
} else {
|
|
76
|
+
videoRef.current.pause();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function checkForNewFrame() {
|
|
81
|
+
if (!renderLoopRunning) return;
|
|
82
|
+
if (!videoRef.current) return;
|
|
83
|
+
var newVideoTime = Math.floor(videoRef.current.currentTime * 1000);
|
|
84
|
+
|
|
85
|
+
if (videoTime !== newVideoTime) {
|
|
86
|
+
onChangeVideoTime(newVideoTime);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (videoRef.current.paused) {
|
|
90
|
+
renderLoopRunning = false;
|
|
91
|
+
onChangeVideoPlaying(false);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
requestAnimationFrame(checkForNewFrame);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
checkForNewFrame();
|
|
98
|
+
return function () {
|
|
99
|
+
renderLoopRunning = false;
|
|
100
|
+
};
|
|
101
|
+
}, [videoPlaying]);
|
|
102
|
+
var onLoadedVideoMetadata = useEventCallback(function (event) {
|
|
103
|
+
var videoElm = event.currentTarget;
|
|
104
|
+
videoElm.currentTime = (videoTime || 0) / 1000;
|
|
105
|
+
if (onLoad) onLoad({
|
|
106
|
+
naturalWidth: videoElm.videoWidth,
|
|
107
|
+
naturalHeight: videoElm.videoHeight,
|
|
108
|
+
videoElm: videoElm,
|
|
109
|
+
duration: videoElm.duration
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
var onImageLoaded = useEventCallback(function (event) {
|
|
113
|
+
var imageElm = event.currentTarget;
|
|
114
|
+
if (onLoad) onLoad({
|
|
115
|
+
naturalWidth: imageElm.naturalWidth,
|
|
116
|
+
naturalHeight: imageElm.naturalHeight,
|
|
117
|
+
imageElm: imageElm
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
var onImageError = useEventCallback(function (event) {
|
|
121
|
+
setError("Could not load image\n\nMake sure your image works by visiting ".concat(imageSrc || videoSrc, " in a web browser. If that URL works, the server hosting the URL may be not allowing you to access the image from your current domain. Adjust server settings to enable the image to be viewed.").concat(!useCrossOrigin ? "" : "\n\nYour image may be blocked because it's not being sent with CORs headers. To do pixel segmentation, browser web security requires CORs headers in order for the algorithm to read the pixel data from the image. CORs headers are easy to add if you're using an S3 bucket or own the server hosting your images.", "\n\n If you need a hand, reach out to the community at universaldatatool.slack.com"));
|
|
122
|
+
});
|
|
123
|
+
var stylePosition = useMemo(function () {
|
|
124
|
+
var width = imagePosition.bottomRight.x - imagePosition.topLeft.x;
|
|
125
|
+
var height = imagePosition.bottomRight.y - imagePosition.topLeft.y;
|
|
126
|
+
return {
|
|
127
|
+
imageRendering: "pixelated",
|
|
128
|
+
left: imagePosition.topLeft.x,
|
|
129
|
+
top: imagePosition.topLeft.y,
|
|
130
|
+
width: isNaN(width) ? 0 : width,
|
|
131
|
+
height: isNaN(height) ? 0 : height
|
|
132
|
+
};
|
|
133
|
+
}, [imagePosition.topLeft.x, imagePosition.topLeft.y, imagePosition.bottomRight.x, imagePosition.bottomRight.y]);
|
|
134
|
+
if (!videoSrc && !imageSrc) return React.createElement(Error, null, "No imageSrc or videoSrc provided");
|
|
135
|
+
if (error) return React.createElement(Error, null, error);
|
|
136
|
+
return React.createElement(ThemeProvider, {
|
|
137
|
+
theme: theme
|
|
138
|
+
}, imageSrc && videoTime === undefined ? React.createElement(StyledImage, Object.assign({}, mouseEvents, {
|
|
139
|
+
src: imageSrc,
|
|
140
|
+
ref: imageRef,
|
|
141
|
+
style: stylePosition,
|
|
142
|
+
onLoad: onImageLoaded,
|
|
143
|
+
onError: onImageError,
|
|
144
|
+
crossOrigin: useCrossOrigin ? "anonymous" : undefined
|
|
145
|
+
})) : React.createElement(Video, Object.assign({}, mouseEvents, {
|
|
146
|
+
ref: videoRef,
|
|
147
|
+
style: stylePosition,
|
|
148
|
+
onLoadedMetadata: onLoadedVideoMetadata,
|
|
149
|
+
src: videoSrc || imageSrc
|
|
150
|
+
})));
|
|
151
|
+
});
|
package/colors.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as muiColors from "@mui/material/colors";
|
|
2
|
+
export var colors = [muiColors.red[500], muiColors.blue[500], muiColors.green[500], muiColors.orange[800], muiColors.brown[500], muiColors.lightGreen[700], muiColors.pink[500], muiColors.purple[500], muiColors.indigo[500], muiColors.teal[500], muiColors.lime[500], muiColors.blueGrey[500]];
|
|
3
|
+
var transparency = 0x88000000;
|
|
4
|
+
|
|
5
|
+
function reverseParseColor(rrggbb) {
|
|
6
|
+
rrggbb = rrggbb.replace("#", "");
|
|
7
|
+
var bbggrr = rrggbb.substr(4, 2) + rrggbb.substr(2, 2) + rrggbb.substr(0, 2);
|
|
8
|
+
return parseInt(bbggrr, 16);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export var colorInts = colors.map(function (c) {
|
|
12
|
+
return (reverseParseColor(c) | transparency) >>> 0;
|
|
13
|
+
});
|
|
14
|
+
export default colors;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { useRef, useCallback, useLayoutEffect, useEffect } from "react";
|
|
2
|
+
export default (function (fn) {
|
|
3
|
+
var ref = useRef();
|
|
4
|
+
useLayoutEffect(function () {
|
|
5
|
+
ref.current = fn;
|
|
6
|
+
});
|
|
7
|
+
return useCallback(function () {
|
|
8
|
+
return (0, ref.current).apply(void 0, arguments);
|
|
9
|
+
}, []);
|
|
10
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { useRef } from "react";
|
|
2
|
+
import excludePatternSrc from "./xpattern.js";
|
|
3
|
+
export default (function () {
|
|
4
|
+
var excludePattern = useRef(null);
|
|
5
|
+
|
|
6
|
+
if (excludePattern.current === null) {
|
|
7
|
+
excludePattern.current = {
|
|
8
|
+
image: new Image(),
|
|
9
|
+
pattern: null
|
|
10
|
+
};
|
|
11
|
+
var canvas = document.createElement("canvas");
|
|
12
|
+
canvas.width = 100;
|
|
13
|
+
canvas.height = 100;
|
|
14
|
+
var context = canvas.getContext("2d");
|
|
15
|
+
|
|
16
|
+
excludePattern.current.image.onload = function () {
|
|
17
|
+
excludePattern.current.pattern = context.createPattern(excludePattern.current.image, "repeat");
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
excludePattern.current.image.src = excludePatternSrc;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return excludePattern.current.pattern;
|
|
24
|
+
});
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
2
|
+
import { useRef, useState } from "react";
|
|
3
|
+
export default (function (imageSrc, onImageLoaded) {
|
|
4
|
+
var _useState = useState(false),
|
|
5
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
6
|
+
imageLoaded = _useState2[0],
|
|
7
|
+
changeImageLoaded = _useState2[1];
|
|
8
|
+
|
|
9
|
+
var image = useRef(null);
|
|
10
|
+
|
|
11
|
+
if (image.current === null) {
|
|
12
|
+
image.current = new Image();
|
|
13
|
+
|
|
14
|
+
image.current.onload = function () {
|
|
15
|
+
changeImageLoaded(true);
|
|
16
|
+
if (onImageLoaded) onImageLoaded({
|
|
17
|
+
width: image.current.naturalWidth,
|
|
18
|
+
height: image.current.naturalHeight
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
image.current.src = imageSrc;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return [image.current, imageLoaded];
|
|
26
|
+
});
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
2
|
+
import { useEffect } from "react";
|
|
3
|
+
import { useRafState, useInterval } from "react-use";
|
|
4
|
+
|
|
5
|
+
var useWindowSize = function useWindowSize() {
|
|
6
|
+
var initialWidth = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Infinity;
|
|
7
|
+
var initialHeight = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Infinity;
|
|
8
|
+
var isClient = typeof window !== "undefined";
|
|
9
|
+
|
|
10
|
+
var _useRafState = useRafState({
|
|
11
|
+
width: isClient ? window.innerWidth : initialWidth,
|
|
12
|
+
height: isClient ? window.innerHeight : initialHeight
|
|
13
|
+
}),
|
|
14
|
+
_useRafState2 = _slicedToArray(_useRafState, 2),
|
|
15
|
+
state = _useRafState2[0],
|
|
16
|
+
setState = _useRafState2[1];
|
|
17
|
+
|
|
18
|
+
useEffect(function () {
|
|
19
|
+
if (!isClient) return;
|
|
20
|
+
|
|
21
|
+
var handler = function handler() {
|
|
22
|
+
setState({
|
|
23
|
+
width: window.innerWidth,
|
|
24
|
+
height: window.innerHeight
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
window.addEventListener("resize", handler);
|
|
29
|
+
return function () {
|
|
30
|
+
window.removeEventListener("resize", handler);
|
|
31
|
+
};
|
|
32
|
+
}, []);
|
|
33
|
+
useInterval(function () {
|
|
34
|
+
if (!isClient) return;
|
|
35
|
+
|
|
36
|
+
if (window.innerWidth !== state.width || window.innerHeight !== state.height) {
|
|
37
|
+
setState({
|
|
38
|
+
width: window.innerWidth,
|
|
39
|
+
height: window.innerHeight
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}, 100);
|
|
43
|
+
return state;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export default useWindowSize;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export default
|
|
1
|
+
export default "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH4wMSAxY5oG+lzgAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAAcSURBVAjXY/jPwPCfAQnA+TAGugLcAhhakRUAAK3lEe8m9qZhAAAAAElFTkSuQmCC";
|
package/index.js
ADDED
package/lib.js
ADDED
package/package.json
CHANGED
package/stories.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { getApplicationKeyMap } from "react-hotkeys";
|
|
2
|
+
export var getHotkeyHelpText = function getHotkeyHelpText(commandName) {
|
|
3
|
+
var _getApplicationKeyMap, _getApplicationKeyMap2, _getApplicationKeyMap3;
|
|
4
|
+
|
|
5
|
+
var firstSequence = (_getApplicationKeyMap = getApplicationKeyMap()[commandName]) === null || _getApplicationKeyMap === void 0 ? void 0 : (_getApplicationKeyMap2 = _getApplicationKeyMap.sequences) === null || _getApplicationKeyMap2 === void 0 ? void 0 : (_getApplicationKeyMap3 = _getApplicationKeyMap2[0]) === null || _getApplicationKeyMap3 === void 0 ? void 0 : _getApplicationKeyMap3.sequence;
|
|
6
|
+
if (!firstSequence) return "";
|
|
7
|
+
return " (".concat(firstSequence, ")");
|
|
8
|
+
};
|
|
9
|
+
export default getHotkeyHelpText;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
2
|
+
export default (function (_ref) {
|
|
3
|
+
var center = _ref.center,
|
|
4
|
+
scale = _ref.scale,
|
|
5
|
+
landmarks = _ref.landmarks;
|
|
6
|
+
var points = {};
|
|
7
|
+
var _iteratorNormalCompletion = true;
|
|
8
|
+
var _didIteratorError = false;
|
|
9
|
+
var _iteratorError = undefined;
|
|
10
|
+
|
|
11
|
+
try {
|
|
12
|
+
for (var _iterator = Object.entries(landmarks)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
13
|
+
var _ref4 = _step.value;
|
|
14
|
+
|
|
15
|
+
var _ref3 = _slicedToArray(_ref4, 2);
|
|
16
|
+
|
|
17
|
+
var keypointId = _ref3[0];
|
|
18
|
+
var defaultPosition = _ref3[1].defaultPosition;
|
|
19
|
+
points[keypointId] = {
|
|
20
|
+
x: defaultPosition[0] * scale + center.x,
|
|
21
|
+
y: defaultPosition[1] * scale + center.y
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
} catch (err) {
|
|
25
|
+
_didIteratorError = true;
|
|
26
|
+
_iteratorError = err;
|
|
27
|
+
} finally {
|
|
28
|
+
try {
|
|
29
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
30
|
+
_iterator.return();
|
|
31
|
+
}
|
|
32
|
+
} finally {
|
|
33
|
+
if (_didIteratorError) {
|
|
34
|
+
throw _iteratorError;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return points;
|
|
40
|
+
});
|
package/.babelrc
DELETED
package/.env
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
SKIP_PREFLIGHT_CHECK=true
|
package/.flowconfig
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
name: Release
|
|
2
|
-
on:
|
|
3
|
-
push:
|
|
4
|
-
branches:
|
|
5
|
-
- master
|
|
6
|
-
jobs:
|
|
7
|
-
release:
|
|
8
|
-
if: "!contains(github.event.head_commit.message, 'skip ci')"
|
|
9
|
-
name: Release
|
|
10
|
-
runs-on: ubuntu-18.04
|
|
11
|
-
steps:
|
|
12
|
-
- name: Checkout
|
|
13
|
-
uses: actions/checkout@v1
|
|
14
|
-
- name: Setup Node.js
|
|
15
|
-
uses: actions/setup-node@v1
|
|
16
|
-
with:
|
|
17
|
-
node-version: 12
|
|
18
|
-
- name: Install dependencies
|
|
19
|
-
run: npm install
|
|
20
|
-
- name: Build Package
|
|
21
|
-
run: npm run build
|
|
22
|
-
- name: Release
|
|
23
|
-
env:
|
|
24
|
-
GITHUB_TOKEN: ${{ secrets.RELEASE_GITHUB_TOKEN }}
|
|
25
|
-
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
26
|
-
run: npx semantic-release
|
|
27
|
-
- name: Publish github pages
|
|
28
|
-
run: |
|
|
29
|
-
git remote set-url origin https://git:${GITHUB_TOKEN}@github.com/waoai/react-image-annotate.git
|
|
30
|
-
npm run gh-pages -- -u "github-actions-bot <support+actions@github.com>"
|
|
31
|
-
env:
|
|
32
|
-
GITHUB_TOKEN: ${{ secrets.RELEASE_GITHUB_TOKEN }}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
name: Test
|
|
2
|
-
on: ["push", "pull_request"]
|
|
3
|
-
jobs:
|
|
4
|
-
test:
|
|
5
|
-
if: "!contains(github.event.head_commit.message, 'skip ci')"
|
|
6
|
-
name: Test
|
|
7
|
-
runs-on: ubuntu-18.04
|
|
8
|
-
steps:
|
|
9
|
-
- name: Checkout
|
|
10
|
-
uses: actions/checkout@v1
|
|
11
|
-
- name: Setup Node.js
|
|
12
|
-
uses: actions/setup-node@v1
|
|
13
|
-
with:
|
|
14
|
-
node-version: 12
|
|
15
|
-
- name: Run Prettier Test
|
|
16
|
-
run: npx prettier --check "src/**/*.js"
|
package/.prettierrc
DELETED
package/.releaserc.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
module.exports = {
|
|
2
|
-
branch: "master",
|
|
3
|
-
plugins: [
|
|
4
|
-
"@semantic-release/commit-analyzer",
|
|
5
|
-
"@semantic-release/release-notes-generator",
|
|
6
|
-
["@semantic-release/npm", { npmPublish: false }],
|
|
7
|
-
["@semantic-release/npm", { npmPublish: true, pkgRoot: "dist" }],
|
|
8
|
-
"@semantic-release/github",
|
|
9
|
-
[
|
|
10
|
-
"@semantic-release/git",
|
|
11
|
-
{
|
|
12
|
-
assets: ["package.json"],
|
|
13
|
-
message:
|
|
14
|
-
"chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}",
|
|
15
|
-
},
|
|
16
|
-
],
|
|
17
|
-
],
|
|
18
|
-
}
|
package/.storybook/addons.js
DELETED
package/.storybook/config.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
|
|
3
|
-
import React from "react"
|
|
4
|
-
import Theme from "../src/Theme"
|
|
5
|
-
import { configure, addDecorator } from "@storybook/react"
|
|
6
|
-
import { action } from "@storybook/addon-actions"
|
|
7
|
-
import SettingsProvider from "../src/SettingsProvider"
|
|
8
|
-
|
|
9
|
-
addDecorator(storyFn => <Theme>{storyFn()}</Theme>)
|
|
10
|
-
// addDecorator(storyFn => <SettingsProvider>{storyFn()}</SettingsProvider>)
|
|
11
|
-
|
|
12
|
-
function loadStories() {
|
|
13
|
-
require("../src/stories")
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
configure(loadStories, module)
|
package/LICENSE
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2019 WorkAround Online Inc.
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
package/public/favicon.ico
DELETED
|
Binary file
|
package/public/index.html
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="utf-8">
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
|
6
|
-
<meta name="theme-color" content="#000000">
|
|
7
|
-
<!--
|
|
8
|
-
manifest.json provides metadata used when your web app is added to the
|
|
9
|
-
homescreen on Android. See https://developers.google.com/web/fundamentals/engage-and-retain/web-app-manifest/
|
|
10
|
-
-->
|
|
11
|
-
<!--
|
|
12
|
-
Notice the use of %PUBLIC_URL% in the tags above.
|
|
13
|
-
It will be replaced with the URL of the `public` folder during the build.
|
|
14
|
-
Only files inside the `public` folder can be referenced from the HTML.
|
|
15
|
-
|
|
16
|
-
Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
|
|
17
|
-
work correctly both with client-side routing and a non-root public URL.
|
|
18
|
-
Learn how to configure a non-root public URL by running `npm run build`.
|
|
19
|
-
-->
|
|
20
|
-
<title>React Image Annotation</title>
|
|
21
|
-
</head>
|
|
22
|
-
<body>
|
|
23
|
-
<noscript>
|
|
24
|
-
You need to enable JavaScript to run this app.
|
|
25
|
-
</noscript>
|
|
26
|
-
<div id="root"></div>
|
|
27
|
-
<!--
|
|
28
|
-
This HTML file is a template.
|
|
29
|
-
If you open it directly in the browser, you will see an empty page.
|
|
30
|
-
|
|
31
|
-
You can add webfonts, meta tags, or analytics to this file.
|
|
32
|
-
The build step will place the bundled scripts into the <body> tag.
|
|
33
|
-
|
|
34
|
-
To begin the development, run `npm start` or `yarn start`.
|
|
35
|
-
To create a production bundle, use `npm run build` or `yarn build`.
|
|
36
|
-
-->
|
|
37
|
-
</body>
|
|
38
|
-
</html>
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"0":{"regions":[{"type":"keypoints","keypointsDefinitionId":"human","points":{"head":{"x":0.4746317908870222,"y":0.17626206226677932},"sternum":{"x":0.49229824456114357,"y":0.2736238514041595},"leftShoulder":{"x":0.4540209282672138,"y":0.2893273657811563},"leftHand":{"x":0.4487209921649774,"y":0.2694362475702937},"rightShoulder":{"x":0.5370532605355844,"y":0.27885835619649174},"leftElbow":{"x":0.41397696660587197,"y":0.3699387395830733},"rightElbow":{"x":0.5906415033470862,"y":0.364704234790741},"rightHand":{"x":0.6542407365739231,"y":0.4002988673786005}},"highlighted":true,"editingLabels":false,"id":"9442418802498487"}]},"479":{"regions":[{"type":"keypoints","keypointsDefinitionId":"human","points":{"head":{"x":0.4673470463145521,"y":0.19100168229192332},"sternum":{"x":0.49229824456114357,"y":0.2736238514041595},"leftShoulder":{"x":0.45402092826721374,"y":0.2893273657811563},"leftHand":{"x":0.4404478609960767,"y":0.3051551630931666},"rightShoulder":{"x":0.5370532605355844,"y":0.27885835619649174},"leftElbow":{"x":0.4328309749571659,"y":0.4222888613021013},"rightElbow":{"x":0.5874898343303621,"y":0.3913183287097443},"rightHand":{"x":0.6415204525487472,"y":0.44683362315624264}},"highlighted":true,"editingLabels":false,"id":"9442418802498487"}]},"716":{"regions":[{"type":"keypoints","keypointsDefinitionId":"human","points":{"head":{"x":0.4746317908870222,"y":0.17626206226677932},"sternum":{"x":0.49229824456114357,"y":0.2736238514041595},"leftShoulder":{"x":0.4540209282672138,"y":0.2893273657811563},"leftHand":{"x":0.4363544745930924,"y":0.3228281964520828},"rightShoulder":{"x":0.5370532605355844,"y":0.27885835619649174},"leftElbow":{"x":0.4251657205994822,"y":0.4170492827140638},"rightElbow":{"x":0.585930449033987,"y":0.4044864712124663},"rightHand":{"x":0.6389298100563513,"y":0.4411280047587922}},"highlighted":true,"editingLabels":false,"id":"9442418802498487"}]},"1095":{"regions":[{"type":"keypoints","keypointsDefinitionId":"human","points":{"head":{"x":0.4746317908870221,"y":0.17626206226677932},"sternum":{"x":0.49229824456114357,"y":0.2736238514041595},"leftShoulder":{"x":0.45402092826721374,"y":0.2893273657811563},"leftHand":{"x":0.44737492639237225,"y":0.476382614412626},"rightShoulder":{"x":0.5370532605355844,"y":0.27885835619649174},"leftElbow":{"x":0.4251657205994822,"y":0.4170492827140638},"rightElbow":{"x":0.5655850955624976,"y":0.42795303711459537},"rightHand":{"x":0.5894808372714573,"y":0.5232999966249137}},"highlighted":true,"editingLabels":false,"id":"9442418802498487"}]},"1118":{"regions":[{"type":"keypoints","keypointsDefinitionId":"human","points":{"head":{"x":0.4976149858125678,"y":0.17778527206277028},"sternum":{"x":0.49229824456114357,"y":0.2736238514041595},"leftShoulder":{"x":0.45402092826721374,"y":0.2893273657811563},"leftHand":{"x":0.4455200023009997,"y":0.4826821239054704},"rightShoulder":{"x":0.5370532605355844,"y":0.27885835619649174},"leftElbow":{"x":0.42592776068568866,"y":0.42512094920834825},"rightElbow":{"x":0.5672683442310021,"y":0.42601155864067825},"rightHand":{"x":0.5935719393363946,"y":0.5165015944201626}},"highlighted":true,"editingLabels":true,"id":"9442418802498487"}]},"1368":{"regions":[{"type":"keypoints","keypointsDefinitionId":"human","points":{"head":{"x":0.5017798209688135,"y":0.17963630990999058},"sternum":{"x":0.49229824456114357,"y":0.2736238514041595},"leftShoulder":{"x":0.45402092826721374,"y":0.28932736578115625},"leftHand":{"x":0.48879738488820257,"y":0.356707045987093},"rightShoulder":{"x":0.5370532605355843,"y":0.27885835619649174},"leftElbow":{"x":0.4251806625619568,"y":0.4172075506845399},"rightElbow":{"x":0.564526723209169,"y":0.4061013580655783},"rightHand":{"x":0.5498343845048111,"y":0.4866834521414889}},"highlighted":true,"editingLabels":true,"id":"9442418802498487"}]},"1373":{"regions":[{"type":"keypoints","keypointsDefinitionId":"human","points":{"head":{"x":0.5018631176719384,"y":0.179673330666935},"sternum":{"x":0.49229824456114357,"y":0.2736238514041595},"leftShoulder":{"x":0.4540209282672138,"y":0.2893273657811563},"leftHand":{"x":0.4893538356154567,"y":0.35528212616454297},"rightShoulder":{"x":0.5370532605355844,"y":0.27885835619649174},"leftElbow":{"x":0.4251657205994822,"y":0.4170492827140638},"rightElbow":{"x":0.585930449033987,"y":0.4044864712124663},"rightHand":{"x":0.5483298762505795,"y":0.4889846449138738}},"highlighted":true,"editingLabels":false,"id":"9442418802498487"}]},"1625":{"regions":[{"type":"keypoints","keypointsDefinitionId":"human","points":{"head":{"x":0.5018631176719384,"y":0.179673330666935},"sternum":{"x":0.49229824456114357,"y":0.2736238514041595},"leftShoulder":{"x":0.4540209282672138,"y":0.2893273657811563},"leftHand":{"x":0.4893538356154567,"y":0.35528212616454297},"rightShoulder":{"x":0.5454579431886196,"y":0.28828477914079875},"leftElbow":{"x":0.4251657205994822,"y":0.4170492827140638},"rightElbow":{"x":0.5775664698606539,"y":0.4049712346052037},"rightHand":{"x":0.5085707949521467,"y":0.4088800509647476}},"highlighted":true,"editingLabels":true,"id":"9442418802498487"}]},"1794":{"regions":[{"type":"keypoints","keypointsDefinitionId":"human","points":{"head":{"x":0.5018631176719384,"y":0.179673330666935},"sternum":{"x":0.49229824456114357,"y":0.2736238514041595},"leftShoulder":{"x":0.4540209282672138,"y":0.2893273657811563},"leftHand":{"x":0.4893538356154567,"y":0.35528212616454297},"rightShoulder":{"x":0.5370532605355844,"y":0.27885835619649174},"leftElbow":{"x":0.4251657205994822,"y":0.4170492827140638},"rightElbow":{"x":0.5719572933515534,"y":0.4052963338646188},"rightHand":{"x":0.5071732824961516,"y":0.40718439246878346}},"highlighted":true,"editingLabels":false,"id":"9442418802498487"}]},"2235":{"regions":[{"type":"keypoints","keypointsDefinitionId":"human","points":{"head":{"x":0.5018631176719384,"y":0.17967333066693503},"sternum":{"x":0.49229824456114357,"y":0.2736238514041595},"leftShoulder":{"x":0.4540209282672138,"y":0.2893273657811563},"leftHand":{"x":0.48980642347488146,"y":0.3397084520431372},"rightShoulder":{"x":0.5370532605355844,"y":0.27885835619649174},"leftElbow":{"x":0.4257163155055763,"y":0.41564655218944524},"rightElbow":{"x":0.5719572933515534,"y":0.4052963338646188},"rightHand":{"x":0.5067367749125811,"y":0.4064483881453737}},"highlighted":true,"editingLabels":true,"id":"9442418802498487"}]},"2623":{"regions":[{"type":"keypoints","keypointsDefinitionId":"human","points":{"head":{"x":0.5018631176719384,"y":0.17967333066693503},"sternum":{"x":0.49229824456114357,"y":0.2736238514041595},"leftShoulder":{"x":0.45402092826721374,"y":0.28932736578115636},"leftHand":{"x":0.4872300656474055,"y":0.34559726993451106},"rightShoulder":{"x":0.5370532605355844,"y":0.27885835619649174},"leftElbow":{"x":0.42620073914177703,"y":0.4144124037913681},"rightElbow":{"x":0.5719572933515534,"y":0.4052963338646187},"rightHand":{"x":0.5089450816218464,"y":0.40579407504633214}},"highlighted":true,"editingLabels":true,"id":"9442418802498487"}]},"2864":{"regions":[{"type":"keypoints","keypointsDefinitionId":"human","points":{"head":{"x":0.5018631176719384,"y":0.17967333066693503},"sternum":{"x":0.49229824456114357,"y":0.2736238514041595},"leftShoulder":{"x":0.4540209282672138,"y":0.28932736578115636},"leftHand":{"x":0.49311888353877925,"y":0.37176979389617243},"rightShoulder":{"x":0.5370532605355844,"y":0.27885835619649174},"leftElbow":{"x":0.42650163114261314,"y":0.41364583223483053},"rightElbow":{"x":0.5719572933515534,"y":0.4052963338646188},"rightHand":{"x":0.5048965193215269,"y":0.43196659900799356}},"highlighted":true,"editingLabels":false,"id":"9442418802498487"}]},"3001":{"regions":[{"type":"keypoints","keypointsDefinitionId":"human","points":{"head":{"x":0.5018631176719384,"y":0.179673330666935},"sternum":{"x":0.49229824456114357,"y":0.2736238514041595},"leftShoulder":{"x":0.4540209282672138,"y":0.2893273657811563},"leftHand":{"x":0.4747072291917559,"y":0.48474464491387376},"rightShoulder":{"x":0.5370532605355844,"y":0.27885835619649174},"leftElbow":{"x":0.4251657205994822,"y":0.4170492827140638},"rightElbow":{"x":0.5719572933515534,"y":0.4052963338646188},"rightHand":{"x":0.5262084056623442,"y":0.515722796174378}},"highlighted":true,"editingLabels":false,"id":"9442418802498487"}]},"3011":{"regions":[{"type":"keypoints","keypointsDefinitionId":"human","points":{"head":{"x":0.5018631176719384,"y":0.179673330666935},"sternum":{"x":0.49229824456114357,"y":0.2736238514041595},"leftShoulder":{"x":0.4540209282672138,"y":0.2893273657811563},"leftHand":{"x":0.4820773499924534,"y":0.48104008143610855},"rightShoulder":{"x":0.5370532605355844,"y":0.27885835619649174},"leftElbow":{"x":0.4252973252321734,"y":0.41426597685380695},"rightElbow":{"x":0.5725414114822169,"y":0.40306213118302386},"rightHand":{"x":0.5317642509509198,"y":0.517027301883393}},"highlighted":true,"editingLabels":true,"id":"9442418802498487"}]},"3091":{"regions":[{"type":"keypoints","keypointsDefinitionId":"human","points":{"head":{"x":0.5018631176719384,"y":0.179673330666935},"sternum":{"x":0.49229824456114357,"y":0.2736238514041595},"leftShoulder":{"x":0.4540209282672138,"y":0.2893273657811563},"leftHand":{"x":0.44306393146210193,"y":0.5274963114680574},"rightShoulder":{"x":0.5370532605355844,"y":0.27885835619649174},"leftElbow":{"x":0.42635016229370254,"y":0.39199952997175247},"rightElbow":{"x":0.5762984362544342,"y":0.41626308463099676},"rightHand":{"x":0.576666487372645,"y":0.5418911996469712}},"highlighted":true,"editingLabels":true,"id":"9442418802498487"}]},"3301":{"regions":[{"type":"keypoints","keypointsDefinitionId":"human","points":{"head":{"x":0.5018631176719384,"y":0.179673330666935},"sternum":{"x":0.49229824456114357,"y":0.2736238514041595},"leftShoulder":{"x":0.4540209282672138,"y":0.2893273657811563},"leftHand":{"x":0.4105282826954702,"y":0.3656471031771597},"rightShoulder":{"x":0.5370532605355844,"y":0.27885835619649174},"leftElbow":{"x":0.4291138595802166,"y":0.3335501069063595},"rightElbow":{"x":0.5894808372714573,"y":0.3382702534167713},"rightHand":{"x":0.6601060294334938,"y":0.40435230456253646}},"highlighted":true,"editingLabels":false,"id":"9442418802498487"}]},"3537":{"regions":[{"type":"keypoints","keypointsDefinitionId":"human","points":{"head":{"x":0.4307069090274806,"y":0.2278188250731353},"sternum":{"x":0.47318822762118673,"y":0.2957889348230651},"leftShoulder":{"x":0.44823045294738434,"y":0.29295684691681806},"leftHand":{"x":0.4774363594805573,"y":0.22970688367730002},"rightShoulder":{"x":0.5257588593808981,"y":0.25613970413560605},"leftElbow":{"x":0.4052181178712569,"y":0.3061732571459711},"rightElbow":{"x":0.5931979526484066,"y":0.26746805576059435},"rightHand":{"x":0.6786916063182402,"y":0.2419792646043707}},"highlighted":true,"editingLabels":false,"id":"9442418802498487"}]},"4306":{"regions":[{"type":"keypoints","keypointsDefinitionId":"human","points":{"head":{"x":0.45490878631628445,"y":0.20669718671199733},"sternum":{"x":0.4775885689464238,"y":0.2942243690185364},"leftShoulder":{"x":0.44427014575467094,"y":0.28669858369870316},"leftHand":{"x":0.4769963253480336,"y":0.2516108049407023},"rightShoulder":{"x":0.5257588593808981,"y":0.25613970413560605},"leftElbow":{"x":0.41049852746154136,"y":0.34606968516145387},"rightElbow":{"x":0.5999667042505391,"y":0.2735681705235042},"rightHand":{"x":0.6762419117855385,"y":0.24400117278228467}},"highlighted":true,"editingLabels":true,"id":"9442418802498487"}]},"4465":{"regions":[{"type":"keypoints","keypointsDefinitionId":"human","points":{"head":{"x":0.45991281556065355,"y":0.2023300339169116},"sternum":{"x":0.4784983924454,"y":0.29390087621890043},"leftShoulder":{"x":0.4434513046055924,"y":0.2854046125001592},"leftHand":{"x":0.476905342998136,"y":0.25613970413560605},"rightShoulder":{"x":0.5257588593808981,"y":0.25613970413560605},"leftElbow":{"x":0.4115903156603128,"y":0.3543187515521714},"rightElbow":{"x":0.5990391339550412,"y":0.30428519854180636},"rightHand":{"x":0.6686022931522351,"y":0.30239713993764167}},"highlighted":true,"editingLabels":false,"id":"9442418802498487"}]},"4810":{"regions":[{"type":"keypoints","keypointsDefinitionId":"human","points":{"head":{"x":0.4980040473937477,"y":0.18459443390996827},"sternum":{"x":0.49527667313378676,"y":0.28906389439882496},"leftShoulder":{"x":0.4547879807463942,"y":0.2854046125001592},"leftHand":{"x":0.46466173276607,"y":0.3488485223537189},"rightShoulder":{"x":0.5398163377954923,"y":0.28032461323598334},"leftElbow":{"x":0.42746166225743537,"y":0.39543309702281276},"rightElbow":{"x":0.5844822636231334,"y":0.3969339197196268},"rightHand":{"x":0.6469935239337719,"y":0.42242271087585054}},"highlighted":true,"editingLabels":true,"id":"9442418802498487"}]},"4869":{"regions":[{"type":"keypoints","keypointsDefinitionId":"human","points":{"head":{"x":0.504518200084045,"y":0.18156138927109972},"sternum":{"x":0.4981460022949891,"y":0.28823670040640625},"leftShoulder":{"x":0.4567267166661256,"y":0.2854046125001592},"leftHand":{"x":0.46256789797276016,"y":0.36470307387507733},"rightShoulder":{"x":0.5422203703359592,"y":0.2844605831980768},"leftElbow":{"x":0.4301758925450592,"y":0.4024642459583717},"rightElbow":{"x":0.5809845735527162,"y":0.38358365991672455},"rightHand":{"x":0.6484236668202246,"y":0.42323289060418356}},"highlighted":true,"editingLabels":false,"id":"9442418802498487"}]},"5352":{"regions":[{"type":"keypoints","keypointsDefinitionId":"human","points":{"head":{"x":0.509297348425837,"y":0.19005765298984095},"sternum":{"x":0.5023941341543596,"y":0.2891807297084886},"leftShoulder":{"x":0.45885078259581086,"y":0.2920128176147357},"leftHand":{"x":0.41849352993179006,"y":0.4968671761666076},"rightShoulder":{"x":0.5459374857129086,"y":0.29106878831265337},"leftElbow":{"x":0.4434513046055924,"y":0.40624036316670115},"rightElbow":{"x":0.5639920461152337,"y":0.427009007812513},"rightHand":{"x":0.5751433922460815,"y":0.5563410221977962}},"highlighted":true,"editingLabels":false,"id":"9442418802498487"}]},"5643":{"regions":[{"type":"keypoints","keypointsDefinitionId":"human","points":{"head":{"x":0.4938978704356184,"y":0.19194571159400564},"sternum":{"x":0.5023941341543596,"y":0.2891807297084886},"leftShoulder":{"x":0.45885078259581086,"y":0.2920128176147357},"leftHand":{"x":0.4434513046055924,"y":0.3014531106355593},"rightShoulder":{"x":0.5459374857129086,"y":0.29106878831265337},"leftElbow":{"x":0.43229995847474456,"y":0.3448784585313478},"rightElbow":{"x":0.5639920461152337,"y":0.427009007812513},"rightHand":{"x":0.562930013150391,"y":0.5676693738227845}},"highlighted":true,"editingLabels":false,"id":"9442418802498487"}]},"5957":{"regions":[{"type":"keypoints","keypointsDefinitionId":"human","points":{"head":{"x":0.49389787043561834,"y":0.19194571159400564},"sternum":{"x":0.5023941341543596,"y":0.2891807297084886},"leftShoulder":{"x":0.4588507825958108,"y":0.29201281761473563},"leftHand":{"x":0.45938179907823223,"y":0.2183785320523117},"rightShoulder":{"x":0.5459374857129085,"y":0.29106878831265337},"leftElbow":{"x":0.41477641455484077,"y":0.3175016087709594},"rightElbow":{"x":0.5639920461152337,"y":0.42700900781251294},"rightHand":{"x":0.5868257548593507,"y":0.5553969928957139}},"highlighted":true,"editingLabels":true,"id":"9442418802498487"}]},"6182":{"regions":[{"type":"keypoints","keypointsDefinitionId":"human","points":{"head":{"x":0.4938978704356184,"y":0.19194571159400564},"sternum":{"x":0.5023941341543596,"y":0.2891807297084886},"leftShoulder":{"x":0.45885078259581086,"y":0.2920128176147357},"leftHand":{"x":0.4370365444267241,"y":0.27512838513550697},"rightShoulder":{"x":0.5459374857129086,"y":0.29106878831265337},"leftElbow":{"x":0.41660051697537204,"y":0.3458765353125571},"rightElbow":{"x":0.5639920461152337,"y":0.427009007812513},"rightHand":{"x":0.5993932064495242,"y":0.5457884600719732}},"highlighted":true,"editingLabels":true,"id":"9442418802498487"}]},"6219":{"regions":[{"type":"keypoints","keypointsDefinitionId":"human","points":{"head":{"x":0.4938978704356184,"y":0.19194571159400564},"sternum":{"x":0.5023941341543596,"y":0.2891807297084886},"leftShoulder":{"x":0.45885078259581086,"y":0.2920128176147357},"leftHand":{"x":0.4333619914395872,"y":0.2844605831980768},"rightShoulder":{"x":0.5459374857129086,"y":0.29106878831265337},"leftElbow":{"x":0.41690048048452605,"y":0.350542634343842},"rightElbow":{"x":0.5639920461152337,"y":0.427009007812513},"rightHand":{"x":0.6012305895492022,"y":0.5461532388538225}},"highlighted":true,"editingLabels":false,"id":"9442418802498487"}]},"6222":{"regions":[{"type":"keypoints","keypointsDefinitionId":"human","points":{"head":{"x":0.4938978704356184,"y":0.19194571159400564},"sternum":{"x":0.5023941341543596,"y":0.2891807297084886},"leftShoulder":{"x":0.45885078259581086,"y":0.2920128176147357},"leftHand":{"x":0.4333619914395872,"y":0.2844605831980768},"rightShoulder":{"x":0.5459374857129086,"y":0.29106878831265337},"leftElbow":{"x":0.41690048048452605,"y":0.350542634343842},"rightElbow":{"x":0.5639920461152337,"y":0.427009007812513},"rightHand":{"x":0.6070043811913611,"y":0.5440686412707255}},"highlighted":true,"editingLabels":false,"id":"9442418802498487"}]},"6594":{"regions":[{"type":"keypoints","keypointsDefinitionId":"human","points":{"head":{"x":0.4938978704356184,"y":0.19194571159400564},"sternum":{"x":0.5023941341543596,"y":0.2891807297084886},"leftShoulder":{"x":0.45885078259581086,"y":0.2920128176147357},"leftHand":{"x":0.4121213321427341,"y":0.3288299603959477},"rightShoulder":{"x":0.5459374857129086,"y":0.29106878831265337},"leftElbow":{"x":0.41690048048452605,"y":0.350542634343842},"rightElbow":{"x":0.5708952603867109,"y":0.43456124222917186},"rightHand":{"x":0.5985081174726199,"y":0.5563410221977962}},"highlighted":true,"editingLabels":false,"id":"9442418802498487"}]},"6901":{"regions":[{"type":"keypoints","keypointsDefinitionId":"human","points":{"head":{"x":0.46681602983213083,"y":0.18533750647942915},"sternum":{"x":0.4869946561641412,"y":0.290124759010571},"leftShoulder":{"x":0.45885078259581086,"y":0.2920128176147357},"leftHand":{"x":0.46150586500791746,"y":0.22970688367730002},"rightShoulder":{"x":0.5459374857129086,"y":0.29106878831265337},"leftElbow":{"x":0.40628015083609953,"y":0.3118374329584653},"rightElbow":{"x":0.5512476505371218,"y":0.4364493008333366},"rightHand":{"x":0.5544337494316498,"y":0.5789977254477728}},"highlighted":true,"editingLabels":false,"id":"9442418802498487"}]},"7267":{"regions":[{"type":"keypoints","keypointsDefinitionId":"human","points":{"head":{"x":0.4439823210880137,"y":0.21932256135439407},"sternum":{"x":0.47637432651571476,"y":0.2891807297084886},"leftShoulder":{"x":0.4370791068165365,"y":0.30522922784388873},"leftHand":{"x":0.46150586500791746,"y":0.22970688367730002},"rightShoulder":{"x":0.5193866615918421,"y":0.2778523780835004},"leftElbow":{"x":0.3945977882228303,"y":0.30994937435430053},"rightElbow":{"x":0.550185617572279,"y":0.43078512502084254},"rightHand":{"x":0.561336963703127,"y":0.5657813152186197}},"highlighted":true,"editingLabels":false,"id":"9442418802498487"}]}}
|