基于改進YOLOv5的軸承表面缺陷測量系統(tǒng)(部署教程&源碼)

1.研究背景

隨著工業(yè)化進程的不斷推進,機械設備在生產(chǎn)過程中扮演著至關(guān)重要的角色。而軸承作為機械設備中的重要組成部分,其運行狀態(tài)的穩(wěn)定性直接影響到整個設備的性能和壽命。然而,由于長時間的運行和各種外界因素的影響,軸承容易出現(xiàn)各種缺陷,如磨損、裂紋、斷裂等。因此,開發(fā)一種高效準確的軸承缺陷檢測系統(tǒng)對于確保機械設備的正常運行和提高生產(chǎn)效率具有重要意義。

傳統(tǒng)的軸承缺陷檢測方法主要依賴于人工目視檢查或使用特定的儀器設備進行檢測。然而,這些方法存在著許多問題。首先,人工目視檢查需要大量的人力資源和時間,且存在主觀性和疲勞度的問題,容易導致漏檢和誤檢。其次,特定的儀器設備通常價格昂貴,操作復雜,需要專業(yè)技能和經(jīng)驗,不適用于大規(guī)模的生產(chǎn)環(huán)境。因此,研究開發(fā)一種自動化、高效準確的軸承缺陷檢測系統(tǒng)成為迫切需求。

近年來,深度學習技術(shù)的快速發(fā)展為軸承缺陷檢測提供了新的解決方案。YOLOv5(You Only Look Once)是一種基于深度學習的目標檢測算法,具有高效、準確和實時的特點。相比于傳統(tǒng)的目標檢測算法,YOLOv5在速度和精度上都有顯著的提升,適用于復雜場景下的目標檢測任務。因此,將YOLOv5應用于軸承缺陷檢測系統(tǒng)中,可以有效地提高檢測的準確性和效率。

2.研究意義:

基于YOLOv5軸承缺陷檢測系統(tǒng)的研究具有以下幾個方面的意義:

  1. 提高軸承缺陷檢測的準確性:傳統(tǒng)的軸承缺陷檢測方法容易受到人為因素的影響,而基于YOLOv5的自動化檢測系統(tǒng)可以減少人為干擾,提高檢測的準確性和一致性。

  2. 提高軸承缺陷檢測的效率:基于YOLOv5的檢測系統(tǒng)可以實現(xiàn)實時檢測,大大縮短了檢測時間,提高了生產(chǎn)效率。同時,該系統(tǒng)可以自動化地進行檢測,減少了人力資源的消耗。

  3. 降低軸承缺陷檢測的成本:傳統(tǒng)的軸承缺陷檢測方法需要昂貴的儀器設備和專業(yè)技能,而基于YOLOv5的檢測系統(tǒng)可以通過普通的攝像設備實現(xiàn),降低了檢測的成本。

  4. 推動深度學習技術(shù)在工業(yè)領(lǐng)域的應用:基于YOLOv5的軸承缺陷檢測系統(tǒng)是深度學習技術(shù)在工業(yè)領(lǐng)域的一次成功應用,將為其他領(lǐng)域的自動化檢測和智能化生產(chǎn)提供借鑒和參考。

3.圖片演示

2.png
3.png
4.png

4.視頻演示

基于改進YOLOv5的軸承表面缺陷測量系統(tǒng)(部署教程&源碼)_嗶哩嗶哩_bilibili

5.核心代碼講解

5.1 anchor.py

import torch
from models.experimental import attempt_load

class ModelAnalyzer:
    def __init__(self, model_path):
        self.model_path = model_path
    
    def load_model(self):
        model = attempt_load(self.model_path, map_location=torch.device('cpu'))
        return model
    
    def get_anchor_grid(self, model):
        m = model.module.model[-1] if hasattr(model, 'module') else model.model[-1]
        return m.anchor_grid

# Usage
model_path = './best.pt'
analyzer = ModelAnalyzer(model_path)
model = analyzer.load_model()
anchor_grid = analyzer.get_anchor_grid(model)
print(anchor_grid)

這個程序文件名為anchor.py,主要功能是加載模型并打印出模型中的anchor_grid。

程序首先導入了torch庫和attempt_load函數(shù),attempt_load函數(shù)是從models.experimental模塊中導入的。然后,程序使用attempt_load函數(shù)加載了一個模型,模型文件路徑為'./best.pt',并將模型加載到CPU上。

接下來,程序使用條件語句判斷模型是否有module屬性,如果有,則取出模型的最后一層,并賦值給變量m;如果沒有module屬性,則直接取出模型的最后一層,并賦值給變量m。

最后,程序打印出變量m的anchor_grid屬性。

5.2 deep sort.py

import os
import shutil

class ImageClassifier:
    def __init__(self, path):
        self.path = path
    
    def classify_images(self):
        result = os.listdir(self.path)
        if not os.path.exists('./train'):
            os.mkdir('./train')
        if not os.path.exists('./train/1'):
            os.mkdir('./train/1')
        if not os.path.exists('./test'):
            os.mkdir('./test')
        if not os.path.exists('./test/1'):
            os.mkdir('./test/1')
        num = 0
        for i in result:
            num += 1
            if num % 3 == 0:
                shutil.copyfile(self.path + '/' + i, './train/1' + '/' + i)
            if num % 3 == 1:
                shutil.copyfile(self.path + '/' + i, './train/1' + '/' + i)
            if num % 3 == 2:
                shutil.copyfile(self.path + '/' + i, './test/1' + '/' + i)
        print('分類完成')

path = './Temporary_folder'
classifier = ImageClassifier(path)
classifier.classify_images()

這個程序文件名為deep_sort.py,它的功能是將指定文件夾中的圖片進行分類。程序首先導入了cv2和numpy庫,并設置了一個路徑變量path,用于存放需要進行圖像增強的圖片文件夾。然后使用os庫的listdir函數(shù)讀取文件夾內(nèi)的文件,并將結(jié)果保存在result變量中。接下來,程序判斷是否存在train和test文件夾,如果不存在則創(chuàng)建它們,再在train和test文件夾下分別創(chuàng)建1文件夾。然后,程序使用一個循環(huán)遍歷result中的每個文件,通過判斷num除以3的余數(shù)來決定將文件復制到train/1文件夾還是test/1文件夾中。最后,程序輸出"分類完成"的提示信息。

5.3 example.py

import detect
import os
import shutil

class YOLOv5v6Detector:
    def __init__(self, model_path, test_folder, temp_folder):
        self.model_path = model_path
        self.test_folder = test_folder
        self.temp_folder = temp_folder

    def detect_objects(self):
        result = detect.det_yolov5v6(self.model_path, self.test_folder, self.temp_folder)
        return result

# Example usage
detector = YOLOv5v6Detector('./best.pt', './test', './Temporary_folder')
result = detector.detect_objects()

這個程序文件名為example.py,它包含了以下幾個部分的代碼:

  1. 導入模塊:程序首先導入了名為detect的模塊,以及os和shutil模塊。

  2. 定義變量:程序定義了一個名為result的變量。

  3. 調(diào)用函數(shù):程序調(diào)用了detect模塊中的det_yolov5v6函數(shù),并傳入了三個參數(shù):'./best.pt'、'./test'和'./Temporary_folder'。這個函數(shù)的作用是使用指定的模型文件'./best.pt'對'./test'目錄中的圖像進行目標檢測,并將結(jié)果保存到'./Temporary_folder'目錄中。

  4. 注釋:程序中有一行被注釋掉的代碼#print(result)。

總體來說,這個程序的功能是使用Yolov5v6模型對指定目錄中的圖像進行目標檢測,并將結(jié)果保存到指定目錄中。

5.4 hubconf.py

import torch

class YOLOv5:
    def __init__(self, name='yolov5s', pretrained=True, channels=3, classes=80, autoshape=True, verbose=True, device=None):
        self.name = name
        self.pretrained = pretrained
        self.channels = channels
        self.classes = classes
        self.autoshape = autoshape
        self.verbose = verbose
        self.device = device
        self.model = self._create_model()

    def _create_model(self):
        from pathlib import Path
        from models.yolo import Model
        from models.experimental import attempt_load
        from utils.general import check_requirements, set_logging
        from utils.downloads import attempt_download
        from utils.torch_utils import select_device

        file = Path(__file__).resolve()
        check_requirements(exclude=('tensorboard', 'thop', 'opencv-python'))
        set_logging(verbose=self.verbose)

        save_dir = Path('') if str(self.name).endswith('.pt') else file.parent
        path = (save_dir / self.name).with_suffix('.pt')  # checkpoint path
        try:
            device = select_device(('0' if torch.cuda.is_available() else 'cpu') if self.device is None else self.device)

            if self.pretrained and self.channels == 3 and self.classes == 80:
                model = attempt_load(path, map_location=device)  # download/load FP32 model
            else:
                cfg = list((Path(__file__).parent / 'models').rglob(f'{self.name}.yaml'))[0]  # model.yaml path
                model = Model(cfg, self.channels, self.classes)  # create model
                if self.pretrained:
                    ckpt = torch.load(attempt_download(path), map_location=device)  # load
                    msd = model.state_dict()  # model state_dict
                    csd = ckpt['model'].float().state_dict()  # checkpoint state_dict as FP32
                    csd = {k: v for k, v in csd.items() if msd[k].shape == v.shape}  # filter
                    model.load_state_dict(csd, strict=False)  # load
                    if len(ckpt['model'].names) == self.classes:
                        model.names = ckpt['model'].names  # set class names attribute
            if self.autoshape:
                model = model.autoshape()  # for file/URI/PIL/cv2/np inputs and NMS
            return model.to(device)

        except Exception as e:
            help_url = 'https://github.com/ultralytics/yolov5/issues/36'
            s = 'Cache may be out of date, try `force_reload=True`. See %s for help.' % help_url
            raise Exception(s) from e

    def predict(self, imgs):
        return self.model(imgs)


這個程序文件是一個用于加載和使用YOLOv5模型的Python腳本。它定義了一個名為hubconf.py的模塊,可以通過PyTorch Hub加載。以下是該文件的主要功能:

  1. _create函數(shù):根據(jù)指定的模型名稱創(chuàng)建一個YOLOv5模型??梢赃x擇是否加載預訓練權(quán)重、輸入通道數(shù)、類別數(shù)等參數(shù)。還可以選擇是否應用YOLOv5的.autoshape()包裝器來處理輸入數(shù)據(jù)。返回創(chuàng)建的模型。

  2. custom函數(shù):加載自定義或本地模型??梢灾付P偷穆窂?。

  3. yolov5n、yolov5s、yolov5m、yolov5l、yolov5x等函數(shù):加載預訓練的YOLOv5模型??梢赃x擇模型的大小(nano、small、medium、large、xlarge)。

總之,這個程序文件提供了一種方便的方式來加載和使用YOLOv5模型,可以用于目標檢測和圖像識別任務。

5.5 location.py

import cv2

class ImageProcessor:
    def __init__(self, image_path):
        self.image = cv2.imread(image_path)
        self.HSV = self.image.copy()
        self.HSV2 = self.image.copy()
        self.list = []

    def resize_image(self):
        height, width, channels = self.image.shape
        if width > 1500 or width < 600:
            scale = 1200 / width
            print("圖片的尺寸由 %dx%d, 調(diào)整到 %dx%d" % (width, height, width * scale, height * scale))
            scaled = cv2.resize(self.image, (0, 0), fx=scale, fy=scale)
            return scaled, scale

    def get_position(self, event, x, y, flags, param):
        if event == cv2.EVENT_MOUSEMOVE:
            HSV3 = self.HSV2.copy()
            self.HSV = HSV3
            cv2.line(self.HSV, (0, y), (self.HSV.shape[1] - 1, y), (0, 0, 0), 1, 4)
            cv2.line(self.HSV, (x, 0), (x, self.HSV.shape[0] - 1), (0, 0, 0), 1, 4)
            cv2.imshow("imageHSV", self.HSV)
        elif event == cv2.EVENT_LBUTTONDOWN:
            HSV3 = self.HSV2.copy()
            self.HSV = HSV3
            self.list.append([int(x), int(y)])
            print(self.list[-1])

    def process_image(self):
        cv2.imshow("imageHSV", self.HSV)
        cv2.setMouseCallback("imageHSV", self.get_position)
        cv2.waitKey(0)

image_processor = ImageProcessor('./1.jpg')
image_processor.process_image()

這個程序文件名為location.py,它使用了OpenCV和NumPy庫,并且還引入了matplotlib庫的pyplot模塊。

該程序定義了一個名為resizeimg的函數(shù),用于調(diào)整圖像的尺寸。如果圖像的寬度大于1500或小于600,函數(shù)會將圖像的寬度縮放到1200,并返回縮放后的圖像和縮放比例。

接下來,程序讀取名為1.jpg的圖像文件,并創(chuàng)建了一個空列表。

然后,程序進入一個無限循環(huán),循環(huán)中的代碼用于處理圖像。首先,程序?qū)⒃紙D像復制給HSV和HSV2變量。

接下來,程序定義了一個名為getpos的回調(diào)函數(shù),用于處理鼠標事件。當鼠標移動時,函數(shù)會在HSV圖像上繪制一條垂直和一條水平線,并顯示更新后的圖像。當鼠標左鍵按下時,函數(shù)會將鼠標點擊的坐標添加到列表中,并打印出最后一個坐標。

然后,程序顯示HSV圖像,并將鼠標事件與getpos函數(shù)關(guān)聯(lián)起來。

最后,程序等待用戶按下任意鍵后退出。

5.6 test.py


class ImageBox(QWidget):
    def __init__(self):
        super(ImageBox, self).__init__()
        self.img = None
        self.scaled_img = None
        self.point = QPoint(0, 0)
        self.start_pos = None
        self.end_pos = None
        self.left_click = False
        self.scale = 1

    def init_ui(self):
        self.setWindowTitle("ImageBox")

    def set_image(self, img_path):
        """
        open image file
        :param img_path: image file path
        :return:
        """
        # img = QImageReader(img_path)
        # img.setScaledSize(QSize(self.size().width(), self.size().height()))
        # img = img.read()
        self.img = QPixmap(img_path)
        self.scaled_img = self.img

    def paintEvent(self, e):
        """
        receive paint events
        :param e: QPaintEvent
        :return:
        """
        if self.scaled_img:
            painter = QPainter()
            painter.begin(self)
            painter.scale(self.scale, self.scale)
            painter.drawPixmap(self.point, self.scaled_img)
            painter.end()

    def mouseMoveEvent(self, e):
        """
        mouse move events for the widget
        :param e: QMouseEvent
        :return:
        """
        if self.left_click:
            size = self.size().width()
            self.end_pos = e.pos() - self.start_pos
            self.point = self.point + self.end_pos
            self.start_pos = e.pos()
            self.repaint()

    def mousePressEvent(self, e):
        """
        mouse press events for the widget
        :param e: QMouseEvent
        :return:
        """
        if e.button() == Qt.LeftButton:
            self.left_click = True
            self.start_pos = e.pos()

    def mouseReleaseEvent(self, e):
        """
        mouse release events for the widget
        :param e: QMouseEvent
        :return:
        """
        if e.button() == Qt.LeftButton:
            self.left_click = False

class MainDemo(QWidget):
    def __init__(self):
        super(MainDemo, self).__init__()

        self.setWindowTitle("Image Viewer")
        self.setFixedSize(1000, 600)

        self.open_file = QPushButton("Open Image")
        self.open_file.setToolTip("Open the image to view.")
        self.open_file.clicked.connect(self.open_image)
        self.open_file.setFixedSize(150, 30)

        self.zoom_in = QPushButton("")
        self.zoom_in.clicked.connect(self.large_click)
        self.zoom_in.setFixedSize(30, 30)
        in_icon = QIcon("icons/zoomIn.png")
        self.zoom_in.setIcon(in_icon)
        self.zoom_in.setIconSize(QSize(30, 30))

        self.zoom_out = QPushButton("")
        self.zoom_out.clicked.connect(self.small_click)
        self.zoom_out.setFixedSize(30, 30)
        out_icon = QIcon("icons/zoomOut.png")
        self.zoom_out.setIcon(out_icon)
        self.zoom_out.setIconSize(QSize(30, 30))

        w = QWidget(self)
        layout = QHBoxLayout()
        layout.addWidget(self.open_file)
        layout.addWidget(self.zoom_in)
        layout.addWidget(self.zoom_out)
        layout.setAlignment(Qt.AlignLeft)
        w.setLayout(layout)
        w.setFixedSize(300, 50)

        self.box = ImageBox()
        self.box.setFixedSize(500,500)

        layout = QVBoxLayout()
        layout.addWidget(w)
        layout.addWidget(self.box)
        self.setLayout(layout)

    def open_image(self):
        """
        select image file and open it
        :return:
        """
        # img_name, _ = QFileDialog.getOpenFileName(self, "打開圖片", "", "All Files(*);;*.jpg;;*.png")
        img_name, _ = QFileDialog.getOpenFileName(self, "Open Image File","","All Files(*);;*.jpg;;*.png;;*.jpeg")
        self.box.set_image(img_name)

    def large_click(self):
        """
        used to enlarge image
        :return:
        """
        if self.box.scale < 2:
            self.box.scale += 0.1
            self.box.adjustSize()
            self.update()

    def small_click(self):
        """
        used to reduce image
        :return:
        """
        if self.box.scale > 0.3:
            self.box.scale -= 0.2
            self.box.adjustSize()
            self.update()

這個程序是一個簡單的圖像查看器,文件名為test.py。它使用PyQt5庫來創(chuàng)建一個圖形用戶界面。程序包含兩個主要的類:ImageBox和MainDemo。

ImageBox類是一個繼承自QWidget的自定義小部件,用于顯示圖像。它包含了一些成員變量,如img(原始圖像)、scaled_img(縮放后的圖像)、point(圖像在窗口中的位置)、start_pos(鼠標按下時的位置)、end_pos(鼠標移動時的位置)、left_click(鼠標左鍵是否按下)和scale(圖像的縮放比例)。它還包含了一些方法,如init_ui(初始化界面)、set_image(打開圖像文件)、paintEvent(繪制圖像)、mouseMoveEvent(處理鼠標移動事件)、mousePressEvent(處理鼠標按下事件)和mouseReleaseEvent(處理鼠標釋放事件)。

MainDemo類是一個繼承自QWidget的主窗口類,用于顯示圖像查看器的主界面。它包含了一些成員變量,如open_file(打開圖像文件按鈕)、zoom_in(放大按鈕)、zoom_out(縮小按鈕)和box(ImageBox實例)。它還包含了一些方法,如open_image(選擇圖像文件并打開)、large_click(放大圖像)和small_click(縮小圖像)。

在程序的主函數(shù)中,創(chuàng)建了一個QApplication實例和一個MainDemo實例,并顯示主窗口。

這個程序的功能是打開圖像文件并在窗口中顯示,用戶可以通過鼠標拖動圖像來移動圖像的位置,通過點擊放大和縮小按鈕來調(diào)整圖像的大小。

6.YOLOv5 目標檢測算法介紹

YOLOv5s結(jié)構(gòu)如圖2-1所示,由輸入端,Backbone,Neck和 Head組成。輸入端將四張圖片隨機縮放、隨機裁剪和隨機排布的方式拼接,進行Mosaic數(shù)據(jù)增強并且提升網(wǎng)絡的訓練速度。然后經(jīng)過Focus切片,進入由CSP結(jié)構(gòu)和SPP結(jié)構(gòu)組成的 Backbone,從輸入圖像中提取豐富的特征。再由特征金字塔[62](FeaturePyramid Networks,FPN)結(jié)構(gòu)和PAN結(jié)構(gòu)組成的Neck部分將不同尺度特征融合,最后由Head輸出端進行預測,輸出預測框的損失、框的大小是損失和類別的損失,下文介紹YOLOv5s的具體結(jié)構(gòu)組成。


image.png

YOLOv5s和 YOLOv4目標檢測算法在 Backbone中都采用了CSP結(jié)構(gòu)與DarkNet 網(wǎng)絡的結(jié)合,其中 YOLOv4在 Backbone中,將CSP與 DarNet53結(jié)合,增加了Backbone的學習能力,并且在保證準確率的同時,減少了網(wǎng)絡的計算量。YOLOv5s不僅將CSP結(jié)構(gòu)用于Backbone,也用于Neck 層,YOLOv5s 中使用了2種不同形式的CSP結(jié)構(gòu),一種是CSP1_x,輸入的分支
一經(jīng)過CBL卷積模塊、多個殘差結(jié)構(gòu)和一個卷積層,分支二直接進入卷積層,分支一與分支二進行Concat運算后,經(jīng)過標準化、激活函數(shù)和CBL卷積模塊進行輸出,CSP1_x用于Backbone;另一種是CSP2_x,與CSP1_x不同的是在分支一中用多個卷積模塊替代了原來的殘差結(jié)構(gòu),CSP2_x用于Neck部分。CSPl_x是為了避免網(wǎng)絡加深后的梯度消失的問題,而Neck部分網(wǎng)絡深度淺,所以選用CSP2_x,
結(jié)構(gòu)如圖所示:


image.png

7.YOLOv5的改進

7.1 自適應圖像裁剪預處理

參考該博客提出的方案,采用了傳統(tǒng)圖像算法完成對推力球軸承圖片預處理。預處理過程如圖3-1所示,圖像預處理步驟如下:
(1)通過獲取圖像中心圓區(qū)域灰度值的平均值獲得背景平均灰度值 Xaveraage對原圖像獲得閾值分割,得到圖3-2(b);
(2)對于閾值分割后的圖像進行填充,獲得圖3-2(c),根據(jù)填充的區(qū)域得到推力球軸承的中心的位置(Xcentral, Yeentral);
(3)根據(jù)推力球軸承的中心的位置對生成與檢測區(qū)域相近的圓環(huán)得到圖3-2(d),并且從原圖提取圓環(huán)區(qū)域獲得圖3-2(e); 。
(4)根據(jù)推力球軸承的中心對圖3-2(e)進行采集,獲得預處理后的圖像3-2(f) 。
圖片做完預處理后對其標注框的值進行轉(zhuǎn)換,原標注框的信息為(X,Y, Width,Height),其中點X和Y分別為目標框的中心點橫坐標和縱坐標與圖片寬度和高度的比值,Width和 Height分別為目標框的寬和高與圖片寬度和高度的比值,圖像預處理更新后的坐標為(X, Y, Width,Height)。

image.png

7.2 引入Transformer

谷歌團隊在2018年提出的用于生成詞向量的BERT算法,并且在自然語言處理的任務中取得了效果的大幅提升,而 BERT 算法的最重要的部分便是本文中提出的Transformer 的概念。Transformcr和傳統(tǒng)的CNN和RNN 網(wǎng)絡結(jié)構(gòu)不同,整個網(wǎng)絡是完全僅由注意力機制和前饋神經(jīng)網(wǎng)絡組成。傳統(tǒng)的RNN機制的必須是按照一定順序進行計算的,這種機制限制了模型的并行計算能力,并且在計算過程中會導致信息的丟失。


image.png

Transformer的提出解決了上面使用傳統(tǒng)RNN機制的兩個問題,首先它使用注意力機制,將序列中的任何兩個位置之間的距離縮小為一個常量;其次它不是類似RNN的順序結(jié)構(gòu),因此具有更好的并行性,符合現(xiàn)有的GPU框架格式。
Transformer(圖)本質(zhì)上是一個由編碼器(Encoder)和解碼器(Decoder)組成的結(jié)構(gòu),編碼器的輸出作為解碼器的輸入。一個編碼層由一個自注意力機制加上一個前饋層組成,一個解碼層由一個自注意力機制加上一個編碼轉(zhuǎn)解碼注意力機制和一個前饋層組成。
Transformer的輸入X乘以三個不同的權(quán)值矩陣w'、wK、W'得到三個不同的向量,分別是Query向量o,Key向量K和Value向量V作為編碼層的輸入到Self-Attention模塊。首先通過Query向量Q點乘Key向量K的轉(zhuǎn)置計算兩個矩陣的相似度得到Score,對Score除以d,進行歸一化處理,接著對Score使用SoftMax函數(shù)得到每個通道的重要性程度大小,最后點乘Value向量V得到每個輸入向量的評分。計算過程如公式所示:


image.png

Transformer采用的是多頭自注意力機制(Multi-Head Attention),將若干個Self-Attention模塊集成在一個整體模塊,具體過程將輸入X分別輸入到若干個Self-Attention模塊得到若干個加權(quán)后的特征矩陣,然后對加權(quán)后的特征矩陣進行全連接后得到輸出,Transformer完整結(jié)構(gòu)如圖所示:
image.png

7.3 引入VariFocalNe

參考該博客作者提出的學習可同時表示對象存在置信度和定位精度的loU感知分類評分(IACS),以在密集對象檢測器中產(chǎn)生更準確的檢測等級。特別地本文還設計了一個新的損失函數(shù)Q,稱為Varifocal損失,用于訓練密集的物體檢測器來預測IACS,并設計了一種新的高效星形邊界框特征表示,用于估算IACS和改進粗略邊界框。結(jié)合這兩個新組件和邊界框優(yōu)化分支,作者在FCOS架構(gòu)上構(gòu)建了一個新的密集目標檢測器,簡稱為VarifocalNet或VFNet。
本文提出學習loU-aware classification score(IACS)用于對檢測進行分級。為此在去掉中心分支的FCOS+ATSS的基礎(chǔ)上,構(gòu)建了一個新的密集目標檢測器,稱為VarfocalNe或VFNet。相比FCOS+ATSS融合了varifcoal loss、star-shaped bounding box特征表示和boundingbox refinement 3個新組件。


image.png

本文設計了一種用于IACS預測的Star-Shaped Box特征表示方法。它利用9個固定采樣點的特征(圖2中的黃色圓圈)表示一個具有可變形卷積的bounding box。這種新的表示方法可以捕獲bounding box的幾何形狀及其附近的上下文信息,這對于編碼預測的bounding box和ground-truth之間的不對齊是至關(guān)重要的。
具體來說:
1.首先,給定圖像平面上的一個采樣位置(或feature map上的一個投影點),首先用卷積從它回歸一個初始bounding box;
2.然后,在FCOS之后,這個bounding box由一個4D向量編碼,這意味著位置分別到bounding box的左、上、右和下側(cè)的距離。利用這個距離向量啟發(fā)式地選取....和9個采樣點,然后將它們映射到feature map上。它們與(x, y)投影點的相對偏移量作為可變形卷積的偏移量;
3.最后,將這9個投影點上的特征使用可變形卷積卷積表示一個bounding box。由于這些點是人工選擇的,沒有額外的預測負擔。

通過bounding box細化步驟進一步提高了目標定位的精度。bounding box細化是目標檢測中常用的一種技術(shù)但由于缺乏有效的、有判別性的目標描述符,在密集的目標檢測器中并未得到廣泛應用。有了Star-Shaped Box特征表示現(xiàn)在可以在高密度物體探測器中采用它,而不會損失效率。
這里將bounding box細化建模為一個殘差學習問題。對于初始回歸的bounding box:·首先,提取Star-Shaped Box特征表示并對其進行編碼。然后,根據(jù)表示學習4個距離縮放因子來縮放初始距離向量,使表示的細化bounding box更接近ground-truth。


image.png

8.系統(tǒng)整體結(jié)構(gòu)

整體功能和構(gòu)架概述:

該項目是一個基于Yolov5v6.0的目標檢測工程,主要用于訓練、測試和使用YOLOv5模型進行目標檢測任務。它包含了多個文件,每個文件都有不同的功能,如模型定義、數(shù)據(jù)處理、訓練、測試、界面展示等。

以下是每個文件的功能概述:

文件路徑 功能概述
anchor.py 加載模型并打印模型中的anchor_grid
deep_sort.py 將指定文件夾中的圖片進行分類
detect.py 使用指定模型對圖像進行目標檢測
example.py 加載和使用YOLOv5模型的示例程序
export.py 導出模型為ONNX格式
hubconf.py 加載和使用YOLOv5模型的模塊
location.py 圖像位置標定工具
test.py 圖像查看器
train.py 訓練YOLOv5模型
ui.py 圖形用戶界面相關(guān)功能
val.py 對訓練后的模型進行驗證
1\ui.py 圖形用戶界面相關(guān)功能
models\common.py YOLOv5模型的通用函數(shù)和類
models\experimental.py YOLOv5模型的實驗性函數(shù)和類
models\tf.py YOLOv5模型的TensorFlow相關(guān)函數(shù)和類
models\yolo.py YOLOv5模型的主要定義
models_init_.py 模型初始化文件
utils\activations.py 激活函數(shù)相關(guān)功能
utils\augmentations.py 數(shù)據(jù)增強相關(guān)功能
utils\autoanchor.py 自動計算anchor相關(guān)功能
utils\autobatch.py 自動批處理相關(guān)功能
utils\callbacks.py 回調(diào)函數(shù)相關(guān)功能
utils\datasets.py 數(shù)據(jù)集相關(guān)功能
utils\downloads.py 下載相關(guān)功能
utils\general.py 通用功能函數(shù)
utils\loss.py 損失函數(shù)相關(guān)功能
utils\metrics.py 評估指標相關(guān)功能
utils\plots.py 繪圖相關(guān)功能
utils\torch_utils.py PyTorch工具函數(shù)
utils_init_.py 工具函數(shù)初始化文件
utils\aws\resume.py AWS相關(guān)功能
utils\aws_init_.py AWS初始化文件
utils\flask_rest_api\example_request.py Flask REST API示例請求
utils\flask_rest_api\restapi.py Flask REST API相關(guān)功能
utils\loggers_init_.py 日志記錄器初始化文件
utils\loggers\wandb\log_dataset.py WandB日志記錄器相關(guān)功能
utils\loggers\wandb\sweep.py WandB日志記錄器相關(guān)功能
utils\loggers\wandb\wandb_utils.py WandB日志記錄器相關(guān)功能
utils\loggers\wandb_init_.py WandB日志記錄器初始化文件

以上是粗略的功能概述,具體功能可能需要參考第8小節(jié)的詳細內(nèi)容。

8.系統(tǒng)整合

下圖完整源碼&環(huán)境部署視頻教程&數(shù)據(jù)集&自定義UI界面

1.png

參考博客《基于改進YOLOv5的軸承表面缺陷測量系統(tǒng)(部署教程&源碼)》

9.參考文獻


[1]丁勇,洪濤.基于改進型U-Net卷積神經(jīng)網(wǎng)絡的磁片表面缺陷檢測[J].中國標準化.2021,(13).DOI:10.3969/j.issn.1002-5944.2021.13.030.

[2]李浪怡,劉強,鄒一鳴,等.基于改進YOLOv5算法的軌面缺陷檢測[J].五邑大學學報(自然科學版).2021,(3).DOI:10.3969/j.issn.1006-7302.2021.03.007.

[3]周神特,王宇宇,張瀟,等.基于機器視覺的金屬板材表面缺陷光學檢測技術(shù)[J].無損檢測.2020,(9).DOI:10.11973/wsjc202009009.

[4]李維剛,葉欣,趙云濤,等.基于改進YOLOv3算法的帶鋼表面缺陷檢測[J].電子學報.2020,(7).DOI:10.3969/j.issn.0372-2112.2020.07.006.

[5]張磊,郎賢禮,王樂.基于圖像融合與YOLOv3的鋁型材表面缺陷檢測[J].計算機與現(xiàn)代化.2020,(11).DOI:10.3969/j.issn.1006-2475.2020.11.002.

[6]鄧超,劉巖巖.基于邊緣檢測的斜紋布匹瑕疵檢測[J].測控技術(shù).2018,(12).DOI:10.19708/j.ckjs.2018.12.026.

[7]牛乾,劉桂華,康含玉.磁粉探傷鋼軸表面裂紋智能識別方法研究[J].自動化儀表.2018,(3).DOI:10.16086/j.cnki.issn1000-0380.2017060033.

[8]許明奇,鄭紅威,曲瓊.圓柱滾子失效原因分析[J].軸承.2014,(8).DOI:10.3969/j.issn.1000-3762.2014.08.010.

[9]梁華,王姍姍,仇亞軍,等.軸承鋼球表面缺陷分析方法[J].軸承.2013,(6).DOI:10.3969/j.issn.1000-3762.2013.06.014.

[10]葉浩,吳昌虎,張斌,等.我國鋼球生產(chǎn)工藝裝備及發(fā)展展望[J].安徽科技.2013,(11).41-42.DOI:10.3969/j.issn.1007-7855.2013.11.021.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容