AlibabaResearch / efficientteacher

A Supervised and Semi-Supervised Object Detection Library for YOLO Series
GNU General Public License v3.0
823 stars 147 forks source link

Killed #18

Closed PHI6kai closed 1 year ago

PHI6kai commented 1 year ago

image 配置完全按照您说的进行,但是出现了Killed的情况是因为dataloader workers开多了还是?

BowieHsu commented 1 year ago

@PHI6kai 您好,可以看一下启动时候的显存占用吗?watch -n 1 nvidia-smi

lonelyzyp commented 1 year ago

@PHI6kai 您好,可以看一下启动时候的显存占用吗?watch -n 1 nvidia-smi 你好!我在使用自己的数据集训练时,python val.py --cfg configs/sup/custom/yolov5s.yaml --weights weights/efficient-yolov5s.pt(自行转换)可以正常进行。 当我使用python train.py --cfg configs/ssod/custom/yolov5s_custom_ssod.yaml训练时,此时yaml中weights指向您提供的efficient-yolov5s.pt 问题1:出现以下问题,并且在扫描完target的无标签数据后,不再向下进行 python train.py --cfg configs/ssod/custom/yolov5s_custom_ssod.yaml

OSError: [WinError 1455] 页面文件太小,无法完成操作。 Error loading "D:\Anaconda\envs\yolov5_ssda2\lib\site-packages\torch\lib\caffe2_detectron_ops_gpu.dll" or one of its dependencies. File "D:\Anaconda\envs\yolov5_ssda2\lib\site-packages\torch__init__.py", line 124, in raise err OSError: [WinError 1114] 动态链接库(DLL)初始化例程失败。 Error loading "D:\Anaconda\envs\yolov5_ssda2\lib\site-packages\torch\lib\caffe2_detectron_ops_gpu.dll" or one of its dependencies. target: Scanning 'data\ear3000_angel\train2400unlabels' images and labels...2400 found, 0 missing, 0 empty, 0 corrupted: 100%|█| 2400/2400 [00:24<00:00, 98.68it/s] image

问题2:当我使用window server2019,进行同样的复现时,可以进行训练,使用CPU,无法调用GPU。出现这种情况 warnings.warn('User provided device_type of \'cuda\', but CUDA is not available. Disabling') image

BowieHsu commented 1 year ago

@lonelyzyp 老师您好,我用ChatGPT查了一下第一个问题,以下是回复,我觉得说得比我要全面一些: 问题1: 这个错误通常是由于缺失或者损坏了依赖的动态链接库(DLL)文件导致的。具体来说,这个错误信息是在尝试加载文件"D:\Anaconda\envs\yolov5_ssda2\lib\site-packages\torch\lib\caffe2_detectron_ops_gpu.dll"时出现的,而这个文件依赖的其他文件中有一个或多个文件无法正常加载。

解决这个问题的方法可能有以下几种: 确认DLL文件存在且路径正确。可以检查一下该DLL文件的路径是否正确,以及是否存在于该路径下。如果文件不存在,则需要重新安装相关的软件包或者重新下载并安装缺失的DLL文件。 更新依赖库。如果缺失的是依赖库,可以尝试更新依赖库,以确保所有依赖库都是最新版本,并且能够相互兼容。 检查环境变量。检查一下系统环境变量中是否包含了需要的DLL文件路径。如果没有,可以手动将其添加到环境变量中。 重新安装软件包。如果以上方法都无法解决问题,可以尝试重新安装相关的软件包,以确保所有依赖项都已正确安装,并且可以相互兼容。

问题2: 这个错误通常是由于在尝试使用CUDA时,没有安装或配置正确的CUDA环境所致。CUDA是一种用于GPU加速计算的平台,如果你的机器上没有安装或者没有正确配置,那么就会导致这个错误。

在这个错误信息中,你的代码尝试使用了设备类型为'cuda'的设备,但是CUDA没有被正确安装或配置。因此,程序会自动禁用CUDA并转而使用CPU来执行计算。

要解决这个问题,你可以尝试以下几个步骤: 检查你的机器是否安装了CUDA。如果没有安装,你需要下载并安装CUDA。 检查CUDA是否正确配置。如果CUDA已经安装,但是仍然出现这个错误,那么你需要检查CUDA是否正确配置。你可以参考CUDA的官方文档来正确配置CUDA。 确保你的代码能够正确地使用CUDA。如果你的机器上已经安装了CUDA并正确配置,但是仍然出现这个错误,那么你需要确保你的代码能够正确地使用CUDA。你可以参考CUDA的官方文档来了解如何正确使用CUDA。 如果你不需要使用CUDA,可以将设备类型设置为CPU。 注意,使用CUDA需要具备一定的硬件和软件条件,例如需要支持CUDA的GPU和适当版本的CUDA驱动程序。如果你不确定是否需要使用CUDA或者如何正确使用CUDA,建议查阅相关文档或向社区寻求帮助。

lonelyzyp commented 1 year ago

@BowieHsu 感谢您的回复! 另外在问题1中,这台本地机器可以val验证,此时可以调用用GPU的。只是显示OSError: [WinError 1455] 页面文件太小,无法完成操作(我修改虚拟内存后仍无法避免)

主要问题是:完成target Scanning对应数据集后,无法进一步训练的,请问这个问题的原因是什么,如何解决正常训练呢 image

BowieHsu commented 1 year ago

@lonelyzyp 看起来像是内存不足的原因,请问一下您这台机器原来跑训练是没有问题的对吧,如果是这样的话,那有可能是我们的代码在造target数据集时占用了太多内存,麻烦您在控制台看一下运行到这里时的内存占用状况,由于我们的代码是在linux环境运行的,所以您提的很多问题我可能也无法回答,我还是请教了一下Chat老师:

截屏2023-03-10 上午11 40 36
lonelyzyp commented 1 year ago

@BowieHsu 您好,感谢您之前的回复。再次请问: 问题1:我想从头开始训练用我的数据,进行完整流程的训练,比如此时我可以设置epoch:200,burn_epoch: 100。包括100epoch有监督,100epoch无监督训练。;那么此时configs/ssod/custom/yolov5s_custom_ssod.yaml文件权重文件weights指向哪一个呢,1,不指向,2指向您提供的efficient-yolov5s.pt作为预训练训练pt. 3是比如我转换而来的,已经训练过的300epoch的pt呢。我应当参考您哪一部分的yaml伪基础作为修改呢

问题2:请问线程控制:num_workers 默认为16吗,为了降低对target伪标签过多机器RAM的占用,在24GB RAM情况下使用(我可以扩增到48GB),,如何修改为8或者4呢,控制参数在哪里呢 捕获 图片显示为在另一台机器的RAM占用情况 问题3: 参考您的这篇回复https://github.com/AlibabaResearch/efficientteacher/issues/6#issuecomment-1451351670 当我使用debug: True为了直观看到伪标签, 出现找不到'/mnt/bowen/EfficientTeacher/unbias_teacher_pseudo_label.jpg'的错误,引文本地的确不存在这个路径。请问是需要在self_supervised_utils.py修改相同的路径为本地实际文件位置吗,比如本地训练文件保存位置G:\python_workspace\efficientteacher\yolov5_ssod\exp7 不使用debug: True时不出现此错误,目的是直观看一下伪标签的分布与产生情况。

lonelyzyp commented 1 year ago

@BowieHsu 老师您好!请问 1.单个类别训练,下图这样的训练过程是否正常呢,(此时仅修改yaml中hyp下 lr0为0.001、 teacher_loss_weight: 1.0) image 2.另外此时tensorboard展示的val损失函数为0,是否正常,是什么问题呢 image 3.修改官方YOLOv5模型框架的pt可以转成本项目的ET模型吗?可以依赖本项目进行训练吗(实现在已经在官方模型的基础上,改进网络结构,在依赖本项目的半监督学习,实现递进训练)

BowieHsu commented 1 year ago

@lonelyzyp 您好,val_loss那里写残了,所以先注释掉了,log里就没有记录,我解决一下

lonelyzyp commented 1 year ago

@BowieHsu 老师您好!请问 1.单个类别训练,下图这样的训练过程是否正常呢,(此时仅修改yaml中hyp下 lr0为0.001、 teacher_loss_weight: 1.0) image 2.另外此时tensorboard展示的val损失函数为0,是否正常,是什么问题呢 image 3.修改官方YOLOv5模型框架的pt可以转成本项目的ET模型吗?可以依赖本项目进行训练吗(实现在已经在官方模型的基础上,改进网络结构,在依赖本项目的半监督学习,实现递进训练)

请问针对上个问题的val损失曲线为0,那么lr0如何没有匹配使用任何优化器吗,可以使用SGD优化器吗,初始学习率修改为0.001,余弦退火,是怎么使用的呢

lonelyzyp commented 1 year ago

@lonelyzyp 您好,val_loss那里写残了,所以先注释掉了,log里就没有记录,我解决一下

感谢您的回复!即使您注释掉了val loss,但是可以证明目前我的验证训练是正常的对吧,因为没看到学习率的变化,是不是我自己哪方面没设置好

BowieHsu commented 1 year ago

@lonelyzyp 在半监督训练时,学习率是不下降的,我们是通过EMA来控制收敛的。

lonelyzyp commented 1 year ago

@lonelyzyp 在半监督训练时,学习率是不下降的,我们是通过EMA来控制收敛的。

感谢,我犯了一个基础性错误。 还想请问您如何修改小num_workers,同时产生伪标签少一些,实现在较小RAM基础上复现本项目,避免超出memoryerror( cv2.error: OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\core\src\alloc.cpp:73: error: (-4:Insufficient memory) Failed to allocate 6750000 bytes in function 'cv::OutOfMemoryError')

BowieHsu commented 1 year ago

@lonelyzyp 可以尝试在Dataset下面添加workers=4,尝试一下,这个应该可以控制dataloader里面的worker数量

lonelyzyp commented 1 year ago

@lonelyzyp 可以尝试在Dataset下面添加workers=4,尝试一下,这个应该可以控制dataloader里面的worker数量 @BowieHsu 老师您好: 请问在复现其他数据集时,300张有标签,2400无标签,验证集300。lr0:0.001,teacher_loss_weight: 1.0 ,其他保持yolov5s_custom_ssod.yaml默认,出现以下几类情况: 问题1:损失函数曲线收敛不理想,请问如何调整呢。 问题2:训练指标在200epoch后大多不提升或提升很少,最后反而下降,不如有监督学习部分。应该从哪方面考虑呢(数据集太小,还是部分参数需要结合实际优化) 下图为训练各指标曲线图 image 下图为log训练结果图 image

BowieHsu commented 1 year ago

@lonelyzyp 您好,您现在有一份能够训练出复合要求效果的有监督训练的超参吗,从我们的经验来看,您这种状态最好先把有监督的训练跑通,然后加上半监督,使用这样的控制变量法来进行调参,这是我们认为事实上最快的定位方案。

BowieHsu commented 1 year ago

@lonelyzyp 我们正在制作相关的教程,我先尝试给您解释一下大概的原因哈,首先正常的有监督训练时,learning rate是会随着epoch的增加的逐渐下降的,所以我们一般在tensorboard上都会看到learning rate下降,loss下降,mAP上升的现象,这背后的本质实际上学习率小的时候,梯度更新不那么剧烈了,参数所代表的网络最终收敛在了一个梯度平面上。而在半监督的训练方案中,尽管我们做了很多实验,但是最终都发现,需要让student的学习率控制在一个定值才会有好的表现,所以我们转而尝试去控制EMA,通过让EMA的更新逐渐放缓,来让teacher最终收敛在一个梯度面上。 所以这边还是建议首先跑一个实验,这个实验最好是加载预训练模型的,然后设置一定的学习率变化策略,也就是lrf一般设置为0.1,然后跑一次这个实验,我们得到一个网络A在验证集上的指标 在获得了网络A后,我们将lrf改为1.0,然后粘贴上半监督的配置,就可以通过和A的对比来发现当前哪部分有问题了。 过程有点麻烦,希望对您有帮助。

lonelyzyp commented 1 year ago

@lonelyzyp 我们正在制作相关的教程,我先尝试给您解释一下大概的原因哈,首先正常的有监督训练时,learning rate是会随着epoch的增加的逐渐下降的,所以我们一般在tensorboard上都会看到learning rate下降,loss下降,mAP上升的现象,这背后的本质实际上学习率小的时候,梯度更新不那么剧烈了,参数所代表的网络最终收敛在了一个梯度平面上。而在半监督的训练方案中,尽管我们做了很多实验,但是最终都发现,需要让student的学习率控制在一个定值才会有好的表现,所以我们转而尝试去控制EMA,通过让EMA的更新逐渐放缓,来让teacher最终收敛在一个梯度面上。 所以这边还是建议首先跑一个实验,这个实验最好是加载预训练模型的,然后设置一定的学习率变化策略,也就是lrf一般设置为0.1,然后跑一次这个实验,我们得到一个网络A在验证集上的指标 在获得了网络A后,我们将lrf改为1.0,然后粘贴上半监督的配置,就可以通过和A的对比来发现当前哪部分有问题了。 过程有点麻烦,希望对您有帮助。

感谢您的回复,我将按照给的提示继续试验验证,后续再和您共同探讨

PHI6kai commented 1 year ago

已经解决,在训练时候启动会出现多个进程并不会被杀死,在kill所有进程之后会正常训练运行。

lonelyzyp commented 1 year ago

@lonelyzyp 我们正在制作相关的教程,我先尝试给您解释一下大概的原因哈,首先正常的有监督训练时,learning rate是会随着epoch的增加的逐渐下降的,所以我们一般在tensorboard上都会看到learning rate下降,loss下降,mAP上升的现象,这背后的本质实际上学习率小的时候,梯度更新不那么剧烈了,参数所代表的网络最终收敛在了一个梯度平面上。而在半监督的训练方案中,尽管我们做了很多实验,但是最终都发现,需要让student的学习率控制在一个定值才会有好的表现,所以我们转而尝试去控制EMA,通过让EMA的更新逐渐放缓,来让teacher最终收敛在一个梯度面上。 所以这边还是建议首先跑一个实验,这个实验最好是加载预训练模型的,然后设置一定的学习率变化策略,也就是lrf一般设置为0.1,然后跑一次这个实验,我们得到一个网络A在验证集上的指标 在获得了网络A后,我们将lrf改为1.0,然后粘贴上半监督的配置,就可以通过和A的对比来发现当前哪部分有问题了。 过程有点麻烦,希望对您有帮助。

您好!在您给的建议下,我进行了试验查看,目前发现,大部分情况下第一行student相关精度低于teacher的相关精度(请问是不是正常来讲,应该中后期学生比教师高,才能正向优化教师),最终完整训练的结果mAp0.5:0.896,与只在监督训练下best指0.893几乎没有差别,也与完整训练(400=burn200+ssod200)第199last epoch0.8811 和best 0.89区别不大。 单类别,平均40目标每个图片。在使用30%,800多张的情况下,再引入2000多张无标签图片。没有预想的半监督学习的提升检测效果; 个人分析原因,请指正:(1)本人数据集,单一目标,数目较多,特征较明显,即使在少量数据集的下情况下,已经学习到足够的特征,无标签数据已经补充不了过多的特征信息了. (2)产生的伪标签过多,如下图80gt_num几乎是真实的2倍。干扰了有效标签,比如都是大目标标签框,忽略了小标签框和重叠隐藏的目标 请问接下来如何调整参数实现突破呢,正在进行降低学习率的研究:lr0为0.0001。可以更改nms_iou可行吗

image

BowieHsu commented 1 year ago

@lonelyzyp 您好,感谢您做了这么多详细的实验,我来尝试回答一下: 1.第一个是关于pse_num和gt_num的,pse_num是指训练时每副图上生成的伪标签个数,由于我们在训练时做了mosaic,所以这个数值一般是每副图的pseudo labels的2-3倍,看起来是比较正常的,第二个gt_num是指得分大于高阈值的reliable pseudo labels的个数占所有pseudo labels的占比,这个看起来也是正常的 2.您所谓的单一目标是指所有的目标都是长得一样的状态吗?然后这些无标签图片和标注图片之间的差异也不太大?这边有一个比较快速的验证方案——用半监督的模型和全监督的模型在无标签数据集上推理渲染对比一下就可以知道两者的差距了,因为我们的半监督方案其本质是一种对抗“过拟合”,所以在没有额外信息引入的情况下,网络性能是无法获得巨大提升的。 3.接下来是我们尝试让客制化任务快速提升的建议:训练时加载我们提供的COCO预训练权重,然后学习率调整为0.001,先burn_in 10个epoch,这个方案的本质也是让COCO权重在迁移学习过程中减轻遗忘灾难,这样就可以最大化利用预训练模型的能力来满足您的要求。

lonelyzyp commented 1 year ago

@lonelyzyp 您好,感谢您做了这么多详细的实验,我来尝试回答一下: 1.第一个是关于pse_num和gt_num的,pse_num是指训练时每副图上生成的伪标签个数,由于我们在训练时做了mosaic,所以这个数值一般是每副图的pseudo labels的2-3倍,看起来是比较正常的,第二个gt_num是指得分大于高阈值的reliable pseudo labels的个数占所有pseudo labels的占比,这个看起来也是正常的 2.您所谓的单一目标是指所有的目标都是长得一样的状态吗?然后这些无标签图片和标注图片之间的差异也不太大?这边有一个比较快速的验证方案——用半监督的模型和全监督的模型在无标签数据集上推理渲染对比一下就可以知道两者的差距了,因为我们的半监督方案其本质是一种对抗“过拟合”,所以在没有额外信息引入的情况下,网络性能是无法获得巨大提升的。 3.接下来是我们尝试让客制化任务快速提升的建议:训练时加载我们提供的COCO预训练权重,然后学习率调整为0.001,先burn_in 10个epoch,这个方案的本质也是让COCO权重在迁移学习过程中减轻遗忘灾难,这样就可以最大化利用预训练模型的能力来满足您的要求。

@BowieHsu 博主您好!又来请教您一些问题了。 问题1:在自己的单类别密集数据集上,我目前无法实现利用您ET项目下,进行YOLOv5s版本监督训练时,实现和官方YOLOv5相同或接近的性能:举例,我使用2000张训练集,200张验证集合,在官方v5能够达到93%左右,在ET下进行监督训练时,最优仅能达到90%,差距还是很明显的。,但是我目前进行10%、20%、30%这种规模下的监督训练时,两个项目分别训练的指标是比较接近的,差距在0.5%上下,排除误差是接近的。但是无法实现全部标签数据集下(相同的验证机val),复现出相似的检测评价指标。那么请问,出现这种情况的原因有哪些呢,我是用您提供的COCO初始权重,官方v5使用提供的默认pt。我需要进行哪些操作调整呢,两个项目之间的超参数均使用默认的,没有对ET项目的参数进行修改,是否需要调整和官方相一致,需要哪些部分呢。

问题2:正是因为上述原因,当时没有明白并实现您之前提供的建议,即:找到一份能够训练出符合要求效果的有监督训练的超参。所以出现了第一个问题,在经过这些天的整理后,明白了您当时的建议。所以造成进行半监督时,无法得到有效提升,在ET项目下,进行监督训练和半监督训练时,无法体现半监督的在少量标签的情况下,保证检测性能。 image

问题3:我曾复现其他老师在开源论文对v5的改进方法,分别在官方V5和ET项目下v5进行了小改动,同样无法实现ET项目v5训练结果,不能接近别人的效果。 因为个人时间和能力,进展较慢,现在后知后觉这个三个问题的严重程度。请博主不吝赐教!

lonelyzyp commented 1 year ago

@BowieHsu 老师您好,可否提供一份在ET模型下进行SUP和SSOD使用的,与官方YOLOv5s的5.0或者6.0版本相一致的超参数呢。因为我对比您进行的参数调优,还包括了不同于官方v5使用的loss,即GIOU。可以 设置 iou_type: ciou,但是 giou: 0.05需要修改吗? 请您查看一下我所按照YOLOv5官方参数,在ET下所做的调整,是否符合在ET模型下进行并于v5官方的参数一致呢。 目的是分别通过您ET模型监督训练,对比官方v5训练。当前在相同数据集下,无法实现在ET进行监督训练的结果,不能接近直接使用官方v5

EfficientTeacher by Alibaba Cloud

Parameters

project: 'runs_yolov5' adam: False epochs: 300 weights: 'efficient-yolov5s.pt' #使用预训练权重 prune_finetune: False

linear_lr: True

linear_lr: False # yolov5 hyp: lr0: 0.01 hsv_h: 0.015 hsv_s: 0.7 hsv_v: 0.4

lrf: 0.1

lrf: 0.2 # yolov5

scale: 0.9

scale: 0.5 # yolov5 no_aug_epochs: 0

mixup: 0.1

mixup: 0.0 # yolov5

warmup_epochs: 0

warmup_epochs: 3 # yolov5

Model: depth_multiple: 0.33 # model depth multiple width_multiple: 0.50 # layer channel multiple Backbone: name: 'YoloV5' activation: 'SiLU' Neck: name: 'YoloV5' in_channels: [256, 512, 1024] out_channels: [256, 512, 1024] activation: 'SiLU' Head: name: 'YoloV5' activation: 'SiLU' anchors: [[10,13, 16,30, 33,23],[30,61, 62,45, 59,119],[116,90, 156,198, 373,326]] # P5/32] Loss: type: 'ComputeLoss'

cls: 0.3

cls: 0.5 # yolov5

obj: 0.7

obj: 1.0 # yolov5 anchor_t: 4.0 iou_type: ciou # ciou moren giou Dataset: data_name: 'coco' train: data/labels.txt # 118287 images val: data/vallabels.txt # 5000 images test: data/vallabels.txt # 20288 of 40670 images, submit to https://competitions.codalab.org/competitions/20794^ nc: 1 # number of classes np: 0 #number of keypoints names: [ 'x'] img_size: 640 batch_size: 8 workers: 8 #指定线程为4,否则默认为16