0%

PPLab 2D KeyPoints Labeling Tool

该项目基于 GitHub - ZHUXUHAN/Priv_Labelimg: A labelimg tool concludes box,segmentation,instance keypoints, brush, human part features. 仅包含2维关节点标注功能

1
2
3
4
5
因为该代码是基于原6功能项目代码删减,所以里面存在大量冗余代码,代码很臃肿

目前连续使用4小时仅卡死一次,项目很稳定,且包含自动保存功能

如果使用时发现非常棘手的bug,欢迎反馈,看时间和心情解决:)

需要安装:

  • python3/2 (更建议在3下使用)
  • pyqt5
  • opencv
  • qdarkstyle
  • requests

运行方式:

  • 源码运行
1
python labelimg.py
  • windows平台下exe可执行文件运行: 只需要下载Priv-LabelImg_1.0,其中有个exe文件,直接运行即可。(未使用)

重要特性 V2.0

  • 自动填补: 对每一帧检测前一帧和后一帧,若前/后一帧中存在一点经过人工标注,前当前帧对应点置信度小于0.85,则自动使用前一帧标注点填补
    • 后一帧优先级高于前一帧

重要特性 v1.0

  • 检索并打标低置信度帧: 低置信度帧评价因素是存在关节点置信度小于0.601

  • 自动晒选是否需要标记:目前测量是除脚部之外15个关节点的置信度都大于0.601,则该帧不需要标记

  • 自动保存:每次点击SAVE、NextImg、PrevImg后会自动保存当前帧的标记结果

    • 保存目录为当前视频目录下Annotation下面,目前策略为逐帧保存,最后大家可以选择整合结果

  • 支持模式切换: 点击左上角model change按钮,可以选择打标时是打标所有文件还是仅打标低置信度文件

    • 默认模式,打标低置信度文件
    • 模式切换,打标所有文件
    • 支持任意时间切换(但下标会置0)
    • 当前模式在标题显示
  • 自动跳转:NextImg、PrevImg会自动跳转下一个/上一个需要标记的数据帧

  • 历史标注记忆:再次打开后会自动记录上一次保存的位置,继续标记 (根据Annotation文件夹内文件数量,建议不要跳跃标记)

  • 清除当前标记记录,复位(只清楚当前一帧之前所有的操作,恢复最初状态)

    img

  • 在data文件夹下更新关节点名称和连接方式

辅助特性

  • 标记注明:标记后的点置信度为0.6

  • 显示像素值:鼠标悬停时可以显示当前帧像素

  • 支持图片缩放:左下角ZoomIn,ZoomOut

  • 鼠标悬停在点上面显示点名称:显示位置在右侧ClearAll下面会有提示

  • 左上角显示当前文件名

标注方式

  • 视频处理

    • 使用ffmpeg将原始视频转为图片

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      # python实现,需预先conda 下载 ffmpeg
      import os
      import cv2
      import subprocess
      import os.path as osp

      def video_to_images(vid_file, img_folder=None, return_info=False):
      # copied from vibe
      if img_folder is None:
      img_folder = osp.join('tmp/', osp.basename(vid_file).replace('.mp4', ''))

      if osp.isdir(img_folder) and len(os.listdir(img_folder)) > 0:
      img_shape = cv2.imread(osp.join(img_folder, '000001.png')).shape
      return img_folder, len(os.listdir(img_folder)), img_shape

      os.makedirs(img_folder, exist_ok=True)

      command = ['ffmpeg',
      '-i', vid_file,
      '-f', 'image2',
      '-v', 'error',
      f'{img_folder}/%06d.png']
      print(f'Running \"{" ".join(command)}\"')
      subprocess.call(command)

      print(f'Images saved to \"{img_folder}\"')

      img_shape = cv2.imread(osp.join(img_folder, '000001.png')).shape

      if return_info:
      return img_folder, len(os.listdir(img_folder)), img_shape
      else:
      return img_folder
  • 视频文件目录

    • 打开目录应为如下格式

      1
      2
      3
      4
      5
      6
      7
      8
      9
      openDir
      ---- rgb_images
      ----000001.png
      ----000002.png
      ----000003.png
      ----000004.png
      ----...
      ---- Annotation (自动创建,不用管它)
      ---- vitpose_raw.npy 关节点坐标,剔除眼部、耳部关节点的21维度OpenPose坐标 (理论上其他模式关节坐标也行,但代码可能要微调: N X 21 x 3
  • 打开视频目录,选择上述根目录

  • 自动打开图片

  • 支持两种标注模式

    • 对于界面已经有的点,点击选择点直接拖动(有可能会受到周围点干扰,出现情况较小)
      • 可以参考image_list目录下operate1.mp4视频
    • 对于界面没有的点,可以选择点添加
      • 可以参考image_list目录下addpoint.mp4视频
  • 切换

    • 点击左侧Prev Image切换到上一帧,点击Next Image切换到下一帧,支持自动保存,但也可以选择自主保存
  • 当完成最后一张图片标注后,在加载目录下生成annotations.npy保存整体标注结果