天天看點

YOLO-V4 實作口罩識别(附加資料、資料批量處理程式)

一、YOLO-v4概念

如果想要了解和認識yolo-v4的基本概念,首先要提的就是它的基礎版本yolo-v1,對于yolo來說,最經典的算是yolo-v3。如果想要了解它的由來和曆史的話,可以自行搜尋。那麼接下來,就先從yolo-v1入手各方面來介紹對比一下yolo-v4。

1、yolo-v1結構設計

原論文位址:https://tuzishenshi.lanzoui.com/iMMu2s92w4f

YOLO-V4 實作口罩識别(附加資料、資料批量處理程式)

圖1、網絡結構圖

yolov1網絡結構圖是由24個卷積層、2個全連接配接層構成,其作者也說過靈感來自用于圖像分類的GoogLeNet模型,但是與GoogLeNet模型不同的是簡單的使用了1×1簡化層和3×3卷積層(類似M. Lin, Q. Chen, and S. Y an. Network in network. CoRR,abs/1312.4400, 2013. 2),可以在上圖看到。

輸入的圖像為448448,經過以上的結構,輸出的為77*1024的張量,是第7個圖樣。在激活函數上,最後一層輸出時用了線性激活函數,其餘層都使用的是Leaky Relu激活函數。

YOLO-V4 實作口罩識别(附加資料、資料批量處理程式)

圖2、Leaky Relu激活函數

YOLO相對于其他的(例如rcnn、fast-rcnn、faster-rcnn等)來說,它的優勢就是YOLO設計實作了端到端的教育訓練和實時速度,同時保持了較高的平均精度。具體的話就是将目标檢測的各個部分統一為一個單一的神經網絡,網絡使用整個圖像的特征來預測每個邊界框。它還可以同時預測圖像中所有類的所有邊框。這意味着我們的網絡對完整的圖像和圖像中的所有對象進行全局推理。

2、yolo-v1損失函數

YOLO-V4 實作口罩識别(附加資料、資料批量處理程式)

圖3、損失函數

3、yolo-v1和yolo-v4對比

yolo-v4說簡單點就是對yolo-v3的改進,它的改進方法就是總結了幾乎所有的檢測技巧,又提出一點兒技巧,然後經過篩選,排列組合,挨個實驗(ablation study)哪些方法有效。YOLOv4對深度學習中一些常用Tricks進行了大量的測試,最終選擇了這些有用的Tricks:WRC、CSP、CmBN、SAT、 Mish activation、Mosaic data augmentation、CmBN、DropBlock regularization 和 CIoU loss。

YOLOv4在傳統的YOLO基礎上,加入了這些實用的技巧,實作了檢測速度和精度的最佳權衡。實驗表明,在Tesla V100上,對MS COCO資料集的實時檢測速度達到65 FPS,精度達到43.5%AP。

二、yolo-v4源碼

這個是從網絡收集而來,自己已經跑通了,裡面也有一些使用的方法,也就不啰嗦了,可以自己研究一下,跑一下口罩識别。

連結位址: https://pan.baidu.com/s/1ziNPRznNcfdGMCKWtB4xYQ 提取碼: e939

三、口罩資料

我這裡整理了一些資料集,一共有三個、我跑的是yolov4的第二個資料集。我會标注,可以先用我跑的這個,因為我跑通了。

連結位址:https://pan.baidu.com/s/1G1XLjK8Y3WNbRSf-1dwVgA 提取碼: vvhv

四、處理資料

1、批量移動(删除)某格式的檔案【父目錄下所有檔案】

1 import os
 2 import shutil
 3 
 4 for parent, dirnames, filenames in os.walk('原目錄'):
 5     for fn in filenames:
 6 
 7         if fn.lower().endswith('.xml'):
 8             # os.remove(os.path.join(parent, fn))  ##這是删除檔案的語句
 9              shutil.copy(os.path.join(parent, fn),'目标目錄')  #這是移動的語句
10 
11             #目錄例子 D:\\學習檔案\\YOLO\\資料\\xml (注意:雙斜杠)      

2、批量更改目錄下某格式檔案的名字【父目錄下所有檔案】

1 import os
 2 
 3 
 4 class BatchRenamePics(object):
 5     """
 6     批量命名目錄下的所有圖名[.jpg,.png]
 7     命名格式:1-1,1-2...2-1,2-2...10-1,10-2...eg
 8     """
 9     def __init__(self, path):
10         # 設定起始路徑path
11         self.path = path
12 
13     def rename(self):
14         allfile = os.walk(self.path)
15         # j用于計數,統計有多少張照片被重命名
16         j = 0
17         # 周遊每一層目錄,從上到下的順序
18         for dirpath, dirnames, filenames, in allfile:
19             # 得到目前檔案夾的名字tail
20             tail = os.path.split(dirpath)[1]
21             # i用于命名
22             i = 0
23             # 周遊filenames中的每一個檔案
24             for each in filenames:
25                 # 如果檔案名是以.jpg或者.png結尾則認為是圖檔,可以自己添加其他格式的照片
26                 if each.endswith('.jpg') or each.endswith('.png')or each.endswith('.xml'):
27                     i += 1
28                     j += 1
29                     # 拼接完整的包含路徑的檔案名
30                     scr = os.path.join(dirpath, each)
31                     # 拼接新的完整的包含路徑的檔案名, tail是檔案夾的名字
32                     # dst = os.path.join(dirpath, tail + '-' + str(i) + '.jpg')  ##這個是檔案改格式
33                     dst = os.path.join(dirpath, str(j) + '.jpg')
34                     try:
35                         # 重命名圖檔檔案
36                         os.rename(scr, dst)
37                         print(scr + '--->' + dst)
38                     except:
39                         continue
40                 else:
41                     continue
42         print('累計重命名{}張圖檔'.format(j))
43 
44 if __name__ == '__main__':
45     # 設定起始路徑path
46     path = r'原目錄'
47     # 建立執行個體對象
48     pics = BatchRenamePics(path)
49     # 調用執行個體方法
50     pics.rename()      

最後,感謝大家對本文章的閱讀,如果有什麼問題,歡迎在下方留言,一起讨論,共同進步。