【多模态/CV】图像数据增强数据分析和处理
note
- 多模态大模型训练前,图片数据处理的常见操作:分辨率调整、网格畸变、水平翻转、分辨率调整、随机crop、换颜色、多张图片拼接、相似图片检测并去重等
一、分辨率调整
from PIL import Image
def resize_image(original_image_path, save_image_path, reduction_percentage):# 打开图片文件img = Image.open(original_image_path)# 获取原始图片的尺寸original_width, original_height = img.size# 计算新的尺寸,根据减少的百分比new_width = int(original_width * (1 - reduction_percentage / 100.0))new_height = int(original_height * (1 - reduction_percentage / 100.0))# 使用LANCZOS滤镜来保持图片质量img_resized = img.resize((new_width, new_height), Image.LANCZOS)# 如果图像有透明通道,转换为RGB模式if img_resized.mode == 'RGBA':img_resized = img_resized.convert('RGB')# 保存缩小后的图片img_resized.save(save_image_path)# 示例:
# 降低90%的分辨率
resize_image(one_image_path, resize_save_path, 90)
二、适当裁剪图片
# 从中心裁剪图片(高分辨率)
from PIL import Image
def crop_image_by_percentage(crop_percentage, input_path, output_path):# 打开图片文件img = Image.open(input_path)# 获取图片的原始尺寸original_width, original_height = img.size# 计算裁剪区域的宽度和高度,即原始尺寸的(100-crop_percentage)%crop_width = int(original_width * (1 - crop_percentage / 100))crop_height = int(original_height * (1 - crop_percentage / 100))# 计算裁剪区域的起始坐标left = (original_width - crop_width) / 2top = (original_height - crop_height) / 2right = left + crop_widthbottom = top + crop_height# 确保裁剪区域不超出图片边界left = max(0, left)top = max(0, top)right = min(original_width, right)bottom = min(original_height, bottom)# 裁剪图片cropped_img = img.crop((left, top, right, bottom))# 如果图像有透明通道,转换为RGB模式if cropped_img.mode == 'RGBA':cropped_img = cropped_img.convert('RGB')# 保存裁剪后的图片cropped_img.save(output_path)# 可以选择显示图片,如果需要的话# cropped_img.show()# 裁剪掉40%
crop_image_by_percentage(40, resize_save_path, crop_save_path)
三、网格畸变、水平翻转、平移缩放、旋转
# 数据增强: 网格畸变、水平翻转、分辨率调整、随机crop、换颜色
import cv2
import albumentations as A
import matplotlib.pyplot as plt# 读取图片
# image_path = "path/to/your/image.jpg"
image_path = "G9_7097.jpg"
image = cv2.imread(image_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 转换为RGB# 定义数据增强管道
transform = A.Compose([A.HorizontalFlip(p=1), # 水平翻转# A.VerticalFlip(p=0.5), # 垂直翻转# A.RandomRotate90(p=0.5), # 随机旋转90度# A.Transpose(p=0.5), # 交换行列(会旋转90度)# A.ShiftScaleRotate(shift_limit=0.0625, scale_limit=0.1, rotate_limit=10, p=1), # 平移、缩放、旋转A.OpticalDistortion(distort_limit=0.05, shift_limit=0.05, p=0.5), # 光学畸变(颜色可能会改变)# A.GridDistortion(p=0.5), # 网格畸变# A.ElasticTransform(alpha=1, sigma=50, alpha_affine=50, p=0.5) # 弹性变换(会有拉伸效果)
])# 应用数据增强
augmented = transform(image=image)
augmented_image = augmented['image']
# 转换回BGR格式以便保存
augmented_image = cv2.cvtColor(augmented_image, cv2.COLOR_RGB2BGR)
# 保存处理后的图片
save_path = = "save_G9_7097.jpg"
cv2.imwrite(save_path, augmented_image)# 显示原图和增强后的图片
fig, ax = plt.subplots(1, 2, figsize=(12, 6))
ax[0].imshow(image)
ax[0].set_title('Original Image')
ax[0].axis('off')
ax[1].imshow(augmented_image)
ax[1].set_title('Augmented Image')
ax[1].axis('off')
save_path = "G9_7097_diff.jpg"
plt.savefig(save_path)
plt.show()
我这里只是水平翻转,如果需要用其他的旋转等操作,可以修改albumentations.Compose
里的参数。这里的水平翻转后的结果如下图:
如果只需要翻转:
def fanzhuan_func(image_path, save_path):import cv2import albumentations as Aimport matplotlib.pyplot as plt# 读取图片# image_path = "/Users/guomiansheng/Desktop/LLM/ChatGLM2-6B/a_data/a_xiaopeng/pic2nl/two_car/G9_7097.jpg"image = cv2.imread(image_path)image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 转换为RGB# 定义数据增强管道transform = A.Compose([A.HorizontalFlip(p=1) # 只进行水平翻转])# 应用数据增强augmented = transform(image=image)augmented_image = augmented['image']# 转换回BGR格式以便保存或显示augmented_image_bgr = cv2.cvtColor(augmented_image, cv2.COLOR_RGB2BGR)# 保存处理后的图片cv2.imwrite(save_path, augmented_image_bgr)
四、改变图片的背景颜色
在上面的基础上修改transform即可:
# 自定义变换函数,改变背景颜色并使图像变淡
class LightenBackground(A.ImageOnlyTransform):def __init__(self, color=(255, 255, 255), alpha=0.5, always_apply=False, p=1.0):super().__init__(always_apply, p)self.color = colorself.alpha = alphadef apply(self, img, **params):# 创建与图像相同大小的纯色图像background = np.full_like(img, self.color, dtype=np.uint8)# 混合图像和背景颜色return cv2.addWeighted(img, 1 - self.alpha, background, self.alpha, 0)# 读取图片
image = cv2.imread(image_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 转换为RGB# 定义数据增强管道,包括自定义的背景颜色变换
transform = A.Compose([LightenBackground(color=(255, 255, 0), alpha=0.1, p=1), # 淡黄色背景,透明度为0.1
])
关于颜色的相关设定:
1. 白色:
LightenBackground(color=(255, 255, 255), alpha=0.3, p=1)2. 黑色:
LightenBackground(color=(0, 0, 0), alpha=0.3, p=1)3. 红色:
LightenBackground(color=(255, 0, 0), alpha=0.3, p=1)4. 绿色:
LightenBackground(color=(0, 255, 0), alpha=0.3, p=1)5. 蓝色:
LightenBackground(color=(0, 0, 255), alpha=0.3, p=1)6. 黄色:
LightenBackground(color=(255, 255, 0), alpha=0.3, p=1)7. 青色:
LightenBackground(color=(0, 255, 255), alpha=0.3, p=1)8. 品红色:
LightenBackground(color=(255, 0, 255), alpha=0.3, p=1)9. 灰色:
LightenBackground(color=(128, 128, 128), alpha=0.3, p=1)10. 橙色:
LightenBackground(color=(255, 165, 0), alpha=0.3, p=1)
五、图片相似度检测
ORB(Oriented FAST and Rotated BRIEF) 是一种计算机视觉中常用的特征检测算法,它将 FAST 关键点检测和 BRIEF 描述符生成结合起来,同时引入了方向性和尺度不变性。使用 ORB 进行特征检测可以有以下几个应用:
- 目标识别:在多幅图像中检测相同的ORB 特征点,并通过这些点的匹配确定目标物体的位置和方向
- 图像匹配:在两幅图像中检测 ORB 特征点,并通过这些点的匹配来确定它们之间的相似度,可以用于图像拼接、图像比较等任务
- 三维重建:在多幅图像中检测 ORB 特征点,并根据这些点的位置和方向计算出相机位姿,可以用于三维重建和增强现实等应用。
- 目标跟踪: 在视频中检测 ORB 特征点,并通过这些点的跟踪来确定目标的运动轨迹和速度。
import cv2def compute_orb_similarity(imageA_path, imageB_path):# 读取图片imageA = cv2.imread(imageA_path)imageB = cv2.imread(imageB_path)# 初始化ORB检测器orb = cv2.ORB_create()# 寻找关键点和描述符keypointsA, descriptorsA = orb.detectAndCompute(imageA, None)keypointsB, descriptorsB = orb.detectAndCompute(imageB, None)# 初始化BFMatcherbf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)# 匹配描述符matches = bf.match(descriptorsA, descriptorsB)# 按照距离排序matches = sorted(matches, key=lambda x: x.distance)# 计算匹配关键点数量num_matches = len(matches)# 计算平均距离if num_matches > 0:avg_distance = sum(match.distance for match in matches) / num_matcheselse:avg_distance = float('inf')# 计算匹配的比例ratio_matches = num_matches / max(len(keypointsA), len(keypointsB))return num_matches, avg_distance, ratio_matches# 示例使用
imageA_path = "奇瑞汽车_瑞虎8_SUV_蓝色_前方_苏LA006S_右前_32a.jpg"
imageB_path = "奇瑞汽车_瑞虎8_SUV_银色_前方_湘FCG315_左前_35a.jpg"
# imageB_path = "雷克萨斯_未知_SUV_白色_右边_鄂AS600T_右前_815.png"
# imageB_path = "奥迪_未知_轿车_白色_前方_未知_左后_1.jpg"
num_matches, avg_distance, ratio_matches = compute_orb_similarity(imageA_path, imageB_path)# 评估: 匹配的关键点数量和匹配比例越高,平均距离越低,表示图片之间的相似度越高。
# 三个指标:计算匹配关键点数量、平均距离和匹配比例
print(f"Number of Matches: {num_matches}")
print(f"Average Distance: {avg_distance}")
print(f"Ratio of Matches: {ratio_matches:.2f}")
从上面结果可以验证还是有效的,同是奇瑞汽车时会这个匹配的关键点数量和匹配比例为0.29,如果是奇瑞和雷克萨斯则是0.26,说明图片越不相似。
六、图片复制
def copy_func(source_folder, destination_folder, now_image, target_image):import osimport shutil# 定义源文件夹和目标文件夹# source_folder = 'path/to/a'# destination_folder = 'path/to/b'# 确保目标文件夹存在,如果不存在则创建os.makedirs(destination_folder, exist_ok=True)# 构建源文件路径和目标文件路径source_file = os.path.join(source_folder, now_image)destination_file = os.path.join(destination_folder, target_image)# 复制文件try:shutil.copy2(source_file, destination_file)print(f"Copied {source_file} to {destination_file}")except FileNotFoundError:print(f"File {source_file} not found.")except Exception as e:print(f"An error occurred: {e}")print("File copy operation completed.")
七、拼接多张图片
这里一般还有个要求,如果是横向水平拼接,一般将所有图片调整为所有图片中最小的高度(进行等比例缩放):
# 按照最小高度,对不同图片进行等比例缩放
from PIL import Image
import matplotlib.pyplot as plt
import osdef resize_images_to_same_height(image_paths, target_height):resized_images = []for image_path in image_paths:image = Image.open(image_path)# Calculate the new width to maintain the aspect ratioaspect_ratio = image.width / image.heightnew_width = int(target_height * aspect_ratio)# Resize the imageresized_image = image.resize((new_width, target_height), Image.Resampling.LANCZOS)resized_images.append(resized_image)return resized_imagesdef concatenate_images_horizontally(images, output_path):# Find the total width of the final imagetotal_width = sum(image.width for image in images)# Find the maximum height (all images have the same height after resizing)max_height = images[0].height# Create a new image with the appropriate sizeconcatenated_image = Image.new('RGB', (total_width, max_height))# Paste each image into the new imagecurrent_x = 0for image in images:concatenated_image.paste(image, (current_x, 0))current_x += image.width# Display the concatenated imagedisplay(concatenated_image)# Save the concatenated imageconcatenated_image.save(output_path)# 获取文件夹中的图片路径
folder_path = "/a_ex_all_pinpai_car/"
files = os.listdir(folder_path)
image_paths = [os.path.join(folder_path, file) for file in files if file.endswith(('jpg', 'jpeg', 'png'))]# 动态确定目标高度(最小高度)
heights = [Image.open(image_path).height for image_path in image_paths]
target_height = min(heights)# Resize images to the same height
resized_images = resize_images_to_same_height(image_paths, target_height)# 输出路径
output_path = os.path.join(folder_path, 'concatenated_image.jpg')# Concatenate images horizontally
concatenate_images_horizontally(resized_images, output_path)
这里拼接后的结果如下图:
备注:大模型的训练少不了算力资源,博主和一些平台有合作~
高性价比4090算力租用,注册就送20元代金券,更有内容激励活动,点击。
GPU云服务器租用,P40、4090、V100S多种显卡可选,点击。
Reference
[1] 计算两幅图像的相似度(PSNR、SSIM、MSE、余弦相似度、MD5、直方图、互信息、Hash)& 代码实现 与举例
相关文章:
【多模态/CV】图像数据增强数据分析和处理
note 多模态大模型训练前,图片数据处理的常见操作:分辨率调整、网格畸变、水平翻转、分辨率调整、随机crop、换颜色、多张图片拼接、相似图片检测并去重等 一、分辨率调整 from PIL import Image def resize_image(original_image_path, save_image_p…...
代码随想录——修建二叉搜素树(Leetcode669)
题目链接 递归 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …...
EasyExcel导出多个sheet封装
导出多个sheet 在需求中,会有需要导出多种sheet的情况,那么这里使用easyexcel进行整合 步骤 1、导入依赖 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><d…...
【Python错误】:AttributeError: ‘generator‘ object has no attribute ‘next‘解决办法
【Python错误】:AttributeError: ‘generator’ object has no attribute next’解决办法 在Python中,生成器是一种使用yield语句的特殊迭代器,它允许你在函数中产生一个值序列,而无需一次性创建并返回整个列表。然而,…...
如何配置Feign以实现服务调试
1、引入依赖 在项目中,需要引入Spring Cloud OpenFeign的依赖。这通常是通过在pom.xml文件中添加相应的Maven依赖来完成的。例如: <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starte…...
pc之间的相互通信详解
如图,实现两台pc之间的相互通信 1.pc1和pc2之间如何进行通讯。 2.pc有mac和ip,首先pc1需要向sw1发送广播,sw1查询mac地址表,向router发送广播,router不接受广播,router的每个接口都有ip和mac,…...
Mongodb中字段的删除
学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第61篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。 本篇文章,探讨UPDATE中的操作符$unset。Mongodb数据插入后,开发人员使用$u…...
TP8 PHP 动态变量调用 (new $class())->$action($data)
动态: $class \app\table\model\Log; $action DataSave; $data [...]; // 假设这是你要保存的数据//class_exists和method_exists的检查,这段代码能够在尝试实例化类或调用方法之前,先验证类是否存在以及该类中是否存在指定的方法。如果类…...
理解JVM内存模型与Java内存模型(JMM)
理解JVM内存模型与Java内存模型(JMM) 在Java程序的运行过程中,内存管理和线程的同步是两个重要的概念。本文将深入探讨JVM内存模型(Java Virtual Machine Memory Model)和JMM(Java Memory Model࿰…...
鸿蒙OS初识
学习官网:https://www.harmonyos.com/cn/develop 准备 注册,安装软件(node:12, DevEco Studio): https://developer.harmonyos.com/cn/docs/documentation/doc-guides/software_install-0000001053582415#ZH-CN_TOP…...
发布自己的 npm 插件包:步骤与最佳实践
在 Node.js 的生态系统中,npm(Node Package Manager)是一个不可或缺的组成部分。npm 允许开发者创建、共享和使用各种库和插件。如果你有自己的 Node.js 插件或库,并且希望与全世界的其他开发者共享,那么发布到 npm 是…...
BubbleML: A Multiphase Multiphysics Dataset and Benchmarks for Machine Learning
我们使用以下六个分类标准: 研究方法: 这个标准根据如何收集和分析数据来区分研究方法。 实验研究,如参考文献[64]中的研究,涉及在受控环境中研究人员操纵变量并观察结果的物理实验。这种方法对于收集真实世界的数据很有价值,但可能成本高且耗时。模拟研究利用计算模型来模…...
vscode+latex设置跳转快捷键
安装参考 https://blog.csdn.net/Hacker_MAI/article/details/130334821 设置默认recipe ctrl P 打开设置,搜索recipe 也可以点这里看看有哪些配置 2 设置跳转快捷键...
PHP序列化、反序列化
目录 一、PHP序列化:serialize() 1.对象序列化 2.pop链序列化 3.数组序列化 二、反序列化:unserialize() 三、魔术方法 四、NSSCTF相关简单题目 1.[SWPUCTF 2021 新生赛]ez_unserialize 2.[SWPUCTF 2021 新生赛]no_wakeup 学习参考࿱…...
websocket链接携带参数
前端创建链接时官方提供的构造函数 var aWebSocket new WebSocket(url, [protocols]); url:要连接的URL;这应该是WebSocket服务器将响应的URL。 protocols:可选;一个协议字符串或者一个包含协议字符串的数组。这些字符串用于指定…...
【C++进阶】深入STL之list:模拟实现深入理解List与迭代器
📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C “ 登神长阶 ” 🤡往期回顾🤡:初步了解 list 🌹🌹期待您的关注 🌹🌹 ❀STL之list 📒1. list…...
技术管理之巅—如何从零打造高质效互联网技术团队阅读体验
技术管理之巅—如何从零打造高质效互联网技术团队 《技术管理之巅:如何从零打造高质效互联网技术团队》是黄哲铿所著的一本书,致力于帮助技术管理者从零开始打造高效的互联网技术团队。该书分为多个章节,分别探讨了从团队文化建设到技术架构…...
机器学习与数据挖掘知识点总结(一)
简介:随着人工智能(AI)蓬勃发展,也有越来越多的人涌入到这一行业。下面简单介绍一下机器学习的各大领域,机器学习包含深度学习以及强化学习,在本节的机器学习中主要阐述一下机器学习的线性回归逻辑回归&…...
行心科技中禄松波携手,开启智能健康新时代
在2024年第34届健博会暨中国大健康产业文化节的盛大舞台上,广州市行心信息科技有限公司(以下简称“行心科技”)与浙江中禄松波生物工程有限公司(以下简称“中禄松波”)宣布达成战略合作,共同推动医康养产业…...
前端多人项目开发中,如何保证CSS样式不冲突?
在前端项目开发中,例如突然来了一个大项目,很可能就需要多人一起开发,领导说了,要快,要快,要快,你们给我快。然后下面大伙就一拥而上,干着干着发现,一更新代码࿰…...
【YOLOv10改进[CONV]】使用DualConv二次创新C2f模块实现轻量化 + 含全部代码和详细修改方式 + 手撕结构图 + 全网首发
本文将使用DualConv二次创新C2f模块实现轻量化,助力YOLOv10目标检测效果的实践,文中含全部代码、详细修改方式以及手撕结构图。助您轻松理解改进的方法。 改进前和改进后的参数对比: 目录 一 DualConv 1 结合33卷积和11卷积核 2 DualConv 3 可视化 二 C2f_DualConv助…...
基于SSM+Jsp的高校信息资源共享平台
开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包…...
软件测试--Linux快速入门
文章目录 软件测试-需要掌握的Linux指令Linux命令操作技巧Linx命令的基本组成常用命令 软件测试-需要掌握的Linux指令 Linux命令操作技巧 使用Tab键自动补全上下键进行翻找之前输入的命令命令执行后无法停止使用CtrC,结束屏幕输出 Linx命令的基本组成 命令 [-选项] [参数] …...
module ‘django_cas_ng.views‘ has no attribute ‘login‘
这个错误表明你正在尝试从django_cas_ng.views模块中访问一个名为login的属性,但是这个模块中并没有名为login的属性或方法。 解决这个问题,你需要确认你的代码中是否有错误的引用。django_cas_ng是一个CAS(Central Authentication Service&…...
CW32F030K8T7单片机在即热式热水器的应用介绍
随着智能家居技术的不断进步,即热式热水器作为现代家庭中的重要组成部分,正逐渐向智能化、节能化方向发展。本方案通过采用武汉芯源半导体的CW32F030系列单片机,以其高性能、超强抗干扰等特性,为即热式热水器的智能化提供了理想的…...
HTML静态网页成品作业(HTML+CSS)—— 美食湘菜介绍网页(5个页面)
🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有5个页面。 二、作品演示 三、代…...
使用redis构建简单的社交网站
Redis命令实践通常涉及对Redis服务器的直接操作,包括数据的增删改查以及管理Redis实例。以下是一些基本的Redis命令及其使用场景: 连接Redis服务器: 使用Redis客户端连接到Redis服务器:redis-cli 设置和获取键值对: SET key value࿱…...
【Java面试】九、微服务篇-SpringCloud(上)
文章目录 1、SpringCloud五大组件2、服务注册和发现2.1 Eurake2.2 Eurake和Nacos的区别 3、Ribbon负载均衡3.1 策略3.2 自定义负载均衡策略 4、服务雪崩与熔断降级4.1 服务雪崩4.2 服务降级4.3 服务熔断 5、服务限流5.1 Nginx限流5.2 网关限流 6、微服务监控7、面试 1、SpringC…...
Python 树状数组
树状数组(Binary Indexed Tree, BIT),又称为斐波那契堆,是一种数据结构,用于高效地解决以下问题: 单点更新:在数组的某个位置增加或减少一个值。区间查询:查询数组中一段连续区间的…...
【QEMU中文手册】2.2 调用方式(持续更新中)
本文由 AI 翻译(ChatGPT-4)完成,并由作者进行人工校对。如有任何问题或建议,欢迎联系我。联系方式:jelin-shoutlook.com。 原文:Invocation — QEMU documentation qemu-system-x86_64 [选项] [磁盘镜像]磁…...
p2p贷款网站开发/网站seo优化总结
/*S.O.L.I.D五大原则1. 单一原则2. 开闭原则3. 里氏替换原则4. 接口分离原则5. 依赖反转原则 */ /*单一原则:类发生更改的原因只有一个如何知道一个对象的多个行为构造多个职责或单个职责?判断标准:1. 存储对象:提供对象信息给其他…...
台州网站设计 解放路/推广方案怎么做
工厂模式功能说明您是否需要一种非常快速的方法来制作Factory对象? 然后,您需要lambda或其他函数传递! 它不仅快速,而且非常简单。 我敢打赌,如果您对Lambdas非常满意,那么您只需阅读标题就可以做到这一点。…...
网站制作切图/拼多多seo是什么意思
在最近项目开发中遇到一个问题,情况是这样的,第一天数据库操作完全正常的,第二天早上来,就报错invalid connection。明明第一天都是正常的,第二天来就报错了,这个问题比较尴尬。于是上网搜索后,…...
知乎 淘宝网站建设/百度指数搜索榜
本动手实战项目介绍了如何在前端使用Ajax向后端请求数据并展示在Web页面,并且在Web页面提供了“增、删、查、改”的功能。 一、融汇贯通 将Python语言和Django基础知识,以实际应用为媒介,有机组织、融汇贯通。让你的理论与实践结合起来&#…...
做网站不如做公众号/电子商务网站建设规划方案
背景 随着智能网联汽车的发展,车辆的互联性大幅提高,与之相伴的则是大大上升的汽车网络安全风险。根据工信部车联网动态监测情况显示,2020年以来发现整车企业车联网信息服务服务提供商等相关企业和平台的恶意攻击达到280余万次,平…...
做亚马逊学英语有什么网站吗/网络营销中的seo是指
转载于:https://www.cnblogs.com/lr86/p/6656115.html...