【python】Data Augmentation

在这里插入图片描述

参考学习来自:使用Python+OpenCV进行数据增广方法综述(附代码演练)

文章目录

  • Random Cut
  • Cutout
  • Color Jitter
  • Add Noisy

Random Cut

随机裁剪图片中的长款缩放为 scale 倍的区域,resize 到原图大小,bounding box 的坐标也相应的改变

引入了丢弃机制,裁剪后 bbox 的面积如果小于原来的 50%,该 bbox 丢弃

import random
import cv2def randomcrop(img, gt_boxes, scale=0.5, ratio=0.25):'''### Random Crop ###img: imagegt_boxes: format [[obj x1 y1 x2 y2],...]scale: percentage of cropped area'''# Crop imageheight, width = int(img.shape[0]*scale), int(img.shape[1]*scale)# Top Left Coordinatex = random.randint(0, img.shape[1] - int(width))y = random.randint(0, img.shape[0] - int(height))cropped = img[y:y+height, x:x+width]# Visisual bboximg_copy = img.copy()cv2.rectangle(img_copy, (x, y), (x+width, y+height), color=[255, 0, 255], thickness=10)for i in range(len(gt_boxes)):cv2.rectangle(img_copy, (gt_boxes[i][1], gt_boxes[i][2]), (gt_boxes[i][3], gt_boxes[i][4]),color=colors[i], thickness=5)cv2.imwrite("bbox.jpg", img_copy)resized = cv2.resize(cropped, (img.shape[1], img.shape[0]))# Modify annotationnew_boxes = []for box in gt_boxes:obj_name = box[0]x1 = int(box[1])y1 = int(box[2])x2 = int(box[3])y2 = int(box[4])if ratio: # 是否丢弃裁剪过半的 bboxori_area = (y2 - y1) * (x2 - x1)x1_new, y1_new, x2_new, y2_new = x1, y1, x2, y2if x1_new < x:x1_new = xif y1_new < y:y1_new = yif x2_new > x+width:x2_new = x+widthif y2_new > y+height:y2_new = y+heightnew_area = (y2_new-y1_new) * (x2_new-x1_new)if (new_area / ori_area) < ratio:continuex1, x2 = x1-x, x2-xy1, y2 = y1-y, y2-yx1, y1, x2, y2 = x1/scale, y1/scale, x2/scale, y2/scaleif (x1 < img.shape[1] and y1 < img.shape[0]) and (x2 > 0 and y2 > 0):if x1 < 0: x1 = 0if y1 < 0: y1 = 0if x2 > img.shape[1]: x2 = img.shape[1]if y2 > img.shape[0]: y2 = img.shape[0]new_boxes.append([obj_name, x1, y1, x2, y2])return resized, new_boxesif __name__ == "__main__":colors = [[0, 0, 255],[0, 255, 0],[255, 0, 0],[0, 255, 255]]bbox = [["person", 777, 221, 1361, 769],["cat", 1085, 413, 1337, 617],['bird', 413, 273, 625, 581],['bag', 877, 781, 1013, 909]]img = cv2.imread("./1.jpg")resized, new_bbox = randomcrop(img, bbox, scale=0.5, ratio=0.5)print(new_bbox)"""[['person', 1162.0, 164.0, 1920, 1080], ['bird', 434.0, 268.0, 858.0, 884.0]]"""for i in range(len(new_bbox)):cv2.rectangle(resized, (int(new_bbox[i][1]), int(new_bbox[i][2])),(int(new_bbox[i][3]), int(new_bbox[i][4])),color=colors[i], thickness=5)cv2.imwrite("resized.jpg", resized)# cv2.imshow("new bbox", resized)# cv2.waitKey(0)# cv2.destroyAllWindows()

输入图片
在这里插入图片描述

案例1

bbox.jpg,粉色框是随机裁剪的区域,其他框是目标

在这里插入图片描述
resized.jpg,粉色区域也被缩放成原图大小,可以看到猫的框裁剪过半,被舍弃了

在这里插入图片描述

案例2

在这里插入图片描述
未出现裁剪过半的矩形框,所有目标都被保留

在这里插入图片描述

案例3

人和海鸥裁剪均过半,被舍弃,猫和包裁剪未过半,得以保留

在这里插入图片描述
resize 到原图大小

在这里插入图片描述

Cutout

import random
import cv2def cutout(img, gt_boxes, amount=0.5):'''### Cutout ###img: imagegt_boxes: format [[obj x1 y1 x2 y2],...]amount: num of masks / num of objects '''out = img.copy()ran_select = random.sample(gt_boxes, round(amount*len(gt_boxes)))for box in ran_select:x1 = int(box[1])y1 = int(box[2])x2 = int(box[3])y2 = int(box[4])mask_w = int((x2 - x1)*0.5)mask_h = int((y2 - y1)*0.5)mask_x1 = random.randint(x1, x2 - mask_w)mask_y1 = random.randint(y1, y2 - mask_h)mask_x2 = mask_x1 + mask_wmask_y2 = mask_y1 + mask_hcv2.rectangle(out, (mask_x1, mask_y1), (mask_x2, mask_y2), (0, 0, 0), thickness=-1)return outif __name__ == "__main__":colors = [[0, 0, 255],[0, 255, 0],[255, 0, 0],[0, 255, 255]]bbox = [["person", 777, 221, 1361, 769],["cat", 1085, 413, 1337, 617],['bird', 413, 273, 625, 581],['bag', 877, 781, 1013, 909]]img = cv2.imread("./1.jpg")out = cutout(img, bbox)for i in range(len(bbox)):cv2.rectangle(out, (bbox[i][1], bbox[i][2]), (bbox[i][3], bbox[i][4]),color=colors[i], thickness=5)cv2.imwrite("cutout.jpg", out)

在目标中进行 mask,随机左上角,h和w固定为设定值——1/2

输入图片

在这里插入图片描述

输出结果

在这里插入图片描述
可以观察到,人形框和小猫框被 mask 掉了 1/4 区域

Color Jitter

import random
import cv2
import numpy as npdef colorjitter(img, cj_type="b"):'''### Different Color Jitter ###img: imagecj_type: {b: brightness, s: saturation, c: constast}'''if cj_type == "b":# value = random.randint(-50, 50)value = np.random.choice(np.array([-50, -40, -30, 30, 40, 50]))hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)h, s, v = cv2.split(hsv)if value >= 0:lim = 255 - valuev[v > lim] = 255v[v <= lim] += valueelse:lim = np.absolute(value)v[v < lim] = 0v[v >= lim] -= np.absolute(value)final_hsv = cv2.merge((h, s, v))img = cv2.cvtColor(final_hsv, cv2.COLOR_HSV2BGR)return imgelif cj_type == "s":# value = random.randint(-50, 50)value = np.random.choice(np.array([-50, -40, -30, 30, 40, 50]))hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)h, s, v = cv2.split(hsv)if value >= 0:lim = 255 - values[s > lim] = 255s[s <= lim] += valueelse:lim = np.absolute(value)s[s < lim] = 0s[s >= lim] -= np.absolute(value)final_hsv = cv2.merge((h, s, v))img = cv2.cvtColor(final_hsv, cv2.COLOR_HSV2BGR)return imgelif cj_type == "c":brightness = 10contrast = random.randint(40, 100)dummy = np.int16(img)dummy = dummy * (contrast/127+1) - contrast + brightnessdummy = np.clip(dummy, 0, 255)img = np.uint8(dummy)return imgif __name__ == "__main__":img = cv2.imread("./1.jpg")img1 = colorjitter(img, "b")img2 = colorjitter(img, "s")img3 = colorjitter(img, "c")cv2.imwrite("b.jpg", img1)cv2.imwrite("s.jpg", img2)cv2.imwrite("c.jpg", img3)

输入图片

在这里插入图片描述

输出结果

b.jpg 亮度增广
在这里插入图片描述

c.jpg 对比度增广
在这里插入图片描述
s.jpg 饱和度增广

在这里插入图片描述

Add Noisy

import cv2
import numpy as npdef noisy(img, noise_type="gauss"):'''### Adding Noise ###img: imagecj_type: {gauss: gaussian, sp: salt & pepper}'''if noise_type == "gauss":image=img.copy() mean=0st=0.7gauss = np.random.normal(mean,st,image.shape)gauss = gauss.astype('uint8')image = cv2.add(image,gauss)return imageelif noise_type == "sp":image=img.copy() prob = 0.05if len(image.shape) == 2:black = 0white = 255            else:colorspace = image.shape[2]if colorspace == 3:  # RGBblack = np.array([0, 0, 0], dtype='uint8')white = np.array([255, 255, 255], dtype='uint8')else:  # RGBAblack = np.array([0, 0, 0, 255], dtype='uint8')white = np.array([255, 255, 255, 255], dtype='uint8')probs = np.random.random(image.shape[:2])image[probs < (prob / 2)] = blackimage[probs > 1 - (prob / 2)] = whitereturn imageif __name__ == "__main__":img = cv2.imread("./1.jpg")img1 = noisy(img, "gauss")img2 = noisy(img, "sp")cv2.imwrite("gauss.jpg", img1)cv2.imwrite("sp.jpg", img2)

输入图片

在这里插入图片描述

gauss.jpg 高斯噪声
在这里插入图片描述

sp.jpg 椒盐噪声

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/368048.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

8.12 矢量图层面要素单一符号使用十四(标记符号渲染边界)

前言 本章介绍矢量图层线要素单一符号中标记符号渲染边界&#xff08;Outline: Marker line&#xff09;的使用说明&#xff1a;文章中的示例代码均来自开源项目qgis_cpp_api_apps 标记符号渲染边界&#xff08;Outline: Marker line&#xff09; Outline系列只画边界&#…

嵌入式学习——硬件(UART)——day55

1. UART 1.1 定义 UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff0c;通用异步收发器&#xff09;是一种用于串行通信的硬件设备或模块。它的主要功能是将数据在串行和并行格式之间进行转换。UART通常用于计算机与外围设备或嵌入式系统之间的数据传输。…

013、MongoDB常用操作命令与高级特性深度解析

目录 MongoDB常用操作命令与高级特性深度解析 1. 数据库操作的深入探讨 1.1 数据库管理 1.1.1 数据库统计信息 1.1.2 数据库修复 1.1.3 数据库用户管理 1.2 数据库事务 2. 集合操作的高级特性 2.1 固定集合(Capped Collections) 2.2 集合验证(Schema Validation) 2.…

防止跨站脚本攻击XSS之Antisamy

目录 一、什么是跨站脚本攻击&#xff08;XSS&#xff09; 二、通常有哪些解决方案 三、常见的XSS攻击例子有哪些 3.1 存储型XSS攻击&#xff08;黑产恶意截流&#xff0c;跳转不法网站&#xff09; 3.2反射型XSS攻击&#xff1a; 四、什么是跨站请求伪造&#xff1f; 五…

2024年上半年典型网络攻击事件汇总

文章目录 前言一、Ivanti VPN 的0 Day攻击(2024年1月)二、微软公司高管账户泄露攻击(2024年1月)三、Change Healthcare网络攻击(2024年2月)四、ConnectWise ScreenConnect漏洞利用攻击(2024年2月)五、XZ Utils软件供应链攻击(2024年3月)六、AT&T数据泄露攻击(20…

【产品经理】订单处理11-订单修改场景梳理

为了应对订单修改的场景&#xff0c;电商ERP系统应该如何设计相应模块&#xff1f; 电商ERP系统&#xff0c;经常遇到需要修改订单的情况&#xff0c;修改订单主要以下几种场景&#xff1a; 一、修改商品 修改商品&#xff0c;包括对正常商品的换货、以及对赠品的增删改。 1…

docker安装ElasticSearchKibana

本文参考以下两篇文章 ✅ElasticSearch&Kibana 部署 云效 Thoughts 企业级知识库 (aliyun.com) docker安装ElasticSearch&Kibana - 飞书 安装elasticsearch 使用docker下载es&#xff1a; docker pull elasticsearch:8.13.0 挂载配置 创建挂在文件目录 mkdir…

无人机企业需要什么资质?

无人机企业所需的资质主要可以分为几大类&#xff0c;以确保其合法、安全、高效地进行相关业务活动。以下是对这些资质的详细解释和归纳&#xff1a; 1. 基础企业资质&#xff1a; - 工商营业执照&#xff1a;这是企业合法经营的基本证书&#xff0c;所有企业都需要取得。无人…

是霍尼韦尔还是柏曼啊??书客、霍尼、柏曼三款护眼大路灯横向PK!

是霍尼韦尔还是柏曼啊&#xff1f;&#xff1f;近年来市面上的劣质护眼大路灯越来越多&#xff0c;很容易使我们选到劣质产品。为了解决这一问题&#xff0c;我自费购买了多个品牌的护眼大路灯进行测评。经过深入研究&#xff0c;我发现市面上确实存在一些光线不稳定、选材做工…

指挥中心操作台的形状及空间布局

在现代化的指挥中心&#xff0c;操作台的形状设计至关重要&#xff0c;它不仅影响着操作人员的工作效率和舒适度&#xff0c;还关系到整个指挥系统的运行效果。常见的指挥中心操作台形状多种多样&#xff0c;以满足不同的功能需求和空间布局。 直线型操作台 直线型操作台是最为…

用python画蜡笔小新

代码地址: https://pan.quark.cn/s/6ae646d2fef3

QT+OpenCV在Android上实现人脸实时检测与目标检测

一、功能介绍 在当今的移动应用领域&#xff0c;随着技术的飞速发展和智能设备的普及&#xff0c;将先进的计算机视觉技术集成到移动平台&#xff0c;特别是Android系统中&#xff0c;已成为提升用户体验、拓展应用功能的关键。其中&#xff0c;目标检测与人脸识别作为计算机视…

Panmnesia发布CXL协议 允许AI GPU以最小的延迟利用各类内存

韩国 科学技术院&#xff08;KAIST&#xff09;的一家初创公司Panmnesia推出了一种尖端 IP&#xff0c;可通过 PCIe 上的 CXL 协议为人工智能 GPU 添加外部存储器&#xff0c;从而打破了存储器容量的障碍&#xff0c;提供有效的基础设施来解决 HBM 的局限性。 目前的人工智能加…

超快的 Python 包管理工具「GitHub 热点速览」

天下武功&#xff0c;无坚不破&#xff0c;唯快不破&#xff01; 要想赢得程序员的欢心&#xff0c;工具的速度至关重要。仅需这一优势&#xff0c;即可使其在众多竞争对手中脱颖而出&#xff0c;迅速赢得开发者的偏爱。以这款号称下一代极速 Python 包管理工具——uv 为例&…

利用DeepFlow解决APISIX故障诊断中的方向偏差问题

概要&#xff1a;随着APISIX作为IT应用系统入口的普及&#xff0c;其故障定位能力的不足导致了在业务故障诊断中&#xff0c;APISIX常常成为首要的“嫌疑对象”。这不仅导致了“兴师动众”式的资源投入&#xff0c;还可能使诊断方向“背道而驰”&#xff0c;从而导致业务故障“…

网站显示不安全怎么解决

网站显示不安全通常表现为浏览器地址栏中出现“不安全”字样或红色感叹号&#xff0c;这意味着用户的个人信息、登录凭证和其他敏感数据可能面临风险。以下是一些步骤和建议&#xff1a; 1、检查URL是否以HTTPS开头&#xff1a; 确保你访问的网址是以https://开头&#xff0c;而…

go-redis源码解析:cluster模式如何选择节点

1. 如何选择节点 1.1. 确定slot 1.1.1. 通过cmdSlot方法确定在哪个槽上, 这一步只是本地计算 首先入口方法_process&#xff0c;先通过cmdSlot方法用key计算此次应该落在哪个槽上 通过crc16sum算法计算key应该属于哪个槽&#xff0c;slotNumber为16384 func Slot(key strin…

ctfshow-web入门-命令执行(web118详解)Linux 内置变量与Bash切片

输入数字和小写字母&#xff0c;回显 evil input 查看源码&#xff0c;发现这里会将提交的参数 code 传给 system 函数 使用 burpsuite 抓包进行单个字符的模糊测试 fuzz&#xff1a; 发现过滤掉了数字和小写字母以及一些符号&#xff0c;下面框起来的部分是可用的 结合题目提…

h5兼容table ,如何实现h5在app内使用h5渲染table表格而且实现横屏预览?

压图地址 横屏div 通过css 实现 transform: rotate(90deg); transformOrigin: 50vw 50vw ; height: 100vw; width: 100vh;<divclass"popup-box":style"{transform: originSet 0 ? rotate(90deg) : ,transformOrigin: originSet 0 ? 50vw 50vw : ,height…

Facebook:数字社交的引领者与创新者

自2004年诞生以来&#xff0c;Facebook从一个校园网络项目迅速成长为全球最大的社交媒体平台&#xff0c;彻底改变了我们与世界互动的方式。作为数字社交的引领者和创新者&#xff0c;Facebook不仅在技术层面上不断突破&#xff0c;也在社会和文化领域留下了深刻的印记。本文将…