[图像处理] 基于CleanVision库清洗图像数据集

CleanVision是一个开源的Python库,旨在帮助用户自动检测图像数据集中可能影响机器学习项目的常见问题。该库被设计为计算机视觉项目的初步工具,以便在应用机器学习之前发现并解决数据集中的问题。CleanVision的核心功能包括检测完全重复、近似重复、模糊、低信息量、过暗、过亮、灰度、不规则长宽比和尺寸异常等问题图片。CleanVision开源仓库地址为:CleanVision,官方文档地址为:CleanVision-docs。

CleanVision基础版安装命令如下:

pip install cleanvision

完整版安装命令如下:

pip install “cleanvision[all]”

查看CleanVision版本:

# 查看版本
import cleanvision
cleanvision.__version__
'0.3.6'

本文代码必要库版本:

# 用于表格显示
import tabulate
# tabulate版本需要0.8.10以上
tabulate.__version__
'0.9.0'

文章目录

  • 1 使用说明
    • 1.1 CleanVision功能介绍
    • 1.2 基础使用
    • 1.3 自定义检测
    • 1.4 在Torchvision数据集上运行CleanVision
    • 1.5 在Hugging Face数据集上运行CleanVision
  • 2 参考

1 使用说明

1.1 CleanVision功能介绍

CleanVision支持多种格式的图像文件,并能检测以下类型的数据问题:

示例图片问题类型描述关键字
完全重复完全相同的图像exact_duplicates
近似重复视觉上几乎相同的图像near_duplicates
模糊图像细节模糊(焦点不实)blurry
信息量低缺乏内容的图像(像素值的熵很小)low_information
过暗不规则的暗图像(曝光不足)dark
过亮不规则的亮图像(曝光过度)light
灰度缺乏颜色的图像grayscale
异常宽高比宽高比异常的图像odd_aspect_ratio
异常大小相比数据集中其他图像,尺寸异常的图像odd_size

上表中,CleanVision针对这些问题的检测主要依赖于多种统计方法,其中关键字列表用于指定CleanVision代码中每种问题类型的名称。CleanVision兼容Linux、macOS和Windows系统,可在Python 3.7及以上版本的环境中运行。

1.2 基础使用

本节介绍如何读取文件夹中的图片以进行问题检测。以下示例展示了对一个包含607张图片的文件夹进行质量检测的过程。在检测过程中,CleanVision将自动加载多进程以加快处理速度:

基础使用

from cleanvision import Imagelab# 示例数据:https://cleanlab-public.s3.amazonaws.com/CleanVision/image_files.zip
# 读取示例图片
dataset_path = "./image_files/"# 实例化Imagelab类,以用于后续处理
imagelab = Imagelab(data_path=dataset_path)# 使用multiprocessing进行多进程处理,n_jobs设置进程数
# n_jobs默认为None,表示自动确定进程数
# 处理时会先检测每张图片的image_property(图像质量)
# 等所有图片处理完后,再检测duplicate(重复)
imagelab.find_issues(verbose=False, n_jobs=2)
Reading images from D:/cleanvision/image_files

如果在Windows系统上运行CleanVision代码,需要将相关代码放入main函数中,以便正确加载multiprocessing模块。当然,也可以将n_jobs设置为1,以使用单进程:

from cleanvision import Imagelabif '__main__' == __name__:# 示例数据:https://cleanlab-public.s3.amazonaws.com/CleanVision/image_files.zip# 读取示例图片dataset_path = "./image_files/"imagelab = Imagelab(data_path=dataset_path)imagelab.find_issues(verbose=False)
Reading images from D:/cleanvision/image_files

基于report函数,能够报告数据集中每种问题类型的图像数量,并展示每种问题类型中最严重实例的图像:

imagelab.report()
Issues found in images in order of severity in the dataset|    | issue_type       |   num_images |
|---:|:-----------------|-------------:|
|  0 | odd_size         |          109 |
|  1 | grayscale        |           20 |
|  2 | near_duplicates  |           20 |
|  3 | exact_duplicates |           19 |
|  4 | odd_aspect_ratio |           11 |
|  5 | dark             |           10 |
|  6 | blurry           |            6 |
|  7 | light            |            5 |
|  8 | low_information  |            5 | --------------------- odd_size images ----------------------Number of examples with this issue: 109
Examples representing most severe instances of this issue:

png

--------------------- grayscale images ---------------------Number of examples with this issue: 20
Examples representing most severe instances of this issue:

png

------------------ near_duplicates images ------------------Number of examples with this issue: 20
Examples representing most severe instances of this issue:Set: 0

png

Set: 1

png

Set: 2

png

Set: 3

png

----------------- exact_duplicates images ------------------Number of examples with this issue: 19
Examples representing most severe instances of this issue:Set: 0

png

Set: 1

png

Set: 2

png

Set: 3

png

----------------- odd_aspect_ratio images ------------------Number of examples with this issue: 11
Examples representing most severe instances of this issue:

png

----------------------- dark images ------------------------Number of examples with this issue: 10
Examples representing most severe instances of this issue:

png

---------------------- blurry images -----------------------Number of examples with this issue: 6
Examples representing most severe instances of this issue:

png

----------------------- light images -----------------------Number of examples with this issue: 5
Examples representing most severe instances of this issue:

png

------------------ low_information images ------------------Number of examples with this issue: 5
Examples representing most severe instances of this issue:

png

如果想创建自定义的问题识别类型,可以参考:custom_issue_manager。

与数据结果交互的主要方式是通过Imagelab类。此类可用于在宏观层面(全局概览)和微观层面(每张图片的问题和质量评分)了解数据集中的问题。它包含三个主要属性:

  • Imagelab.issue_summary:问题摘要
  • Imagelab.issues:问题列表
  • Imagelab.info:数据集信息,包括相似图片信息

问题结果分析

通过issue_summary属性可以展示数据集中不同问题类别的图像数量:

# 返回结果为pandas的dataframe
res = imagelab.issue_summary
type(res)
pandas.core.frame.DataFrame

查看汇总结果:

res
issue_typenum_images
0odd_size109
1grayscale20
2near_duplicates20
3exact_duplicates19
4odd_aspect_ratio11
5dark10
6blurry6
7light5
8low_information5

通过issues属性,可以展示每张图片中各种问题的质量分数及其存在情况。这些质量分数的范围从0到1,较低的分数表示问题的严重性更高:

imagelab.issues.head()
odd_size_scoreis_odd_size_issueodd_aspect_ratio_scoreis_odd_aspect_ratio_issuelow_information_scoreis_low_information_issuelight_scoreis_light_issuegrayscale_scoreis_grayscale_issuedark_scoreis_dark_issueblurry_scoreis_blurry_issueexact_duplicates_scoreis_exact_duplicates_issuenear_duplicates_scoreis_near_duplicates_issue
D:/cleanvision/image_files/image_0.png1.0False1.0False0.806332False0.925490False1False1.000000False0.980373False1.0False1.0False
D:/cleanvision/image_files/image_1.png1.0False1.0False0.923116False0.906609False1False0.990676False0.472314False1.0False1.0False
D:/cleanvision/image_files/image_10.png1.0False1.0False0.875129False0.995127False1False0.795937False0.470706False1.0False1.0False
D:/cleanvision/image_files/image_100.png1.0False1.0False0.916140False0.889762False1False0.827587False0.441195False1.0False1.0False
D:/cleanvision/image_files/image_101.png1.0False1.0False0.779338False0.960784False0True0.992157False0.507767False1.0False1.0False

由于imagelab.issues返回的是Pandas的数据表格,因此可以对特定类型的数据进行筛选:

# 得分越小,越严重
dark_images = imagelab.issues[imagelab.issues["is_dark_issue"] == True].sort_values(by=["dark_score"]
)
dark_images_files = dark_images.index.tolist()
dark_images_files
['D:/cleanvision/image_files/image_417.png','D:/cleanvision/image_files/image_350.png','D:/cleanvision/image_files/image_605.png','D:/cleanvision/image_files/image_177.png','D:/cleanvision/image_files/image_346.png','D:/cleanvision/image_files/image_198.png','D:/cleanvision/image_files/image_204.png','D:/cleanvision/image_files/image_485.png','D:/cleanvision/image_files/image_457.png','D:/cleanvision/image_files/image_576.png']

可视化其中的问题图片:

imagelab.visualize(image_files=dark_images_files[:4])

png

完成上述任务的更简洁方法是直接在imagelab.visualize函数中指定issue_types参数,这样可以直接显示某个问题下的图片,并按严重程度对其进行排序展示:

# issue_types:问题类型,num_images:显示图片数,cell_size:每个网格中图片尺寸
imagelab.visualize(issue_types=["low_information"], num_images=3, cell_size=(3, 3))

png

查看图片信息和相似图片

通过info属性可以查看数据集的信息:

# 查看存在的项目
imagelab.info.keys()
dict_keys(['statistics', 'dark', 'light', 'odd_aspect_ratio', 'low_information', 'blurry', 'grayscale', 'odd_size', 'exact_duplicates', 'near_duplicates'])
# 查看统计信息
imagelab.info["statistics"].keys()
dict_keys(['brightness', 'aspect_ratio', 'entropy', 'blurriness', 'color_space', 'size'])
# 查看数据集的统计信息
imagelab.info["statistics"]["size"]
count     607.000000
mean      280.830152
std       215.001908
min        32.000000
25%       256.000000
50%       256.000000
75%       256.000000
max      4666.050578
Name: size, dtype: float64

查看数据集中基本相似的图片个数:

imagelab.info["exact_duplicates"]["num_sets"]
9

查看数据集中近似的图片对:

imagelab.info["near_duplicates"]["sets"]
[['D:/cleanvision/image_files/image_103.png','D:/cleanvision/image_files/image_408.png'],['D:/cleanvision/image_files/image_109.png','D:/cleanvision/image_files/image_329.png'],['D:/cleanvision/image_files/image_119.png','D:/cleanvision/image_files/image_250.png'],['D:/cleanvision/image_files/image_140.png','D:/cleanvision/image_files/image_538.png'],['D:/cleanvision/image_files/image_25.png','D:/cleanvision/image_files/image_357.png'],['D:/cleanvision/image_files/image_255.png','D:/cleanvision/image_files/image_43.png'],['D:/cleanvision/image_files/image_263.png','D:/cleanvision/image_files/image_486.png'],['D:/cleanvision/image_files/image_3.png','D:/cleanvision/image_files/image_64.png'],['D:/cleanvision/image_files/image_389.png','D:/cleanvision/image_files/image_426.png'],['D:/cleanvision/image_files/image_52.png','D:/cleanvision/image_files/image_66.png']]

1.3 自定义检测

指定检测类型

from cleanvision import Imagelab# 示例数据:https://cleanlab-public.s3.amazonaws.com/CleanVision/image_files.zip
dataset_path = "./image_files/"# 指定检测类型
issue_types = {"blurry":{}, "dark": {}}imagelab = Imagelab(data_path=dataset_path)imagelab.find_issues(issue_types=issue_types, verbose=False)
imagelab.report()
Reading images from D:/cleanvision/image_filesIssues found in images in order of severity in the dataset|    | issue_type   |   num_images |
|---:|:-------------|-------------:|
|  0 | dark         |           10 |
|  1 | blurry       |            6 | ----------------------- dark images ------------------------Number of examples with this issue: 10
Examples representing most severe instances of this issue:

png

---------------------- blurry images -----------------------Number of examples with this issue: 6
Examples representing most severe instances of this issue:

png

如果已经运行过find_issues函数,再次运行该函数时如果添加新的检测类型,当前结果将会与上一次的结果合并:

issue_types = {"light": {}}
imagelab.find_issues(issue_types)
# 报告三个类型的结果
imagelab.report()
Checking for light images ...
Issue checks completed. 21 issues found in the dataset. To see a detailed report of issues found, use imagelab.report().
Issues found in images in order of severity in the dataset|    | issue_type   |   num_images |
|---:|:-------------|-------------:|
|  0 | dark         |           10 |
|  1 | blurry       |            6 |
|  2 | light        |            5 | ----------------------- dark images ------------------------Number of examples with this issue: 10
Examples representing most severe instances of this issue:

png

---------------------- blurry images -----------------------Number of examples with this issue: 6
Examples representing most severe instances of this issue:

png

----------------------- light images -----------------------Number of examples with this issue: 5
Examples representing most severe instances of this issue:

png

结果保存

以下代码展示了如何保存和加载结果,但加载结果时,数据路径和数据集必须与保存时保持一致:

save_path = "./results"
# 保存结果
# force表示是否覆盖原文件
imagelab.save(save_path, force=True)
# 加载结果
imagelab = Imagelab.load(save_path, dataset_path)
Successfully loaded Imagelab

阈值设置

CleanVision通过阈值控制来确定各种检测结果,其中exact_duplicates和near_duplicates是基于图像哈希(由 imagehash库提供)进行检测的,而其他类型的检测则采用范围为0到1的阈值来控制结果。如果图片在某一问题类型上的得分低于设定的阈值,则认为该图片存在该问题;阈值越高,判定为存在该问题的可能性越大。如下所示:

关键字超参数
1lightthreshold
2darkthreshold
3odd_aspect_ratiothreshold
4exact_duplicatesN/A
5near_duplicateshash_size(int),hash_types(whash,phash,ahash,dhash,chash)
6blurrythreshold
7grayscalethreshold
8low_informationthreshold

对于单一检测类型,阈值设置代码如下:

imagelab = Imagelab(data_path=dataset_path)
issue_types = {"dark": {"threshold": 0.5}}
imagelab.find_issues(issue_types)imagelab.report()
Reading images from D:/cleanvision/image_files
Checking for dark images ...Issue checks completed. 20 issues found in the dataset. To see a detailed report of issues found, use imagelab.report().
Issues found in images in order of severity in the dataset|    | issue_type   |   num_images |
|---:|:-------------|-------------:|
|  0 | dark         |           20 | ----------------------- dark images ------------------------Number of examples with this issue: 20
Examples representing most severe instances of this issue:

png

如果某类问题的存在是正常的,例如天文数据集中普遍图像过暗的情况,那么可以设置一个最大出现率(max_prevalence)。这意味着如果某一问题的图像所占比例超过了max_prevalence,则可以认为该问题是正常的。以上示例中,dark问题的图像数量为10,图像总数为607,因此dark问题的图像占比约为0.016。如果将max_prevalence设置为0.015,那么出现dark问题的图片将不会被报告为dark问题:

imagelab.report(max_prevalence=0.015)
Removing dark from potential issues in the dataset as it exceeds max_prevalence=0.015 
Please specify some issue_types to check for in imagelab.find_issues().

1.4 在Torchvision数据集上运行CleanVision

CleanVision支持使用Torchvision数据集进行问题检测,具体代码如下:

准备数据集

from torchvision.datasets import CIFAR10
from torch.utils.data import ConcatDataset
from cleanvision import Imagelab# 准备torchvision中的CIFAR10数据集
train_set = CIFAR10(root="./", download=True)
test_set = CIFAR10(root="./", train=False, download=True)
Files already downloaded and verified
Files already downloaded and verified
# 查看训练集和测试集样本数
len(train_set), len(test_set)
(50000, 10000)

如果想对训练集和测试集进行合并处理,可以使用如下代码:

dataset = ConcatDataset([train_set, test_set])
len(dataset)
60000

查看图片:

dataset[0][0]

png

运行CleanVision

只需在创建Imagelab示例时指定torchvision_dataset参数,即可对Torchvision数据集进行操作,后续的处理步骤与读取文件夹中图片的处理方式相同:

imagelab = Imagelab(torchvision_dataset=dataset)
imagelab.find_issues()
# 查看结果
# imagelab.report()
Checking for dark, light, odd_aspect_ratio, low_information, exact_duplicates, near_duplicates, blurry, grayscale, odd_size images ...Issue checks completed. 173 issues found in the dataset. To see a detailed report of issues found, use imagelab.report().
# 结果汇总
imagelab.issue_summary
issue_typenum_images
0blurry118
1near_duplicates40
2dark11
3light3
4low_information1
5grayscale0
6odd_aspect_ratio0
7odd_size0
8exact_duplicates0

1.5 在Hugging Face数据集上运行CleanVision

CleanVision支持基于Hugging Face数据集(如果能用的话)进行问题检测,代码如下:

# datasets是专门用于下载huggingface数据集的工具
from datasets import load_dataset
from cleanvision import Imagelab
# 以https://huggingface.co/datasets/mah91/cat为例
# 下载某个hugging face数据集,只需要将参数path设置为待下载链接datasets后的文字
# split表示提取train或test的数据,如果没有提供分割后的数据集则返回完整的数据
dataset = load_dataset(path="mah91/cat", split="train")
Repo card metadata block was not found. Setting CardData to empty.
# 查看数据集,可以看到该数据集有800张图片,只提供了图片没有注释。
dataset
Dataset({features: ['image'],num_rows: 800
})
# dataset.features包含数据集中不同列的信息以及每列的类型,例如图像,音频
dataset.features
{'image': Image(mode=None, decode=True, id=None)}

指定hf_dataset参数加载hugging face数据集:

# 加载数据至CleanVision,image_key指定包含'image'的数据
imagelab = Imagelab(hf_dataset=dataset, image_key="image")

进行检测的代码如下:

imagelab.find_issues()
# 结果汇总
imagelab.issue_summary
Checking for dark, light, odd_aspect_ratio, low_information, exact_duplicates, near_duplicates, blurry, grayscale, odd_size images ...Issue checks completed. 4 issues found in the dataset. To see a detailed report of issues found, use imagelab.report().
issue_typenum_images
0blurry3
1odd_size1
2dark0
3grayscale0
4light0
5low_information0
6odd_aspect_ratio0
7exact_duplicates0
8near_duplicates0

2 参考

  • CleanVision
  • CleanVision-docs
  • custom_issue_manager
  • imagehash

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

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

相关文章

ML 系列:机器学习和深度学习的深层次总结(17)从样本空间到概率规则概率

一、说明 概率是支撑大部分统计分析的基本概念。从本质上讲,概率提供了一个框架,用于量化不确定性并对未来事件做出明智的预测。无论您是在掷骰子、预测天气还是评估金融市场的风险,概率都是帮助您驾驭不确定性的工具。本篇将讲授概率的原理和…

论文阅读:Guided Linear Upsampling

今天介绍一篇有趣的文章,Guided Linear Upsampling,基于引导的线性上采样,这是发表在 ACM transaction on Graphic 的一篇工作。 Abstract 引导上采样是加速高分辨率图像处理的一种有效方法。在本文中,文章作者提出了一种简单而…

博客搭建之路:hexo搜索引擎收录

文章目录 hexo搜索引擎收录以百度为例 hexo搜索引擎收录 hexo版本5.0.2 npm版本6.14.7 next版本7.8.0 写博客的目的肯定不是就只有自己能看到,想让更多的人看到就需要可以让搜索引擎来收录对应的文章。hexo支持生成站点地图sitemap 在hexo下的_config.yml中配置站点…

问:MySQL表过大,你有哪些优化实践?

当MySQL单表记录数过大时,数据库的CRUD(创建、读取、更新、删除)性能会明显下降。为了提升性能,我们需要采取一些优化措施。本文将详细介绍几种常见的优化方案。 1. 限定数据的范围 描述 务必禁止不带任何限制数据范围条件的查…

优先算法——移动零(双指针)

目录 1. 题目解析 2. 算法原理 3.代码实现 题目: 力扣题目链接:移动零 1. 题目解析 题目截图如下: 不过要注意,这个移动题目要求是在原数组中原地操作,不能新额外开辟一个数组来修改。 2. 算法原理 这个原理可以称之为数…

node和npm

背景(js) 1、为什么js能操作DOM和BOM? 原因:每个浏览器都内置了DOM、BOM这样的API函数 2、浏览器中的js运行环境? v8引擎:负责解析和执行js代码 内置API:由运行环境提供的特殊接口,只能在所…

Python | Leetcode Python题解之第507题完美数

题目&#xff1a; 题解&#xff1a; class Solution:def checkPerfectNumber(self, num: int) -> bool:if num 1:return Falsesum 1d 2while d * d < num:if num % d 0:sum dif d * d < num:sum num / dd 1return sum num

使用预训练的BERT进行金融领域问答

获取更多完整项目代码数据集&#xff0c;点此加入免费社区群 &#xff1a; 首页-置顶必看 1. 项目简介 本项目旨在开发并优化一个基于预训练BERT模型的问答系统&#xff0c;专注于金融领域的应用。随着金融市场信息复杂性和规模的增加&#xff0c;传统的信息检索方法难以高效…

Python 爬虫项目实战:爬取某云热歌榜歌曲

一、网络爬虫的定义 网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;也成为网页蜘蛛或者网页机器人&#xff0c;是一种按照既定规则自动浏览网络并提取信息的程序。爬虫的主要用途包括数据采集、网络索以及内容抓取等。 二、爬虫基本原理 1、种子URL&#xff1a;爬…

01 springboot-整合日志(logback-config.xml)

logback-config.xml 是一个用于配置 Logback 日志框架的 XML 文件&#xff0c;通常位于项目的 classpath 下的根目录或者 src/main/resources 目录下。 Logback 提供了丰富的配置选项&#xff0c;可以满足各种不同的日志需求。需要根据具体情况进行配置。 项目创建&#xff0…

学习规划网络安全工程师之路

要成为一名网络安全工程师&#xff0c;尤其是在物联网安全日渐重要的背景下&#xff0c;你需要制定一个系统的学习规划&#xff0c;以掌握相关知识和技能。以下是一个具体的学习规划&#xff0c;分为基础阶段、进阶阶段和实践阶段。 学习规划 一、基础阶段&#xff08;1-3个月…

CCF-BDCI大数据与计算智能大赛TOP4-京东生鲜

2023 CCF 大数据与计算智能大赛《线上线下全场景生鲜超市库存履约一体化决策》top4南山论剑 摘要1 数据预处理1.1 数据整合1.2 数据划分 2 特征工程2.1 静态特征2.2 动态特征 3 方案设计3.1 数据构造3.2 模型训练3.3 模型融合3.4库存分配3.5 方案对比 链接: CCFBDCI-线上线下全…

Linux下EDAC功能介绍

一、背景介绍 edac 目的是在linux系统运行过程中&#xff0c;当内存错误发生时&#xff0c;能够发现并且报告出硬件错误 当内存硬件有ECC功能时&#xff0c;如果在BIOS中使能了内存ECC&#xff0c;不管内核是否启用edac&#xff0c;内存硬件ECC功能都会使能&#xff0c;由硬件自…

解决:如何在opencv中得到与matlab立体标定一样的矫正图?(python版opencv)

目的&#xff1a;采用一样的标定参数&#xff0c;matlab中和opencv中的立体矫正图像是一样的吗&#xff1f;不一样的话怎么让它们一样&#xff1f; 结论&#xff1a;不一样。后文为解决方案。 原因&#xff1a;注意matlab的标定结果在matlab中的用法和在opencv中的用法不一样&a…

STM32 从0开始系统学习2

目录 C语言基础 位操作 extern 修饰符 typedef 封装复杂的类型 寄存器基础知识 STM32F103架构简单描述&#xff08;建议先不看&#xff09; 存储器映射 寄存器映射 寄存器地址计算 下面简单的聊一聊一些需要的前置知识基础。 C语言基础 位操作 这个在单片机里算基操…

ScrollView 真机微信小程序无法隐藏滚动条

问题描述 根据官方文档&#xff0c;使用:show-scrollbar"false"&#xff0c;隐藏滚动条无效 解决方法 添加一段样式在 scroll-view 上或者父级节点上下 ::-webkit-scrollbar {width: 0;height: 0;color: transparent;display: none;} eg. .inforDetails_app {p…

Windows通过netsh控制安全中心防火墙和网络保护策略

Windows通过netsh控制安全中心防火墙和网络保护策略 1. 工具简介 【1】. Windows安全中心 【2】. netsh工具 netsh(Network Shell) 是一个Windows系统本身提供的功能强大的网络配置命令行工具。 2. 开启/关闭防火墙策略 在设置端口&#xff08;禁用/启用&#xff09;前&am…

中国人寿财险青岛市分公司普惠金融助力民生保障

普惠金融是金融业的重要组成部分&#xff0c;也是服务实体经济、保障民生的重要途径。国寿财险青岛市分公司始终坚持以人民为中心的发展思想&#xff0c;大力发展普惠金融业务&#xff0c;不断提升金融服务的覆盖面和便捷性。 在服务“三农”方面&#xff0c;国寿财险青岛市分…

【宝塔面板】宝塔面板使用docker部署chatGPT-Next-web

1111111 chatGPT-Next-web大家并不陌生&#xff0c;就是下面的这个界面&#xff0c;下面请大家跟随小编部署下这个web 我们先感谢下源码的博主&#xff1a; https://github.com/Dooy/chatgpt-web-midjourney-proxy 本教程部署也很简单&#xff0c;就2步 1、创建容器编排模版 …

循环双链表,将L改造为L=(a1,a3,…,an,a4,a2)

题目&#xff1a;设以带头结点的双向循环链表表示的线性表L&#xff08;a1,a2,…..,an&#xff09;.试写出一时间复杂度为o(n)的算法&#xff0c;将L改造为L&#xff08;a1,a3,…,an,a4,a2&#xff09; 思想&#xff1a;将偶数头插到表尾&#xff0c;奇数顺序保持不变。 代码…