首页 游戏 软件 资讯 排行榜 专题
首页
AI
全流程,从零搞懂基于PaddlePaddle的图像分割

全流程,从零搞懂基于PaddlePaddle的图像分割

热心网友
68
转载
2025-07-21
本项目介绍从零开始完成图像语义分割任务的流程:自建鸽子图片数据集,经拍摄、labelme标注、生成标签图并上传至AI Studio;随后分别基于Paddle2.0 API和PaddleSeg2.0,使用U-Net网络进行训练、验证与预测,展示了两种实现鸽子图像分割的方法。

全流程,从零搞懂基于paddlepaddle的图像分割 - 游乐网

1. 项目简介

本项目介绍如何从零开始完成一个图像分割任务。通过自建数据集,并分别使用基于Paddle2.0和PaddleSeg2.0的方法完成图像分割任务。

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

1.1 什么是图像分割

图像分割是一种典型的计算机视觉任务,指的是将一张图像分割成既定类别的几个区域。图像分割本质上是一种像素级别的图像分类任务。

图像分割通常分为语义分割、实例分割、全景分割,如图1所示。另外,还有基于视频的目标分割和实例分割。本项目中我们将完成一个图像语义分割任务。

全流程,从零搞懂基于PaddlePaddle的图像分割 - 游乐网            

图1 图像分割任务示意图

2. 创建数据集

本项目采用自建的鸽子图片数据集。创建数据集分为如下几步:

2.1. 拍摄鸽子的照片。

拍摄鸽子图片时尽量选择不同角度、不同背景进行拍摄,图片中的鸽子数量也尽量不同,以便增加图片的多样性从而提高最后模型的鲁棒性。由于本项目只是讲述流程,故这里仅采用了124张照片。

2.2. 使用labelme进行标注。

严格按照labelme github仓库主页的描述来安装labelme,链接为labelme github网址

2.3. 基于标注好的图片利用json文件生成原始图片和标签图片。

使用labelme完成标注任务后,需要利用保存的json文件来生成原始图片和对应的标签图片。这里要注意的是,由于labelme自带的labelme_json_to_dataset命令只能处理单个json文件,如果要批量处理所有生成的json文件可以采用并修改如下示例代码:

import ospath = PATH_TO_JSONjson_file = os.listdir(path)#os.system("conda activate labelme")for file in json_file:    os.system("labelme_json_to_dataset %s"%(path+"/"+file))
登录后复制        

2.4. 使用AI Studio创建并上传标注好的图片。

通常生成的数据集较大,这时可以使用AI Studio的创建数据集功能上传生成的数据,然后在项目中挂载使用。

完成以上步骤后就可以使用AI Studio进行训练、验证和预测了。

3. 训练、验证和预测

下面以U-Net网络为例,讲述两种进行训练、验证和预测的方法:基于Paddle2.0 API的方法和基于PaddleSeg2.0的方法。

3.1 基于Paddle2.0 API使用U-Net网络实现鸽子图像的语义分割任务

这部分借鉴了项目『跟着雨哥学AI』系列06:趣味案例——基于U-Net的宠物图像分割 的部分内容。

3.1.1 简要介绍

U-Net网络结构是一个基于FCN并改进后的深度学习网络,包含下采样(编码器,特征提取)和上采样(解码器,分辨率还原)两个阶段,因模型结构比较像U型而命名为U-Net。

3.1.2.环境设置

导入一些比较基础常用的模块,确认自己的飞桨版本。

In [ ]
import osimport ioimport numpy as npimport matplotlib.pyplot as pltfrom PIL import Image as PilImageimport paddlefrom paddle.nn import functional as Fimport warningswarnings.filterwarnings('ignore') paddle.__version__
登录后复制        
'2.0.1'
登录后复制                

3.1.3 解压数据集

In [ ]
!unzip -q 'data/data75217/doves.zip' -d work/doves
登录后复制    

3.1.4 数据集概览

首先我们先来了解一下我们的数据集。

数据集解压后,里面放的每个文件夹中有四个文件,分别是图片文件、标签文件、标签名字文件和可视化的图片文件,如下所示。

.├── label.webp├── img.webp├── label_names.txt└── label_viz.webp
登录后复制        

我们来看看这个数据集给我们提供了多少个训练样本。

In [ ]
images_path = "work/doves"image_count = len([os.path.join(images_path, image_name)           for image_name in os.listdir(images_path)])print("用于训练的图片样本数量:", image_count)
登录后复制        
用于训练的图片样本数量: 124
登录后复制        

3.1.5 划分训练集、验证集和测试集

In [ ]
def _sort_images(image_dir):    """    对文件夹内的图像进行按照文件名排序    """    images = []    labels = []    for image_name in os.listdir(image_dir):        if os.path.isdir(os.path.join(image_dir, image_name)):            images.append(os.path.join(os.path.join(image_dir, image_name), 'img.webp'))            labels.append(os.path.join(os.path.join(image_dir, image_name), 'label.webp'))    return sorted(images), sorted(labels)"""这里的分割符是\t,后面使用PaddleSeg的时候要注意修改相关代码,因为PaddleSeg读取文件时默认的分割符是空格。当然也可以将这里的\t替换为空格。"""def write_file(mode, images, labels):    with open('./{}.txt'.format(mode), 'w') as f:        for i in range(len(images)):            f.write('{}\t{}\n'.format(images[i], labels[i]))    """由于所有文件都是散落在文件夹中,在训练时我们需要使用的是数据集和标签对应的数据关系,所以我们第一步是对原始的数据集进行整理,得到数据集和标签两个数组,分别一一对应。这样可以在使用的时候能够很方便的找到原始数据和标签的对应关系,否则对于原有的文件夹图片数据无法直接应用。"""images, labels = _sort_images(images_path)eval_num = int(image_count * 0.15)"""由于图片数量有限,这里的测试集和验证集采用相同的一组图片。"""write_file('train', images[:-eval_num], labels[:-eval_num])write_file('test', images[-eval_num:], labels[-eval_num:])write_file('eval', images[-eval_num:], labels[-eval_num:])
登录后复制    

3.1.6 DoveDataSet数据集抽样展示

划分好数据集之后,我们来查验一下数据集是否符合预期,我们通过划分的配置文件读取图片路径后再加载图片数据来用matplotlib进行展示,这里要注意的是对于分割的标签文件因为是1通道的灰度图片,需要在使用imshow接口时注意下传参cmap='gray'。

In [ ]
with open('./train.txt', 'r') as f:    i = 0    for line in f.readlines():        image_path, label_path = line.strip().split('\t')        image = np.array(PilImage.open(image_path))        label = np.array(PilImage.open(label_path))            if i > 2:            break        # 进行图片的展示        plt.figure()        plt.subplot(1,2,1),         plt.title('Train Image')        plt.imshow(image.astype('uint8'))        plt.axis('off')        plt.subplot(1,2,2),         plt.title('Label')        plt.imshow(label.astype('uint8'), cmap='gray')        plt.axis('off')        plt.show()        i = i + 1
登录后复制        
登录后复制登录后复制登录后复制                
登录后复制登录后复制登录后复制                
登录后复制登录后复制登录后复制                

3.1.7 数据集类定义

飞桨(PaddlePaddle)数据集加载方案是统一使用Dataset(数据集定义) + DataLoader(多进程数据集加载)。

首先我们先进行数据集的定义,数据集定义主要是实现一个新的Dataset类,继承父类paddle.io.Dataset,并实现父类中以下两个抽象方法,__getitem__和__len__:

class MyDataset(Dataset):    def __init__(self):        ...            # 每次迭代时返回数据和对应的标签    def __getitem__(self, idx):        return x, y    # 返回整个数据集的总数    def __len__(self):        return count(samples)
登录后复制        

在数据集内部可以结合图像数据预处理相关API进行图像的预处理(改变大小、反转、调整格式等)。

由于加载进来的图像不一定都符合自己的需求,举个例子,已下载的这些图片里面就会有RGBA格式的图片,这个时候图片就不符合我们所需3通道的需求,我们需要进行图片的格式转换,那么这里我们直接实现了一个通用的图片读取接口,确保读取出来的图片都是满足我们的需求。

另外图片加载出来的默认shape是HWC,这个时候要看看是否满足后面训练的需要,如果Layer的默认格式和这个不是符合的情况下,需要看下Layer有没有参数可以进行格式调整。不过如果layer较多的话,还是直接调整原数据Shape比较好,否则每个layer都要做参数设置,如果有遗漏就会导致训练出错,那么在本案例中是直接对数据源的shape做了统一调整,从HWC转换成了CHW,因为飞桨的卷积等API的默认输入格式为CHW,这样处理方便后续模型训练。

本项目的数据集定义的代码可以参考code目录下的dove_dataset.py文件。

3.1.8 模型组网

U-Net是一个U型网络结构,可以看做两个大的阶段,图像先经过Encoder编码器进行下采样得到高级语义特征图,再经过Decoder解码器上采样将特征图恢复到原图片的分辨率。

具体的网络定义的代码可以参考code目录下的unet.py文件,具体网络结构包括如下几部分。

3.1.9 定义SeparableConv2D接口

我们为了减少卷积操作中的训练参数来提升性能,是继承paddle.nn.Layer自定义了一个SeparableConv2D Layer类,整个过程是把filter_size * filter_size * num_filters的Conv2D操作拆解为两个子Conv2D,先对输入数据的每个通道使用filter_size * filter_size * 1的卷积核进行计算,输入输出通道数目相同,之后在使用1 * 1 * num_filters的卷积核计算。

3.1.10 定义Encoder编码器

我们将网络结构中的Encoder下采样过程进行了一个Layer封装,方便后续调用,减少代码编写,下采样是有一个模型逐渐向下画曲线的一个过程,这个过程中是不断的重复一个单元结构将通道数不断增加,形状不断缩小,并且引入残差网络结构,我们将这些都抽象出来进行统一封装。

3.1.11 定义Decoder解码器

在通道数达到最大得到高级语义特征图后,网络结构会开始进行decode操作,进行上采样,通道数逐渐减小,对应图片尺寸逐步增加,直至恢复到原图像大小,那么这个过程里面也是通过不断的重复相同结构的残差网络完成,我们也是为了减少代码编写,将这个过程定义一个Layer来放到模型组网中使用。

3.1.12 训练模型组网

按照U型网络结构格式进行整体的网络结构搭建,三次下采样,四次上采样。

3.1.13 模型可视化

调用飞桨提供的summary接口对组建好的模型进行可视化,方便进行模型结构和参数信息的查看和确认。

In [ ]
import paddlefrom code.unet import DoveNetnum_classes = 2IMAGE_SIZE = (224, 224)network = DoveNet(num_classes)model = paddle.Model(network)model.summary((-1, 3,) + IMAGE_SIZE)
登录后复制        
-----------------------------------------------------------------------------  Layer (type)        Input Shape          Output Shape         Param #    =============================================================================    Conv2D-1       [[1, 3, 224, 224]]   [1, 32, 112, 112]         896        BatchNorm2D-1   [[1, 32, 112, 112]]   [1, 32, 112, 112]         128           ReLU-1       [[1, 32, 112, 112]]   [1, 32, 112, 112]          0            ReLU-2       [[1, 32, 112, 112]]   [1, 32, 112, 112]          0       SeparableConv2D-1 [[1, 32, 112, 112]]   [1, 64, 112, 112]        2,400       BatchNorm2D-2   [[1, 64, 112, 112]]   [1, 64, 112, 112]         256           ReLU-3       [[1, 64, 112, 112]]   [1, 64, 112, 112]          0       SeparableConv2D-2 [[1, 64, 112, 112]]   [1, 64, 112, 112]        4,736       BatchNorm2D-3   [[1, 64, 112, 112]]   [1, 64, 112, 112]         256         MaxPool2D-1    [[1, 64, 112, 112]]    [1, 64, 56, 56]           0           Conv2D-2      [[1, 32, 112, 112]]    [1, 64, 56, 56]         2,112         Encoder-1     [[1, 32, 112, 112]]    [1, 64, 56, 56]           0            ReLU-4        [[1, 64, 56, 56]]     [1, 64, 56, 56]           0       SeparableConv2D-3  [[1, 64, 56, 56]]     [1, 128, 56, 56]        8,896       BatchNorm2D-4    [[1, 128, 56, 56]]    [1, 128, 56, 56]         512           ReLU-5        [[1, 128, 56, 56]]    [1, 128, 56, 56]          0       SeparableConv2D-4  [[1, 128, 56, 56]]    [1, 128, 56, 56]       17,664       BatchNorm2D-5    [[1, 128, 56, 56]]    [1, 128, 56, 56]         512         MaxPool2D-2     [[1, 128, 56, 56]]    [1, 128, 28, 28]          0           Conv2D-3       [[1, 64, 56, 56]]     [1, 128, 28, 28]        8,320         Encoder-2      [[1, 64, 56, 56]]     [1, 128, 28, 28]          0            ReLU-6        [[1, 128, 28, 28]]    [1, 128, 28, 28]          0       SeparableConv2D-5  [[1, 128, 28, 28]]    [1, 256, 28, 28]       34,176       BatchNorm2D-6    [[1, 256, 28, 28]]    [1, 256, 28, 28]        1,024          ReLU-7        [[1, 256, 28, 28]]    [1, 256, 28, 28]          0       SeparableConv2D-6  [[1, 256, 28, 28]]    [1, 256, 28, 28]       68,096       BatchNorm2D-7    [[1, 256, 28, 28]]    [1, 256, 28, 28]        1,024        MaxPool2D-3     [[1, 256, 28, 28]]    [1, 256, 14, 14]          0           Conv2D-4       [[1, 128, 28, 28]]    [1, 256, 14, 14]       33,024         Encoder-3      [[1, 128, 28, 28]]    [1, 256, 14, 14]          0            ReLU-8        [[1, 256, 14, 14]]    [1, 256, 14, 14]          0       Conv2DTranspose-1  [[1, 256, 14, 14]]    [1, 256, 14, 14]       590,080      BatchNorm2D-8    [[1, 256, 14, 14]]    [1, 256, 14, 14]        1,024          ReLU-9        [[1, 256, 14, 14]]    [1, 256, 14, 14]          0       Conv2DTranspose-2  [[1, 256, 14, 14]]    [1, 256, 14, 14]       590,080      BatchNorm2D-9    [[1, 256, 14, 14]]    [1, 256, 14, 14]        1,024        Upsample-1      [[1, 256, 14, 14]]    [1, 256, 28, 28]          0          Upsample-2      [[1, 256, 14, 14]]    [1, 256, 28, 28]          0           Conv2D-5       [[1, 256, 28, 28]]    [1, 256, 28, 28]       65,792         Decoder-1      [[1, 256, 14, 14]]    [1, 256, 28, 28]          0            ReLU-10       [[1, 256, 28, 28]]    [1, 256, 28, 28]          0       Conv2DTranspose-3  [[1, 256, 28, 28]]    [1, 128, 28, 28]       295,040     BatchNorm2D-10    [[1, 128, 28, 28]]    [1, 128, 28, 28]         512           ReLU-11       [[1, 128, 28, 28]]    [1, 128, 28, 28]          0       Conv2DTranspose-4  [[1, 128, 28, 28]]    [1, 128, 28, 28]       147,584     BatchNorm2D-11    [[1, 128, 28, 28]]    [1, 128, 28, 28]         512         Upsample-3      [[1, 128, 28, 28]]    [1, 128, 56, 56]          0          Upsample-4      [[1, 256, 28, 28]]    [1, 256, 56, 56]          0           Conv2D-6       [[1, 256, 56, 56]]    [1, 128, 56, 56]       32,896         Decoder-2      [[1, 256, 28, 28]]    [1, 128, 56, 56]          0            ReLU-12       [[1, 128, 56, 56]]    [1, 128, 56, 56]          0       Conv2DTranspose-5  [[1, 128, 56, 56]]    [1, 64, 56, 56]        73,792      BatchNorm2D-12    [[1, 64, 56, 56]]     [1, 64, 56, 56]          256           ReLU-13       [[1, 64, 56, 56]]     [1, 64, 56, 56]           0       Conv2DTranspose-6  [[1, 64, 56, 56]]     [1, 64, 56, 56]        36,928      BatchNorm2D-13    [[1, 64, 56, 56]]     [1, 64, 56, 56]          256         Upsample-5      [[1, 64, 56, 56]]    [1, 64, 112, 112]          0          Upsample-6      [[1, 128, 56, 56]]   [1, 128, 112, 112]         0           Conv2D-7      [[1, 128, 112, 112]]  [1, 64, 112, 112]        8,256         Decoder-3      [[1, 128, 56, 56]]   [1, 64, 112, 112]          0            ReLU-14      [[1, 64, 112, 112]]   [1, 64, 112, 112]          0       Conv2DTranspose-7 [[1, 64, 112, 112]]   [1, 32, 112, 112]       18,464      BatchNorm2D-14   [[1, 32, 112, 112]]   [1, 32, 112, 112]         128           ReLU-15      [[1, 32, 112, 112]]   [1, 32, 112, 112]          0       Conv2DTranspose-8 [[1, 32, 112, 112]]   [1, 32, 112, 112]        9,248      BatchNorm2D-15   [[1, 32, 112, 112]]   [1, 32, 112, 112]         128         Upsample-7     [[1, 32, 112, 112]]   [1, 32, 224, 224]          0          Upsample-8     [[1, 64, 112, 112]]   [1, 64, 224, 224]          0           Conv2D-8      [[1, 64, 224, 224]]   [1, 32, 224, 224]        2,080         Decoder-4     [[1, 64, 112, 112]]   [1, 32, 224, 224]          0           Conv2D-9      [[1, 32, 224, 224]]    [1, 2, 224, 224]         578      =============================================================================Total params: 2,058,690Trainable params: 2,051,138Non-trainable params: 7,552-----------------------------------------------------------------------------Input size (MB): 0.57Forward/backward pass size (MB): 230.07Params size (MB): 7.85Estimated Total Size (MB): 238.50-----------------------------------------------------------------------------
登录后复制        
{'total_params': 2058690, 'trainable_params': 2051138}
登录后复制                

3.1.14 启动模型训练

使用模型代码进行Model实例生成,使用prepare接口定义优化器、损失函数和评价指标等信息,用于后续训练使用。在所有初步配置完成后,调用fit接口开启训练执行过程,调用fit时只需要将前面定义好的训练数据集、测试数据集、训练轮次(Epoch)和批次大小(batch_size)配置好即可。

In [18]
!python code/train.py
登录后复制    

3.1.15 预测数据集准备和预测

继续使用DoveDataset来实例化待预测使用的数据集。

我们可以直接使用model.predict接口来对数据集进行预测操作,只需要将预测数据集传递到接口内即可。

In [ ]
import paddlefrom code.unet import DoveNetfrom code.dove_dataset import DoveDataset
登录后复制    In [ ]
num_classes = 2network = DoveNet(num_classes)
登录后复制    In [ ]
state_dict = paddle.load('unet.pdparams')network.set_state_dict(state_dict)model = paddle.Model(network)
登录后复制    In [ ]
predict_dataset = DoveDataset(mode='test')test_loader = paddle.io.DataLoader(predict_dataset, places=paddle.CUDAPlace(0), batch_size= 32)model.prepare(paddle.nn.CrossEntropyLoss(axis=1))predict_results = model.predict(test_loader)
登录后复制        
Predict begin...step 1/1 [==============================] - 10s/stepPredict samples: 18
登录后复制        

3.1.16 预测结果可视化

从我们的预测数据集中抽3个图片来看看预测的效果,展示一下原图、标签图和预测结果。

In [ ]
import numpy as npimport matplotlib.pyplot as pltfrom paddle.vision.transforms import transforms as Tfrom PIL import Image as PilImage
登录后复制    In [ ]
plt.figure(figsize=(10, 10))IMAGE_SIZE = (224, 224)i = 0idx = 0with open('./test.txt', 'r') as f:    for line in f.readlines():        image_path, label_path = line.strip().split('\t')        resize_t = T.Compose([            T.Resize(IMAGE_SIZE)        ])        image = resize_t(PilImage.open(image_path))        label = resize_t(PilImage.open(label_path))        image = np.array(image).astype('uint8')        label = np.array(label).astype('uint8')        if i > 8:             break        plt.subplot(3, 3, i + 1)        plt.imshow(image)        plt.title('Input Image')        plt.axis("off")        plt.subplot(3, 3, i + 2)        plt.imshow(label, cmap='gray')        plt.title('Label')        plt.axis("off")                data = predict_results[0][0][idx].transpose((1, 2, 0))        mask = np.argmax(data, axis=-1)        plt.subplot(3, 3, i + 3)        plt.imshow(mask.astype('uint8'), cmap='gray')        plt.title('Predict')        plt.axis("off")        i += 3        idx += 1plt.show()
登录后复制        
登录后复制登录后复制                

3.2 基于PaddleSeg使用U-Net网络实现鸽子图像的语义分割任务

3.2.1 安装PaddleSeg

In [15]
!pip install paddleseg
登录后复制    

3.2.2 克隆或者解压缩PaddleSeg

为避免由于网络造成的下载困难问题,这里采用解压缩的方法。也可以采用克隆的方法获取最新的PaddleSeg。

!git clone https://github.com/PaddlePaddle/PaddleSeg.git
登录后复制    In [ ]
!unzip -q data/data75217/PaddleSeg.zip -d work
登录后复制    

3.2.3 开始训练

使用PaddleSeg时的配置信息是采用yml文件描述的,这里使用的是unet.yml文件.

In [16]
## 使用U-net进行训练!python work/PaddleSeg/train.py --config unet.yml --save_interval 2000
登录后复制    

3.2.4 开始预测

In [ ]
## 将测试图片拷贝到新建的文件夹中import osimport shutilif not os.path.exists('test_imgs'):    os.mkdir('test_imgs')with open('test.txt', 'r') as f:    paths = f.readlines()    i = 0    for path in paths:        img, label = path.strip().split('\t')        shutil.copy(img, 'test_imgs/t'+str(i)+'.webp')        i += 1
登录后复制    In [ ]
## 将标签图片拷贝到新建的文件夹中if not os.path.exists('label_imgs'):    os.mkdir('label_imgs')with open('seg_test.txt', 'r') as f:    paths = f.readlines()    i = 0    for path in paths:        img, label = path.strip().split('\t')        shutil.copy(label, 'label_imgs/t'+str(i)+'.webp')        i += 1
登录后复制    In [17]
## 开始预测并保存预测后的图片!python work/PaddleSeg/predict.py --image_path test_imgs \--model_path output/iter_10000/model.pdparams \--save_dir saved_imges \--crop_size 512 512 \--config unet.yml
登录后复制    

3.2.5 结果可视化

In [11]
## 创建需要可视化的图片列表test_images = os.listdir('test_imgs')label_images = os.listdir('label_imgs')predicted_images = os.listdir('saved_imges/pseudo_color_prediction')test_images = ['test_imgs/' + path for path in test_images if not path.startswith('.')]label_images = ['label_imgs/' + path for path in label_images if not path.startswith('.')]predicted_images = ['saved_imges/pseudo_color_prediction/' + path for path in predicted_images if not path.startswith('.')]test_images.sort()label_images.sort()predicted_images.sort()
登录后复制    In [14]
## 开始可视化from paddle.vision.transforms import transforms as Timport matplotlib.pyplot as pltfrom PIL import Image as PilImageimport numpy as npplt.figure(figsize=(10, 10))IMAGE_SIZE = (224, 224)i = 0for j in range(len(test_images)):    test_path = test_images[j]    label_path = label_images[j]    predicted_path = predicted_images[j]    resize_t = T.Compose([        T.Resize(IMAGE_SIZE)    ])    image = resize_t(PilImage.open(test_path))    label = resize_t(PilImage.open(label_path))    predicted = resize_t(PilImage.open(predicted_path))    image = np.array(image).astype('uint8')    label = np.array(label).astype('uint8')    predicted = np.array(predicted).astype('uint8')    if i > 8:         break    plt.subplot(3, 3, i + 1)    plt.imshow(image)    plt.title('Input Image')    plt.axis("off")    plt.subplot(3, 3, i + 2)    plt.imshow(label, cmap='gray')    plt.title('Label')    plt.axis("off")    plt.subplot(3, 3, i + 3)    plt.imshow(predicted, cmap='gray')    plt.title('Predict')    plt.axis("off")    i += 3    j += 1plt.show()
登录后复制        
登录后复制登录后复制                
来源:https://www.php.cn/faq/1419280.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

openclaw在飞书测试报错access not configured.
AI
openclaw在飞书测试报错access not configured.

常见报错解析:“Access Not Configured”故障排除指南 许多开发者和团队成员在使用OpenClaw集成飞书时,都曾遭遇过一个典型的中断提示:“access not configured”(访问未配置)。该提示会明确显示您的飞书账户ID及一组唯一的配对验证码,并指出需要联系机器人所有

热心网友
04.02
OpenClaw 常用指令速查
AI
OpenClaw 常用指令速查

OpenClaw 常用指令大全与使用详解 openclaw status:此命令是查看OpenClaw系统整体健康状态的核心指令,执行后即获取服务运行状况的全面报告,是日常运维的首要诊断工具。 openclaw gateway restart:在修改网关配置后,必须运行此指令以重启网关服务,使配置文

热心网友
04.02
OpenClaw 操控浏览器
AI
OpenClaw 操控浏览器

如何通过 OpenClaw 实现 Chrome 浏览器自动化操控 在软件开发与自动化测试领域,持续学习是常态。本文旨在详细介绍如何利用 OpenClaw 连接并控制一个已开启的 Chrome 浏览器实例,实现点击、文本输入、文件上传、页面滚动、屏幕截图以及执行 JavaScript 等自动化操作。整

热心网友
04.01
# OpenClaw QQ 机器人接入完整指南
AI
# OpenClaw QQ 机器人接入完整指南

项目概述 你是否希望将强大的 AI 助手带入日常聊天?本教程将指导你完成搭建流程,让你能在 QQ 上直接调用 OpenClaw 智能助手,实现无门槛的 AI 对话体验。 架构说明 ┌─────────────┐ ┌──────────────┐ ┌─────────────┐ │ QQ 用户 │ ─

热心网友
04.01
OpenClaw 保姆级 window部署
AI
OpenClaw 保姆级 window部署

一 下载并安装Node js,全程保持默认设置 首先,请前往Node js官方网站的下载中心:https: nodejs org zh-cn download。根据您的操作系统(Windows Mac Linux)下载对应的安装程序。运行安装向导时,整个过程非常简单,您只需连续点击“下一步”按钮

热心网友
04.01

最新APP

火柴人传奇
火柴人传奇
动作冒险 04-07
数独趣味闯关
数独趣味闯关
休闲益智 04-07
碧优蒂的世界
碧优蒂的世界
休闲益智 04-07
海岛奇兵
海岛奇兵
棋牌策略 04-07
列王的纷争:西部大陆
列王的纷争:西部大陆
棋牌策略 04-07

热门推荐

苹果折叠 iPhone Fold 渲染图再曝:后摄缩小凸起,整体更精致
科技数码
苹果折叠 iPhone Fold 渲染图再曝:后摄缩小凸起,整体更精致

苹果折叠屏手机 iPhone Fold 最新渲染图曝光:摄像头凸起优化,设计更显精致 有关苹果公司首款折叠屏 iPhone 的传闻持续受到关注。4月5日,知名爆料者 Majin Bu 在社交平台X上再度分享了一组据称是 iPhone Fold 的高清渲染图,从多角度揭示了这款备受期待设备可能的外观设

热心网友
04.07
这城有良田官府无垢队阵容推荐
游戏攻略
这城有良田官府无垢队阵容推荐

通用性首选:官府无垢队阵容深度解析 在当前版本中,若要挑选一套兼具强度与广泛适用性的阵容,以官府流派【长孙无垢】为核心的搭配方案无疑是热门之选。这套经典组合通常由长孙无垢(官府)、李一桐、李善德、李光弼,以及关羽或平安组成。其核心战斗逻辑清晰且高效:一方面,依靠长孙无垢与李光弼的技能联动,通过对目标

热心网友
04.07
洛克王国世界进化什么条件 洛克王国世界全隐藏进化条件整理
游戏攻略
洛克王国世界进化什么条件 洛克王国世界全隐藏进化条件整理

洛克王国全精灵隐藏进化条件完整攻略大全 在《洛克王国》丰富多彩的冒险世界中,除了常规的等级进化,众多精灵还埋藏着独特的“隐藏进化”路径。这些特殊的进化条件,往往是解锁精灵终极形态、完成图鉴收集的关键所在。与普通进化方式不同,隐藏进化需要触发特定的环境、时间、道具或任务条件,充满了探索与解密的乐趣。你

热心网友
04.07
燕云十六声石震通关方法-燕云十六声石震如何通关
游戏资讯
燕云十六声石震通关方法-燕云十六声石震如何通关

燕云十六声石震关卡怎么过?高效通关技巧与实战攻略详解 掌握核心机制:石震关卡难点全解析 石震关卡的核心挑战在于敌人配置:不仅数量密集,且拥有高额血量和攻击力。这些敌人并非随机分布,而是依据特定区域、巡逻路线及攻击逻辑进行部署。提前掌握不同敌人的攻击前摇、技能范围与仇恨机制,是制定有效战术的前提,真正

热心网友
04.07
英雄联盟手游安妮符文怎么搭配
游戏攻略
英雄联盟手游安妮符文怎么搭配

英雄联盟手游安妮符文终极指南:爆发流核心配置与实战策略 在英雄联盟手游的对局中,黑暗之女安妮以其强大的瞬间爆发与控制能力,始终是中单位置的热门选择。虽然操作看似简单易懂,但想要真正掌握这位火焰法师的精髓,打出毁天灭地的效果,一套科学高效的符文搭配是不可或缺的基石。正确的符文选择,能让她从温顺的火苗化

热心网友
04.07