Auto-DataProcessing:一组让制作数据集变轻松的脚本

news2024/11/16 5:29:02

前言

最近跟同学参加了个比赛,我负责Object-Detection的技术实现,需要从网上扒大量的数据(主办方每种识别物就给了一张demo🤣),发现数据准备是一个真的是一个非常重要但又耗时耗力的过程。对我来说,给我一类待识别的标签,我一般会用以下的环节来获取数据:

  • 从Google等网站搜关键词,然后爬个几百张数据,或者直接用google的搜相似图的功能
  • 一些离线的数据增强处理
  • 数据重命名(个人习惯,用data_{index}的顺序让数据排列的整齐一点)

但是准备几千张数据来组成数据集实在是有点烦人…于是我写了一组脚本,能够自动化的实现从数据获取到数据增强,然后批量重命名的脚本,希望能给同样需要处理大量数据的小伙伴剩下一点时间。

Github仓库地址:
> https://github.com/zin-Fu/Automation-Data-Processing

p.s.如果觉得对你有帮助欢迎给我点个👀watch或者star⭐吖!

关于Auto-DataProcessing

这组脚本的主要功能如下:

  1. 🚀数据收集:

    • crawler_keyword.py: 根据指定的关键词从谷歌图像搜索下载图片。
    • crawler_similar.py: 从给定的 URL 获取图像(我是用来搜相似图的时候用的),可以从特定网站或来源收集数据。
  2. 🚀数据增强:

    • DataAugment.py: 通过应用翻转、旋转、添加噪声、高斯模糊、调整亮度对比度等多种数据增强技术,扩充和优化我们的数据集。创建多样化和鲁棒的训练数据。

3.🚀 数据管理:

  • rename.py: 重命名目录中所有图像文件,添加指定的前缀和连续编号,确保文件结构的一致。

此外,所有的参数(获取图片的数量,URL和数据增强的类型这些)都是执行之后在终端直接输入的,不用自己在代码里设定。以数据增强的脚本运行起来的终端为例:
在这里插入图片描述
我们只需要输入要处理文件的路径和选择数据增强的序号就行啦~

一些关键部分的实现

crawler_keyword.py

def google_image_scraper(keyword, num_images, save_dir):
    # Create Chrome WebDriver instance
    driver = webdriver.Chrome()
    driver.implicitly_wait(5)

google_image_scraper函数接受关键词(keyword)、图像数量(num_images)和保存目录(save_dir)作为参数。这个函数用于爬取和下载Google图像搜索结果。在函数内部,我们创建了一个Chrome WebDriver实例,并使用implicitly_wait方法设置了一个隐式等待时间,以确保页面加载完成。

    # Open Google Image Search page
    driver.get("https://www.google.com/imghp")

driver.get方法用于打开指定的URL,这里我们打开了Google图像搜索页面。

    from selenium.webdriver.common.by import By

    # Locate the search box and enter the keyword
    search_box = driver.find_element(By.NAME, "q")
    search_box.send_keys(keyword)
    search_box.send_keys(Keys.RETURN)

使用driver.find_elements方法和CSS选择器定位到所有的图像元素。然后,我们使用os.makedirs方法创建保存图像的目录。exist_ok=True参数表示如果目录已经存在,不会引发异常。

    # Download images
    downloaded_images = set()
    for i, image in enumerate(images[:num_images]):
        try:
            image_url = image.get_attribute("src")
            image_hash = hashlib.sha256(image_url.encode('utf-8')).hexdigest()
            # Check if image has been downloaded
            if image_hash in downloaded_images:
                print(f"Image {i+1} already downloaded, skipping...")
                continue
            # Check if image link is https
            if not image_url.startswith('https://'):
                print(f"Image {i+1} is not from a secure source, skipping...")
                continue
            image_path = os.path.join(save_dir, f"{keyword}_{i}.jpg")
            # Check if file already exists, if so, change filename
            counter = 0
            while os.path.exists(image_path):
                counter += 1
                image_path = os.path.join(save_dir, f"{keyword}_{i}_{counter}.jpg")
            if image_url.startswith('data:image/jpeg;base64,') or image_url.startswith('data:image/gif;base64,'):
                base64_data = image_url.split(',', 1)[1]
                image_data = base64.b64decode(base64_data)
                with open(image_path, 'wb') as f:
                    f.write(image_data)
            else:
                response = requests.get(image_url```
                with open(image_path, "wb") as f:
                    f.write(response.content)

crawler_similar.py

def download_images_from_url(url, num_images, save_dir):
    # Create Chrome WebDriver instance
    driver = webdriver.Chrome()
    driver.implicitly_wait(5)

download_images_from_url函数接受URL(url)、图像数量(num_images)和保存目录(save_dir)作为参数。这个函数用于从给定的URL下载图像。在函数内部,我们创建了一个Chrome WebDriver实例,并使用implicitly_wait方法设置了一个隐式等待时间,以确保页面加载完成。

    try:
        driver.get(url)
        # Get all image elements
        images = driver.find_elements(By.CSS_SELECTOR, "img")
        # Create directory to save images
        os.makedirs(save_dir, exist_ok=True)

使用driver.get方法打开指定的URL。然后,使用driver.find_elements方法和CSS选择器定位到页面上的所有图像元素。我们还使用os.makedirs方法创建保存图像的目录。exist_ok=True参数表示如果目录已经存在,不会引发异常。

        # Download images
        downloaded_images = set()
        for i, image in enumerate(images[:num_images]):
            try:
                image_url = image.get_attribute("src")
                if not image_url:
                    continue
                image_hash = hashlib.sha256(image_url.encode('utf-8')).hexdigest()
                # Check if image has been downloaded
                if image_hash in downloaded_images:
                    print(f"Image {i+1} already downloaded, skipping...")
                    continue

                image_save_path = os.path.join(save_dir, f"image_{i}.jpg")
                
  '''剩下的实现就跟crawler_keyword.py差不多'''

遍历图像元素列表,并尝试下载每个图像。先获取图像的URL,并使用哈希函数计算URL的哈希值。如果图像的哈希值已经在downloaded_images集合中,表示该图像已经下载过,就跳过它。然后根据索引和计数器生成图像的保存路径。如果文件已经存在,则增加计数器以避免文件名冲突。

DataAugment.py

def data_augmentation(img, techniques):
    img_list = []
    
    if '1' in techniques:
        # Flip
        img_list.append(cv2.flip(img, 1))  # Horizontal flip
        img_list.append(cv2.flip(img, 0))  # Vertical flip
        img_list.append(cv2.flip(img, -1)) # Horizontal and vertical flip

data_augmentation函数接受输入的图像和要应用的数据增强技术列表。根据技术列表中的编号,函数将应用不同的数据增强技术。在这种情况下,技术编号1表示翻转操作。通过使用cv2.flip函数,图像将水平翻转、垂直翻转和水平垂直翻转,然后将增强后的图像添加到img_list列表中。

    if '2' in techniques:
        # Rotate
        scale = 1.0
        rows, cols = img.shape[:2]
        center = (cols / 2, rows / 2)  # Image center
        angle = [45, 315]
        for a in angle:
            M = cv2.getRotationMatrix2D(center, a, scale)
            rotated = cv2.warpAffine(img, M, (cols, rows), borderValue=(255, 255, 255))
            img_list.append(rotated)

技术编号2表示旋转操作。使用cv2.getRotationMatrix2D函数获取旋转矩阵,然后使用cv2.warpAffine函数将图像应用旋转变换,生成旋转后的图像。将增强后的图像添加到img_list列表中。

    if '3' in techniques:
        # Noise
        noise_img = img.copy()
        for _ in range(1500):
            noise_img[random.randint(0, noise_img.shape[0] - 1)][random.randint(0, noise_img.shape[1] - 1)][:] = 255
        img_list.append(noise_img)

技术编号3表示添加噪声操作。首先复制原始图像,然后通过随机选择像素位置并将其设置为白色(255)来添加噪声。这里的噪声是通过在图像上随机选择位置并将其像素值设置为白色来模拟的。将增强后的图像添加到img_list列表中。

    if '4' in techniques:
        # Gaussian blur
        blur1 = cv2.GaussianBlur(img, (9, 9), 1.5)
        blur2 = cv2.blur(img, (11, 11), (-1, -1))
        img_list.append(blur1)
        img_list.append(blur2)

技术编号4表示应用高斯模糊操作。通过cv2.GaussianBlur函数和cv2.blur函数应用不同的模糊核生成模糊后的图像。将增强后的图像添加到img_list列表中。

    if '5' in techniques:
        # Lighting
        contrast = 1       # Contrast
        brightness = 100   # Brightness
        light1 = cv2.addWeighted(img, contrast, img, 0, brightness)
        light2 = cv2.addWeighted(img, 1.5, img, 0, 50)
        img_list.append(light1)
        img_list.append(light2)

其他三个增强的方式实现的原理类似。

每个脚本详细的运行方式见:readme里的详细说明

使用方法

  • 根据需求先运行两个crawler文件,获取数据
  • 用数据增强的脚本进行需要的数据增强
  • 用Rename.py脚本批量重命名

然后就得到了一个(不错的)数据集,可以去LabelImg里标注啦(打标签…感觉又入了一个大坑😭)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥之手撕排序算法——冒泡、选择、插入、快排、归并(Python版)

目录 1. 排序引言 2. 冒泡排序 2.1 算法思想 2.2 代码实现 2.3 时空复杂度分析 3. 选择排序 3.1 算法思想 3.2 代码实现 3.3 时空复杂度分析 4. 插入排序 4.1 算法思想 4.3 代码实现 4.4 时空复杂度分析 5. 快速排序 5.1 算法思想 5.2 代码实现 5.3 时空复杂度分…

upload-labs 0.1 靶机详解

下载地址https://github.com/c0ny1/upload-labs/releases Pass-01 他让我们上传一张图片,我们先尝试上传一个php文件 发现他只允许上传图片格式的文件,我们来看看源码 我们可以看到它使用js来限制我们可以上传的内容 但是我们的浏览器是可以关闭js功能的…

【开发】SpringBoot 整合 Redis

目录 前言 1. Redis 的下载及安装 1.1 Redis 的下载 1.2 安装 Redis 1.3 启动 Redis 2. 创建 SpringBoot 项目整合 Redis 2.1 环境要求 2.2 SpringBoot项目构建 2.2.1 方式一 2.2.2 方式二 2.3 在 pom.xml 文件中导入依赖坐标 2.4 在 application.properties 中加…

解释器模式(Interpreter Pattern)

解释器模式 说明 解释器模式(Interpreter Pattern)属于行为型模式,是指给定一门语言,定义它的语法(文法)的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。是一…

CVX安装新版本Mosek求解器

在使用连续凸近似(SCA)求解优化问题时遇到了报错 Problem status : ILL_POSED Solution status : PRIMAL_ILLPOSED_CER并且最后给出的结果为NaN。 在CVX论坛中找到一条回答 具体链接如下: The status is failed 因为我使用的是CVX自带的…

批量查询快递信息,固乔助手助您高效处理

在物流、供应链等行业,每天都需要处理大量的快递信息。无论是物流公司还是供应链企业,都需要实时掌握每一个包裹的状态和位置。然而,当面对成千上万的快递单号时,如何高效地查询这些信息成为了一个亟待解决的问题。 传统的查询方式…

IDEA直接打包Docker镜像

以下为使用IDEA打包Docker镜像并推送到远程仓库(使用Windows打包Docker镜像并推送到远程仓库)教程 1 安装Docker Desktop 下载地址:https://www.docker.com/products/docker-desktop/ 安装成功后,可在cmd查看版本号 2 启动Do…

Machine Learning ---- Feature Scaling

目录 一、What is feature scaling:: 二、Why do we need to perform feature scaling? 三、How to perform feature scaling: 1、Normalization: 2、Mean normalization: 3、Standardization (data needs to follow a normal distribution): 一、What is featur…

膨胀 卷积

1.作用 Dilated convolution、Atrous convolution 增大感受野保持原输入大小 2.膨胀因子 描述的是相邻元素之间的距离 r 2 3.gridding effect 不合理的多个膨胀卷积之前,设计的膨胀因子不合理导致,在增大感受野的同时丢失了细节信息。 丢失&…

【SpringCloud】使用Seata实现分布式事务

目录 一、Seata 框架的需求背景二、Seata 事务模式与架构2.1 Seata 组成2.2 Seata 事务模式 三、Seata 实战演示3.1 部署 Seata Server3.1.1 下载 Seata Server3.1.2 更改 Seata Server 配置3.1.3 创建 Seata Server 所需的数据库、数据库表3.1.4 启动 Seata Server 3.2 Seata …

判断闰年(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int year 2000;//执行循环判断&#xff1b;while (year < 2010){//执行流程&#xff1b;//判断能否整除4&#xff1…

十二、CyclicBarrier

CyclicBarrier 栅栏 什么时候满了开始发车 CyclicBarrier barrier new CyclicBarrier(20, () -> System.out.println("满人"));满20人开始发车每一个线程到达 barrier.await();都等着当 barrier.await();到达20人就开始往下执行 &#xff0c;发车 public…

struts2 CVE-2021-31805-struts2 s2-061 ONGL远程代码执行复现

复现&#xff1a; 切换到vulhub开启并且查看靶场的端口 访问页面 我们可以输入下面的命令来测试一下&#xff0c;执行6*6&#xff0c;查看源代码发现可以成功运行 接下来我们可以注入下面的payload来进行代码执行&#xff0c;执行id来查看当前用户 POST / HTTP/1.1 Host: x.x.…

探索Spring中的属性注入:@Value注解解析与应用

探索Spring中的属性注入&#xff1a;Value注解解析与应用 探索Spring中的属性注入&#xff1a;Value注解解析与应用摘要引言正文作用代码准备示例注入字符串注入属性注入Bean及其属性 其他属性注入优先级问题对Value属性注入的扩展Spring Boot对Value类型转换的扩展 代码案例演…

【GameFramework框架内置模块】8、文件系统(File System)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录&#xff1a; https://blog.csdn.net/q7…

代码随想录算法训练营第二十七天(第二十六天休息)|40.组合总和II

40.组合总和II 题目 给定一个数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次。 说明&#xff1a; 所有数字&#xff08;包括目标数&#xff09;都是正整数。解集…

Android 开发环境搭建(Android Studio 安装图文详细教程)

Android Studio 下载 https://developer.android.google.cn/studio?hlzh-cn Android Studio 安装 检查电脑是否启用虚拟化 如果没有开启虚拟化&#xff0c;则需要进入电脑的 BIOS 中开启 直接 next选择安装的组件&#xff0c;Android Studio 和 Android 虚拟设备&#xff…

使用蜂鸟地图完成楼层自定义、房间着色、热力图、添加图片覆盖物、添加dom覆盖物、定位到固定区域的中心点

项目里有用到蜂鸟地图的地方&#xff0c;虽然有跟她们对接&#xff0c;但看他们文档也挺费劲的&#xff0c;要自己慢慢研究好久&#xff0c;有些实在研究不出来让他们帮忙看代码发现一些问题&#xff0c;所以把我发现的需要注意的一些点发上来&#xff0c;希望可以帮助到部分有…

深入探讨ChatGPT:技术突破与应用前景

目录 一、ChatGPT究竟是什么&#xff1f; 二、ChatGPT的发展脉络 三、ChatGPT的突出优势 强大的语言生成能力 多场景适应性 多语言处理能力 广泛的应用范围 数据敏感性的重视 四、结语&#xff1a;ChatGPT的未来与挑战 Tips&#xff1a;国内的ChatGPT ⭐ 点击进入Chat…

【GIS系列】GeoTools简介及工具类分享

本文将对GeoTools相关概念进行介绍&#xff0c;同时会给大家分享我工作中用到的工具类及使用方法。 作者&#xff1a;后端小肥肠 目录 1.前言 2. GeoTools简介 3. Geotools使用示例 3.1. 开发环境搭建 3.1.1. 所需版本和工具 3.1.2. pom依赖​​​​​​​ 4. 工具类介绍…