Skip to content

Commit

Permalink
vid: support manual button
Browse files Browse the repository at this point in the history
  • Loading branch information
grokhi committed Sep 19, 2024
1 parent 4a7ce2b commit b062211
Showing 1 changed file with 76 additions and 47 deletions.
123 changes: 76 additions & 47 deletions src/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -354,11 +354,9 @@ def process_video_rectangle_changed(api: sly.Api, event: sly.Event.Tools.Rectang
direction = -1 if idx < event_frame_idx else 1
frame_id = f"{event.video_id}_{frame_index}"

_diff = get_increment_by_diff(
_drow, _dcol = get_increment_by_diff(
api, event, frame_id, direction, reverse_direction=True, modality="video"
)
# if _diff is None:
_drow, _dcol = _diff

drow += _drow * direction
dcol += _dcol * direction
Expand Down Expand Up @@ -464,72 +462,99 @@ def rectangle_changed(api: sly.Api, event: sly.Event.Tools.Rectangle.FigureChang

def process_video(api: sly.Api, event: sly.Event.FigureCreated):
project_meta = g.get_project_meta(api, event.project_id)
figure = api.image.figure.get_info_by_id(event.figure_state["id"])
obj_class = project_meta.get_obj_class_by_id(event.figure_state["classId"])

ann_json = api.video.annotation.download(event.video_id)
key_id_map = sly.KeyIdMap()
video_ann = sly.VideoAnnotation.from_json(ann_json, project_meta, key_id_map)
video_info = api.video.get_info_by_id(event.video_id)

processed_vidfigures: List[sly.VideoFigure] = []

end_frame = min(event.frame + 2, video_info.frames_count)
start_frame = max(event.frame - 2, 0)

frame_indexes = [x for x in range(end_frame + 1)][start_frame:]
event_frame_idx = frame_indexes.index(event.frame)
frame_indexes[:event_frame_idx] = frame_indexes[:event_frame_idx][::-1]

video_object = sly.VideoObject(
obj_class,
key=key_id_map.get_object_key(event.object_id),
class_id=event.tool_class_id,
)
video_figure = sly.VideoFigure(
video_object,
figure.bbox,
event_frame_idx,
# key=key_id_map.get_object_key(event.object_id),
# class_id=event.tool_class_id,
track_id=event.object_id,
)
try:
figure = api.image.figure.get_info_by_id(event.figure_state["id"])
obj_class = project_meta.get_obj_class_by_id(event.figure_state["classId"])
video_object = sly.VideoObject(
obj_class,
key=key_id_map.get_object_key(event.object_id),
class_id=event.tool_class_id,
)
vid_figure = sly.VideoFigure(
video_object,
figure.bbox,
event_frame_idx,
# key=key_id_map.get_object_key(event.object_id),
# class_id=event.tool_class_id,
track_id=event.object_id,
)
processed_vidfigures.append(vid_figure)
except AttributeError:
for frame in ann_json["frames"]:
if frame["index"] == event.frame:
for figure in frame["figures"]:
object_json = next(
(item for item in ann_json["objects"] if item["id"] == figure["objectId"]),
None,
)
vid_object = sly.VideoObject.from_json(object_json, project_meta).clone(
key=key_id_map.get_object_key(figure["objectId"]),
class_id=object_json["classId"],
)
bbox = sly.Rectangle.from_json(figure["geometry"])
processed_vidfigures.append(
sly.VideoFigure(vid_object, bbox, event.frame, track_id=figure["objectId"])
)
break

new_figures = []
drow, dcol = 0, 0
for idx, frame_index in enumerate(frame_indexes):
for video_figure in processed_vidfigures:

if idx == event_frame_idx:
drow, dcol = 0, 0
continue
# video_object = sly.VideoObject(
# obj_class,
# key=key_id_map.get_object_key(event.object_id),
# class_id=event.tool_class_id,
# )

direction = -1 if idx < event_frame_idx else 1
frame_id = f"{event.video_id}_{frame_index}"
new_figures = []
drow, dcol = 0, 0
for idx, frame_index in enumerate(frame_indexes):

_diff = get_increment_by_diff(
api, event, frame_id, direction, reverse_direction=True, modality="video"
)
# if _diff is None:
_drow, _dcol = _diff
if idx == event_frame_idx:
drow, dcol = 0, 0
continue

drow += _drow * direction
dcol += _dcol * direction
direction = -1 if idx < event_frame_idx else 1
frame_id = f"{event.video_id}_{frame_index}"

new_figure = interpolate_video_figure(
video_figure, video_info, video_object, frame_index, drow, dcol
)
if new_figure is None:
continue
if (direction < 0 and new_figure.geometry.to_bbox().bottom < 0) or (
direction > 0 and new_figure.geometry.to_bbox().top > video_info.frame_height
):
continue
_drow, _dcol = get_increment_by_diff(
api, event, frame_id, direction, reverse_direction=True, modality="video"
)

new_figures.append(new_figure)
drow += _drow * direction
dcol += _dcol * direction

api.video.figure.append_bulk(event.video_id, new_figures, key_id_map)
new_figure = interpolate_video_figure(
video_figure, video_info, video_figure.video_object, frame_index, drow, dcol
)
if new_figure is None:
continue
if (direction < 0 and new_figure.geometry.to_bbox().bottom < 0) or (
direction > 0 and new_figure.geometry.to_bbox().top > video_info.frame_height
):
continue

new_figures.append(new_figure)

api.video.figure.append_bulk(event.video_id, new_figures, key_id_map)

if g.event_anns[event.user_id][frame_id] == "done":
g.event_anns[event.user_id][frame_id] = {}
g.event_anns[event.user_id][frame_id][video_figure.track_id] = video_figure
# if g.event_anns[event.user_id][frame_id] == "done":
# g.event_anns[event.user_id][frame_id] = {}
# g.event_anns[event.user_id][frame_id][video_figure.track_id] = video_figure


@app.event(sly.Event.FigureCreated)
Expand Down Expand Up @@ -669,6 +694,10 @@ def manual_track():
return
status_image_not_initialized.hide()

if getattr(event, "frame", None) is not None:
process_video(api, event)
return

project_meta = g.get_project_meta(api, event.project_id)

track_tag_meta = project_meta.get_tag_meta(g.TRACK_TAG_NAME)
Expand Down

0 comments on commit b062211

Please sign in to comment.