CVAT开源标注工具:Docker部署与目标检测图片标注实战指南
做目标检测项目时最琐碎又绕不开的就是图片标注。我试过好几种标注工具LabelImg单机凑合用Label Studio功能花哨但对大项目有点重直到换了CVAT才算找到顺手的工具开源免费浏览器直接用不需要给每台标注机器装客户端能多人协同导YOLO格式也方便加上Docker部署并不难。这篇文章我会把从零安装CVAT到完成一次图片标注的完整过程写下来重点是我实际踩过的坑和对应解法给准备自建标注工具的团队和个人开发者做个参考。内容不绕弯子直接给你能实操的东西。1. 项目概述与方案选型1.1 为什么选择CVAT做图片标注刚开始做目标检测标注时团队人少用LabelImg就够Python装个依赖、打开软件、框一下、填个标签简单直接。但人一多问题就来了标签定义不统一、每个人电脑上的标注版本对不上、图片分散在各自硬盘里最后合并标注文件的时候简直灾难。CVAT这种Web化的标注平台正好解决这些痛点。CVATComputer Vision Annotation Tool最初由Intel开源现在由社区持续维护主打的是“在浏览器里完成标注”后端用Django前端用React底层存储和任务调度走PostgreSQL、Redis、ClickHouse这套组合。它支持矩形框、多边形、关键点、语义分割等常见标注类型也支持自动标注模版比如用深度学习模型预打标最实用的是它能把标注结果导出成YOLO、COCO、VOC、TFRecord等多种格式基本覆盖了主流训练框架的需求。对我来说CVAT对中小团队最大的吸引力是“权限清晰、流程可控”管理员建项目标注员进任务标签统一由项目配置下发避免了大家各标各的。而且图片在服务器上集中管理最终导出时不需要人工合并。虽然部署起来比桌面版工具多几步但一次的投入换来长期省心值得。1.2 安装方式选型Docker Compose几乎是唯一解CVAT的安装方式主要有源码安装和Docker部署两种。源码安装需要你手动配Python、Node.js、PostgreSQL、Redis、OpenCV等一堆依赖过程很长而且CVAT版本迭代快依赖版本经常对不上非常痛苦。Docker部署就简单得多官方仓库里已经把Django后端、前端、Worker、数据库等容器编排好了一条命令就能拉起全部服务。在实际使用中我推荐优先使用Docker Compose方式。CVAT官方仓库提供了完整的docker-compose.yml你不需要关心单个服务怎么配置只需要保证宿主机装了Docker和Compose v2插件。CVAT支持CPU和GPU两种运行模式默认会尝试使用GPU做模型推理和自动标注如果没有NVIDIA显卡可以配置成纯CPU模式照样能跑只是自动标注和某些模型跑得慢一些。可能有人问我能不能在Windows上用Docker Desktop直接跑CVAT可以但我不建议生产环境这么干。Docker Desktop在Windows上跑Linux容器会有文件挂载和性能损耗而且CVAT用了不少Linux系统调用容易出现诡异权限问题。Linux服务器、Ubuntu系统、Docker Compose这是最稳的组合。1.3 硬件要求比我预想的高官方文档说CVAT“最低2核4G内存”这话听着轻松实际跑起来完全是另一回事。我第一次用一台1核2G的云服务器部署docker compose启动后内存立刻爆掉进程不断被OOM Killer杀掉。后来换成4核8G的机器才终于能正常打开界面。我的经验是如果只是几个人小规模用CPU至少4核、内存至少8G磁盘建议留出图片标注数据之外50G以上的空间。如果要做自动标注、训练分割模型内存最好16G以上并准备一块能跑CUDA的NVIDIA显卡。磁盘方面要注意CVAT会有任务缓存、数据库快照、日志等图片多的时候增长很快建议用单独数据盘避免系统盘被写满。2. 安装前准备环境与依赖2.1 Linux/macOS/Windows怎么选CVAT官方主打Linux部署我的建议是直接选一台Ubuntu 20.04或22.04的服务器。如果你只有Windows有两个路子一是装WSL2在WSL2内部安装Docker引擎无需Docker Desktop二是直接用虚拟机跑Ubuntu Server对新手来说虚拟机更直观也不容易踩坑。macOS也能跑但M1/M2芯片的ARM架构和部分Docker镜像兼容性一般如果是Apple Silicon建议先查一下CVAT官方是否已经有对应架构的镜像不确定的话还是用Linux稳妥。记住一点CVAT的Docker容器本身就是Ubuntu环境所以宿主机不必纠结是不是Ubuntu只要Docker能跑理论上都能部署。但我个人踩过坑CentOS 7的旧内核和Docker新版本有兼容问题大概率会在容器启动时报错所以能用Ubuntu就不要用别的。2.2 Docker与Docker Compose安装要点我以Ubuntu 22.04为例直接贴命令。如果你服务器上没有Docker可以运行sudo apt update sudo apt install -y ca-certificates curl gnupg lsb-release sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod ar /etc/apt/keyrings/docker.gpg echo \ deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin我强烈建议不要只装docker.io这个软件包它自带的Compose版本太老或根本没有。上面命令安装的docker-compose-plugin会提供docker compose命令注意是空格不是连字符CVAT所需功能基本都依赖新版Compose。装完以后把当前用户加入docker组不然每条命令前都要加sudosudo usermod -aG docker $USER newgrp docker然后验证docker --version docker compose version能正常输出版本号环境就OK了。2.3 可选NVIDIA GPU支持配置如果要用CVAT的自动标注功能或者后续打算在标注平台里跑Detector做预标注尽量让容器能访问GPU。这样需要先安装NVIDIA显卡驱动再安装nvidia-container-toolkit。驱动安装不展开说装好后用nvidia-smi确认。然后执行sudo apt install -y nvidia-container-toolkit sudo nvidia-ctk runtime configure --runtimedocker sudo systemctl restart docker之后启动CVAT容器时它就能自动调用GPU资源。如果不配置这一步CVAT也能跑但界面里的AI工具会明显变慢或者一直在等待状态。3. 一步步完成CVAT安装含踩坑3.1 拉取代码与目录准备CVAT安装的核心是官方Git仓库里的docker-compose配置。先把它克隆到服务器git clone https://github.com/cvat-ai/cvat.git cd cvat这里有个小提醒仓库很大包含了很多文档和示例数据克隆时如果网络不稳定可以加--depth1只拉最新版本git clone --depth1 https://github.com/cvat-ai/cvat.git进入目录后你会看到docker-compose.yml、docker-compose.override.example.yml等文件。CVAT默认的docker-compose.yml已经能跑起来但通常我们会复制一份override文件用来配置一些环境变量和端口cp docker-compose.override.example.yml docker-compose.override.yml如果不需要自定义也可以不复制直接用默认配置。我倾向于复制一份因为之后改端口、改异常日志级别都方便。3.2 配置文件与环境变量打开docker-compose.override.yml你可能会看到很多服务定义但多数不需要动。最常改的是CVAT_HOST这个环境变量。它决定你访问CVAT的地址默认可能是localhost。如果你通过IP或者域名访问就需要改成对应值。比如服务器IP是192.168.1.100可以这样设置services: cvat_server: environment: CVAT_HOST: 192.168.1.100注意这个改动可能不止出现在cvat_server服务里cvat_worker_import等也可能需要但现在CVAT版本统一从.env文件读取CVAT_HOST。更简洁的做法是在cvat仓库根目录创建.env文件写上CVAT_HOST192.168.1.100具体细节不同版本略有差异安装前可以看一眼README.md里的Docker Installation说明。我建议尽量使用官方仓库里已有的.env模版或者文档少自己发明配置项。另外一个重点项是端口。CVAT默认使用8080端口如果这个端口被别的服务占了可以在.env里加CVAT_PORT8081然后启动后访问http://IP:8081。3.3 启动容器与等待配置完之后执行docker compose up -d第一次启动会自动拉取很多镜像包含cvat_server、cvat_db、cvat_redis、cvat_worker_default等镜像总量可能超过10G需要耐心等一会儿。如果中途出现网络超时重试即可。启动完成后执行docker compose ps理想状态下所有服务都是Up。如果某个容器状态是Restarting多半是配置或者端口问题。此时先看日志docker compose logs cvat_server然后根据日志去排查。常见的错误是数据库连接失败这可能是因为数据库容器启动比服务端慢重启几次就正常了。最笨蛋的方法就是再执行一次docker compose restart。等所有容器都稳定运行后在浏览器输入http://localhost:8080或对应的服务器IP应该能看到CVAT的登录页面。3.4 创建管理员账号首次进入CVAT没有可用账号需要手动创建超级用户。执行docker exec -it cvat_server bash -c python3 manage.py createsuperuser按提示输入用户名、邮箱、密码。这里我踩过一个坑密码必须满足Django的校验规则不能全是数字或太短否则会报错。建议直接用强密码不然会卡在这一步。创建成功后回到浏览器用该账号登录就能看到CVAT的功能面板。到这里安装基本完成。但别高兴太早此时只是“能登录”真正好用还要看后续的任务、标注和导出。3.5 停止、升级与数据备份日常停止服务用docker compose down这个命令不会删掉数据因为CVAT把数据库和媒体文件做了volume挂载。它的数据存储在Docker volume里如果你跑docker compose down -v那所有数据可就真没了所以不要乱加-v。升级CVAT时先备份数据然后git pull docker compose pull docker compose up -d数据库结构有变更时CVAT容器启动时会自动做迁移通常没问题。不过升级前最好看一下官方Changelog有些大版本切换需要手动执行额外的迁移命令。4. 图片标注全流程实战4.1 创建标注任务并上传图片登录CVAT后左侧导航栏有“Projects”“Tasks”“Jobs”等模块。简单场景下可以直接创建一个Task不需要先建Project。但为了标签统一我建议先创建Project在Project里定义好标签再从Project创建Task。以Project为例点击“Create project”填名称然后在“Label”配置里添加标签类别比如person、car、dog。每个标签还可以设置颜色方便标注时肉眼区分。保存Project后进入该Project页点击“Create task”。Task创建时有几个关键选项Name任务名建议用日期加数据批次如2025-03-photos-part1。Segment size每个子任务Job包含多少张图可以设置成10或者20方便多人分片标注。Upload images这里选择要标注的图片文件。上传图片可以直接拖拽图床区域也可以上传压缩包。CVAT支持常见图片格式如果图片很大一次不要上传太多不然上传等待时间很长。我传过几千张高清图确实慢后来按批次拆分上传会好很多。创建完任务后点击Open会进入标注主界面。4.2 标注界面操作细节CVAT的标注界面是浏览器里的单页应用左侧是图片列表中间是当前图片画布右侧是标签面板。标注一个矩形框的基本操作选择右侧需要标注的标签如果标签多可以按快捷键比如数字1、2提前在Label设置里配置。回到画布按住鼠标左键拖动拉出一个矩形框松开即可。如果框没框好可以拖拽框的边角调整大小也可以整个拖动框的位置。对同一个目标如果类别选错了可以先点击框然后在右侧改成正确标签。按CtrlS保存当前Job的标注结果或者点击右上角保存按钮。如果你要标多边形物体选择Polygon然后逐点点击描边最后按Enter或双击闭合。关键点标注类似适合做人体关键点这类任务。这里不展开但CVAT基本把主流标注类型都覆盖了。有个很实用的功能是“自动标注模式”。在标注界面左侧有一个魔法棒或者AI图标可以用内置的模型自动生成预标注框然后人工做微调。开启后会调用服务器端的GPU做推理速度取决于你的硬件和模型大小。如果没有GPU不建议用不然一张图等十几秒效率反而低。4.3 保存与任务切换CVAT的标注结果会自动保存到数据库吗没那么智能。官方设计了“保存”动作通常按CtrlS保存当前Job。标注期间如果不保存直接切走可能会丢失最近的修改。我习惯每标完一张图就习惯性按一下CtrlZ撤销是另一回事保存一定要勤快。每个Job是任务的一个分片包含若干张图片。当前Job标注完成后通过左侧列表的下一个Job继续。多人标同一个任务时注意协调好分片避免大家同时改同一个Job。CVAT有任务锁机制但最好还是用Segment Size把每个Job分配清晰。4.4 导出YOLO格式的正确姿势标注完成之后需要把数据导出来训练模型。在Task列表页点击任务右侧的“Export dataset”会出现一个下拉框里面列出了很多格式包括COCO、VOC、YOLO等。直接选YOLO导出理论上会生成一个包含obj_train_data目录和obj.names、train.txt等文件的zip包。但实测下来YOLO导出对标签有序号映射要求比较严格如果Project里的标签顺序不对导出后训练时容易错乱。在这里我分享两个排坑点导出的obj.names里的标签顺序必须和labels.txt对应否则训练时模型预测的类别会错位。建议先手动打开YOLO标注的txt文件看第一列数字对应的类别是否正确。CVAT中的YOLO导出格式是每张图片生成一个同名txt文件内容为class_id x_center y_center width height归一化坐标。如果导出后发现坐标归一化有问题可以自己写个脚本转一下逻辑不复杂。如果你需要更稳定的转换控制可以安装Datumaro工具单独转换。CVAT本身内置了Datumaro组件通过UI导出的格式也是由它生成。如果碰到导出失败去服务器上看cvat_server容器的日志多半是某个图片文件缺失或者标签类型不支持。把报错提到的问题图去掉再导出基本就能解决。5. 踩坑记录你大概率也会遇到的7个问题5.1 容器启动慢或卡死的处理我第一次启动时cvat_server容器反复重启网页一直打不开。查日志发现PostgreSQL在初始化时很慢而Server端在等待数据库连接超时后报错。解决方法很简单多等几分钟或者主动重启一次cvat_serverdocker compose restart cvat_server如果容器一直卡在Executing migration plan那可能是数据库volume损坏。可以先备份再删除数据库volume重建。这个操作比较粗暴但回头看是省时间的。5.2 端口占用怎么办8080端口被Nginx或者其他服务占用的情况非常常见。这时候不要硬去停掉别的服务按我前面说的在.env里改端口CVAT_PORT8081 docker compose down docker compose up -d启动后留意访问地址变成http://IP:8081。Created Task里的图片链接是前端拼接的有些老版本会写死端口如果你的CVAT版本发现改了端口但图片加载不出来可能是CVAT_HOST和端口没同步好。解决办法是让CVAT_HOST包含端口例如192.168.1.100:8081改完重启服务。5.3 图片上传丢失或重复上传几百张图片时偶尔会看到“一些上传文件未处理成功”或者图片被重复识别。原因一般是上传过程中网络不稳定前端把图片发给Worker后Worker处理失败。这种情况我建议分批上传每次最多传200-300张并且上传完以后在任务里逐个浏览检查一下。还有一种情况上传的是压缩包CVAT能自动解压但如果包里面包含子目录可能导致目录结构被当作文件名存储导出时路径异常。所以最好把所有图片放在压缩包根目录不要有嵌套目录。5.4 标注框消失或无法保存这个问题多和浏览器缓存有关。如果标了框之后切到下一张图再回来框不见了先按CtrlS保存并刷新页面。如果仍然异常就换一个浏览器试试。Chrome和Firefox对CVAT兼容性最好Safari偶尔会有Canvas渲染bug。如果点击“Save”没反应查看浏览器开发者工具的控制台常见是某个API返回500。这时候要到服务器上查docker compose logs cvat_server。我记得有一次是任务里的标签ID冲突导致的删除任务重建后就好了。5.5 导出格式报错导出YOLO遇到Failed to export dataset是很常见的。点开日志看多数是文件路径中有空格或特殊字符或者图片数据有损坏。我的处理方法是先用小批次图片测试导出确认格式没问题再更新全量任务。另外一个持久化建议导出的压缩包最好及时从浏览器下载到本地因为服务器上长时间缓存可能被清理导致下载失败。5.6 磁盘空间暴涨CVAT是后端计算密集型应用日志、临时文件、数据库快照可能让磁盘迅速增大。特别是任务多、图片多时/var/lib/docker/volumes目录可能变成巨大垃圾场。定期检查一下磁盘df -h docker system df清理无用的构建缓存docker system prune -f注意不要随意删除volume。如果磁盘确实不够了可以参考官方文档把volume迁移到数据盘。我踩过因为磁盘写满导致数据库损坏的坑后来养成了每周检查一次磁盘的习惯。5.7 忘记管理员密码/权限问题如果忘记CVAT超级用户密码可以通过容器重置docker exec -it cvat_server bash -c echo from django.contrib.auth import get_user_model; Userget_user_model(); uUser.objects.get(username\你的用户名\); u.set_password(\新密码\); u.save() | python3 manage.py shell这个方法要是能通就不用重新部署了。权限方面普通标注员看不到项目设置需要管理员在成员管理里添加用户名并赋角色。第一次添加用户时可以在Admin面板里操作路径是http://IP:8080/admin/。5.8 常见问题速查表问题现象快速解决容器反复重启cvat_server不断重启查看日志等数据库就绪后restart8080端口被占浏览器无法访问修改.env里的CVAT_PORT并重启图片上传失败上传列表有失败项分批上传、去掉目录嵌套标注框不显示切图后框丢失CtrlS保存、换Chrome浏览器导出YOLO失败Export dataset报错检查文件名特殊字符、分小批测试磁盘爆满服务响应慢、数据库异常docker system prune、扩展volume忘记密码登录失败用shell命令重置密码这个表建议收藏基本覆盖了使用CVAT期间80%的突发事故。6. 经验总结与个人建议6.1 小规模标注的部署推荐如果你只是个人学习或者三五人小团队用我推荐部署在Ubuntu Server Docker Compose上规格至少4核8G数据盘留足50G。不要把CVAT装在Docker Desktop for Windows的默认虚拟机里坑太多了。标注图片的数据结构不要太乱上传前统一命名和格式最好先建几个小任务试跑整个流程再正式标注。6.2 后续可以这样扩展CVAT不是用完即弃的工具。项目多了以后你可以把“任务创建”自动化写一个Python脚本调用CVAT的REST API自动创建Project、Task把图片传进去再分给标注员。等标注完成后API拉取结果直接喂给训练脚本完整跑起数据处理管线。如果团队有二次开发需求CVAT提供了完整REST API文档在/api/下可以直接浏览。基于API做标注质量抽检、标签自动校验都是常见的扩展方向。甚至可以让标注结果实时推送到NATS或Kafka和平台解耦。最后分享一个我的个人体验CVAT的部署难点往往不在安装本身而在于你对Docker和Linux的熟悉程度。如果你之前不熟悉容器建议先花一小时把Docker的基本命令跑一遍。安装CVAT过程中遇到任何异常不要急着重装先看日志明确了原因再去动手。数据标注工具稳定的第一要素是环境稳定别三天两头去改底层配置。按照本文这套流程走配合踩坑记录排查大部分人都能在一两个小时内让CVAT跑起来。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →