当前位置:   article > 正文

【YOLO&Pytorch】从0开始的基于Pytorch的YOLO系列项目理论+实战部署03 VoTT数据标注工具标注视频数据集+YOLOX模型部署训练全过程(所有坑都遇到了并成功解决了)_vott yolo

vott yolo


系列前两篇:
【YOLO&Pytorch】从0开始的基于Pytorch的YOLO系列项目理论+实战部署01 pytorch环境的配置及安装
【YOLO&Pytorch】从0开始的基于Pytorch的YOLO系列项目理论+实战部署02 编辑器的配置

通过这篇文档完整演示如何使用VoTT工具标注自己的视频数据集以及在本地部署YOLOX模型并进行训练和测试。把整个过程遇到的所有坑都完整展示一遍,包括是如何解决问题的,相信能够帮助大家实际完成自己项目的部署。

下载和安装VoTT

这是搜索整理的开源数据标注工具
目前主要包括面向图像、视频、文本和声音四个方面。
其中图像的标注工具有以下的:
在这里插入图片描述
在这里插入图片描述
其中视频的标注工具有以下的:
在这里插入图片描述
文本的标注工具有以下的:
在这里插入图片描述

音频的标注工具有以下的:
在这里插入图片描述
这篇文章主要介绍VoTT的安装与使用方法。

下载与安装

点击VoTT的链接,进入下面的页面
VOTT
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到有对VoTT的介绍和使用教程,教程的话不用细看,我在这篇文章里面会说的很清楚。
在这里插入图片描述
点击上图中的release,点击
在这里插入图片描述
下载下来就是exe可执行文件可以直接使用,我把它放到D盘的program files里面

使用

首先我们在项目文件夹下面新建两个文件夹
一个命名为source,放源文件,一个命名为target 放处理后的文件
在这里插入图片描述
VoTT的界面长这个样子
在这里插入图片描述
我们点击左边的New Project图标
在这里插入图片描述
Display name 自己命名
Security Token选择它默认的
在Source Connection 中点击后面的Add Connection
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
点击 Save Connection

配置target Connection
在这里插入图片描述
配置好了以后别忘了在下拉框中选择
在这里插入图片描述
下面的Video settings是设置视频的FPS,即1秒钟多少帧,一般为了保证视频的流程,最低要30帧,也就是它把视频1秒钟切出30张图像,然后我们挨个去标注,如果是这样的话,一旦视频时长比较长的话,我们的标注工作量会非常大。这里我们先采用默认的设置15.

下面的tags标签,我们可以现在添加,也可以稍后添加,我们稍后再添加。

点击Save project
下面就进入了我们的项目,但是这里出现了问题
提示Unable to load assets就是无法加载资源
我查了一下,不少的说是视频格式,不是mp4格式的视频它没法读取,但是我这几个视频明明是.mp4,我抱着试试看的心态下载了格式转换工厂软件。
在这里插入图片描述
发现我的原始视频文件是mpeg4编码格式,然后我尝试着转换成h264编码的,结果就好了!
当然还有别的要注意的地方,就是source和target的文件夹路径里面不要有空格和中文
在这里插入图片描述
可以看到我们现在左上角有两个视频,有橘黄色标志的表示正在访问和播放的视频,有绿色标签的表示已经标注过的视频,可见我们的第一个视频还没有标注,我们首先在左上角点击,进入对它的标注。

点开是这样的,
在这里插入图片描述
大家可以首先看我勾选的1,点击播放图标,则视频开始播放
2有两个箭头,然后看到后面的进度条有黄色的竖线标志,还记得我们在开始创建项目里面设置的FPS吗,这里就是按我们设置的FPS将视频每一秒钟分隔成多少个帧,总视频有多少秒时长*我们设置的FPS就是我们这个视频要标注的帧数。是一帧一帧的逐个标注的。
然后再看3,左边的Tags标签显示了当前视频我们已经标注了多少帧,右边的像眼睛一样的Visited标签显示我们已经访问(播放到了)多少帧。
在这里插入图片描述
点击右上角的这个加号,即可添加标签的名字。
我们添加了car
在这里插入图片描述
点击上方的这个矩形框标志,就可以在视频的每一帧中标注了
在这里插入图片描述
我们在中间选择我们要标注的物体,拖动标注框将其覆盖上,然后到右边点击car,就标注上了,然后我们点击下面的向右的箭头,就可以选择下一帧,快捷键是我们选中目标后,Ctrl+1,比如我们选择的标签car是第1个标签,那么Ctrl+1就表示给我们选中的目标打上了car的标签。键盘的左右方向可以选择上一帧和下一帧。
在这里插入图片描述
我们已经标注了1500帧
下面就将标注数据导出

导出项目前,首先设置导出选项

在这里插入图片描述
首先就是导出的选项是啥。
一般是选择Json,但是这里因为我接下来要用YOLOX 的模型训练,因此我选择导出成为VOC 的格式
在这里插入图片描述
然后导出的资源,我们选择我们标注过的 Only tagged assets
下面自动生成了训练数据集和测试数据集的划分比例
在这里插入图片描述
然后我们点击这个导出我们标注的数据集
在这里插入图片描述
提示正在导出了,我们去target文件夹去看看
在这里插入图片描述

可以看到产生了一个“VoTT项目名称”+PascalVOC-export的文件夹

在这里插入图片描述
然后我们进入文件夹看看

在这里插入图片描述
用过Pascal VOC数据集的朋友们一定对这个文件夹目录无比熟悉。
导出过程比较长,咱们可以干别的事等一等。
OK,全部导出完了 咱们挨个文件夹看看
Annotations 与图片对应的xml文件
这个就是用XML文件保存的标注数据
在这里插入图片描述

IMageSet文件夹 将数据集分为训练集和验证集,因此产生的train.txt和val.txt
在这里插入图片描述

在这里插入图片描述
然后是 JPEGImages文件夹 数据集图片
在这里插入图片描述

用YOLOX模型训练

下载和配置YOLOX模型

在github上搜索YOLOX,点击下面这个最多star的项目在这里插入图片描述
我们点进去下载项目

然后将项目文件夹放到pycharm的工程路径

新建一个虚拟环境

conda create --prefix=D:\Anaconda3\envs\YOLOX python=3.8
  • 1

然后激活这个环境

conda activate D:\Anaconda3\envs\YOLOX        
  • 1

在vscode中打开requirement.txt,看看它对于环境的要求

pip install -r requirements.txt -i https://pypi.douban.com/simple
  • 1

下载完成

然后给项目配置这个环境

python tools/demo.py image -f exps/default/yolox_s.py -c ./weights/yolox_s.pth --path assets/dog.jpg --conf 0.3 --nms 0.65 --tsize 640 --save_result --device gpu

  • 1
  • 2
import sys
import os
oscurPath = os.path.abspath(os.path.dirname(__file__))
rootPath = os.path.split(curPath)[0]
sys.path.append(rootPath)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
>python demo.py image -f exps/default/yolox_s.py -c ./weights/yolox_s.pth --path assets/dog.jpg --conf 0.3 --nms 0.65 --tsize 640 --save_result --device gpu    
  • 1

报错,
在这里插入图片描述

pip show Pillow
  • 1

在这里插入图片描述
突然想到是不是因为没有装matplotlib

pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
  • 1

装了,还是不行
关闭pycharm,重启

重装Pillow

>pip install Pillow==9.3.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
  • 1

再输入

python demo.py image -f exps/default/yolox_s.py -c ./weights/yolox_s.pth --path assets/dog.jpg --conf 0.3 --nms 0.65 --tsize 640 --save_result --device gpu 
  • 1

这次可以了在这里插入图片描述
在YOLOX_output下面生成了对实例图像的预测

用自己的数据集进行训练与测试

将VoTT生成的target文件夹里面的文件放yolo项目里面
在这里插入图片描述
在这里插入图片描述

训练准备:把我们自己的数据集放进去

训练准备:修改训练配置参数

1.修改类的标签与数量
注意路径
我的路径是:YOLOX-main/yolox/data/datasets/voc_classes.py
在这里插入图片描述
在这里修改类的标签
我们只有一个类,car
所以改成如下形式,注意别忘了car后面的逗号

在这里插入图片描述
再去这个路径:YOLOX-main/exps/example/yolox_voc/yolox_voc_s.py
在这里插入图片描述
改Exp类下面的self.num_classes 改成1

然后再去改 YOLOX-main/yolox/exp/yolox_base.py
在这里插入图片描述
还是将self.num_classed=80改成=1
2.修改训练集的信息
YOLOX-main/exps/example/yolox_voc/yolox_voc_s.py中
在这里插入图片描述
data_dir改成数据集放的路径在这里插入图片描述
下面的max_labels改成1
在这里插入图片描述
另外就是在读取txt的YOLOX-main/yolox/data/datasets/voc.py
找到127行
改成如下
在这里插入图片描述
3.修改验证集的信息
在YOLOX-main/exps/example/yolox_voc/yolox_voc_s.py
第44行开始
在这里插入图片描述
4.修改网络参数
YOLOX-main/yolox/exp/yolox_base.py
第24行
在这里插入图片描述
self.depth=0.33
self.width=0.50

5.修改其他参数
YOLOX-main/yolox/data/datasets/voc.py文件
第244行
在这里插入图片描述
改成下面
在这里插入图片描述
到时候结果会输出在datasets文件夹中的results文件夹

YOLOX-main/yolox/exp/yolox_base.py文件
第92行和第95行
在这里插入图片描述
改成下面的
在这里插入图片描述
设置为每迭代一个epoch,即使用验证集验证一次

6.修改验证时的相关信息
YOLOX-main/yolox/data/datasets/voc.py中

第278、279 283行
在这里插入图片描述
改成下面:
在这里插入图片描述
第289行
在这里插入图片描述
改成
在这里插入图片描述

修改完后执行python setup.py install重载代码。

python setup.py install
  • 1

开始训练

下面就是关键的一步,在终端中输入命令开始训练

python tools/train.py -f exps/example/yolox_voc/yolox_voc_s.py -d 1 -b 
8 -c weights/yolox_s.pth

  • 1
  • 2
  • 3

下面一个个说
tools/train.py 是训练的程序
-f exps/example/yolox_voc/yolox_voc_s.py 是voc的模型
-d 1 是device 设备 有几块GPU 我有一块就写1
-b 8 是batchsize
-c weights/yolox_s.pth是预训练模型

报错了
AttributeError: ‘VOCDetection’ object has no attribute ‘cache’
在这里插入图片描述

重新配置环境和项目文件
报了两个错

在这里插入图片描述
在这里插入图片描述
上网搜,参考这个链接
添加链接描述
把命令行改成

python train.py -f exps/example/yolox_voc/yolox_voc_s.py -d 1 -b 8 -c weights/yolox_s.pth  
  • 1

解决问题 ,-f -c我之前是直接复制的路径

又报了两个错
在这里插入图片描述

第一个错误
重写数据集的txt文件 我的代码如下,供大家参考

import os
import random

trainval_percent = 0.5
train_percent = 0.9
xmlfilepath = 'VOCdevkit/VOC2007/Annotations'
txtsavepath = 'VOCdevkit/VOC2007/ImageSets/Main'
total_xml = os.listdir(xmlfilepath)

num = len(total_xml)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)

ftrainval = open('VOCdevkit/VOC2007/ImageSets/Main/trainval.txt', 'w')
ftest = open('VOCdevkit/VOC2007/ImageSets/Main/test.txt', 'w')
ftrain = open('VOCdevkit/VOC2007/ImageSets/Main/train.txt', 'w')
fval = open('VOCdevkit/VOC2007/ImageSets/Main/val.txt', 'w')

for i in list:
    name = total_xml[i][:-4] + '\n'
    if i in trainval:
        ftrainval.write(name)
        if i in train:
            ftest.write(name)
        else:
            fval.write(name)
    else:
        ftrain.write(name)

ftrainval.close()
ftrain.close()
fval.close()
ftest.close()
  • 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
  • 34
  • 35
  • 36

第二个错误 !!!很多人都遇到过,去这个dataset_wrapper里面把定位到的那三行函数给 注释掉就行了

后面又报 eps的错误
在YOLOX-main/yolox/data/datasets/voc.py
第138行

 # path_filename = [(self._imgpath % self.ids[i]).split(self.root + "/")[1] for i in range(self.num_imgs)]
  • 1

注释掉
改成

path_filename = []
        for i in range(self.num_imgs):
            path_filename.append((self._imgpath % self.ids[i]).split(self.root + "/")[0])
  • 1
  • 2
  • 3

然后再运行train.py
就ok了
我们可以看最后这个代码是什么问题

(self._imgpath % self.ids[i])
  • 1

这是一个Python代码片段,用于拼接字符串和对象属性值。

代码中使用了字符串格式化(也称为字符串插值)的语法,将一个字符串中的占位符替换为对象属性值。在Python中,字符串格式化使用百分号(%)作为占位符,后面跟着一个冒号(:)来指定要替换的属性名称。

在这个例子中,self._imgpath是一个字符串,它包含了需要用对象属性值替换的占位符。self.ids[i]是一个整数或字符串类型的对象属性值,它将被插入到self._imgpath字符串的相应位置。

因此,整个代码片段的意思是,将self._imgpath字符串中的占位符(例如%s)用self.ids[i]替换,然后得到一个新的字符串。

举个例子,假设有一个名为MyClass的类,其中有一个名为ids的列表和一个名为_imgpath的字符串属性。如果MyClass的实例名为my_instance,并且my_instance.ids[0]等于’image1.jpg’,那么执行(self._imgpath % self.ids[i])会返回’image1.jpg’。

然后训练到第十轮开始验证的时候又报错如下
在这里插入图片描述
在这里插入图片描述
一个是AP=0 另一个是ValueError: invalid literal for int() with base 10: ‘571.5333215440583’
在网上查了下 发现不少人都遇到这个问题,比如这篇博客
ValueError: invalid literal for int() with base 10:解决方法

原因:由于python不能直接将包含小数点的字符串转化为整数,而原始数据的格式经常是不一致的,故类型转化时造成ValueError异常。
解决方法:先将字符串转换为浮点数float,在将浮点数转化为整数int

我们定位到程序YOLOX-main/yolox/evaluators/voc_eval.py

 obj_struct["bbox"] = [
            int(bbox.find("xmin").text),
            int(bbox.find("ymin").text),
            int(bbox.find("xmax").text),
            int(bbox.find("ymax").text),
        ]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这明显是标注框bounding box的四个参数
我们改成

obj_struct["bbox"] = [
            int(float(bbox.find("xmin").text)),
            int(float(bbox.find("ymin").text)),
            int(float(bbox.find("xmax").text)),
            int(float(bbox.find("ymax").text)),
        ]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

至于AP=0的问题,很多人也遇到了,这篇文章非常全面,值得参考

https://blog.csdn.net/weixin_42166222/article/details/119637797

明显问题是出现在我们的数据集上
我们逐个检查
1.dataset文件夹下面的VOC2007是否是按照VOC的格式部署的,ImageSet文件的Main文件下面是否有train.txt和test.txt文件,我们有的
在这里插入图片描述

2.yolox/data/datasets/voc_classes.py文件下是我们自己定的类的名字,我们也有,car
在这里插入图片描述
3.yolox/exp/yolox_base.py self.num_classes=1,这里也是对的
在这里插入图片描述

4.对yolox/data/datasets/voc.py 下的 _do_python_eval 方法进行修改
在这里插入图片描述
这里我也是对的

5.exps/example/yolox_voc/yolox_voc_s.py
首先是 self.num_classes=1,
在这里插入图片描述
然后get_data_loder 下的 VOCDetection 下的 image_sets
image_sets=[(‘2007’, ‘trainval’)],
在这里插入图片描述
最后发现问题在这里!!!
get_eval_loader 下的 VOCDetection 下的 image_sets
不能是test!!!!可以看到我的是错的
在这里插入图片描述
应该改为
在这里插入图片描述

一定要修改为 image_sets=[(‘2007’, ‘val’)],因为我们验证的数据在val.txt,而不是test.txt,这应该也是为什么 AP 一直为0的原因

然后我们再试,果然就成功了
在这里插入图片描述
在pycharm终端输入

tensorboard --logdir=YOLOX-main/YOLOX_outputs/yolox_voc_s/train_log.txt
  • 1

可视化过程
在这里插入图片描述
在这里插入图片描述
报错
首先试着改一下绝对路径

>tensorboard --logdir=E:\PycharmProjects\YOLOX\YOLOX-main\YOLOX_outputs\yolox_voc_s\train_log.txt

  • 1
  • 2

还是不行
在这里插入图片描述
改成

tensorboard --logdir=E:\PycharmProjects\YOLOX\YOLOX-main\YOLOX_outputs\yolox_voc_s\    
  • 1

OK了
在这里插入图片描述
然后就等它训练完就行了
可以看到在YOLOX_outputs路径下有
在这里插入图片描述
在这里插入图片描述

进行测试

首先找到YOLOX-main/tools/demo.py
第15行

from yolox.data.datasets import COCO_CLASSES
  • 1

在这里插入图片描述
改成:

from yolox.data.datasets import voc_classes
  • 1

第105行

class Predictor(object):
    def __init__(
        self,
        model,
        exp,
        cls_names=COCO_CLASSES,
        trt_file=None,
        decoder=None,
        device="cpu",
        fp16=False,
        legacy=False,
    ):
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

改成:

cls_names=voc_classes.VOC_CLASSES,
  • 1

还有第306行

 predictor = Predictor(
        model, exp, COCO_CLASSES, trt_file, decoder,
        args.device, args.fp16, args.legacy,
    )
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述
把COCO_CLASSES改成
voc_classes.VOC_CLASSES

改完以后如下:

predictor = Predictor(
        model, exp, voc_classes.VOC_CLASSES, trt_file, decoder,
        args.device, args.fp16, args.legacy,
    )
  • 1
  • 2
  • 3
  • 4

然后我们去YOLOX_outputs路径下找到:
在这里插入图片描述
然后把它复制到weights文件夹下面

在这里插入图片描述
然后把demo.py文件复制到YOLOX项目的根目录,这样可以避免一些路径报错

再检查一下:
YOLOX-main/exps/example/yolox_voc/yolox_voc_s.py
第28行是否有VOCDetection
在这里插入图片描述
第43行
在这里插入图片描述
第54行
在这里插入图片描述
都没问题
然后检查

YOLOX-main/yolox/data/datasets/init.py
在这里插入图片描述

from .voc import VOCDetection
  • 1

没问题

然后YOLOX-main/yolox/evaluators/init.py
在这里插入图片描述

from .voc_evaluator import VOCEvaluator
  • 1

没问题
加入

from .voc_class import VOC_CLASSES
  • 1

最后!!!准备开始测试了。三种方法
1.通过命令行
之前说了把demo.py放在项目根目录了

demo.py video -f exps/example/yolox_voc/yolox_voc_s.py -c weights/best_ckpt.pth --path assets/bayland_occlusion_plane_gimbal_1_camera_image_raw_compressed_Cut01.mp4  --conf 0.3 --nms 0.65 --tsize 640 --save_result --device gpu
  • 1

报错
在这里插入图片描述
去YOLOX-main/yolox/evaluators/init.py
改成

from yolox.data.datasets.voc_classes import VOC_CLASSES
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/213408
推荐阅读
相关标签
  

闽ICP备14008679号