脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - python目标检测数据增强的代码参数解读及应用

python目标检测数据增强的代码参数解读及应用

2022-12-24 12:30Bubbliiiing Python

这篇文章主要为大家介绍了python目标检测数据增强的代码参数解读及应用,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

数据增强做了什么

数据增强是非常重要的提高目标检测算法鲁棒性的手段,学习一下对身体有好处!

数据增强其实就是让图片变得更加多样。比如说原图是一个电脑

python目标检测数据增强的代码参数解读及应用

如果不使用数据增强的话这个电脑就只是一个电脑,每次训练的电脑都是这样的样子的,但是我们实际生活中电脑是多样的。

因此我们可以通过改变亮度,图像扭曲等方式使得图像变得更加多种多样,如下图所示,尽管亮度,形态发生了细微改变,但本质上,这些东西都依然是电脑。

python目标检测数据增强的代码参数解读及应用

改变后的图片放入神经网络进行训练可以提高网络的鲁棒性,降低各方面额外因素对识别的影响。

 

目标检测中的图像增强

在目标检测中如果要增强数据,并不是直接增强图片就好了,还要考虑到图片扭曲后框的位置。

也就是框的位置要跟着图片的位置进行改变。

如果大家对我的目标检测代码有少许研究的话,应该都可以看到。我特别喜欢用这个数据增强代码:

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'''
  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:]])
  # 对图像进行缩放并且进行长和宽的扭曲
  new_ar = w/h * rand(1-jitter,1+jitter)/rand(1-jitter,1+jitter)
  scale = rand(.25, 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)
  # 将图像多余的部分加上灰条
  dx = int(rand(0, w-nw))
  dy = int(rand(0, h-nh))
  new_image = Image.new('RGB', (w,h), (128,128,128))
  new_image.paste(image, (dx, dy))
  image = new_image
  # 翻转图像
  flip = rand()<.5
  if flip: image = image.transpose(Image.FLIP_LEFT_RIGHT)
  # 色域扭曲
  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.)
  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

里面有一些比较重要的参数如:

scale = rand(.25, 2)jitter=.5;hue=.1;sat=1.5;val=1.5;

其中:

1、scale代表原图片的缩放比率,rand(.25, 2)表示在0.25到2之间缩放。

2、jitter代表原图片的宽高的扭曲比率,jitter=.5表示在0.5到1.5之间扭曲。

3、hue=.1,sat=1.5,val=1.5;分别代表hsv色域中三个通道的扭曲,分别是:色调(H),饱和度(S),明度(V)。

实际效果如下:

原图:

python目标检测数据增强的代码参数解读及应用

增强后:

python目标检测数据增强的代码参数解读及应用

 

全部代码

全部代码构成如下:

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):
  return np.random.rand()*(b-a) + a
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'''
  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:]])
  # 对图像进行缩放并且进行长和宽的扭曲
  new_ar = w/h * rand(1-jitter,1+jitter)/rand(1-jitter,1+jitter)
  scale = rand(.25,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)
  # 将图像多余的部分加上灰条
  dx = int(rand(0, w-nw))
  dy = int(rand(0, h-nh))
  new_image = Image.new('RGB', (w,h), (128,128,128))
  new_image.paste(image, (dx, dy))
  image = new_image
  # 翻转图像
  flip = rand()<.5
  if flip: image = image.transpose(Image.FLIP_LEFT_RIGHT)
  # 色域扭曲
  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.)
  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'''
  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]
  image_data, box_data = normal_(line,[416,416])
  img = image_data
  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()

以上就是python目标检测数据增强的代码参数解读及应用的详细内容,更多关于python数据增强参数解读的资料请关注服务器之家其它相关文章!

原文链接:https://blog.csdn.net/weixin_44791964/article/details/105768775

延伸 · 阅读

精彩推荐