日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

目标检测常见数据增强算法汇总讲解(Mixup,Cutout,CutMix,Mosaic)

發布時間:2023/12/3 综合教程 44 生活家
生活随笔 收集整理的這篇文章主要介紹了 目标检测常见数据增强算法汇总讲解(Mixup,Cutout,CutMix,Mosaic) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? ?在學習目標檢測算法的過程中,發現了一些有趣的目標檢測算法,打算簡單寫個筆記,不足之處還望諒解,可以在評論中指出來。

? ? ? ? 目標檢測作為需要大量數據的算法,在實際情況中經常面臨數據不足的情況,事實上很多時候數據確實對于開發者來說非常難搞,因此大佬們開發了各式各樣的通過軟件的方式將我們的數據變的多樣化的方法。(Mixup,Cutout,CutMix,Mosaic)就是四種最為經典的算法,下面我們逐一進行講解。

Mixup數據增強算法:

? ? ? ? ?隨機混合圖像:將兩個圖像按一定比例混合生成新的圖像,(與其他數據增強方式不同的是這里還會生成新標簽),然后使用新的圖像和標簽參與訓練,整個過程中原始圖像不參與訓練。?

??圖1

圖2

? ?

混合后的圖像

?圖像混合的數學方法(mixup數學公式)如下:

(x? , y?),(x??, y?)是隨機選擇的兩個樣本及對應標簽。其中,圖像x?(標簽為y?)和圖像x?(標簽為y?),λ為從beta分布中隨機采樣的數。

個人感覺他這個算法思想還是很easy的就是根據從beta中采樣的隨機數,然后根據隨機數的比例對圖像進行混合,同時標簽也是按照相應的比例混合,從何得到混合后的新圖像和新標簽。

mixup源代碼:

import matplotlib.pyplot as plt
import matplotlib.image as Image
import cv2
im1 = Image.imread("cat1.jpg") #輸入圖片1的路徑
im1 = im1/255.
im2 = Image.imread("cat2.jpg") #輸入圖片2的路徑
im2 = im2/255.lam= 4*0.1  #融合比例
im_mixup = (im1*lam+im2*(1-lam))
cv2.imwrite('mixup.jpg', im_mixup) #把融合之后的圖片保存到當前文件夾
plt.imshow(im_mixup)
plt.show()

Cutout數據增強算法:?

? ? ? ?隨機裁剪圖像的一塊區域,并在圖像中對裁剪后的區域進行補0,與mixup不同的是,它不改變label。如下圖所示,很簡單和容易理解的方法,這個有點類似神經網絡的dropout,我們隨時扔掉一些神經元,可緩解神經網絡的過擬合達到更好的效果。

? ? ? ??

Cutout源代碼:?

import cv2
from torchvision import transforms
import matplotlib.pyplot as plt
import numpy as np
import torch
class Cutout(object):"""Randomly mask out one or more patches from an image.Args:n_holes (int): Number of patches to cut out of each image.length (int): The length (in pixels) of each square patch."""def __init__(self, n_holes=1, length=16):self.n_holes = n_holesself.length = lengthdef __call__(self, img):"""Args:img (Tensor): Tensor image of size (C, H, W).Returns:Tensor: Image with n_holes of dimension length x length cut out of it."""h = img.size(1)w = img.size(2)mask = np.ones((h, w), np.float32)for n in range(self.n_holes):y = np.random.randint(h)x = np.random.randint(w)y1 = np.clip(y - self.length // 2, 0, h)y2 = np.clip(y + self.length // 2, 0, h)x1 = np.clip(x - self.length // 2, 0, w)x2 = np.clip(x + self.length // 2, 0, w)mask[y1: y2, x1: x2] = 0.mask = torch.from_numpy(mask)mask = mask.expand_as(img)img = img * maskreturn img
# 執行cutout
img = cv2.imread('cat.1.jpg')#圖片路徑
img = transforms.ToTensor()(img)cut = Cutout(length=100)
img = cut(img)# cutout圖像寫入本地
img = img.mul(255).byte()
img = img.numpy().transpose((1, 2, 0))
cv2.imwrite('cutout.jpg', img)  #把隨機裁剪之后的圖片保存到當前文件夾
plt.imshow(img)
plt.show()

? ? ? ??

CutMix數據增強算法:?

? ? ? CutMix算法其實也可以顧名思義理解,Cutout和Mixup的結合體,思想很簡單,我們首先使用Cutout對圖像隨機選擇一塊兒區域進行裁剪,然后使用Mixup圖像跟裁剪后的圖像進行混合。

數學上實現方法如下:

Cutmix代碼:

代碼懶得自己寫了,參考這位

數據增強---CutMix - hikari_1994 - 博客園大佬的修改了一下。可以自動將輸入的圖片resize成同樣大小的,這樣可以隨意輸入兩個不同大小的圖片,和效果圖可以自動保存到本地。

import matplotlib.pyplot as plt
import numpy as npplt.rcParams['figure.figsize'] = [10, 10]import cv2def rand_bbox(size, lamb):"""生成隨機的bounding box:param size::param lamb::return:"""W = size[0]H = size[1]# 得到一個bbox和原圖的比例cut_ratio = np.sqrt(1.0 - lamb)cut_w = int(W * cut_ratio)cut_h = int(H * cut_ratio)# 得到bbox的中心點cx = np.random.randint(W)cy = np.random.randint(H)bbx1 = np.clip(cx - cut_w // 2, 0, W)bby1 = np.clip(cy - cut_h // 2, 0, H)bbx2 = np.clip(cx + cut_w // 2, 0, W)bby2 = np.clip(cy + cut_h // 2, 0, H)#隨機生成遮擋框return bbx1, bby1, bbx2, bby2def cutmix(image_batch, image_batch_labels, alpha=1.0):# 決定bbox的大小,服從beta分布lam = np.random.beta(alpha, alpha)#  permutation: 如果輸入x是一個整數,那么輸出相當于打亂的range(x)rand_index = np.random.permutation(len(image_batch))# 對應公式中的y_a,y_btarget_a = image_batch_labelstarget_b = image_batch_labels[rand_index]# 根據圖像大小隨機生成bboxbbx1, bby1, bbx2, bby2 = rand_bbox(image_batch[0].shape, lam)image_batch_updated = image_batch.copy()# image_batch的維度分別是 batch x 寬 x 高 x 通道# 將所有圖的bbox對應位置, 替換為其他任意一張圖像# 第一個參數rand_index是一個list,可以根據這個list里索引去獲得image_batch的圖像,也就是將圖片亂序的對應起來image_batch_updated[:, bbx1: bbx2, bby1:bby2, :] = image_batch[rand_index, bbx1:bbx2, bby1:bby2, :]# 計算 1 - bbox占整張圖像面積的比例lam = 1 - ((bbx2 - bbx1) * (bby2 - bby1)) / (image_batch.shape[1] * image_batch.shape[2])# 根據公式計算labellabel = target_a * lam + target_b * (1. - lam)return image_batch_updated, labelif __name__ == '__main__':cat = cv2.cvtColor(cv2.imread("cat.1.jpg"), cv2.COLOR_BGR2RGB)dog = cv2.cvtColor(cv2.imread("cat.2.jpg"), cv2.COLOR_BGR2RGB)data = [cat , dog]a = 0H, W = cat.shape[0], cat.shape[1]width = 400  # 需要縮放成多大,這里直接修改就行,我這里是縮放成400*400,根據自己的需要修改成響應的數值即可height = 400  #博主源代碼只能輸入大小相同兩張圖片進行cutmix,我這里可以自動將兩張圖片調整成相同大小,避免了還需要手動調節圖片大小輸入的尷尬cat= cv2.resize(cat, (width, height), interpolation=cv2.INTER_AREA)H, W = dog.shape[0], dog.shape[1]width = 400  # 需要縮放成多大,這里直接修改就行,我這里是縮放成400*400,根據自己的需要修改成響應的數值即可height = 400dog= cv2.resize(dog, (width, height), interpolation=cv2.INTER_AREA)updated_img, label = cutmix(np.array([cat, dog]), np.array([[0, 1], [1, 0]]), 0.5)print(label)#輸出融合后的標簽fig, axs = plt.subplots(nrows=1, ncols=2, squeeze=False)ax1 = axs[0, 0]ax2 = axs[0, 1]ax1.imshow(updated_img[0])cv2.imwrite('cutmix_1.jpg', updated_img[0])ax2.imshow(updated_img[1])cv2.imwrite('cutmix_2.jpg', updated_img[1])plt.show()

Mosaic數據增強算法:?

更像是Cutmix的改進,四張圖片拼接到一起,這樣使得在訓練的時候可以一次性訓練四張圖,

據說是在BN層計算的時候效果更好,到底好不好咱也不知道,作者說好就是好把。不過極大的豐富了目標背景這個倒是真的,畢竟一個目標有了四個背景不是?

?我這效果圖不好可能是因為選的圖片尺寸有點問題,懶得調了,知道啥意思就行。

一句話看懂思路的就是這位大佬的

目標檢測: 一文讀懂 Mosaic 數據增強_大林兄的博客-CSDN博客_mosaic數據增強

的這部分

?好的,我想這里已經表達的很清楚了。當然細節的地方得注意一下,圖像拼接的時候,是需要分別對圖片進行增光操作的。

????????1、翻轉(對原始圖片進行左右的翻轉);

????????2、縮放(對原始圖片進行大小的縮放);

????????3、色域變化(對原始圖片的明亮度、飽和度、色調進行改變)等操作。這也是為了豐富一下數據多樣性

并且按照四個方向位置擺好

代碼看B導的:睿智的目標檢測28——YoloV4當中的Mosaic數據增強方法_Bubbliiiing的博客-CSDN博客_睿智yolov4

b導已經寫的很好了,我就不寫了

好的 目標檢測數據增強篇就到這里了,兄弟們覺得有用的麻煩點個贊!感謝!

? ? ? ? ??

總結

以上是生活随笔為你收集整理的目标检测常见数据增强算法汇总讲解(Mixup,Cutout,CutMix,Mosaic)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。