IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> yolo v4基础知识先导篇 -> 正文阅读

[人工智能]yolo v4基础知识先导篇

*免责声明:
1\此方法仅提供参考
2\搬了其他博主的操作方法,以贴上路径.
3*

场景一:Mish激活函数

场景二:Mosaic数据增强

场景三:DropBlock正则化方法

场景四:CIoU Loss损失函数

场景五: CSPNet

场景一:Mish激活函数

Mish论文地址

一个新的激活函数,ReLU的继任者

请添加图片描述
请添加图片描述
请添加图片描述

#绘制Mish激活函数
import math
import numpy as np
from matplotlib import pyplot as plt
        
def mish(x):
    return x * math.tanh(math.log(1+math.exp(x)))
     
x = np.linspace(-10,10,1000)
y=[]

for i in x:
    y.append(mish(i))

plt.plot(x,y)

plt.grid()
plt.show()

请添加图片描述

场景二:Mosaic数据增强

原文链接

YoloV4当中的Mosaic数据增强方法(附代码讲解)
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
代码可跳过

from PIL import Image, ImageDraw
import numpy as np
from matplotlib.colors import rgb_to_hsv, hsv_to_rgb

"""  
数据增强的方式:
  数据增强其实就是让图片变得更加多样,数据增强是非常重要的提高目标检测算法鲁棒性的手段。
  可以通过改变亮度,图像扭曲等方式使得图像变得更加多种多样,改变后的图片放入神经网络进行训练可以提高网络的鲁棒性,降低各方面额外因素对识别的影响.
  
目标检测中的图像增强:
  在目标检测中如果要增强数据,并不是直接增强图片就好了,还要考虑到图片扭曲后框的位置。也就是框的位置要跟着图片的位置进行改变。
"""


def rand(a=0, b=1):  # 生成一个取值范围为[a,b)的随机数
    return np.random.rand() * (b - a) + a


#  get_random_data数据增强
def get_random_data(annotation_line, input_shape, random=True, max_boxes=20, jitter=.5, hue=.1, sat=1.5, val=1.5, proc_img=True):
    """
    实时数据增强的随机预处理
    random preprocessing for real-time data augmentation

    :param annotation_line: 数据集中的某一行对应的图片
    :param input_shape:  yolo网络输入图片的大小416*416
    :param random:
    :param max_boxes:
    :param jitter:控制图片的宽高的扭曲比率,jitter=.5表示在0.5到1.5之间进行扭曲
    :param hue: 代表hsv色域中三个通道中的色调进行扭曲,色调(H)=.1
    :param sat: 代表hsv色域中三个通道中的饱和度进行扭曲,饱和度(S)=1.5
    :param val: 代表hsv色域中三个通道中的明度进行扭曲,明度(V)=1.5
    :param proc_img:
    :return:
    """
    line = annotation_line.split()
    image = Image.open(line[0])
    iw, ih = image.size   # 原图片大小
    h, w = input_shape    # 模型输入图片的大小
    box = np.array([np.array(list(map(int, box.split(',')))) for box in line[1:]])  # 对该行的图片中的目标框进行一个划分

    # 对图像进行缩放并且进行长和宽的扭曲
    # 扭曲后的图片大小可能会大于416*416的大小,但是在加灰条的时候会修正为416*416
    new_ar = w/h * rand(1-jitter, 1+jitter)/rand(1-jitter, 1+jitter)   # 表原图片的宽高的扭曲比率,jitter=0,则原图的宽高的比率不变,否则对图片的宽和高进行一定的扭曲
    scale = rand(.25, 2)   # scale控制对原图片的缩放比率,rand(.25, 2)表示在0.25到2之间缩放,图片可能会放大可能会缩小,rand(.25, 1)会把原始的图片进行缩小,图片的边缘加上灰条,可以训练网络对我们小目标的检测能力。rand(1,2)则是一定放大图像
    if new_ar < 1:
        nh = int(scale * h)
        nw = int(nh * new_ar)
    else:
        nw = int(scale * w)
        nh = int(nw / new_ar)
    image = image.resize((nw, nh), Image.BICUBIC)
    # print(nw,nh) # 扭曲后的图片的宽和高

    # 将图像多余的部分加上灰条,一定保证图片的大小为w,h = 416,416
    dx = int(rand(0, w - nw))
    dy = int(rand(0, h - nh))
    new_image = Image.new('RGB', (w, h), (128, 128, 128))   # (128, 128, 128)代表灰色
    new_image.paste(image, (dx, dy))
    image = new_image

    # 是否翻转图像
    flip = rand() < .5  # 有50%的几率发生翻转
    if flip: image = image.transpose(Image.FLIP_LEFT_RIGHT)  # 左右翻转

    # 色域扭曲
    # 色域扭曲是发生在这个hsv这样的色域上,hsv色域是有色调H、饱和度S、明度V三者控制,调整这3个值调整色域扭曲的比率
    hue = rand(-hue, hue)
    sat = rand(1, sat) if rand()<.5 else 1/rand(1, sat)
    val = rand(1, val) if rand()<.5 else 1/rand(1, val)
    x = rgb_to_hsv(np.array(image) / 255.)  # 将图片从RGB图像调整到hsv色域上之后,再对其色域进行扭曲
    x[..., 0] += hue
    x[..., 0][x[..., 0] > 1] -= 1
    x[..., 0][x[..., 0] < 0] += 1
    x[..., 1] *= sat
    x[..., 2] *= val
    x[x > 1] = 1
    x[x < 0] = 0
    image_data = hsv_to_rgb(x)  # numpy array, 0 to 1

    # 将box进行调整
    # 对原图片进项扭曲后,也要对原图片中的框框也进行相应的调整
    box_data = np.zeros((max_boxes, 5))
    if len(box) > 0:
        np.random.shuffle(box)
        # 扭曲调整
        box[:, [0, 2]] = box[:, [0, 2]] * nw / iw + dx
        box[:, [1, 3]] = box[:, [1, 3]] * nh / ih + dy
        # 旋转调整
        if flip: box[:, [0, 2]] = w - box[:, [2, 0]]

        # 因为调整后不再图像中的目标框的调整
        box[:, 0:2][box[:, 0:2] < 0] = 0
        box[:, 2][box[:, 2] > w] = w
        box[:, 3][box[:, 3] > h] = h
        box_w = box[:, 2] - box[:, 0]
        box_h = box[:, 3] - box[:, 1]
        box = box[np.logical_and(box_w > 1, box_h > 1)]  # discard invalid box
        if len(box) > max_boxes: box = box[:max_boxes]
        box_data[:len(box)] = box

    return image_data, box_data


# 原图片绘制展示
def normal_(annotation_line, input_shape):
    """
    random preprocessing for real-time data augmentation
    :param annotation_line: 选取的数据集第a行所对应的图片进行数据增强
    :param input_shape:     输入的大小
    :return:
    """
    line = annotation_line.split()  # 以空格进行分割
    # 获取该行对应的图片
    image = Image.open(line[0])
    # 获取该图片上的每一个目标框
    box = np.array([np.array(list(map(int, box.split(',')))) for box in line[1:]])
    return image, box


if __name__ == "__main__":
    with open("2007_train.txt") as f:
        lines = f.readlines()
    a = np.random.randint(0, len(lines))
    line = lines[a]  # 选取的数据集第a行所对应的图片进行数据增强
    image_data, box_data = normal_(line, [416, 416])
    img = image_data

    # 原图片绘制展示
    #数据集的第a行图片的展现
    for j in range(len(box_data)):
        thickness = 3
        left, top, right, bottom = box_data[j][0:4]
        draw = ImageDraw.Draw(img)
        for i in range(thickness):
            draw.rectangle([left + i, top + i, right - i, bottom - i], outline=(255, 255, 255))
    img.show()

    #对图片进行数据增强后的展示
    image_data, box_data = get_random_data(line, [416, 416])
    print(box_data)
    img = Image.fromarray((image_data * 255).astype(np.uint8))
    for j in range(len(box_data)):
        thickness = 3
        left, top, right, bottom = box_data[j][0:4]
        #创建绘制对象
        draw = ImageDraw.Draw(img)
        for i in range(thickness):
            draw.rectangle([left + i, top + i, right - i, bottom - i], outline=(255, 255, 255))
    img.show()


    # img = Image.open(r"F:\Collection\yolo_Collection\keras-yolo3-master\Mobile-yolo3-master/VOCdevkit/VOC2007/JPEGImages/00000.jpg")
    # left, top, right, bottom = 527,377,555,404
    # draw = ImageDraw.Draw(img)
    # draw.rectangle([left, top, right, bottom])
    # img.show()

场景三:DropBlock正则化方法

论文地址
论文翻译

正则化方法之DropBlock
新的正则化神器:DropBlock(Tensorflow实践)

请添加图片描述
请添加图片描述
请添加图片描述

场景四: CIoU Loss损失函数

参考博文博主
浅谈目标检测中常规的回归loss计算
请添加图片描述

1.1 SmoothL1 Loss

Fast R-CNN论文地址
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

1.2 Iou Loss

论文地址
请添加图片描述
请添加图片描述请添加图片描述

请添加图片描述
请添加图片描述

1.3 GIou Loss

论文地址
开源代码

请添加图片描述
请添加图片描述

1.4 DIou Loss 和 CIou Loss

论文地址

DIou开源代码
CIou开源代码

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
在这里插入图片描述

场景五: CSPNet

CSPNet 论文地址

先导知识DenseNet----场景十:新增模型DenseNet

深度学习_经典网络_CSPNet网络详解
【CSPNet 解读】一种增强CNN学习能力的新型骨干网络
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

you did it
在这里插入图片描述

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-12-16 17:40:43  更:2021-12-16 17:43:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 0:36:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码