公司網(wǎng)站怎么做能被別人搜索到個(gè)人網(wǎng)頁
基于AI相關(guān)的技術(shù)來對一些重復(fù)性的但是又比較重要的工作來做智能化助力是一個(gè)非常有潛力的場景,關(guān)于這方面的項(xiàng)目開發(fā)實(shí)踐在我之前的文章中也有不少的實(shí)踐,感興趣的話可以自行移步閱讀即可:
《AI助力智能安檢,基于目標(biāo)檢測模型實(shí)現(xiàn)X光安檢圖像智能檢測分析》
《基于輕量級YOLO模型的X光安檢場景下危險(xiǎn)物品檢測系統(tǒng)》
智能安檢相關(guān)的任務(wù)大都是基于X光數(shù)據(jù)進(jìn)行的,基于X光相關(guān)的其他類型的項(xiàng)目還有一些,感興趣的話自行閱讀即可:
《基于YOLOv5開發(fā)構(gòu)建手部X光骨骼檢測識別分析系統(tǒng)》
《基于輕量級yolov5的手部X光骨骼實(shí)例分割檢測識別分析系統(tǒng)》
本文的主要落腳點(diǎn)在X光智能安檢,前面雖然也有這塊的項(xiàng)目實(shí)踐,但是大都是基于行李的安檢圖像數(shù)據(jù)進(jìn)行的,這里的主要研究對象是人,也就是說核心的目的是行人攜帶的或者是夾帶的各種可能存在危險(xiǎn)的物品進(jìn)行智能化的檢測識別,首先看下效果圖:
?接下來簡單看下數(shù)據(jù)集:
?可以看到:實(shí)驗(yàn)設(shè)定所用到的數(shù)據(jù)集來源于真實(shí)場景單人拍攝的數(shù)據(jù)。
考慮到實(shí)際項(xiàng)目使用過程中所需要的精度和時(shí)效性問題,這里模型的主要選型考慮再n、s和m這三款中進(jìn)行選擇,希望達(dá)到的是在精度達(dá)到指標(biāo)的情況下盡可能更加輕量化。
整套項(xiàng)目基于v7.0代碼開發(fā)實(shí)現(xiàn),這里時(shí)間比較充裕,所以n、s和m三款不同參數(shù)量級的模型我都開發(fā)實(shí)現(xiàn)了。接下來我們依次看下:
【yolov5n】
# YOLOv5 🚀 by Ultralytics, GPL-3.0 license# Parameters
nc: 13 # number of classes
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.25 # layer channel multiple
anchors:- [10,13, 16,30, 33,23] # P3/8- [30,61, 62,45, 59,119] # P4/16- [116,90, 156,198, 373,326] # P5/32# YOLOv5 v6.0 backbone
backbone:# [from, number, module, args][[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2[-1, 1, Conv, [128, 3, 2]], # 1-P2/4[-1, 3, C3, [128]],[-1, 1, Conv, [256, 3, 2]], # 3-P3/8[-1, 6, C3, [256]],[-1, 1, Conv, [512, 3, 2]], # 5-P4/16[-1, 9, C3, [512]],[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32[-1, 3, C3, [1024]],[-1, 1, SPPF, [1024, 5]], # 9]# YOLOv5 v6.0 head
head:[[-1, 1, Conv, [512, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 6], 1, Concat, [1]], # cat backbone P4[-1, 3, C3, [512, False]], # 13[-1, 1, Conv, [256, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 4], 1, Concat, [1]], # cat backbone P3[-1, 3, C3, [256, False]], # 17 (P3/8-small)[-1, 1, Conv, [256, 3, 2]],[[-1, 14], 1, Concat, [1]], # cat head P4[-1, 3, C3, [512, False]], # 20 (P4/16-medium)[-1, 1, Conv, [512, 3, 2]],[[-1, 10], 1, Concat, [1]], # cat head P5[-1, 3, C3, [1024, False]], # 23 (P5/32-large)[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)]
【yolov5s】
# YOLOv5 🚀 by Ultralytics, GPL-3.0 license# Parameters
nc: 13 # number of classes
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple
anchors:- [10,13, 16,30, 33,23] # P3/8- [30,61, 62,45, 59,119] # P4/16- [116,90, 156,198, 373,326] # P5/32# YOLOv5 v6.0 backbone
backbone:# [from, number, module, args][[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2[-1, 1, Conv, [128, 3, 2]], # 1-P2/4[-1, 3, C3, [128]],[-1, 1, Conv, [256, 3, 2]], # 3-P3/8[-1, 6, C3, [256]],[-1, 1, Conv, [512, 3, 2]], # 5-P4/16[-1, 9, C3, [512]],[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32[-1, 3, C3, [1024]],[-1, 1, SPPF, [1024, 5]], # 9]# YOLOv5 v6.0 head
head:[[-1, 1, Conv, [512, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 6], 1, Concat, [1]], # cat backbone P4[-1, 3, C3, [512, False]], # 13[-1, 1, Conv, [256, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 4], 1, Concat, [1]], # cat backbone P3[-1, 3, C3, [256, False]], # 17 (P3/8-small)[-1, 1, Conv, [256, 3, 2]],[[-1, 14], 1, Concat, [1]], # cat head P4[-1, 3, C3, [512, False]], # 20 (P4/16-medium)[-1, 1, Conv, [512, 3, 2]],[[-1, 10], 1, Concat, [1]], # cat head P5[-1, 3, C3, [1024, False]], # 23 (P5/32-large)[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)]
【yolov5m】
# YOLOv5 🚀 by Ultralytics, GPL-3.0 license# Parameters
nc: 13 # number of classes
depth_multiple: 0.67 # model depth multiple
width_multiple: 0.75 # layer channel multiple
anchors:- [10,13, 16,30, 33,23] # P3/8- [30,61, 62,45, 59,119] # P4/16- [116,90, 156,198, 373,326] # P5/32# YOLOv5 v6.0 backbone
backbone:# [from, number, module, args][[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2[-1, 1, Conv, [128, 3, 2]], # 1-P2/4[-1, 3, C3, [128]],[-1, 1, Conv, [256, 3, 2]], # 3-P3/8[-1, 6, C3, [256]],[-1, 1, Conv, [512, 3, 2]], # 5-P4/16[-1, 9, C3, [512]],[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32[-1, 3, C3, [1024]],[-1, 1, SPPF, [1024, 5]], # 9]# YOLOv5 v6.0 head
head:[[-1, 1, Conv, [512, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 6], 1, Concat, [1]], # cat backbone P4[-1, 3, C3, [512, False]], # 13[-1, 1, Conv, [256, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 4], 1, Concat, [1]], # cat backbone P3[-1, 3, C3, [256, False]], # 17 (P3/8-small)[-1, 1, Conv, [256, 3, 2]],[[-1, 14], 1, Concat, [1]], # cat head P4[-1, 3, C3, [512, False]], # 20 (P4/16-medium)[-1, 1, Conv, [512, 3, 2]],[[-1, 10], 1, Concat, [1]], # cat head P5[-1, 3, C3, [1024, False]], # 23 (P5/32-large)[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)]
訓(xùn)練完成后,為了直觀對比分析不同量級模型的性能差異,這里對其進(jìn)行整體對比可視化,如下所示:
【Precision曲線】
精確率曲線(Precision-Recall Curve)是一種用于評估二分類模型在不同閾值下的精確率性能的可視化工具。它通過繪制不同閾值下的精確率和召回率之間的關(guān)系圖來幫助我們了解模型在不同閾值下的表現(xiàn)。
精確率(Precision)是指被正確預(yù)測為正例的樣本數(shù)占所有預(yù)測為正例的樣本數(shù)的比例。召回率(Recall)是指被正確預(yù)測為正例的樣本數(shù)占所有實(shí)際為正例的樣本數(shù)的比例。
繪制精確率曲線的步驟如下:
使用不同的閾值將預(yù)測概率轉(zhuǎn)換為二進(jìn)制類別標(biāo)簽。通常,當(dāng)預(yù)測概率大于閾值時(shí),樣本被分類為正例,否則分類為負(fù)例。
對于每個(gè)閾值,計(jì)算相應(yīng)的精確率和召回率。
將每個(gè)閾值下的精確率和召回率繪制在同一個(gè)圖表上,形成精確率曲線。
根據(jù)精確率曲線的形狀和變化趨勢,可以選擇適當(dāng)?shù)拈撝狄赃_(dá)到所需的性能要求。
通過觀察精確率曲線,我們可以根據(jù)需求確定最佳的閾值,以平衡精確率和召回率。較高的精確率意味著較少的誤報(bào),而較高的召回率則表示較少的漏報(bào)。根據(jù)具體的業(yè)務(wù)需求和成本權(quán)衡,可以在曲線上選擇合適的操作點(diǎn)或閾值。
精確率曲線通常與召回率曲線(Recall Curve)一起使用,以提供更全面的分類器性能分析,并幫助評估和比較不同模型的性能。
【Recall曲線】
召回率曲線(Recall Curve)是一種用于評估二分類模型在不同閾值下的召回率性能的可視化工具。它通過繪制不同閾值下的召回率和對應(yīng)的精確率之間的關(guān)系圖來幫助我們了解模型在不同閾值下的表現(xiàn)。
召回率(Recall)是指被正確預(yù)測為正例的樣本數(shù)占所有實(shí)際為正例的樣本數(shù)的比例。召回率也被稱為靈敏度(Sensitivity)或真正例率(True Positive Rate)。
繪制召回率曲線的步驟如下:
使用不同的閾值將預(yù)測概率轉(zhuǎn)換為二進(jìn)制類別標(biāo)簽。通常,當(dāng)預(yù)測概率大于閾值時(shí),樣本被分類為正例,否則分類為負(fù)例。
對于每個(gè)閾值,計(jì)算相應(yīng)的召回率和對應(yīng)的精確率。
將每個(gè)閾值下的召回率和精確率繪制在同一個(gè)圖表上,形成召回率曲線。
根據(jù)召回率曲線的形狀和變化趨勢,可以選擇適當(dāng)?shù)拈撝狄赃_(dá)到所需的性能要求。
通過觀察召回率曲線,我們可以根據(jù)需求確定最佳的閾值,以平衡召回率和精確率。較高的召回率表示較少的漏報(bào),而較高的精確率意味著較少的誤報(bào)。根據(jù)具體的業(yè)務(wù)需求和成本權(quán)衡,可以在曲線上選擇合適的操作點(diǎn)或閾值。
召回率曲線通常與精確率曲線(Precision Curve)一起使用,以提供更全面的分類器性能分析,并幫助評估和比較不同模型的性能。
【F1值曲線】
F1值曲線是一種用于評估二分類模型在不同閾值下的性能的可視化工具。它通過繪制不同閾值下的精確率(Precision)、召回率(Recall)和F1分?jǐn)?shù)的關(guān)系圖來幫助我們理解模型的整體性能。
F1分?jǐn)?shù)是精確率和召回率的調(diào)和平均值,它綜合考慮了兩者的性能指標(biāo)。F1值曲線可以幫助我們確定在不同精確率和召回率之間找到一個(gè)平衡點(diǎn),以選擇最佳的閾值。
繪制F1值曲線的步驟如下:
使用不同的閾值將預(yù)測概率轉(zhuǎn)換為二進(jìn)制類別標(biāo)簽。通常,當(dāng)預(yù)測概率大于閾值時(shí),樣本被分類為正例,否則分類為負(fù)例。
對于每個(gè)閾值,計(jì)算相應(yīng)的精確率、召回率和F1分?jǐn)?shù)。
將每個(gè)閾值下的精確率、召回率和F1分?jǐn)?shù)繪制在同一個(gè)圖表上,形成F1值曲線。
根據(jù)F1值曲線的形狀和變化趨勢,可以選擇適當(dāng)?shù)拈撝狄赃_(dá)到所需的性能要求。
F1值曲線通常與接收者操作特征曲線(ROC曲線)一起使用,以幫助評估和比較不同模型的性能。它們提供了更全面的分類器性能分析,可以根據(jù)具體應(yīng)用場景來選擇合適的模型和閾值設(shè)置。
?【loss對比曲線】
整體來看不難發(fā)現(xiàn):n系列模型效果最低,m系列模型效果最優(yōu),s系列模型兼顧了精度和速度,在實(shí)測分析場景下最終選用的也是s系列的模型,后續(xù)還可以對其進(jìn)行進(jìn)一步的剪枝處理達(dá)到進(jìn)一步精簡參數(shù)量的目的。
?這里我們以最終選定的yolov5s模型為例,看下對應(yīng)模型的結(jié)果詳情:
【混淆矩陣】
?【F1值】
?【精確率曲線】
?【PR曲線】
?【召回率曲線】
?【整體訓(xùn)練過程可視化】
?【Batch計(jì)算實(shí)例】
?因?yàn)槲疫@里資源限制,所以設(shè)定的訓(xùn)練使用的batch-size都是比較小的。