DVC通过生成.dvc文件来追踪数据集,可以把这个.dvc文件理解成“钥匙”,找到了“钥匙”也就可以打开“宝藏”(目标数据集),而过多的.dvc文件又容易造成混乱,因此引入git来管理.dvc文件,也就是说git并不是在管理“宝藏”,而是在管理“钥匙”,真正的“宝藏”放在了“remote”所指向的位置,也就是我们的“宝藏”仓库,这个仓库就是DVC所支持的各种存储方式,如本地存储、s3存储、ssh存储等。DVC工作逻辑图如下
DVC数据存储
Dvc安装及项目初始化
实验环境:
Ubuntu 22.04.1
anaconda虚拟环境
建议安装前创建一个新的虚拟环境,在python 3.7+上创建环境:
conda install git
pip install dvc(建议使用 pip --default-timeout=600 install dvc,600为超时时间,单位是秒,如果还是不成功建议加大时间)
使用ssh远程仓库存储需要再执行一步:pip install dvc[ssh],用以补充安装ssh所需要的工具包。
文件跟踪
准备工作:
git初始化:
git init
也可直接git clone一个自己的远程版本库,如:
git clone http://***.***.***.***/*********/test.git (-b 指定分支,不添加默认是main分支)
使用conda activate your_env_name激活环境
第一步:数据集准备,以检测数据集为例,初版数据集为纯图像
第二步,将数据放入git clone出的文件夹中
数据追踪
第一步,执行命令cd test切换至git目录下
这里我们可以执行ls -al命令查看当前目录下的所有内容
第二步,执行命令dvc init进行dvc初始化
这里我们可以执行ls -al命令查看当前目录下的所有内容
此时我们可以看到当前文件夹下生成了一些新的内容
第三步,执行dvc remote add --default myssh ssh://root@***.***.***.***:22/home/ssh-test命令设置远程仓库的位置(ssh远程仓库,类似于服务器)
此命令格式如下
dvc remote add --default your_storage_name ssh://your_user_name@your_ip:your_port/your_storage_location_in_ssh_server
第四步,执行dvc remote modify myssh user root命令设置用户名
此命令格式如下
dvc remote modify your_storage_name user your_user_name
第五步,执行dvc remote modify myssh port 22命令设置端口号(ssh使用22号端口)
此命令格式如下
dvc remote modify your_storage_name port your_port
第六步,执行dvc remote modify --local myssh password adminadmin命令设置用户密码
此命令格式如下
dvc remote modify --local your_storage_name password your_password
第七步,执行dvc add data命令对数据集进行跟踪
此命令格式如下
dvc add your_dataset
这里我们可以执行ls -al命令查看当前目录下的所有内容
第八步,执行git add .dvc .dvcignore data.dvc .gitignore命令将这些文件添加入git缓存
此命令格式如下
git add your_file1 your_file2等
第九步,执行git commit -m “初版数据集,有2张图像,且未标注”命令添加签名
此命令格式如下
git commit -m “your_message”
第十步,执行git push命令,将文件提交入git仓库
这里我们可以打开gitlab仓库,查看是否更新成功
第十一步,执行dvc push命令,将数据文件提交至ssh远程仓库
此时ssh远程仓库中便被传入了数据
到了这里便完成了数据追踪
数据拉取
这里我们使用另一台电脑,称之为电脑2,进行测试
第一步,执行conda activate your_env_name命令激活环境
第二步,执行git clone http://***.***.***.***/*******/test.git命令克隆一个远程仓库到本地
第三步,执行cd test命令切换到克隆下来的本地仓库
此时我们可以执行ls -al命令查看当前目录下的文件
第四步,执行dvc remote modify --local myssh password adminadmin命令配置本地密码
第五步,执行dvc pull命令下拉数据
此时我们可以使用ls -al命令查看当前目录下的文件
到这里便完成了数据下拉
数据迭代
我们还是在电脑2上继续操作这里我们往data数据集中加入xml标签
加入前:
加入后:
完成数据迭代后执行以下步骤完成数据迭代
第一步,执行dvc add data命令重新生成data.dvc文件
第二步,执行git add data.dvc命令,将新生成的data.dvc文件添加入git缓存中
第三步,执行git commit -m “增加了图像标注”命令,提交签名
第四步,执行git push将缓存内容提交至git远程仓库
此时我们可以查看git仓库,检查是否完成更新
第五步,执行dvc push命令将数据文件推送至ssh远程仓库
到了这一步便完成了数据迭代,接下来我们切换回本机,下载由电脑2工控机更新的数据集
数据迭代后拉取:
拉取之前我们先查看一下本地文件,使用ls -al命令查看文件目录,再cd data进入data目录执行ls命令查看当前数据集内容
第一步,使用git pull命令下拉git仓库更新后的文件(只要在test目录之中即可,不用非得切换入data目录)
我们可以执行cd ..命令后执行ls -al命令查看data.dvc文件是否更新
第二步,执行dvc pull下拉数据
此时可以打开data目录查看是否完成更新
后续我们可以调整标注,继续迭代数据集
第一步,打开labelimg调整标注,这里我们新增”ceshi”标注类别
第二步,执行dvc add data
第三步,执行git add data.dvc
第四步,执行git commit -m “调整了标注,增加了ceshi标注类别”
第五步,执行git push
第六步,执行dvc push
切换至电脑2工控机,下拉数据
第一步,执行git pull下来更新的dvc文件
第二步,执行dvc pull下拉数据
这里可以直接打开xml文件查看是否更新完成
到了这里就完成了git+dvc的基础操作,接下来是进阶操作
版本回退
应用场景:不使用最新版本数据,想要使用前面版本的数据进行训练
这里以本机电脑为例,当前本机数据集为修改完标注的数据集
第一步,执行git log查询git提交日志(按q退出)
这里红色框内的字符串类似于每个版本的”身份证号”,我们可以选择想要回退的版本的身份证号,这里以回退到”增加了图像标注”版本为例,复制其”身份证号”
第二步,执行git reset --hard <上图红框内的ID>命令,进行版本回退
此命令格式如下
git reset --hard your_wanna_version_ID
第三步,执行dvc pull下拉数据
此时我们可以打开xml文件查看是否为对应的标签,通过对比发现,当前的xml文件中新增的ceshi标注类别已经消失
这里我们就完成了版本回退,需要注意的是,在这个节点中执行git log是无法查看到最新版本的ID的,因此尽量不要关闭窗口,如果关闭了窗口可以执行git reflog查看历史记录
红框内就是最后一个版本的ID,执行git reset --hard 288fccd即可回到最后一个版本
到了这里我们就完成了版本回退操作
版本回退后新建分支
应用场景:同一版本数据集发展出两个版本的新数据集,如一个版本需要调整标注,另一个版本需要添加neg数据,这里我们还是以倒数第二个数据集为例,我们已经有一版修改过标注的数据集,这里我们再创建一版增加了neg数据的数据集
第一步,执行git branch add_neg命令在倒数第二个节点创建新的分支
此命令格式如下
git branch your_new_branch_name
第二步,执行git checkout add_neg切换至新增加的分支
此命令格式如下
git checkout your_new_branch_name
第三步,新增neg数据
第四步,执行dvc add data命令,追踪新的数据集
第五步,执行git add data.dvc命令添加至git缓存中
第六步,执行git commit -m “在倒数第二个数据集上增加了neg数据”命令增加签名
第七步,执行git push origin add_neg命令提交新分支
这里我们可以查看git远程仓库是否更新完成
第八步,执行dvc push命令,上传数据
这里我们完成了多分支数据集管理,下面我们切换到电脑2,尝试分别拉取这些版本的数据集
多分支数据集拉取
首先我们在电脑2上拉取add_neg分支的数据
第一步,执行git pull命令,更新本地仓库
第二步,执行git checkout add_neg命令,切换分支
第三步,执行dvc pull命令下拉增加了neg数据的数据集
此时我们查看data中的文件发现多了两张图象
然后我们再拉取main分支上最后一个,即两张图像两张标签且增加ceshi标注的版本:
第一步,执行git checkout main命令,切换到main分支
第二步,执行dvc pull命令,下拉数据集
此时我们查看一下当前的数据集
最后,我们再拉取main分支上倒数第二个数据集,即未增加ceshi标注的版本:
第一步,执行git log命令查看更新日志
第二步,执行git reset --hard <ID>命令切换到main分支的倒数第二个节点
第三步,执行dvc pull命令,下拉数据
此时我们查看data文件夹的内容,可以看到ceshi标注已经消失
执行到此,我们已经完成了所有dvc涉及到我们业务逻辑的操作,另外结束操作后,记得返回到main分支最后一个节点,如果忘记了,且使用git reflog命令也无法查询到最后一个节点的ID也不要惊慌,只需要把本地的test文件夹删了,重新git clone一份下来即可。
常用命令汇总
git:
git clone:下载git地址文件,可以使用-b指定分支
git add:添加缓存
git commit:提交
git push:上传至仓库
git log:查看git日志
git reset:返回某一个版本
git reflog:显示可引用的版本记录
git pull:下拉git仓库
git branch:分支管理
git checkout:分支切换
dvc:
dvc init:dvc初始化
dvc add:对文件添加跟踪
dvc remote:配置原始数据存放位置
dvc push:推送数据
dvc pull:下拉数据
注意事项
- 切记下拉数据前使用dvc remote default查看是否存在数据源,如果不存在记得执行dvc remote add -d local_remote /home/data/
- 如果出现误操作不要着急,只要不执行git push操作,就不会影响版本管理,哪怕是对数据集进行了误删操作,并且执行了dvc push也不要紧,此时在data文件夹中并不会删除对应的图像文件,只要没有git push该版本的dvcimg.dvc文件,就不会产生该废数据集的版本记录,可以直接把当前git文件夹删掉,重新git clone一份新的即可。
- git commit时尽量描述清楚每个数据集的作用
- 安装dvc时即使设置了超时时间,依然可能安装失败,此时如果还是报httpconnect的错误可以再将安装命令执行一次,如此反复就能安装成功