YOLO-V4 實現口罩識別(附加數據、數據批量處理程序)


一、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()

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM