遥感数据集制作(Potsdam数据集为例):TIF图像转JPG,TIF标签转PNG,图像重叠裁剪

文章目录

  • TIF图像转JPG
  • TIF标签转PNG
  • 图像重叠裁剪
  • 图像重命名
  • 数据集转COCO格式
  • 数据集转VOC格式

遥感图像不同于一般的自然图像,由于波段数量、图像位深度等原因,TIF图像数据不能使用简单的格式转换方法。本文以Potsdam数据集为例,制作能够直接用于深度学习的数据集。
Potsdam数据集的内容如下:
在这里插入图片描述
本文使用2_Ortho_RGB(图像数据RGB通道顺序)和5_Labels_all(标签数据)作为示例进行数据集制作。
在这里插入图片描述
在这里插入图片描述

TIF图像转JPG

TIF转JPG借鉴了文章怎么读取tif格式的卫星遥感数据,并将数据输入到神经网络模型中进行训练

# -*- coding: UTF-8 -*-
import numpy as np
import os
from PIL import Image
from osgeo import gdal


def readTif(imgPath, bandsOrder=[1, 2, 3]):
    """
    读取GEO tif影像的前三个波段值,并按照R.G.B顺序存储到形状为【原长*原宽*3】的数组中
    :param imgPath: 图像存储全路径
    :param bandsOrder: RGB对应的波段顺序,如高分二号多光谱包含蓝B,绿g,红R,近红Nir外四个波段,RGB对应的波段为3,2,1
    :return: R.G.B三维数组
    """
    dataset = gdal.Open(imgPath, gdal.GA_ReadOnly)
    cols = dataset.RasterXSize
    rows = dataset.RasterYSize
    data = np.empty([rows, cols, 3], dtype=float)
    for i in range(3):
        band = dataset.GetRasterBand(bandsOrder[i])
        oneband_data = band.ReadAsArray()
        data[:, :, i] = oneband_data
    return data


def stretchImg(imgPath, resultPath, lower_percent=0.5, higher_percent=99.5):
    """
    #将光谱DN值映射至0-255,并保存
    :param imgPath: 需要转换的tif影像路径(***.tif)
    :param resultPath: 转换后的文件存储路径(***.jpg)
    :param lower_percent: 低值拉伸比率
    :param higher_percent: 高值拉伸比率
    :return: 无返回参数,直接输出图片
    """
    RGB_Array = readTif(imgPath)
    band_Num = RGB_Array.shape[2]
    JPG_Array = np.zeros_like(RGB_Array, dtype=np.uint8)
    for i in range(band_Num):
        minValue = 0
        maxValue = 255
        # 获取数组RGB_Array某个百分比分位上的值
        low_value = np.percentile(RGB_Array[:, :, i], lower_percent)
        high_value = np.percentile(RGB_Array[:, :, i], higher_percent)
        temp_value = minValue + (RGB_Array[:, :, i] - low_value) * (maxValue - minValue) / (high_value - low_value)
        temp_value[temp_value < minValue] = minValue
        temp_value[temp_value > maxValue] = maxValue
        JPG_Array[:, :, i] = temp_value
    outputImg = Image.fromarray(np.uint8(JPG_Array))
    outputImg.save(resultPath)


def Batch_Convert_tif_to_jpg(imgdir, savedir):
    # 检查保存目录是否存在,如果不存在则创建
    if not os.path.exists(savedir):
        os.makedirs(savedir)

    # 获取文件夹下所有tif文件名称,并存入列表
    file_name_list = os.listdir(imgdir)
    for name in file_name_list:
        # 获取图片文件全路径
        img_path = os.path.join(imgdir, name)
        # 获取文件名,不包含扩展名
        filename = os.path.splitext(name)[0]
        savefilename = filename + ".jpg"
        # 文件存储全路径
        savepath = os.path.join(savedir, savefilename)
        stretchImg(img_path, savepath)
        print(f"Converted {filename} to jpg format.")
    print("Done!")


# 主函数,首先调用
if __name__ == '__main__':
    imgdir = r"F:\Potsdam\2_Ortho_RGB"  # tif文件所在的【文件夹】
    savedir = r"F:\Potsdam\jpg"  # 转为jpg后存储的【文件夹】
    Batch_Convert_tif_to_jpg(imgdir, savedir)

在这里插入图片描述

TIF标签转PNG

如果标签图像是单通道的,那么可以简单地进行格式转换以适应深度学习模型的输入要求。然而,当标签图像以RGB格式存在时,则需要使用RGB字典进行映射。

import os
from PIL import Image
import numpy as np

def rgb_to_single_channel(rgb_image_path, output_path, rgb_dict):
    """
    将RGB图像转换为单通道图像,使用指定的RGB字典来映射类别标签。

    :param rgb_image_path: RGB图像的路径
    :param output_path: 转换后图像的保存路径
    :param rgb_dict: RGB字典,键是RGB元组,值是对应的类别标签
    """
    # 读取RGB图像
    rgb_image = Image.open(rgb_image_path)
    # 将图像转换为numpy数组
    rgb_array = np.array(rgb_image)

    # 创建一个空的单通道图像数组
    single_channel_array = np.zeros((rgb_array.shape[0], rgb_array.shape[1]), dtype=np.uint8)

    # 将RGB值转换为单一的标量值
    for rgb, label in rgb_dict.items():
        # 将图像中的每个像素的RGB值与rgb_dict中的RGB元组进行比较
        # 如果匹配,则将对应的类别标签赋给单通道图像的对应像素
        single_channel_array[np.all(rgb_array == rgb, axis=-1)] = label

    # 将单通道数组转换为图像并保存
    single_channel_image = Image.fromarray(single_channel_array, mode='L')
    single_channel_image.save(output_path)

def convert_tif_to_png(image_folder, output_folder, rgb_dict):
    """
    将指定文件夹中的所有TIFF图像转换为PNG格式,并保存到另一个文件夹中。
    如果图像是单通道图像,则直接转换为PNG。如果图像是RGB图像,则使用rgb_to_single_channel函数进行转换。

    :param image_folder: 包含TIFF图像的文件夹路径。
    :param output_folder: 保存转换后的PNG图像的文件夹路径。
    :param rgb_dict: RGB字典,用于rgb_to_single_channel函数。
    """
    # 检查输出文件夹是否存在,如果不存在则创建它
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    # 遍历图像文件夹中的所有文件
    for filename in os.listdir(image_folder):
        filepath = os.path.join(image_folder, filename)

        # 检查文件是否为TIFF格式
        if filename.endswith('.tif'):
            try:
                # 打开TIFF图像
                image = Image.open(filepath)

                # 检查图像是否为单通道图像
                if image.mode == 'L':
                    # 如果是单通道图像,直接转换为PNG
                    output_filename = os.path.splitext(filename)[0] + '.png'
                    output_filepath = os.path.join(output_folder, output_filename)
                    image.save(output_filepath, 'PNG')
                    print(f"Converted {filename} to png format.")
                else:
                    # 如果是RGB图像,使用rgb_to_single_channel函数进行转换
                    output_filename = os.path.splitext(filename)[0] + '_single_channel.png'
                    output_filepath = os.path.join(output_folder, output_filename)
                    rgb_to_single_channel(filepath, output_filepath, rgb_dict)
                    print(f"Converted {filename} to single channel png format.")

            except Exception as e:
                print(f"Error converting {filename}: {str(e)}")

# 指定图像文件夹和输出文件夹
image_folder = r"F:\Potsdam\5_Labels_all"
output_folder = r"F:\Potsdam\png"

# 定义RGB字典
rgb_dict = {
    (255, 255, 255): 1,  # 不透水路面 Impervious surfaces (RGB: 255, 255, 255)
    (0, 0, 255): 2,      # 建筑物 Building (RGB: 0, 0, 255)
    (0, 255, 255): 3,    # 低植被 Low vegetation (RGB: 0, 255, 255)
    (0, 255, 0): 4,      # 树木 Tree (RGB: 0, 255, 0)
    (255, 255, 0): 5,    # 汽车 Car (RGB: 255, 255, 0)
    (255, 0, 0): 255       # 背景 Clutter/background (RGB: 255, 0, 0)
}

# 调用函数进行转换
convert_tif_to_png(image_folder, output_folder, rgb_dict)

在这里插入图片描述

图像重叠裁剪

由于遥感图像数据集的珍贵性,我们可以使用重叠裁剪的方式扩充数据集数量,当然也可以设置为0不重叠。

import os
from PIL import Image

def crop_images(image_path, save_path, subimage_size, overlap_ratio):
    """
    将图像裁剪成指定大小的子图像,并允许设置子图像之间的重叠比例。
    只有完全覆盖原始图像的子图像才会被保存。

    :param image_path: 原始图像路径
    :param save_path: 保存子图像的路径
    :param subimage_size: 子图像大小(宽度和高度)
    :param overlap_ratio: 子图像之间的重叠比例,范围在0到1之间
    """
    # 确保保存路径存在
    os.makedirs(save_path, exist_ok=True)

    # 遍历图像路径中的所有文件
    for filename in os.listdir(image_path):
        # 检查文件是否为图像格式
        if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.tif')):
            # 打开图像
            img = Image.open(os.path.join(image_path, filename))
            width, height = img.size

            # 计算子图像的步长,包括重叠部分
            step = int(subimage_size * (1 - overlap_ratio))

            # 计算需要划分的行列数
            num_rows = (height // step) + (1 if height % step > 0 else 0)
            num_cols = (width // step) + (1 if width % step > 0 else 0)

            # 遍历并保存每个子图片
            for row in range(num_rows):
                for col in range(num_cols):
                    # 计算子图像的左上角和右下角坐标
                    left = col * step
                    top = row * step
                    right = left + subimage_size
                    bottom = top + subimage_size

                    # 检查子图像是否完全覆盖原始图像
                    if right <= width and bottom <= height:
                        # 裁剪子图像
                        sub_img = img.crop((left, top, right, bottom))

                        # 构建子图像的文件名
                        base_name, ext = os.path.splitext(filename)
                        sub_filename = f"{base_name}_row{row}_col{col}{ext}"

                        # 保存子图像
                        sub_img.save(os.path.join(save_path, sub_filename))
        print(f"{filename} cropping complete.")


crop_images(r'F:\Potsdam\jpg',
            r'F:\Potsdam\jpg_512_0.5',
            512, 0.5)

crop_images(r'F:\Potsdam\png',
            r'F:\Potsdam\png_512_0.5',
            512, 0.5)

在这里插入图片描述

图像重命名

在构建遥感图像数据集的过程中,会遇到图像集和相应的标签集在文件命名上的不一致问题。这种不一致性会导致无法直接将数据集用于深度学习模型的训练,因为模型通常需要图像和标签数据具有完全匹配的文件名,以确保它们可以正确地配对。

import os

def rename(directory, str):
    # 检查目录是否存在
    if not os.path.exists(directory):
        print("path error!")
        return

    # 获取目录下所有文件
    files = os.listdir(directory)

    # 循环处理每个文件
    for file in files:
        if file.endswith(('.png', '.jpg', '.jpeg', '.bmp', '.tif')):
            # 检查文件名中是否包含
            if str in file:
                # 构建新的文件名
                new_file_name = file.replace(str, '')

                # 旧文件路径
                old_file_path = os.path.join(directory, file)
                # 新文件路径
                new_file_path = os.path.join(directory, new_file_name)

                try:
                    # 重命名文件
                    os.rename(old_file_path, new_file_path)
                    print(f" {file} rename {new_file_name}")
                except Exception as e:
                    print(f" {file} error:{e}")


# 指定路径
jpg_directory_path = r"F:\Potsdam\jpg_512_0.5"
png_directory_path = r"F:\Potsdam\png_512_0.5"
jpg_str="_RGB"
png_str="_label_single_channel"

# 执行重命名操作
rename(jpg_directory_path, jpg_str)
rename(png_directory_path, png_str)

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

数据集转COCO格式

某些深度学习模型是根据公共自然图像数据集格式进行数据集格式处理,这里给出COCO数据集的格式转化。

import os
import json
import shutil
import random
from PIL import Image

# 原始JPG图片路径
jpg_path = r'F:\Five-Billion-Pixels\jpg_512'
# 原始PNG标签路径
png_path = r'F:\Five-Billion-Pixels\png_24_512'
# COCO数据集路径
coco_path = r'F:\Five-Billion-Pixels\coco-stuff'

# 确保COCO数据集路径存在
if not os.path.exists(coco_path):
    os.makedirs(coco_path)

# 创建COCO数据集的目录结构
annotations_path = os.path.join(coco_path, 'annotations')
images_path = os.path.join(coco_path, 'images')
train_images_path = os.path.join(images_path, 'train2017')
val_images_path = os.path.join(images_path, 'val2017')
train_annotations_path = os.path.join(annotations_path, 'train2017')
val_annotations_path = os.path.join(annotations_path, 'val2017')

os.makedirs(annotations_path, exist_ok=True)
os.makedirs(images_path, exist_ok=True)
os.makedirs(train_images_path, exist_ok=True)
os.makedirs(val_images_path, exist_ok=True)
os.makedirs(train_annotations_path, exist_ok=True)
os.makedirs(val_annotations_path, exist_ok=True)

# 获取JPG图片列表
jpg_images = [f for f in os.listdir(jpg_path) if f.lower().endswith('.jpg')]

# 随机划分数据集
random.shuffle(jpg_images)
split_index = int(len(jpg_images) * 0.8)  # 80%的数据用于训练,20%的数据用于验证
train_images = jpg_images[:split_index]
val_images = jpg_images[split_index:]

# 复制图像和标签到对应的目录
def copy_images_and_labels(image_list, src_image_path, src_label_path, dst_image_path, dst_label_path):
    for image_name in image_list:
        # 复制图像
        shutil.copy(os.path.join(src_image_path, image_name), os.path.join(dst_image_path, image_name))
        # 复制标签
        label_name = image_name.replace('.jpg', '.png')
        shutil.copy(os.path.join(src_label_path, label_name), os.path.join(dst_label_path, label_name))

# 复制训练集图像和标签
copy_images_and_labels(train_images, jpg_path, png_path, train_images_path, train_annotations_path)

# 复制验证集图像和标签
copy_images_and_labels(val_images, jpg_path, png_path, val_images_path, val_annotations_path)

数据集转VOC格式

某些深度学习模型是根据公共自然图像数据集格式进行数据集格式处理,这里给出VOC数据集的格式转化。

import os
import shutil
import random

def create_voc_dataset(image_folder, label_folder):
    # 定义 VOC 数据集的主目录和子目录
    voc_root = 'VOCdevkit'
    voc_dataset = 'VOC2012'
    voc_images = os.path.join(voc_root, voc_dataset, 'JPEGImages')
    voc_labels = os.path.join(voc_root, voc_dataset, 'SegmentationClassAug')
    voc_image_sets = os.path.join(voc_root, voc_dataset, 'ImageSets', 'Segmentation')

    # 创建 VOC 数据集所需的目录结构
    os.makedirs(voc_images, exist_ok=True)
    os.makedirs(voc_labels, exist_ok=True)
    os.makedirs(voc_image_sets, exist_ok=True)

    # 遍历图像文件夹中的所有图像文件
    for root, dirs, files in os.walk(image_folder):
        for filename in files:
            if filename.endswith('.jpg'):
                # 构建图像文件的完整路径
                image_path = os.path.join(root, filename)
                # 构建 VOC 数据集中的图像路径
                voc_image_path = os.path.join(voc_images, filename)
                # 将图像复制到 VOC 数据集目录
                shutil.copy(image_path, voc_image_path)
    print('图像已复制')

    # 遍历标签文件夹中的所有标签文件
    for root, dirs, files in os.walk(label_folder):
        for filename in files:
            if filename.endswith('.png'):
                # 构建标签文件的完整路径
                label_path = os.path.join(root, filename)
                # 构建 VOC 数据集中的标签路径
                voc_label_path = os.path.join(voc_labels, filename)
                # 将标签复制到 VOC 数据集目录
                shutil.copy(label_path, voc_label_path)
    print('标签已复制')

    # 获取图像文件夹中的所有文件名(不含扩展名)
    image_filenames = [os.path.splitext(filename)[0] for root, dirs, files in os.walk(image_folder) for filename in files if filename.endswith('.jpg')]
    # 随机打乱文件名列表
    random.shuffle(image_filenames)

    # 计算训练集和验证集的分割点
    split_index = int(len(image_filenames) * 0.8)

    # 分割训练集和验证集
    train_files = image_filenames[:split_index]
    val_files = image_filenames[split_index:]

    # 生成 train.txt 文件
    train_file_path = os.path.join(voc_image_sets, 'train.txt')
    with open(train_file_path, 'w') as train_file:
        for filename in train_files:
            train_file.write(filename + '\n')

    # 生成 val.txt 文件
    val_file_path = os.path.join(voc_image_sets, 'val.txt')
    with open(val_file_path, 'w') as val_file:
        for filename in val_files:
            val_file.write(filename + '\n')

    # 打印成功提示信息
    print('train.txt 和 val.txt 已成功创建。')

# 提供图像文件夹和标签文件夹的路径
image_folder = r'F:\WHDLD\Images'
label_folder = r'F:\WHDLD\Labels'

# 调用函数创建 VOC 数据集
create_voc_dataset(image_folder, label_folder)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

信创电脑|暴雨新增兆芯KX-7000处理器版本

IT世界 5 月 15 日消息&#xff0c;暴雨公司信创家族新上架了一款搭载兆芯KX-7000系列处理器、摩尔线程8GB 显卡、16G DDR5 内存以及 512G SSD 的新配置台式电脑主机。 兆芯 KX-7000 处理器采用开先的 8 核 Chiplet互联架构&#xff0c;最高频率3.7 GHz&#xff0c;拥有 32MB 的…

2024最新软件测试【测试理论+ 接口测试】面试题(内附答案)

一、测试理论 3.1 你们原来项目的测试流程是怎么样的? 我们的测试流程主要有三个阶段&#xff1a;需求了解分析、测试准备、测试执行。 1、需求了解分析阶段 我们的 SE 会把需求文档给我们自己先去了解一到两天这样&#xff0c;之后我们会有一个需求澄清会议&#xff0c; …

干什么副业好呢?

选择适合自己的副业可以根据个人的兴趣、技能和时间来决定。以下是一些常见的副业选择 1. 在线销售 可以在电商平台上开设自己的网店&#xff0c;销售自己感兴趣的产品&#xff0c;如手工艺品、服装、配饰等。 2. 做任务 网上我还在做的致米宝库&#xff0c;一个月有个一千多…

shiro_attack工具-shiro反序列化漏洞的快速检测和利用

shiro反序列化漏洞的快速检测和利用 前言 今天分享一个好用的渗透测试工具&#xff0c;主要是针对shiro框架漏洞的&#xff0c;它可以自动的爆破shiro密钥&#xff0c;同时可以写入大马&#xff0c;本人实战中觉得很好用&#xff01;&#xff01;&#xff01; 工具名称 shi…

自学VBA 设置单元格文字格式 笔记

一.设定对应单元格对应需要显示的格式 Cells(1, 1).Font.Size 18 字体大小 Cells(1, 2).Font.Color RGB(255, 0, 0) 字体颜色 Cells(1, 3).Font.Name "黑体" 字体类型 Cells(1, 4).Font.Italic True 字体斜体 Cells(1, 5).Font.FontStyle "BOLD"…

哈夫曼编码的应用

数据结构与算法课的一个简单实验&#xff0c;记录一下&#xff0c;以供参考。 文章目录 要求测试样例统计字母出现次数建立哈夫曼树对字符编码对原文进行编码译码 要求 输入一段100—200字的英文短文&#xff0c;存入一文件a中。统计短文出现的字母个数n及每个字母的出现次数…

stm32ADC注入通道使用笔记(以STM32F407 为例)

ADC_JDR1 存放的是第一次转换的数据 ADC_JDR2 存放的是第二次转换的数据 ADC_JDR3 存放的是第三次转换的数据 ADC_JDR4 存放的是第四次转换的数据 1.当 JL 0&#xff08;定序器中有 1 次注入转换&#xff09;时&#xff0c;ADC 将仅转换 JSQ4[4:0] 通道。值存入ADC_JDR1中…

表现层设计模式_1.MVC模式

1.MVC模式三个核心模块 MVC是一种目前广泛流行的软件设计模式。近年来&#xff0c;随着Java EE的成熟&#xff0c;MVC成为了Java EE平台上推荐的一种设计模式。MVC强制性地把一个应用的输入、处理、输出流程按照视图、控制、模型的方式进行分离&#xff0c;形成了控制器…

战网国际服加速器哪个好用 暴雪战网免费加速器分享

战网国际服&#xff08;Battle.net International或Battle.net Global&#xff09;是由暴雪娱乐公司&#xff08;Blizzard Entertainment&#xff09;运营的面向全球玩家的多人在线游戏平台。与专注于特定地区的版本不同&#xff0c;国际服允许玩家不受地域限制地访问暴雪的多款…

1:硬件测试面试

1&#xff1a;板级测试 . JTAG和Boundary Scan 对于硬件板级测试&#xff0c;我使⽤JTAG和Boundary Scan技术进⾏⾃动化测试。这些技术可以帮助我访问PCB 上的芯⽚引脚&#xff0c;从⽽进⾏信号测量、连通性测试和故障诊断。 2&#xff1a;整机测试 3&#xff1a;测试准备 4…

第189题|幂级数的展开的常规方法(二)|武忠祥老师每日一题

解题思路&#xff1a;将函数展开成幂级数有两种方法&#xff1a;一种是直接法&#xff08;这种一般比较麻烦&#xff09;&#xff0c;一种是拆解成现有展开式展开&#xff08;这种的特征一般是能因式分解&#xff09;。 第一步&#xff1a; 这里看到 ln(1-x-2x^2) 将里面的式…

【图神经网络——消息传递】

消息传递机制 画图先&#xff1a;导包&#xff1a;画图&#xff1a; 实现消息传递&#xff1a;例子一&#xff1a;例子二&#xff1a; 画图先&#xff1a; 导包&#xff1a; import networkx as nx import matplotlib.pyplot as plt import torch from torch_geometric.nn im…

蛋白聚乙二醇化修饰检测试剂盒

蛋白多肽因其高生物活性、高特异性等优点备受药物开发商和研究者的青睐。但分子量大、亲水性强、稳定性差等劣势限制了蛋白多肽在临床上的应用&#xff0c;特别是蛋白多肽作为一种异源蛋白具有很强的免疫原性&#xff0c;容易被机体免疫系统识别并清除&#xff0c;导致药物的血…

动态规划-两个数组的dp问题3

文章目录 1. 两个字符串的最小ASCII删除和&#xff08;712&#xff09;2. 最长重复子数组&#xff08;718&#xff09; 1. 两个字符串的最小ASCII删除和&#xff08;712&#xff09; 题目描述&#xff1a; 状态表示&#xff1a; 根据经验以及题目要求&#xff0c;建立二维数…

zabbix触发器配置定期生效教程

在企业生产过程中&#xff0c;并非所有的设备都需要全天候、满负载运转&#xff0c;也有些仅需要周期性的运转即可。例如&#xff0c;在某家企业&#xff0c;有一批这样的机器&#xff0c;每天都会在固定的时间跑批量任务&#xff0c;期间&#xff0c;机器的CPU使用率会有明显的…

学前端网络安全这块还不懂?细说CSRF

什么是CSRF&#xff1f; 举个栗子&#xff0c;比如我们需要在某个博客上删除一个文章&#xff0c;攻击者首先在自己的域构造一个页面&#xff0c;使用了一个img标签&#xff0c;其地址指向了删除博客的链接。攻击者诱使目标用户&#xff0c;也就是博客主访问这个页面&#xff…

脉冲水路清洗机,全自动脉冲技术清除管道堵塞

邦注脉冲水路清洗机是一种高效的清洗设备&#xff0c;它利用全自动脉冲技术来清除管道内的堵塞和污垢。以下是对该设备的一些详细描述&#xff1a; 全自动脉冲技术&#xff1a;脉冲水路清洗机采用了全自动脉冲技术&#xff0c;这是一种先进的清洗方法。该技术通过产生高强度的…

##21 深入理解文本处理:使用PyTorch进行NLP基础操作

文章目录 前言简介文本预处理实现分词构建词汇表 文本向量化构建简单的文本分类模型结论 前言 在现代深度学习应用中&#xff0c;文本处理是不可或缺的一部分&#xff0c;尤其在自然语言处理&#xff08;NLP&#xff09;领域。借助强大的框架如PyTorch&#xff0c;我们可以更加…

AI 绘画神器 Fooocus 图生图:图像放大或变化、图像提示、图像重绘或扩充、反推提示词、生成参数提取、所需模型下载

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 大家好&#xff0c;我是水滴~~ 本文讲述 Fooocus 的图生图功能&#xff0c;主要内容包括&#xff1a;图像放大或变化、图像提示、图像重绘或扩充、反推…

Typora+PicGo+Gitee设置图床,解决CSDN上传markdown文件图片加载不出来的问题(超级实用)

注&#xff1a; 由于gitee现在已经加上了防盗链&#xff0c;并且只支持1M的图片&#xff0c;我觉得不是很好用&#xff08;可以买腾讯云或阿里云等&#xff09;&#xff0c;之后找到比较好点的图床工具也会持续更新的。&#xff08;sm.ms好像还好&#xff0c;github网速不太稳定…