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

阿西莫多發表於2021-08-06

一、YOLO-v4概念

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

1、yolo-v1結構設計

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

 

圖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啟用函式。

 

圖2、Leaky Relu啟用函式

YOLO相對於其他的(例如rcnn、fast-rcnn、faster-rcnn等)來說,它的優勢就是YOLO設計實現了端到端的培訓和實時速度,同時保持了較高的平均精度。具體的話就是將目標檢測的各個部分統一為一個單一的神經網路,網路使用整個影像的特徵來預測每個邊界框。它還可以同時預測影像中所有類的所有邊框。這意味著我們的網路對完整的影像和影像中的所有物件進行全域性推理。

2、yolo-v1損失函式

圖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()

 

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

 

相關文章