Pruned-OpenVINO-YOLO
Pruned-OpenVINO-YOLO copied to clipboard
About trained from AlexeyAB
May I ask you, when I do sparse training, can I use AlexeyAB trained .weights?
In other words, the basic training part is trained by the YOLO framework maintained by AlexeyAB, and the sparse training is used by a well-trained AlexeyAB .weight model.
Because when I use your code for basic training, it often fails to converge. (YOLOv4)
It is feasible, only adding L1 regularization to AlexeyAB's training code. However, with the help of tools such as tensorboard, it is more convenient for us to jJudge the completion of sparseness Relatively speaking, Pytorch is more convenient. And because there are many differences between AlexeyAB's training strategy and Pytorch's, it is recommended that all training be completed in Pytorch. The model trained by Pytorch has been tested that the accuracy is completely acceptable in OpenVINO
@TNTWEN
Why do I need to add L1 regularization? Your basic training is not explained in detail, or even instructions. I refer to the basic training: https://github.com/tanluren/yolov3-channel-and-layer-pruning The following are the instructions used in my basic training: The yolov4.weights used here is also from the pre-trained model provided by AlexeyAB, and the github I referred to above is also taught in this way.
But it uses yolov4.weights directly without adding L1 regularization and not retraining.
The following are the instructions I used in my basic training.
python train.py
--cfg cfg/yolov4-license_plate_color.cfg
--data data/license_plate_color/license_plate_color.data
--weights weights/yolov4.weights
--batch-size 16
--epochs 150
--device 0,1
When my training is complete, I use your detect.py to detect the video and get bad results. I don't know why.
I'm doing basic training again on your side, but the pre-trained model I used is from AlexeyAB I trained.
英文不好表示,我想表示的是,我現在是拿在AlexeyAB訓練好的模型來您這邊進行基礎訓練並將它當成預先訓練好的模型。 請問您可以添加更多關於基礎訓練的說明嗎? 請問您使用的Python版本是多少?
哦,你说的是基础训练啊
我在readme中推荐的两种基础训练方式: Recommended:
- The pruning code used below also supports basic training ★ 也就是使用https://github.com/TNTWEN/Pruned-OpenVINO-YOLO/tree/main/Pruneyolov3v4
- https://github.com/ultralytics/yolov3/tree/archive
比如你可以下载AlexeyAB提供的预训练模型 yolov4.weights
然后在https://github.com/TNTWEN/Pruned-OpenVINO-YOLO/tree/main/Pruneyolov3v4 这里做基础训练,使用方法就像
python train.py --cfg cfg/yolov4-license_plate_color.cfg --data data/license_plate_color/license_plate_color.data --weights weights/yolov4.weights --batch-size 16 --epochs 150 --device 0,1
我用的是python3.6,其他需要的库可以查看https://github.com/TNTWEN/Pruned-OpenVINO-YOLO/blob/main/Pruneyolov3v4/requirements.txt
之前pytorch版本和AlexeyAB的训练策略基本上是一样的,确实是认为可以使用AlexeyAB 做基础训练,再在pytorch中做稀疏训练。但后来ultralytics修改增加了许多训练策略,与AlexeyAB的训练策略相差越来越大,导致使用AlexeyAB 训练出的模型,在Pytorch中稀疏训练效果很差。所以现在普遍认为所有的操作都在pytorch下完成效果会好些。
@TNTWEN 明白 您推荐的2種基礎訓練,似乎第2種沒有支持YOLOv4,因此我使用的是您第1種來進行基礎訓練 請問使用他的Github: https://github.com/tanluren/yolov3-channel-and-layer-pruning 來進行基礎訓練可行嗎?
是的,我就是下載AlexeyAB提供的預訓練模型來進行基礎訓練,但我在您這裡: https://github.com/TNTWEN/Pruned-OpenVINO-YOLO/tree/main/Pruneyolov3v4 完成基礎訓練後,使用以下指令直接在您的資料夾裡面使用detect.py來檢測影片:
python detect.py
--source test.mp4
--cfg cfg/yolov4-license_plate_color.cfg
--weights weights/last.pt
但output的影片效果不好,我正在找原因,請問我使用的指令正確嗎? 我還發現訓練完畢後的best.pt檔案是last.pt的兩倍大,是因為沒有量化嗎?(因此我使用last.pt)
那如果說,我在AlexeyAB的darknet框架先訓練好字自義的模型,再拿其模型拿來您這邊: https://github.com/TNTWEN/Pruned-OpenVINO-YOLO/tree/main/Pruneyolov3v4 做一次基礎訓練,是可行的嗎?這個意思就好像原本我應該下載AlexeyAB提供的預訓練模型(yolov4.weights)來進行基礎訓練,替換成我自己在AlexeyAB的darknet框架自己訓練好的自定義模型,因為yolov4.weights也是在AlexeyAB的darknet框架所訓練的。 雖然有多了一個步驟,但我實驗的目的是因為我下載AlexeyAB提供的預訓練模型(yolov4.weights)來您這進行基礎訓練後效果不好
請問基礎訓練時,.cfg檔案裡面的shape 416 416或是608 608會影響基礎訓練嗎? 我看size是在train.py裡面寫了default值416了
第二种基础训练方式是支持yolov4的 https://github.com/tanluren/yolov3-channel-and-layer-pruning使用的是旧版本的ultralytics/yolov3,训练时间很长,https://github.com/TNTWEN/Pruned-OpenVINO-YOLO/tree/main/Pruneyolov3v4是基于新版本的ultralytics/yolov3,训练效果更好
output的影片效果不好 ? 可能你需要修改一下置信度
best.pt檔案是last.pt的兩倍大 ?
在训练过程中权重文件保存了epoch等信息,都是两倍占用空间,可以通过执行命令python -c "from models import *; convert('cfg/yolov3.cfg', 'weights/last.pt')"转换为darknet weights去除掉epoch信息或者在最后一个epoch会自动去掉epoch信息。 不过一般还是推荐全部使用last.pt
那如果說,我在AlexeyAB的darknet框架先訓練好字自義的模型,再拿其模型拿來您這邊: https://github.com/TNTWEN/Pruned-OpenVINO-YOLO/tree/main/Pruneyolov3v4
做一次基礎訓練,是可行的嗎?
是可行的,只要你把模型放在https://github.com/TNTWEN/Pruned-OpenVINO-YOLO/tree/main/Pruneyolov3v4 再跑一下基础训练,训练到不错的map,也就可以了 (也就是让模型适应一下pytorch的训练方式)
請問基礎訓練時,.cfg檔案裡面的shape 416 416或是608 608會影響基礎訓練嗎? 我看size是在train.py裡面寫了default值416了
不影响,不用管.cfg里的shape
@TNTWEN 感謝您的細心解說, 我正在實驗中, 不知道是Dataset出問題或是Python版本與Package版本上差異的問題, 我使用AlexeyAB的darknet框下做基礎訓練完成後的.weight拿來您這邊做測試(測試集),
python test.py --weights weights/yolov4-license_plate_best.weights --cfg cfg/yolov4-license_plate.cfg --data data/license_plate/license_plate.data --device 0,1
[email protected]: 0.995 F1: 0.968
然後拿此.weight當作Pre-trained model來您這邊做基礎訓練簡單測試3個Epoch後得到的last.pt(目的如您所說為了適應Pytorch的訓練), 我也做一次測試(測試集) python test.py --weights weights/last.pt --cfg cfg/yolov4-license_plate.cfg --data data/license_plate/license_plate.data --device 0,1
但, [email protected]: 0.663 F1: 0.654
我試過訓練了150個Epoch,[email protected]掉到了0.5, 目前還不知道問題出在哪裡,是image size在test的時候使用的是512嗎?因為訓練時是使用416的Shape, 很神奇的是我在AlexeyAB的darknet框架下做基礎訓練後的模型可以直接在您這邊做detect.py,影片效果很不錯!
@jackypeng95 每个人的数据集等情况不一样,可能实验的效果也不同,既然你detect的结果很不错,那就直接把这个AlexeyAB的模型直接拿来用试试看,不用再在pytorch做基础训练了。
我之前也遇到过类似的情况,不过是pytorch训练地不错的模型,在AlexeyAB里训练,map就变得很糟糕
@TNTWEN
我目前已經在新的3090 GPU上使用您提供的策略第1階段的基礎訓練完成,從0開始訓練到結束,完美適應了Pytorch的訓練環境,[email protected]來到了非常漂亮的0.99。
我的類別只有1個,訓練數據達4萬筆,驗證數據僅500筆。
緊接著我去掉epoch訊息,接續稀疏訓練階段,起初我的指令如下,
python train.py --cfg cfg/license_plate/color/yolov4-license_plate.cfg --data data/license_plate/color/license_plate.data --weights weights/baseline_training/last.weights --batch-size 16 -sr --epochs 300 --s 0.001 --prune 1
[email protected]隔天來看發現降至0已久,忘了紀錄訓練到第幾個epoch,接著衰減學習率0.1,繼續實驗,
python train.py --cfg cfg/license_plate/color/yolov4-license_plate.cfg --data data/license_plate/color/license_plate.data --weights weights/baseline_training/last.weights --epochs 300 --batch-size 16 -sr --s 0.0001 --prune 1
[email protected]隔天來看發現降至0已久,大約訓練到了第30 epoch,[email protected]開始從0.99向下降低,0.7,0.6,0.4,0
我繼續降低了學習率為0.00001,繼續實驗中,但我有一個疑問,
我的類別只有1個,會需要降低到如此低的學習率(Learning Rate)才能成功稀疏訓練嗎?每個個案情況都有所不同嗎?
若是官方訓練的80類別的YOLOv4,請問您當初是使用--s 0.001進行稀疏訓練完成的嗎?
@jayer95
s的设置是根据自己的数据集的训练结果,慢慢调整的,我的实验中也只有两个类别,不过我的数据集很庞大 训练集54647张 ,测试集22998张。
我看到你的测试集图片数量似乎很小 稀疏的过程精度会下降,如果测试集图片很少,某种程度上在指标上放大了精度的损失,让你不能精细地评估map指标。
我目前总结下来,这套剪枝代码对于yolov3通用性比较强,而训练yolov4需要比较大的训练集和测试集,才能取得好一些的效果
@TNTWEN 請問數據集大小如何定義?你說你5萬4千多張算是龐大,我的數據集有4萬張算是很小嗎?不太明白 需要多大的訓練集才足夠?
[ 某種程度上在指標上放大了精度的損失,讓你不能精細地評估map指標 ] 請問這句話能否稍微詳細點解釋,我想了解與改善辦法,是否可以透過prune策略的改變來改善? 或是一直降低學習續繼續實驗嗎?又或者我應該去參考這兒:https://github.com/tanluren/yolov3-channel-and-layer-pruning 我會比較偏向是使用YOLOv4,我看他甚至還有提供Tiny版本的剪枝,請問您有試過Tiny的嗎?
@jayer95 你的测试集有多大? 是只有448张吗,我看到你test只用了两秒
tiny版本效果很差,本来tiny版本检验框稳定性和精度就很低,再剪枝效果更差了
@TNTWEN 我的測試集是一個具有指標性論文的考試題目,因為我希望模型訓練能夠獲取更多Data的特徵,因此我就沒有切出測試集出來 我的測試集是指Validation Set,一般應該稱為驗證集還是測試集? 我可以隨時加大,這個測試集會影響稀疏訓練的過程嗎?因為我以前在AlexeyAB訓練YOLO時他的mAP function是可選擇開與不開,不影響整體訓練,因此我一直都偏向將大部分的數據都擺到Training Set,但也許我的看法是錯誤的,需要與您討論 我原本會切8:2,9:1,9.5:0.5,請教您的建議是如何? 您指的測試集(or驗證集)會影響稀疏訓練的策略嗎?如果會我可以隨時加大,我還有自型做資料稱強的20萬筆數據
@jayer95 简单说,你的测试集很小,其内容和你4W张图片的训练集相比极有可能过于片面。 在稀疏训练时候,模型的精度在正常情况下会慢慢下降趋于稳定(最后还可能会慢慢提升),而因为你的测试集很小,测试出的map直接下降到0,然而实际上模型精度并没有那么差,map=0是由于测试集数量不够且过于片面 导致的,此时的map是不准确,不具有参考价值的。
你可以试试按照7:3 的比例随机划分。 这样才有可能使用map指标准确而精细地评估你的模型
@TNTWEN 原來如此,所以mAP=0或許到200 epoch時精度就回升了? 所以我測試時應該讓他跑完全部300 epoch再做評估而不是降到0 mAP就重新訓練對吧? 那測試集的數據不影響整體訓練對吧,只具有參考性? 請教您,訓練集直接挪去測試集會造成訓練不週嗎? 即是訓練集存在的數據也剛好存在測試集
@jayer95
- 比如训练300 epoch,程序会自动在210 epoch和 270epoch时候减小学习率,学习率的减小会让map慢慢回升
- 学习率learning rate 不是设置的参数s,你之前的描述中可能理解有些偏差,s是稀疏化力度的一个参数
- 只要你的数据集不是出现很多很多重复的数据,按照7:3的比例随机划分数据集后,并不会导致训练不过。 测试集不参与训练,不会影响模型,但是是准确合理评估模型的工具,这样你的map指标才有参考价值。
- 一般来说还是不希望看到map=0这种情况,这是不正常的情况。比如基础训练得到的map为0.9,那么在0~210epoch时,你的模型map下降到0.7左右然后稳定,那还是可以接受的,如果下降得再厉害点比如0.5,说明稀疏力度过大,你应该调小参数s,重新训练。 如果在0~210epoch之间map下降到0,一般认为是异常现象,没有必要继续训练下去,210~300epoch也不太会让map回升,此时应该及时停止,调小s,重新训练。
- 判断稀疏是否成功是看tensorboard的直方图的,如何判断我在readme中有介绍。 总而言之,稀疏训练要兼顾map指标和tensorboard中的图
- 每个人的数据集不一样,遇到的情况也不同。在实验中很有可能不管怎么调整s的值,map都下降地很多,比如从0.9下降到了0.3~0.4,但只要不出现map=0的情况,并且tensorboard图中显示稀疏化是成功的,那都是可以勉强接受的。可以把这个稀疏训练之后的模型去剪枝,然后finetune。往往finetune会让map大幅回升。
@TNTWEN 我完全明白了,我拿BDD100K來實驗,到時再來討論&分享,感謝!
@TNTWEN
請問在這裡做的基礎訓練,能夠重新計算並修改Anchors嗎?若是能,請問在哪裡修改?是.cfg檔裡嗎?
希望這次可以順利!
@TNTWEN 這次訓練的情況, 訓練集: 約35萬張圖片 測試集: 約2.5萬張圖片 基礎訓練到[email protected]持續十幾個Epoch都是約0.45時自認為完成基礎訓練。(約訓練到40個Epoch)
接著,稀疏訓練時到第16幾個Epoch時, P, R, [email protected]皆降至0持續好幾個Epoch,我停止並重新訓練,調整稀疏訓練的力度由0.001調至0.0001,
python train.py --cfg cfg/bdd100k/mixing/yolov4-bdd100k.cfg --data data/bdd100k/mixing/bdd100k.data --weights weights/bdd100k_baseline_training/last.weights --epochs 300 --batch-size 20 -sr --s 0.0001 --prune 1
但這一次到第6個Epoch時,P, R, [email protected]皆降至0,下圖是截圖至results.txt,
請問這樣正常嗎?
不知道為什麼我用3090訓練起來感覺特別費時,10個小時才跑了5個Epoch,想請問您這樣的速度正常嗎?
1:我用3090测试过,10W张图片需要50min训练,你的训练速度应该是正常的
关于训练 1:你可以测试集不动,训练集减至10W左右,再做一次实验 ,看看map还会不会下降地那么快 2:稀疏过程中,tensorboard中bn_weights的分布直方图也很重要,https://github.com/TNTWEN/Pruned-OpenVINO-YOLO/blob/main/assets/image-20201114105332649.png,你可以分享一下你这次实验的bn_weights的分布直方图
@TNTWEN
原本我懷疑我的PyTorch與3090的CUDA&cuDNN沒有安裝好,我檢查了環境配置發現CUDA用了10.2(但訓練時3090的24G記憶體是有消耗的情況)
後來參考此篇重新安裝了PyTorch與3090的訓練環境,速度好像也沒感覺到變特別快,Batch甚至可以下到52
https://blog.csdn.net/qq_15602569/article/details/109232265
我有測試用PyTorch做基礎訓練或稀疏訓練時,用剩餘的GPU記憶體訓練AlexeyAB,造成PyTorch端訓練速度變很慢!
BDD100K我在做基礎訓練時沒有跑完指令設定的150Epoch,只跑了30幾,看mAP不再上升後即停止,不確定這是否會有影響後續的稀疏訓練
關於訓練
- 好的,訓練集不要用到30W這麼多張嗎? 那請問基礎訓練需要重來嗎?
- 由於我將訓練主機放置在遠端,過年期間我嘗試用tensorboard指定port網址但我依然取得不了,因為防火牆阻擋了,我重新設定後再與您報告
- 感謝您,新年快樂,由於YOLOv4的稀疏訓練實驗一直受挫,我有開始訓練YOLOv3-spp,想觀察看看是否真的是YOLOv4訓練支援不完全
新年快乐!
- coco数据集80个类别训练集才10W张,感觉你的训练集有些多,我也不确定这是否会对训练出来的模型造成影响,但减少训练集之后,会节省很多训练时间,算力充足的话建议跑一下基础训练,跑60~70个epoch也就差不多了
- tensorboard看直方图判断是否成功稀疏很重要。 YOLOv4的稀疏剪枝成功的人很少,YOLOv3-SPP适应性会好很多。
- 我也咨询过很多大佬,他们在实际使用中采取基础训练后直接剪枝(也就是不进行稀疏训练)然后把剪枝后的模型从头开始训练,如何加载预训练模型可能要试验试验。这个我没有实验验证过。
@TNTWEN
- 好的,我將BDD100K訓練集由30萬筆調整成10萬筆的計劃排序再下一步,目前的算力我用在訓練另一個只有一個類別(車牌)的Dataset,訓練集有20萬張,測試集有5萬張,因為看到您建議10萬張之前我已經按下去訓練,因此先跑完基礎訓練吧,且我這次用的是YOLOv3-spp
請問跑基礎訓練時,指令設定120 epoch,但我觀察訓練到40 epoch左右時,mAP已經達到理想的水準,我中斷基礎訓練,並用python -c "from models import *; convert('cfg/yolov3-spp.cfg', 'weights/last.pt')"轉換last.pt to last.weights後,接著直接進行稀疏訓練會有影響稀疏訓練嗎?還是一般建議跑完最初設定的目標epoch比較好?如果會影響,那我是不是基礎訓練一開始就不必設到120或更高的epoch,就像您所說設定60~70就好?
以下是此次車牌的基礎訓練
@jayer95 你的模型精度已经很理想了,基础训练可以提前停止。就用目前的数据集试试是否可以正常稀疏吧 基础训练提前停止没什么影响,剪枝完成后恢复精度时,设置110~120epoch,才需要尽量跑满
@TNTWEN 沒問題,開始稀疏訓練,想請教您,我剛才意外中斷了稀疏訓練,請問我該如何接續訓練? 是直接使用最新包含 Epoch 信息的 last.weights 接續訓練嗎? "--weights weights/last.weights" 但我發現假設訓練到 25/299 Epoch,使用以上方式接續稀疏訓練它會從 0/299 開始,那我是不是應該在 "--epochs 300" 的參數上更改為 "--epochs 275" 並且使用 "--weights weights/last.weights" 接續訓練?
因為我有看到您的README上有建議稀疏練時建議不要中斷訓練,因此想詢問您以上這個問題是否可行,若不可行,或建議不中斷,也請您給予我您的經驗與意見,感謝您!
可以从last.pt继续训练,.pt中保存了中断前epoch信息和网络相关参数,所以"--weights weights/last.pt",epoch仍然是300 ,不需要改变,他会从26/299 开始训练。
last.weights就删除了用于保存中断前epoch信息个网络相关参数。 一般建议直接用last.pt,不需要再转为.weights
总的来说影响都不太大,只是打印出来的P R map等参数中断前后连接不上,波动严重(这可能是ultralytics / yolov3 的一个bug),epoch总数为300比较大,所以1~2次的中断不会影响结果的判断,只是输出的数据不连续了,做图显得不好看。
@TNTWEN 明白了,感謝解說,持續實驗,目前看來很不錯 python train.py --cfg cfg/license_plate/color/yolov3-spp-license_plate.cfg --data data/license_plate/color/license_plate.data --weights weights/last.pt --batch-size 52 -sr --epochs 300 --s 0.001 --prune 1
24/299 21.7G 0.609 0.241 0 0.85 271 416: 4%| | 157/4060 [01:28<34:28, 1.89it/s]
@TNTWEN 這是目前關於1個車牌類別的YOLOv3-spp稀疏訓練進度, 訓練集: 約20萬張 測試集: 約5萬張 python train.py --cfg cfg/license_plate/color/yolov3-spp-license_plate.cfg --data data/license_plate/color/license_plate.data --weights weights/last.pt --batch-size 52 -sr --epochs 300 --s 0.001 --prune 1
158/299 21.8G 0.631 0.253 0 0.884 258 416: 31%|▎| 1252/4060 [11:17<24:54, 1.88it/s
分享TensorBoard,不同顏色是因為中斷訓練過,
我讀了您解說TensorBoard如何觀察HISTOGHRAMS/bn_weights
我的判斷是此模型已經稀疏訓練成功,但還沒有很把握,因此想先給您看個情況, 且此稀疏訓練還沒經歷過210/300 Epoch的Learning Rate衰減,精度可能還能再提高?
@jayer95 是的,目前看来稀疏是成功的,现在只需要把300epoch跑完就可以了。 从你现在的158~210epoch P R map等各项指标都将保持稳定,但此过程中模型仍在进一步地稀疏化。在210epoch, 270epoch时,学习率会降低,稀疏化进行的同时,还更有利于精度回升。 总而言之,跑完300epoch,模型就会稀疏化到非常不错的程度!
@jayer95 我找到了一种可行的优化yolov4训练的方法 yolov4最主要的改动就是mish激活函数,而之前没有对mish激活函数进行优化,导致占用显存过大,训练速度慢
https://github.com/JunnYu/mish-cuda git clone 这个项目,运行 python setup.py install 如果安装成功可以在pip list中看到这个mish-cuda库 我在RTX3090+CUDA11.2上测试,可以正常安装
然后在此处:
https://github.com/TNTWEN/Pruned-OpenVINO-YOLO/blob/44c337ad131142ba454c1cd72b9cb5083f10fd50/Pruneyolov3v4/utils/layers.py#L4
加上一行
from mish_cuda import MishCuda as Mish
并且注释掉这三行
https://github.com/TNTWEN/Pruned-OpenVINO-YOLO/blob/44c337ad131142ba454c1cd72b9cb5083f10fd50/Pruneyolov3v4/utils/layers.py#L147-L149
做以上改动后就可以了,我用VOC数据集做了简单的测试,优化前batchsize=32,显存占用20G,优化后batchsize=48,显存占用17G,训练速度也快了一些。
对于稀疏训练是否有帮助还需要做进一步实验!
@TNTWEN 感謝提供此優化的方式,已經依照您的教學完成mish-cuda庫的安裝, 後續會接著訓練YOLOv4,再與您分享效果,Thanks!
目前YOLOv3-spp稀疏訓練的情況如下,有看見210epoch後,learning rate衰減為0.001,
learning rate: 0.001 215/299 21.8G 0.461 0.199 0 0.66 229 416: 100%|█| 4060/4060 [36:53<00:00, 1.83it/s Class Images Targets P R [email protected] F1: 100%|█| 1015/1015 [03:55<00:00, 4.31it/s] all 5.28e+04 1.91e+05 0.996 0.973 0.993 0.985 0%| | 0/4060 [00:00<?, ?it/s]learning rate: 0.001 216/299 21.8G 0.459 0.197 0 0.656 259 416: 23%|▍ | 952/4060 [08:42<28:08, 1.84it/s]
對了,我想請教您,您的整套訓練與模型剪枝的策略是否可以換成其他種的.cfg? 例如: https://github.com/AlexeyAB/darknet/blob/master/cfg/yolov4-tiny-3l.cfg 我想在遷入式裝置上做邊緣計算上獲得更高的fps,目前訓練大模型的需求時間有點長,想實測看看3l的Tiny版本, 多了一層YOLO層用來檢測小物件的yolov4-tiny-3l,我在AlexeyAB上訓練後測試效果很不錯, 但fps仍然需要在更多,因此詢問以上!!!