解決方案:【目標檢測】英雄聯(lián)盟能用YOLOv5實(shí)時(shí)目標檢測了 支持onnx推理
優(yōu)采云 發(fā)布時(shí)間: 2022-11-30 10:53解決方案:【目標檢測】英雄聯(lián)盟能用YOLOv5實(shí)時(shí)目標檢測了 支持onnx推理
目錄
一、項目介紹
dcmyolo(夢(mèng)想創(chuàng )造奇跡),中文:大智能物體檢測工具包。該項目基于pytorch構建。構建的目的是提供一個(gè)性能更好的YOLO版本。同時(shí)擁有豐富的中文教程和詳細的源碼解讀。提供了算法工具箱,給出了不同體積模型的實(shí)驗數據,為算法的實(shí)現提供了指導。來(lái)的方便。為了方便開(kāi)發(fā)者,項目開(kāi)箱即用。推理階段,直接把test dcmyolo目錄放到項目中,實(shí)例化一個(gè)類(lèi),然后調用。
很多教程都是基于coco和voc數據集,我也會(huì )提供基于coco數據集的預訓練模型。為了增加趣味性,我將以英雄聯(lián)盟中英雄、小兵、塔的檢測為例,詳細介紹dcmyolo的使用。
項目鏈接:
資料鏈接: 提取碼:faye
測試視頻: 提取碼:faye
預訓練模型: 提取碼:faye
標注工具: 提取碼:faye
效果演示:英雄聯(lián)盟可以使用YOLOv5實(shí)時(shí)目標檢測_英雄聯(lián)盟
2.項目結構
dcmyolo項目主目錄
+數據存儲訓練和測試數據
- dcmyolo實(shí)現了項目的所有核心功能,移植時(shí)直接測試該目錄即可
- 模型模型構建相關(guān)
+ backbone 各種backbone,目前只有CSPdarknet,未來(lái)會(huì )不斷豐富
yolo_body.py構建模型的類(lèi),實(shí)例化后使用
+ model_data 存儲模型文件
+ utils 工具類(lèi)
labelme2voc.py 將labelme的json文件轉為voc格式
voc2annotation_txt.py 將VOC格式轉換成項目需要的格式
make_anchors.py 生成數據集的anchors文件
train_dcmyolo.py 執行訓練
export.py 導出onnx等格式的文件
predict_dcmyolo.py 推理演示
predict_onnx.pypth 轉換onnx,onnx進(jìn)行推理demo
3.準備數據
我們需要制作三個(gè)文件train.txt、val.txt、test.txt,格式如下:
data/wangzhe/JPEGImages/1.jpg 910,504,1035,633,0 1759,113,1920,383,2
data/wangzhe/JPEGImages/10.jpg 805,189,1060,570,0 1,649,273,935,2 1636,70,1823,182,2
data/wangzhe/JPEGImages/100.jpg 896,258,1254,550,3
data/wangzhe/JPEGImages/101.jpg 869,416,1059,591,0 277,295,464,407,4 1024,311,1369,640,3
文件中一張圖片為一行,一行中的每條信息以空格分隔。第一塊是圖片存放的路徑。這里我們放在項目中的data/wangzhe/JPEGImages目錄下;其余幾塊表示方框的位置和類(lèi)別,每段用逗號分成5個(gè)部分,分別代表左上x(chóng)、左上y、右下x、右下y,以及所屬類(lèi)別的索引他們屬于哪個(gè)。
如果只有圖片,沒(méi)有標簽,我們需要進(jìn)行下面的數據標注和數據格式轉換步驟。這個(gè)過(guò)程非常簡(jiǎn)單,而且是體力勞動(dòng)。
如果使用開(kāi)源數據集,我們需要自己將數據集的標注文件轉換成上述格式,不需要下面的步驟。
如果你用的是我整理的英雄聯(lián)盟手游數據,直接下載數據解壓到項目的data目錄下,就可以直接使用了,不需要下面的步驟。
1、數據標注
這一步是用來(lái)制作我們自己的數據集的。我們使用 labelme 作為標注工具。標注好后,我們使用腳本將標注文件轉成voc格式,再從voc轉成我們需要的格式。上面是labelme的下載鏈接,解壓后使用方法如下:
?。?)雙擊main.exe打開(kāi)labelme
(2) 選擇要標注的圖片目錄。這里我準備了100多張英雄聯(lián)盟的截圖,比如項目中的data/wangzhe_org/目錄。
?。?)右側會(huì )列出該文件夾下的所有圖片,選擇一張圖片,在圖片區域右擊選擇矩形
?。?)選擇一個(gè)矩形框的目標(英雄),填寫(xiě)類(lèi)別名稱(chēng),點(diǎn)擊確定完成一個(gè)目標的標注。注意:一定要選擇從左上角到右下角的邊框;在同一張圖片中標記盡可能多的目標,不要錯過(guò)它們;同一類(lèi)別的名稱(chēng)必須相同,不同類(lèi)別的名稱(chēng)不能相同;類(lèi)別名稱(chēng)使用英文(區分大小寫(xiě)),無(wú)標點(diǎn)符號。
(5)標記一張圖片后,選擇下一張圖片時(shí),會(huì )提示保存json文件,保存到默認目錄即可,不要更改目錄。
2.數據轉換格式
我們已經(jīng)得到了labelme生成的json格式的標準文件,我們需要先將其轉換成VOC格式,然后再轉換成我們需要的格式。
(1) 轉換成VOC格式
執行工程中的labelme2voc.py文件,示例如下:
'''
data/wangzhe_org/: 存放原圖片和labelme生成的json文件的目錄
data/wangzhe/:? ? ? 目標目錄
labels:? ? ? ? ? ? ?存放所有列表標簽的文件,英雄聯(lián)盟的數據集標簽文件已經(jīng)放在項目的dcmyolo/model_data/wangzhe_classes.txt文件中
'''
python labelme2voc.py data/wangzhe_org/ data/wangzhe/ --labels dcmyolo/model_data/wangzhe_classes.txt
其中,dcmyolo/model_data/wangzhe_classes.txt文件,共有3種標簽文件如下:
Hero
Solider
Tower
VOC格式有以下4個(gè)文件,Annotations存放標簽文件,AnnotationsVisualization存放用方框標注的圖片,方便我們查看,JPEGImages存放圖片,class_names.txt存放所有類(lèi)別的標簽。接下來(lái)我們將只使用 Annotations 和 JPEGImages:
?。?)轉換工程需要的格式
執行項目中的voc2annotation_txt.py文件,示例如下:
'''
classes_path: ? ????存放標簽種類(lèi)的文件
data_dir: ? ????????存數據的目錄,寫(xiě)到Annotations上一級
trainval_percent: ? 用于指定(訓練集+驗證集)與測試集的比例,默認情況下 9:1
train_percent: ? ???用于指定(訓練集+驗證集)中訓練集與驗證集的比例,默認情況下 9:1
'''
python voc2annotation_txt.py --classes_path dcmyolo/model_data/wangzhe_classes.txt --data_dir data/wangzhe/ --trainval_percent 0.95 --train_percent 0.95
至此我們已經(jīng)生成了項目需要的標簽文件,可以進(jìn)行訓練了。
4.執行力訓練
所有數據文件和配置文件的文件名和目錄都是可以自定義的,下面我會(huì )按照自己的習慣存放這些文件。
" />
1.錨文件
文件放在dcmyolo/model_data/wangzhe_classes.txt
原來(lái)yolov5提到的改進(jìn)之一就是不需要手動(dòng)生成anchors。事實(shí)上,生成anchor的方法在訓練之前就被丟棄了。我比較習慣手動(dòng)生成anchor,也不麻煩。
anchors的作用下一篇講原理的時(shí)候會(huì )提到,現在我們只需要生成即可,使用make_anchors.py生成:
'''
txt_path: 標注文件txt
anchors_path: anchors文件txt
clusters: 聚類(lèi)的數目,一般情況下是9
input_size: 模型中圖像的輸入尺寸
'''
python make_anchors.py --txt_path data/wangzhe/train.txt --anchors_path dcmyolo/model_data/wangzhe_anchors.txt --clusters 9 --input_size 640
生成的文件 wangzhe_anchors.txt 如下所示:
25,44,30,58,37,64,50,68,42,91,55,104,71,113,62,141,91,256
2.標簽文件
文件放在dcmyolo/model_data/wangzhe_classes.txt,內容是標注三類(lèi),每行一類(lèi):
Hero
Solider
Tower
3.預訓練模型
下載好預訓練模型后,解壓放到dcmyolo/model_data/下。
預訓練模型有兩種,backbone和yolov5。Backbone只是在imagenet上預訓練的分類(lèi)模型,yolov5是在coco數據集上訓練的yolov5模型。如果同時(shí)加載了backbone和yolov5預訓練模型,backbone參數會(huì )被覆蓋。yolov5預訓練模型收錄
了一些backbone沒(méi)有的卷積層。如果fine-tuning推薦使用yolov5預訓練模型,收斂會(huì )更快。
4.訓練數據
將上述數據集解壓,放到data目錄下。
如果是自己標注的數據,將三個(gè)核心文件train.txt、val.txt、test.txt放在data/wangzhe/目錄下,同時(shí)保證這三個(gè)文件中的圖片路徑正確. 結構如下,其中ImageSets目錄為臨時(shí)目錄,不用于訓練,可以省略。
5.修改配置
所有參數的定義和注釋如下,為了節省篇幅,去掉了之前的parser.add_argument:
('--classes_path', type=str, default='dcmyolo/model_data/coco_classes.txt', help="類(lèi)別標簽文件路徑")
('--anchors_path', type=str, default='dcmyolo/model_data/coco_anchors.txt', help="anchors文件路徑")
('--train_annotation_path', type=str, default='data/coco/train.txt', help="存放訓練集圖片路徑和標簽的txt")
('--val_annotation_path', type=str, default='data/coco/val.txt', help="存放驗證圖片路徑和標簽的txt")
('--phi', type=str, default='s', help="所使用的YoloV5的版本。n、s、m、l、x")
# ---------------------------------------------------------------------#
# --backbone_model_dir參數
# 如果有backbone的預訓練模型,可以backbone預訓練模型目錄,當model_path不存在的時(shí)候不加載整個(gè)模型的權值。
# 只寫(xiě)到模型文件的上一級目錄即可,文件名會(huì )根據phi自動(dòng)計算(前提是從百度網(wǎng)盤(pán)下載的模型文件名沒(méi)改)
# ---------------------------------------------------------------------#
('--backbone_model_dir', type=str, default='dcmyolo/model_data/', help="backbone的預訓練模型,寫(xiě)到上一級目錄即可")
('--model_path', type=str, default='dcmyolo/model_data/pretrained.pth', help="yolov5預訓練模型的路徑")
('--save_period', type=int, default=10, help="多少個(gè)epoch保存一次權值")
('--save_dir', type=str, default='logs_wangzhe', help="權值與日志文件保存的文件夾")
('--input_shape', nargs='+', type=int, default=[640, 640], help="輸入的shape大小,一定要是32的倍數")
('--use_fp16', action='store_true', help="是否使用混合精度訓練")
#------------------------------------------------------------------#
# mosaic 馬賽克數據增強。
# mosaic_prob 每個(gè)step有多少概率使用mosaic數據增強,默認50%。
#
# mixup 是否使用mixup數據增強,僅在mosaic=True時(shí)有效。
# 只會(huì )對mosaic增強后的圖片進(jìn)行mixup的處理。
# mixup_prob 有多少概率在mosaic后使用mixup數據增強,默認50%。
# 總的mixup概率為mosaic_prob * mixup_prob。
#
# special_aug_ratio 參考YoloX,由于Mosaic生成的訓練圖片,遠遠脫離自然圖片的真實(shí)分布。
# 當mosaic=True時(shí),本代碼會(huì )在special_aug_ratio范圍內開(kāi)啟mosaic。
# 默認為前70%個(gè)epoch,100個(gè)世代會(huì )開(kāi)啟70個(gè)世代。
#------------------------------------------------------------------#
('--use_mosaic', action='store_true', help="是否使用馬賽克數據增強")
('--mosaic_prob', type=float, default=0.5, help="每個(gè)step有多少概率使用mosaic數據增強")
('--use_mixup', action='store_true', help="是否使用mixup數據增強,僅在mosaic=True時(shí)有效")
('--mixup_prob', type=float, default=0.5, help="有多少概率在mosaic后使用mixup數據增強")
('--special_aug_ratio', type=float, default=0.7, help="當mosaic=True時(shí),會(huì )在該范圍內開(kāi)啟mosaic")
('--epoch', type=int, default=100, help="總迭代次數")
('--batch_size', type=int, default=128, help="每批次取多少張圖片")
('--label_smoothing', type=float, default=0, help="是否開(kāi)啟標簽平滑")
('--init_lr', type=float, default=1e-2, help="初始學(xué)習率")
('--min_lr', type=float, default=1e-4, help="最小學(xué)習率")
('--optimizer_type', type=str, default="sgd", help="使用到的優(yōu)化器種類(lèi),可選的有adam、sgd")
('--momentum', type=float, default=0.937, help="優(yōu)化器內部使用到的momentum參數")
('--weight_decay', type=float, default=5e-4, help="權值衰減,可防止過(guò)擬合")
('--lr_decay_type', type=str, default="step", help="使用到的學(xué)習率下降方式,可選的有step、cos")
('--eval_flag', action='store_true', help="是否在訓練時(shí)進(jìn)行評估,評估對象為驗證集")
('--eval_period', type=int, default=10, help="代表多少個(gè)epoch評估一次")
('--num_workers', type=int, default=4, help="多少個(gè)線(xiàn)程讀取數據")
示例腳本 train_dcmyolo.sh:
for i in $(ps -ax |grep train_dcmyolo |awk '{print
}')do
id=`echo $i |awk -F"/" '{print
}'`<p>
kill -9 $id
done
nohup python -u train_dcmyolo.py \
--classes_path dcmyolo/model_data/wangzhe_classes.txt \
--anchors_path dcmyolo/model_data/coco_anchors.txt \
--train_annotation_path data/wangzhe/train.txt \
--val_annotation_path data/wangzhe/val.txt \
--save_dir logs_wangzhe \
--phi s \
--backbone_model_dir dcmyolo/model_data \
--model_path dcmyolo/model_data/yolov5_s.pth \
--input_shape 640 640 \
--batch_size 4 \
--epoch 1000 \
--save_period 100 \
> log_train_dcmyolo.log &
tail -f log_train_dcmyolo.log
</p>
6.執行力訓練
執行以下腳本進(jìn)行訓練,訓練結果會(huì )放在logs_wangzhe目錄下。
./train_dcmyolo.sh
五、執行預測
推理和預測方法都在predict_dcmyolo.py中,可以檢測圖片、檢測視頻和熱圖。所有參數定義如下。同樣為了節省空間,移除了parser.add_argument:
('--operation_type', type=str, default='', help="操作類(lèi)型export_onnx / predict_image / predict_video")
('--model_path', type=str, default='', help="pth模型的路徑")
('--classes_path', type=str, default='', help="分類(lèi)標簽文件")
('--anchors_path', type=str, default='', help="anchors文件")
('--onnx_path', type=str, default='', help="onnx保存路徑")
('--video_path', type=str, default='', help="視頻時(shí)才會(huì )用到,視頻的路徑")
('--video_save_path', type=str, default='', help="視頻時(shí)才會(huì )用到,視頻檢測之后的保存路徑")
('--phi', type=str, default='', help="所使用的YoloV5的版本。n、s、m、l、x")
('--no_simplify', action='store_false', help="不使用onnxsim簡(jiǎn)化模型")
('--input_shape', nargs='+', type=int, default=[640, 640], help="輸入的shape大小,一定要是32的倍數")
('--append_nms', action='store_true', help="添加nms")
('--iou_threshold', type=float, default=0.3, help="兩個(gè)bbox的iou超過(guò)這個(gè)值會(huì )被認為是同一物體")
('--score_threshold', type=float, default=0.5, help="檢測物體的概率小于這個(gè)值將會(huì )被舍棄")
1.檢測圖片
檢測圖片,示例腳本如下:
python predict_dcmyolo.py --operation_type predict_image --model_path dcmyolo/model_data/wangzhe_best_weights.pth --classes_path dcmyolo/model_data/wangzhe_classes.txt --anchors_path dcmyolo/model_data/coco_anchors.txt
在控制臺輸入圖片路徑,會(huì )顯示檢測結果:
2.檢測視頻
測試視頻可以從上面的鏈接下載。示例腳本如下,檢測結果會(huì )放在指定的輸出位置:
python predict_dcmyolo.py --operation_type predict_video --model_path dcmyolo/model_data/wangzhe_best_weights.pth --classes_path dcmyolo/model_data/wangzhe_classes.txt --anchors_path dcmyolo/model_data/coco_anchors.txt --video_path data/video/wangzhe1.mp4 --video_save_path_path data/video/wangzhe1_out.mp4
3.熱圖
示例腳本如下:
python predict_dcmyolo.py --operation_type heatmap --model_path dcmyolo/model_data/wangzhe_best_weights.pth --classes_path dcmyolo/model_data/wangzhe_classes.txt --anchors_path dcmyolo/model_data/coco_anchors.txt --heatmap_save_path data/heatmap.jpg
與檢測圖片類(lèi)似,在控制臺輸入圖片路徑,即可顯示熱圖??梢郧宄乜吹郊せ顓^域,證明模型確實(shí)很好地檢測到了目標。
5.轉換onnx
將模型導出為onnx格式,有利于模型加速,便于模型部署。所有onnx相關(guān)的方法都放在predict_onnx.py中??梢詫С鰋nnx文件,檢測圖片,檢測視頻。所有參數定義如下。同樣為了節省空間,移除了parser.add_argument:
('--operation_type', type=str, default='', help="操作類(lèi)型export_onnx / predict_image / predict_video")
('--model_path', type=str, default='', help="pth模型的路徑")
('--classes_path', type=str, default='', help="分類(lèi)標簽文件")
('--anchors_path', type=str, default='', help="anchors文件")
('--onnx_path', type=str, default='', help="onnx保存路徑")
('--video_path', type=str, default='', help="視頻時(shí)才會(huì )用到,視頻的路徑")
('--video_save_path', type=str, default='', help="視頻時(shí)才會(huì )用到,視頻檢測之后的保存路徑")
('--phi', type=str, default='', help="所使用的YoloV5的版本。n、s、m、l、x")
('--no_simplify', action='store_false', help="不使用onnxsim簡(jiǎn)化模型")
('--input_shape', nargs='+', type=int, default=[640, 640], help="輸入的shape大小,一定要是32的倍數")
('--append_nms', action='store_true', help="添加nms")
('--iou_threshold', type=float, default=0.3, help="兩個(gè)bbox的iou超過(guò)這個(gè)值會(huì )被認為是同一物體")
('--score_threshold', type=float, default=0.5, help="檢測物體的概率小于這個(gè)值將會(huì )被舍棄")
1.導出onnx文件
建議導出的onnx收錄
nms,這樣可以直接使用onnx輸出的結果,不需要程序進(jìn)行后期處理。加上--append_nms參數,可以讓聯(lián)通nms導出,onnx結果會(huì )報有指定的輸出路徑。示例腳本如下:
python predict_onnx.py --operation_type export_onnx --model_path dcmyolo/model_data/wangzhe_best_weights.pth --classes_path dcmyolo/model_data/wangzhe_classes.txt --anchors_path dcmyolo/model_data/coco_anchors.txt --onnx_path dcmyolo/model_data/wangzhe_best_weights.onnx --append_nms
2.檢測圖片
使用onnx模型檢測圖片,示例腳本如下:
python predict_onnx.py --operation_type predict_image --onnx_path dcmyolo/model_data/wangzhe_best_weights.onnx --classes_path dcmyolo/model_data/wangzhe_classes.txt
在控制臺輸入圖片路徑,即可顯示檢測結果??梢钥吹給nnx和pytorch的結果是一致的。
3.檢測視頻
測試視頻可以從上面的鏈接下載。示例腳本如下,檢測結果會(huì )放在指定的輸出位置:
python predict_onnx.py --operation_type predict_video --onnx_path dcmyolo/model_data/wangzhe_best_weights.onnx --classes_path dcmyolo/model_data/wangzhe_classes.txt --video_path data/video/wangzhe1.mp4 --video_save_path data/video/wangzhe1_out1.mp4
英雄聯(lián)盟YOLOv5實(shí)時(shí)檢測的功能這里簡(jiǎn)單介紹一下。下一篇我會(huì )介紹YOLOv5的實(shí)現原理。dcmyolo項目會(huì )持續維護,會(huì )增加越來(lái)越多的功能,敬請期待。
解決方案:基于web的文章管理系統(完整源碼+論文全套+教學(xué)視頻)
實(shí)現一個(gè)web文章管理系統,也就是說(shuō)可以基于瀏覽器管理各種數據信息。也可以看作是一個(gè)B/S架構的文章管理系統。系統分為前后臺,實(shí)現在線(xiàn)操作,實(shí)現文章管理系統的各項功能,實(shí)現用戶(hù)管理、登錄注冊、權限管理等功能,管理與各種文章相關(guān)的實(shí)體管理系統。
文章管理系統是采用mvc設計模式開(kāi)發(fā)的B/S架構項目,采用分層架構對項目進(jìn)行架構,分為pojo+action+service,其中pojo表示文章的各個(gè)數據庫表對應的實(shí)體系統,文章管理系統經(jīng)過(guò)詳細的需求分析和數據庫設計,設計實(shí)現了以下模塊,分別是登錄模塊,權限管理模塊,用戶(hù)管理模塊,文章管理系統信息管理模塊等。并通過(guò)java實(shí)現抽象類(lèi)
開(kāi)發(fā)環(huán)境系統需求分析及流程圖
一般來(lái)說(shuō),這類(lèi)項目的主要目的是掌握基本的web開(kāi)發(fā)知識,所以在實(shí)施文章管理系統的課程設計時(shí),需要先
" target="_blank">采集
其他文章管理系統的產(chǎn)品分析,進(jìn)行深入的數據庫web系統的設計,并基于mvc模式編寫(xiě)代碼,使用layui搭建頁(yè)面,進(jìn)而完成文章管理系統各模塊的開(kāi)發(fā)
數據庫課程設計
數據庫設計是整個(gè)文章管理系統的關(guān)鍵。合理的數據庫設計直接影響文章管理系統能否完美運行不報錯。本系統采用mysql數據庫作為數據存儲,引擎采用innoddb。文章管理系統將按照數據庫設計原則進(jìn)行數據分表設計
系統演示視頻運行截圖
基于Web的文章管理系統-登錄功能接口-網(wǎng)站實(shí)現
" />
基于Web的文章管理系統-前臺首頁(yè)-網(wǎng)頁(yè)設計
基于Web的文章管理系統-后臺信息管理頁(yè)面-網(wǎng)頁(yè)設計
文章管理系統系統架構圖
預防措施
基于web的文章管理系統項目自帶源碼、試卷、sql數據庫、答辯ppt、期中檢查報告
" />
登錄地址:8080/login.jsp
后臺地址:8080/admin/login.jsp
測試用戶(hù)cswork admin bishe 密碼123456
測試管理員admin密碼admin bishe
函數列表
文章管理系統系統登錄模塊,實(shí)現文章管理系統的登錄注冊功能
文章管理系統用戶(hù)管理模塊實(shí)現文章管理系統的信息管理和角色管理功能
前臺信息管理模塊,面向普通用戶(hù),實(shí)現普通用戶(hù)對文章管理系統自定義查詢(xún)的錄入和修改
超級管理員管理,實(shí)現文章管理系統系統各模塊后臺管理員管理功能,同意核心數據最佳權限管理