图像标注

lishihuan大约 16 分钟

图像标注

图像和视频标注工具

参考-海康威视--https://ai.hikvision.com/intellisense/ai-training/console/data/#/calibrate/onlineopen in new window

参考:https://app.basic.ai/datasets/data?id=1248731open in new window

​ lishihuan/

1. 常用工具

VoTT (Visual Object Tagging Tool)CVATCOCO Annotator 都是流行的图像和视频标注工具,但它们各自在功能、用户体验、安装部署等方面有所不同。下面对这三者进行详细对比:

2. 常用工具对比

2.1. 功能比较

功能VoTTCVATCOCO AnnotatorLabelImgLabelMe
注释类型支持边界框(Bounding Box)、分割(Segmentation)支持边界框(Bounding Box)、多边形、线、点、分割等支持边界框、多边形、点、分割等支持边界框和分割支持边界框、多边形
图像/视频支持支持图像和视频支持图像和视频仅支持图像仅支持图像支持图像
标签管理支持自定义标签支持自定义标签,支持标签层次结构支持自定义标签,支持标签层次结构支持自定义标签支持自定义标签
数据导出格式支持COCO、YOLO、TensorFlow、Caffe等格式支持COCO、YOLO、Pascal VOC、TFRecord等格式支持COCO格式、YOLO、Pascal VOC等格式支持Pascal VOC、YOLO格式支持JSON格式
热键支持支持热键,提升标注效率支持热键,提升标注效率支持热键,提升标注效率支持热键支持热键
多人协作不支持多人协作支持多人协作和团队管理支持多人协作,任务分配与进度跟踪不支持多人协作不支持多人协作
视频标注支持视频标注(逐帧标注)支持视频标注,支持高级操作如轨迹标注不支持视频标注不支持视频标注不支持视频标注
技术栈语言:Python, TypeScript
框架:React
数据格式:支持 COCO、Pascal VOC、TFRecord 等格式
依赖:Node.js, Electron, Redux 等
语言:Python, TypeScript
框架:Django, React
数据格式:支持 COCO、Pascal VOC、YOLO 等格式
依赖:OpenCV, Docker, Redis 等
语言:JavaScript(前端),Python(后端)
框架
后端 Flask - Python 微型 Web 框架
MongoDB - 跨平台文档导向数据库 MongoEngine - MongoDB 的 Python 对象数据映射器
前端
Vue - 构建用户界面的 JavaScript 框架 Axios - 基于 Promise 的 HTTP 客户端 PaperJS - HTML Canvas 向量图形库 Bootstrap - 前端组件库
数据格式:专注于COCO格式
依赖:Node.js和Python Flask
语言:Python
框架:使用Qt5作为图形用户界面(GUI),主要基于PyQt5
数据格式:支持Pascal VOC、YOLO格式导出
依赖:Python库如lxml、OpenCV等
语言:JavaScript,Python
框架:前端使用React.js,后端使用Flask
数据格式:主要使用JSON格式
依赖:Node.js环境,常用的前端库和后端库

2.2. 用户体验

特性VoTTCVATCOCO AnnotatorLabelImgLabelMe
界面设计简洁直观,适合初学者,易于上手界面功能丰富,但较复杂,适合进阶用户界面简洁直观,适合快速标注界面简洁,适合基本标注需求界面较简单,适合初学者
学习曲线学习曲线较短,适合入门级用户学习曲线较长,适合有一定经验的用户学习曲线较短,适合中小型项目的用户学习曲线较短,易于上手学习曲线较短,易于理解
文档和支持文档相对简洁,社区支持一般文档详细,社区活跃,GitHub支持良好文档较为完善,社区支持活跃文档简单,支持一般文档较为基础,社区支持一般
可视化和交互提供基本的图形标注,界面交互直观提供强大的可视化功能,支持复杂的注释操作提供基本的图形标注,用户界面简洁易懂提供基本的图形标注提供基本的图形标注

2.3. 部署与安装

特性VoTTCVATCOCO AnnotatorLabelImgLabelMe
安装方式可以直接从 GitHub 克隆源码,支持 Windows 和 macOS,支持 Docker 部署通过 Docker Compose 部署,支持 Linux、Windows、macOS支持通过 Docker 部署,易于安装通过 pip 安装,支持多平台通过 pip 安装,支持多平台
安装复杂度安装简单,特别适合 Windows 用户安装相对复杂,依赖较多,推荐 Docker 部署安装较简单,通过 Docker 或源代码安装安装简单,依赖较少安装简单,依赖较少
系统要求轻量,支持 Windows/macOS,要求较低需要较高的硬件和资源,特别适合处理大型数据集适合小型和中型数据集,硬件要求相对较低轻量级,适合一般用户轻量级,适合一般用户

2.4. 开源与社区支持

特性VoTTCVATCOCO AnnotatorLabelImgLabelMe
开源许可证MIT LicenseApache 2.0 LicenseMIT LicenseMIT LicenseMIT License
社区活跃度社区支持一般,更新较慢社区非常活跃,GitHub上的支持广泛,定期更新社区活跃,更新频繁社区较小,更新不频繁社区较小,更新不频繁
开发支持支持开发者自定义插件和扩展支持插件开发和自定义功能,功能非常强大具有一定的扩展性,支持脚本和插件开发具备一定的开发支持支持简单的扩展功能

2.5. 性能与扩展性

特性VoTTCVATCOCO AnnotatorLabelImgLabelMe
性能性能较好,适合中小型项目和较小数据集性能优化良好,适合大型数据集,支持高效的分布式标注性能适中,适用于小型和中型项目性能良好,适合一般标注需求性能适中,适合简单项目
扩展性支持一些基本的扩展,如自定义标签,支持多种数据格式支持高级功能扩展,如视频跟踪、自动标注等通过自定义脚本和插件支持功能扩展支持自定义标注功能支持基本的扩展

2.6. 适用场景

特性VoTTCVATCOCO AnnotatorLabelImgLabelMe
适用项目规模适合中小型项目,快速标注需求适合大型项目、复杂标注任务,支持高效的团队协作适合中小型项目和较简单的标注需求适合个人和小型项目适合简单项目和教育用途
团队协作不支持团队协作支持团队协作和任务分配,适合大规模标注项目支持团队协作,任务分配与进度跟踪不支持多人协作不支持多人协作

2.7. 总结

  • VoTT (Visual Object Tagging Tool)
    • 优点:界面简洁,适合中小型项目,支持图像和视频标注,适合快速入门的用户。
    • 缺点:功能较为基础,不支持团队协作,缺少高级注释功能,如视频跟踪等。
    • 适用场景:个人或小团队进行简单的图像和视频标注,快速启动项目。
  • CVAT (Computer Vision Annotation Tool)
    • 优点:功能全面,支持各种复杂标注,适合团队协作,支持大规模数据集,支持高级注释功能,如视频轨迹、自动标注等。
    • 缺点:界面较复杂,学习曲线较长,安装较为复杂。
    • 适用场景:大规模项目、复杂标注任务或团队合作,适合需要高级功能的用户。
  • COCO Annotator
    • 优点:简洁直观,易于部署,支持基本的标注任务,适合中小型项目。
    • 缺点:功能较为基础,缺乏CVAT那样的高级标注功能。
    • 适用场景:小团队或单人项目,适合快速完成图像标注任务。
  • LabelImg
    • 优点:轻量级,易于安装和使用,适合个人用户和小型项目,支持基本的边界框标注。
    • 缺点:功能较为有限,不支持视频标注或多人协作,适合简单标注任务。
  • LabelMe
    • 优点:简单易用,适合初学者,支持基本的标注类型,适合教育和小型项目。
    • 缺点:功能相对单一,不支持复杂的标注需求和多人协作,社区支持一般。

选择建议:

  • 如果你的项目需要快速标注且功能要求较低,可以选择 VoTT
  • 如果需要强大的功能支持、大型团队协作或者复杂标注任务,CVAT 是更好的选择。
  • 如果你需要简洁高效的工具进行基础标注,且项目规模较小,COCO Annotator 是一个不错的选择。
  • 如果你的项目需要轻量级的解决方案,且主要进行边界框标注,LabelImg 是理想的选择。
  • 如果你是初学者,或者希望进行基础的图像标注并进行教育用途,LabelMe 将会是合适的选择。

cvat

Cvat汉化教程open in new window

1. 项目根目录

CVAT 项目的根目录通常包含以下文件和目录:

  • README.md:项目的基本信息和使用说明。
  • docker-compose.yml:Docker Compose 配置文件,用于定义和运行多容器 Docker 应用。
  • requirements.txt:Python 项目的依赖库列表,后端使用的库。
  • cvat/:后端代码目录。
  • cvat-ui/:前端代码目录。
  • data/:用于存储上传的数据和模型。
  • scripts/:包含一些脚本文件,可能用于初始化数据库或其他管理任务。

2. 后端 (cvat/)

后端部分主要使用 Django 框架,结构如下:

  • cvat/:后端的主要代码目录。
    • settings.py:Django 项目的设置文件,包括数据库配置、应用注册等。
    • urls.py:URL 路由配置,定义了 API 的路径。
    • views.py:视图函数,处理请求并返回响应。
    • models.py:数据库模型定义,包含与标注任务、用户等相关的数据结构。
    • serializers.py:用于数据序列化和反序列化的类,支持 API 数据格式的转换。
    • migrations/:数据库迁移文件,记录模型更改和数据库结构更新。
  • cvat/apps/:应用模块,通常用于不同功能的分离。
    • auth/:用户身份验证和权限管理相关代码。
    • annotations/:与标注相关的逻辑和模型。
    • tasks/:任务管理和处理相关代码。

3. 前端 (cvat-ui/)

前端部分主要使用 React,结构如下:

  • cvat-ui/:前端代码目录。

    • src/

      :源代码目录,包含主要的应用逻辑和组件。

      • components/:可复用的组件,负责不同功能的 UI。
      • containers/:容器组件,通常用于连接 Redux 状态和 UI。
      • redux/:状态管理相关代码,使用 Redux 来管理应用状态。
      • api/:与后端 API 交互的代码。
      • utils/:一些工具函数和辅助模块。
  • public/:静态文件目录,包含 HTML 模板和其他静态资源。

4. 数据存储 (data/)

  • data/:用于存储上传的数据和导出结果。这里的文件可能包括图像、视频以及标注文件。

5. 脚本 (scripts/)

  • scripts/:一些自动化脚本,用于初始化数据库、迁移数据或其他管理任务。

总结

CVAT 的项目结构是模块化的,后端使用 Django 框架,前端使用 React,便于开发和维护。这样的结构不仅清晰,也使得不同团队可以独立开发前后端功能。

如果你需要更深入的某个模块或文件的解释,请告诉我!

3. COCO Annotator 使用

admin/admin

https://gitcode.com/gh_mirrors/co/coco-annotator/overviewopen in new window

前端使用的插件 : paperjsopen in new window

├── backend            # 后端服务代码
│    ├── datasets       # 数据集管理相关代码
│    ├── db             # 数据库操作相关代码
│    ├── models       # 模型定义
│    └── ...         # 其他前端相关的组件和样式等
├── client          # 前端Vue应用代码
├── db            	# 可能包含与数据库相关的文件和配置,例如数据库模型、迁移文件等。这部分代码通常用于管理数据的存储和检索。

安装:

git clone https://github.com/jsbroks/coco-annotator ## 下载
cd coco-annotator
docker-compose up # 通过docker-compose 来运行
docker-compose down # 停止服务

3.1 要求

  1. Python(建议使用 Python 3.6 或更高版本)
  2. Node.js(建议使用 Node 14 或更高版本)

3.2 Python安装

python --version
  • 安装时,请确保勾选“Add Python to PATH”选项

3.3 克隆代码库

打开命令提示符(Cmd)或 PowerShell,运行以下命令以克隆 COCO Annotator 的代码库:

git clone https://github.com/jsbroks/coco-annotator.git
# 进入项目目录
cd coco-annotator

3.4 设置 Python 虚拟环境(可选)

为了避免依赖冲突,可以创建一个虚拟环境:

python -m venv venv
venv\Scripts\activate  # 激活虚拟环境

10.安装 Python 依赖 使用 pip 安装所需的 Python 依赖:

cd backend

pip install -r requirements.txt

11.安装 Node.js 依赖 在项目目录中,运行以下命令安装 Node.js 依赖:

npm install

12.构建前端 构建前端文件:

npm run build

13.运行服务器 启动开发服务器: python app.pyopen in new window

默认情况下,应用程序将在 http://127.0.0.1:5000open in new window 上运行。

注意事项

14.确保在执行每一步时没有错误。如果出现问题,请仔细检查依赖项是否已正确安装。 15.如果你使用的是 Windows PowerShell,请确保以管理员身份运行 PowerShell,以避免权限问题。 16.对于 Python 和 Node.js 的安装,建议使用最新版本以获得最佳兼容性。

运行应用 打开浏览器并访问 http://127.0.0.1:5000open in new window,就可以开始使用 COCO Annotator 进行标注。 如果在安装或运行过程中遇到任何问题,请随时询问!

前端使用

  • Annotator.vue 主界面
    • Category.vue 右上角 标签树 (标签-> 系统中的类型
      • Annotation.vue右上角标签树二级,并且图片中的标签图层也是在这个组件中完成初始化的
        • 在emitModify方法中实现对Paper对象的转换,将标注层【覆盖物】数据转为json格式,以复合路径对象记录,方便数据的回显
  • SelectTool.vue
  • CustomShortcut.vue 快捷键设置&监听组件
    • 搭配shortcuts.js 设置快捷键回调
  • SelectTool.vue 弹窗悬浮组件
  • PolygonTool.vue折现工具
    • onMouseDown方法添加了 this.$parent.currentCategory.createAnnotation(); 实现添加一个新的覆盖物,不加这个多次添加的都会被合并到一起

4. COCO 格式转换为 Paper.js 能识别的格式,并回显到页面中

要将 COCO 格式的标注数据(例如,边界框、分割区域等)转换为 Paper.js 能识别的格式,并回显到页面中,通常需要进行以下几个步骤:

1. 解析 COCO 格式的数据

COCO 格式包含了 annotationsimagescategories 等信息。你首先需要提取 annotations(标注数据)和 images(图像信息)来进行处理。

例如,COCO 格式中有以下内容:

{
    "images": [
        {
            "id": 1,
            "file_name": "image1.jpg",
            "width": 1024,
            "height": 768
        }
    ],
    "annotations": [
        {
            "id": 1,
            "image_id": 1,
            "category_id": 2,
            "bbox": [100, 150, 200, 250],
            "segmentation": [],
            "area": 50000,
            "iscrowd": 0
        },
        {
            "id": 2,
            "image_id": 1,
            "category_id": 1,
            "bbox": [50, 60, 250, 300],
            "segmentation": [[50, 60, 100, 120, 250, 180, 200, 250]],
            "area": 45000,
            "iscrowd": 0
        }
    ]
}

在这个例子中:

  • annotations 数组包含了每个标注的信息。
  • bbox 是一个边界框,包含 [x, y, width, height]
  • segmentation 包含分割区域,通常是一个多边形的顶点坐标数组。

2. 将 COCO 格式数据转换为 Paper.js 格式

Paper.js 处理的图形通常是基于路径(Path)、矩形(Rectangle)等对象。因此,你需要将 COCO 格式的标注数据(如 bboxsegmentation)转换成 Paper.js 可以理解的路径对象。

a. 转换边界框(Bounding Box)

如果标注是边界框(bbox),你可以直接使用 Paper.js 创建一个矩形(Path.Rectangle)对象。bbox 通常包含四个值:[x, y, width, height]

// 假设你从 COCO 数据中获取了 bbox
const bbox = [100, 150, 200, 250];  // [x, y, width, height]

// 在 Paper.js 中创建矩形
const rect = new paper.Path.Rectangle(new paper.Rectangle(bbox[0], bbox[1], bbox[2], bbox[3]));
rect.strokeColor = 'blue';  // 可以设置颜色
rect.strokeWidth = 2;  // 设置边框宽度

b. 转换分割区域(Segmentation)

如果标注是分割区域(segmentation),它通常是一个多边形(polygon),由一组顶点坐标组成。在 Paper.js 中,你可以使用 Path 来绘制多边形。

// 假设你从 COCO 数据中获取了 segmentation
const segmentation = [[50, 60, 100, 120, 250, 180, 200, 250]];  // 多边形的顶点数组

// 在 Paper.js 中绘制多边形
const points = segmentation[0];  // 获取第一个分割区域的顶点
const polygon = new paper.Path();
polygon.add(new paper.Point(points[0], points[1]));  // 将点添加到路径
for (let i = 2; i < points.length; i += 2) {
    polygon.add(new paper.Point(points[i], points[i + 1]));
}
polygon.closed = true;  // 关闭路径,形成一个封闭的多边形
polygon.strokeColor = 'red';  // 设置边框颜色
polygon.fillColor = new paper.Color(1, 0, 0, 0.5);  // 填充颜色

c. 绘制标注类别(Category)

如果需要显示标注的类别(如“人”或“狗”),可以在每个标注上方添加文本标签。你可以从 COCO 数据中的 category_id 获取类别,然后根据类别 ID 显示相应的标签。

const categoryId = 2;  // 假设是狗类
const categories = [
    { id: 1, name: 'person' },
    { id: 2, name: 'dog' }
];

const category = categories.find(c => c.id === categoryId);
const label = category ? category.name : 'unknown';

// 创建文本标签
const text = new paper.PointText(new paper.Point(bbox[0], bbox[1] - 10));  // 设置位置
text.justification = 'center';
text.fillColor = 'black';
text.fontSize = 14;
text.content = label;

3. 将标注回显到画布

使用 Paper.js 时,可以将这些标注(矩形、多边形、文本等)绘制到画布中。在 COCO 格式的回显过程中,你需要确保:

  • 加载正确的图像。
  • 在图像上绘制所有的标注。
  • 处理标注的显示样式(如颜色、边框、标签等)。
// 加载图像并将标注绘制在其上
const imageUrl = 'path/to/your/image.jpg';
const image = new paper.Raster(imageUrl);
image.onLoad = function() {
    // 图像加载完成后,绘制标注
    annotations.forEach(annotation => {
        if (annotation.bbox) {
            // 如果是边界框,绘制矩形
            const rect = new paper.Path.Rectangle(new paper.Rectangle(annotation.bbox[0], annotation.bbox[1], annotation.bbox[2], annotation.bbox[3]));
            rect.strokeColor = 'blue';
            rect.strokeWidth = 2;
        }
        if (annotation.segmentation && annotation.segmentation.length > 0) {
            // 如果有分割区域,绘制多边形
            const points = annotation.segmentation[0];
            const polygon = new paper.Path();
            polygon.add(new paper.Point(points[0], points[1]));
            for (let i = 2; i < points.length; i += 2) {
                polygon.add(new paper.Point(points[i], points[i + 1]));
            }
            polygon.closed = true;
            polygon.strokeColor = 'red';
            polygon.fillColor = new paper.Color(1, 0, 0, 0.5);
        }
    });
};

4. 处理回显后的交互

  • 删除和编辑标注:如果要允许用户编辑这些标注,可以为每个标注(矩形或多边形)添加交互处理(如拖动、缩放等)。Paper.js 提供了 onMouseDown, onMouseDrag, onMouseUp 等事件,可以用来处理用户的交互。

总结

通过上述步骤,你可以将 COCO 格式的标注数据转换为 Paper.js 可以识别和渲染的格式,并将其回显到页面中。主要的转换操作包括将 bbox 转换为矩形,segmentation 转换为多边形路径,最后通过 Paper.js 在画布上进行绘制。根据需要,你还可以为这些标注添加更多的交互和样式。