目前,基于機器視覺的表面缺陷已經在各個工業領域廣泛取代人工視覺檢測,包括3C、汽車、家電、機械制造、半導體電子、化工、制藥、航空航天、輕工等行業。許多基于深度學習的缺陷檢測方法也被廣泛應用于各種工業場景。
本文的代碼實戰,是基于YOLOv5目標檢測算法,在NEU表面缺陷數據集上實現鋼材表面缺陷檢測。要求Python>=3.7.0,PyTorch>=1.7。
一、YOLOv5
選取YOLOv5,一方面是因為從最終效果來看YOLOv5已經相當優秀,是發展的比較完備、使用比較廣泛的一個版本;而更重要的是YOLOv5的調用、訓練和預測都十分方便,為初學者提供了良好的練手工具。YOLOv5的另一個特點就是它為不同的設備需求和不同的應用場景提供了大小和參數數量不同的網絡。
如圖所示,大一點的模型比如YOLOv5l和YOLOv5x參數更多,在大規模的COCO數據集上有更高的預測準確率;而小模型比如YOLOv5n或YOLOv5s占空間更小,適合部署在移動設備上,且推理速度更快,適合于高幀 率視頻的實時檢測。
二、鋼材表面缺陷數據集
東北大學(NEU)表面缺陷數據集,收集了熱軋帶鋼6種典型的表面缺陷,即軋內垢(RS)、斑塊(Pa)、裂紋(Cr)、點蝕面(PS)、夾雜物(In)和劃痕(Sc)。該數據庫包括1800張灰度圖像:6種不同類型的典型表面缺陷各300個樣本。
下圖為6種典型表面缺陷的樣本圖像,每張圖像的原始分辨率為200×200像素。從圖中,我們可以清楚地觀察到類內缺陷在外觀上存在較大差異,例如劃痕(最后一列)可能是水平劃痕、垂直劃痕和傾斜劃痕等。與此同時,類間缺陷也具有相似的特征,如滾積垢、裂紋和坑狀表面。
此外,由于光照和材料變化的影響,類內缺陷圖像的灰度會發生變化。總之,NEU表面缺陷數據庫包含兩個難題,即類內缺陷存在較大外觀差異,類間缺陷具有相似方面,缺陷圖像受到光照和材料變化的影響。
對于缺陷檢測任務,數據集提供了標注,標注了每個圖像中缺陷的類別和位置。下圖展示了數據集上的一些檢測結果示例。對于每個缺陷,黃色框是表示其位置的邊界框,綠色標簽是類分數。
三、YOLOv5數據格式
YOLOv5標簽文件中每一行的數據為class, x, y, w, h,其中class是該物體的類別,x,y是檢測框中心坐標,w,h是檢測框的寬和高。
四、格式轉換voc2yolo
從網上獲取一些目標檢測的數據集資源標簽的格式都是VOC(xml格式)的,而YOLOv5訓練所需要的文件格式是YOLO(txt格式)的,這里就需要對xml格式的標簽文件轉換為txt文件。
同時訓練自己的YOLOv5檢測模型的時候,數據集需要劃分為訓練集和驗證集。這里提供了一份代碼將xml格式的標注文件轉換為txt格式的標注文件,并按比例劃分為訓練集和驗證集。
importxml.etree.ElementTreeasET importos fromosimportgetcwd fromtqdmimporttqdm classes=["crazing","inclusion","patches","pitted_surface","rolled-in_scale","scratches"] defconvert(size,box): dw=1./size[0] dh=1./size[1] x=(box[0]+box[1])/2.0 y=(box[2]+box[3])/2.0 w=box[1]-box[0] h=box[3]-box[2] x=x*dw w=w*dw y=y*dh h=h*dh return(x,y,w,h) defconvert_annotation(image_id): in_file='./xml/%s.xml'%(image_id) out_file=open('./labels/%s.txt'%(image_id),'w') tree=ET.parse(in_file) root=tree.getroot() size=root.find('size') w=int(size.find('width').text) h=int(size.find('height').text) forobjinroot.iter('object'): difficult=obj.find('Difficult').text cls=obj.find('name').text ifclsnotinclassesorint(difficult)==1: continue cls_id=classes.index(cls) xmlbox=obj.find('bndbox') b=(float(xmlbox.find('xmin').text),float(xmlbox.find('xmax').text),float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text)) bb=convert((w,h),b) out_file.write(str(cls_id)+""+"".join([str(a)forainbb])+' ') if__name__=="__main__": wd=getcwd() print(wd) ifnotos.path.exists('./labels/'): os.makedirs('./labels/') image_ids=os.listdir('./datasets') forimage_idintqdm(image_ids): convert_annotation(image_id.split('.')[0])
五、訓練
YOLOv5是通過yaml格式的配置文件來找到對應的訓練測試數據,因此在訓練前需要對該文件進行簡單配置。
我們可以通過修改YOLOv5的配置文件來實現,需要修改的配置文件有兩個,我們先復制一份data/coco.yaml,這里將其重命名為my_coco.yaml
在download前加上一個#注釋掉這段代碼
將train、val、test修改為自己的路徑,以train為例,NEU-DET/train/images/
將nc修改為數據的類別數,如鋼材表面缺陷,故修改為6
將names修改自己數據的類名,如names: ["crazing", "inclusion", "patches", "pitted_surface", "rolled-in_scale", "scratches"]
下一個需要修改的文件為模型配置文件,在models文件夾中有四個模型的配置文件:yolov5s.yaml、yolov5m.yaml、yolov5l.yaml和yolov5x.yaml,可以根據需要選擇相應的模型,這里以yolo5s.yaml為例,打開文件,修改文件中的nc為自己的類別數即可。
pythontrain.py--weightsweights/yolov5s.pt--cfgmodels/yolov5s.yaml--datadata/my_coco.yaml--epoch30--batch-size32
六、測試
訓練結束后,在runs/exp0文件夾下會自動生成訓練結果,其中包括模型權重、混淆矩陣、PR曲線等。
進行測試時,打開detect.py文件,修改source為檢測圖片的文件夾,運行之后,在run->detect中輸出檢測結果;或者通過如下方式進行測試。
pythondetect.py--source./data/images/example.jpg--weightsruns/exp0/weights/best.pt--conf-thres0.25
最終預測的結果如下,可以看出模型缺陷檢測效果。
審核編輯:劉清
-
機器視覺
+關注
關注
162文章
4383瀏覽量
120419 -
Neu
+關注
關注
0文章
2瀏覽量
6730 -
python
+關注
關注
56文章
4797瀏覽量
84788 -
voc
+關注
關注
0文章
105瀏覽量
15695
原文標題:代碼實戰:YOLOv5實現鋼材表面缺陷檢測
文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論