一款零安装、跨平台的目标检测标注工具

 

如果你做过目标检测,一定对 LabelImg不陌生。这款经典的图像标注工具陪伴了无数算法工程师和数据标注员,它稳定、轻量,但也存在一些"成长的烦恼":需要安装Python/QT环境、跨平台协作麻烦、多人标注时数据分散难以管理……

 

为了解决这些问题,我基于 FastAPI 和纯前端技术,开发了一款 Web版的LabelImg。它保留了LabelImg的核心标注功能,同时带来了团队协作、进度可视化、自动格式转换等现代化特性。最重要的是,打开浏览器就能用

 

📌 项目简介

Web LabelImg是一款基于FastAPI和纯前端技术开发的网页版图像边界框标注工具,专为目标检测数据集的标注而设计。它解决了传统LabelImg的安装复杂、跨平台困难、团队协作不便等痛点,让标注工作变得简单高效。

核心价值

- 零安装:打开浏览器即可使用,无需配置Python/QT环境

- 跨平台:支持Windows、macOS、Linux,甚至平板设备

- 团队协作:所有数据集中存储在服务器,标注结果实时共享

- 格式兼容:同时生成JSON和YOLO格式,完美兼容LabelImg

 

> 🔗 GitHub仓库:https://github.com/paidaxin-12138/web-labelimg (等你来点亮Star!)

 

✨ 核心功能

 

1. 零安装,跨平台

- 无需配置Python环境,无需安装QT,只需一个现代浏览器(Chrome/Edge/Firefox)。

- 支持Windows、macOS、Linux,甚至可以在平板上使用!

 

2. 数据集中管理

- 所有图像和标注文件都存放在服务器,团队成员共用同一份数据,标注结果实时可见,再也不用U盘拷贝、邮件传送了。

 

3. 自动双格式保存

- 每次保存标注,系统会同时生成 **JSON**(前端快速加载)和 **YOLO格式的TXT**(直接用于训练),兼容LabelImg,方便你在不同工具间切换。

 

4. 项目进度可视化

- 界面上方实时显示总图像数、已标注数量、标注进度百分比,管理者一目了然,轻松掌握项目全局。

 

5. 智能跳转未标注图像

- 点击"下一个未标注"按钮,系统自动切换到尚未标注的图像,大幅提升连续标注效率。

 

6. 标签管理灵活

- 支持自定义标签名称和颜色,可以随时添加、编辑、删除标签,标注框的颜色与标签一一对应,清晰易读。

 

 7. 标注编辑与删除

- 支持选择/编辑已绘制的标注框,修改标签或删除,操作流畅。

 

 8. 图像缩放与自适应

- 提供放大、缩小、适应窗口功能,方便标注大图或细节。

 

🛠 技术实现

 

架构设计

 

Web LabelImg 采用前后端分离架构:

 

- 前端:浏览器端通过HTML5 Canvas实现标注界面,使用原生JavaScript处理用户交互

- 后端:FastAPI提供RESTful API服务,处理图像加载、标注保存和格式转换

- 存储:图像文件存储在服务器本地文件夹,标注结果同时保存为JSON和YOLO格式

- 数据流:用户在浏览器中绘制标注 → 前端发送标注数据 → 后端保存并转换格式 → 前端实时更新状态

 

后端技术

- FastAPI:高性能Web框架,提供异步API服务

- Pillow:用于图像处理,获取图像尺寸

- Pydantic:数据验证,确保API数据格式正确

 

前端技术

- HTML5 Canvas:实现标注绘制功能

- 原生JavaScript:无框架依赖,轻量快速

- CSS3:响应式布局,适配不同设备

 

核心代码示例

 

后端API - 保存标注

@app.post("/api/save-annotations")

async def save_annotations(annotation_data: AnnotationData):

    """保存标注数据为JSON格式,并自动转换为YOLO格式"""

    try:

        # 从图像URL提取文件名

        image_url = annotation_data.image

        filename = image_url.split("/")[-1]

       

        # 创建标注文件名

        annotation_filename = f"{os.path.splitext(filename)[0]}.json"

        annotation_path = os.path.join(ANNOTATION_FOLDER, annotation_filename)

       

        # 保存标注数据为JSON

        with open(annotation_path, 'w', encoding='utf-8') as f:

            data_to_save = annotation_data.dict()

            data_to_save["saved_at"] = datetime.now().isoformat()

            data_to_save["image_filename"] = filename

            json.dump(data_to_save, f, ensure_ascii=False, indent=2)

       

        # 同时转换为YOLO格式

        yolo_filename = f"{os.path.splitext(filename)[0]}.txt"

        yolo_path = os.path.join(ANNOTATION_FOLDER, yolo_filename)

       

        # 获取图像尺寸并转换

        # ... 转换代码 ...

       

        return {

            "message": "标注保存成功,已同时生成JSON和YOLO格式",

            "json_filename": annotation_filename,

            "yolo_filename": yolo_filename

        }

    except Exception as e:

        raise HTTPException(status_code=500, detail=f"保存标注失败: {str(e)}")

 

前端 - 绘制标注

function handleMouseDown(e) {

    const rect = canvas.getBoundingClientRect();

    const x = (e.clientX - rect.left - offsetX) / scale;

    const y = (e.clientY - rect.top - offsetY) / scale;

   

    if (mode === 'draw') {

        isDrawing = true;

        startX = x;

        startY = y;

        currentRect = { x: x, y: y, width: 0, height: 0, label: currentLabel };

    } else if (mode === 'select') {

        selectedAnnotation = null;

        for (let i = annotations.length - 1; i >= 0; i--) {

            const ann = annotations[i];

            if (x >= ann.x && x <= ann.x + ann.width &&

                y >= ann.y && y <= ann.y + ann.height) {

                selectedAnnotation = ann;

                break;

            }

        }

       

        if (selectedAnnotation) {

            showEditModal();

        }

    }

   

    renderCanvas();

}

 

🚀 快速上手

 

1. 下载项目

git clone https://github.com/paidaxing-12138/web-labelimg.git

cd web-labelimg

 

2. 安装依赖

pip install -r requirements.txt

 

3. 配置图像文件夹

打开 `main.py`,修改以下两个路径为你自己的文件夹:

IMAGE_FOLDER = "/path/to/your/images"        # 存放待标注图像

ANNOTATION_FOLDER = "/path/to/your/labels"   # 存放标注结果(JSON和TXT)

> 支持常见的图像格式:`.jpg`, `.jpeg`, `.png`, `.bmp`, `.tiff`, `.webp`

 

4. 运行服务

python main.py

终端会显示:

INFO:     Uvicorn running on http://0.0.0.0:8000

 

5. 打开浏览器

访问 `http://localhost:8000`,开始标注吧!

 

📊 与LabelImg对比

 

| 特性 | LabelImg(桌面版) | Web LabelImg(网页版) |

|------|-------------------|-----------------------|

| 安装 | 需Python/QT环境 | 无需安装,打开浏览器即可 |

| 跨平台 | 需对应版本 | 任何设备,任何操作系统 |

| 数据共享 | 手动拷贝文件 | 集中存储在服务器,团队共用 |

| 标注格式 | 主要XML或TXT | 同时保存JSON和YOLO TXT |

| 进度管理 | 无 | 实时显示项目进度、统计信息 |

| 批量操作 | 手动切换图像 | "下一个未标注"一键跳转 |

| 标签管理 | 需编辑配置文件 | 界面直接增删改查 |

| 扩展性 | 有限 | 可轻松集成自动标注、协作等功能 |

 

🔮 未来规划

 

近期计划

- 多人实时协作:支持多个标注员同时标注,标注结果实时同步

- 自动标注辅助:集成YOLO预标注功能,标注员只需修正错误

 

中期计划

- 标注版本回溯:保留每次保存的历史版本,可随时回滚

- 导出更多格式:支持COCO、PASCAL VOC等常见数据集格式

 

长期规划

- 云存储集成:支持AWS S3、阿里云OSS等云存储服务

- AI辅助标注:利用深度学习模型自动识别和标注目标

 

💡 实际应用

 

案例展示

某AI公司使用Web LabelImg为其河流出口检测项目标注了5,000+张图像,相比传统LabelImg:

- 标注效率提升:从平均每小时标注50张提升到80张

- 团队协作:3名标注员同时工作,数据实时共享

- 格式转换:自动生成YOLO格式,直接用于模型训练

 

性能数据

- 响应速度:图像加载时间<1秒(5MB以内图像)

- 标注保存:保存操作<0.5秒,同时生成两种格式

- 系统负载:支持10人同时在线标注

 

📝 结语

 

Web LabelImg 旨在降低图像标注的门槛,提升团队协作效率。它不是一个替代LabelImg的工具,而是一个补充——当你需要多人协作、集中管理、快速部署时,Web版会是一个更好的选择。

 

如果你有任何建议或发现了Bug,欢迎在GitHub提Issue或PR。如果你觉得这个项目对你有帮助,不妨点个Star支持一下!

 

立即体验: `https://github.com/paidaxing-12138/web-labelimg`  

技术交流:欢迎在评论区留言讨论!

 

本文已同步发布在[个人博客]和[开发者社区]

 

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐