Nvidia Jetson 平台 DeepStream-6.0.1 部署 YoloV5-6.0 实现目标检测

Nvidia Jetson 平台 DeepStream-6.0.1 部署 YoloV5-6.0 实现目标检测 Winki 2024-02-02 14:41:10 821

文章目录

前言

之前在 dGPU 平台的 DeepStream-5.1 上部署过 YoloV5 模型,本以为在 Jetson 平台上使用 DeepStream-6.0.1 也可以复刻之前的过程,但是没想到是步步都踩坑,而且坑坑不一样!因此,记录下来最终成功的方法以及在部署过程中踩到的一些坑。

项目中各模块版本:

1. YoloV5 模型训练自己的数据集

YoloV5 在工程的应用上确实很方便,具体的使用方法在项目中也写的很清楚,在目前的不同平台上的多次使用中均未碰到问题。其中,YoloV5 的 6.0 和 6.1 版本都可以通过其 export.py 文件直接生成 TensorRT 的引擎文件 .engine,但是 dGPU 平台生成的 .engine 文件不能在 Jetson 平台上使用,而我在 Jetson 平台上生成的 .engine 文件也不能部署成功,还有待进一步研究。

YoloV5 在不断地更新中,目前已经更新至 6.1 版本,之前出现过权重文件的兼容问题。所以,建议基于对应 Release 版本的预训练权重文件训练自己的数据集,并且对训练出来的权重文件标明版本号。

YoloV5 项目地址:https://github.com/ultralytics/yolov5

训练自己的数据集可以在 dGPU 平台上完成,本节的内容全部在 dGPU 平台上完成。

1.1 建立自己的数据集

YoloV5 官方的实现方式是基于 Pytorch 架构,可以使用 roboflow 建立自己的数据集。

1.1.1 开始之前

Anaconda 创建新的虚拟环境
dGPU 平台的操作都将会在 Anaconda 创建的虚拟环境中进行。

conda create -n yolo.v5 python=3.9
conda activate -n yolo.v5

dGPU 平台安装 Pytorch
检查 YoloV5 的版本,并且根据版本需求安装 Pytorch 平台的版本。

Pytorch 官网提供简单明了的安装方法,dGPU 平台推荐使用 Anaconda 安装,并且在 Anaconda 建立虚拟环境训练自己的数据集。
其中 torchvision 和 pytorch 之间有严格的版本对应关系,可以在 Pypi 官网的 torchvison 中查看两者的对应关系。

# Stable (1.11.0) - CUDA-10.2
conda install pytorch torchvision torchaudio cudatoolkit=10.2 -c pytorch

# LTS (1.8.2) - CUDA-10.2
conda install pytorch torchvision torchaudio cudatoolkit=10.2 -c pytorch-lts

dGPU 平台安装 YoloV5 基础环境
从 GitHub 克隆 repo 并且使用 pip 安装所需要的包,本次使用的 YoloV5 是 6.0 版本。

git clone -b v6.0 https://github.com/ultralytics/yolov5.git
cd yolov5
python -m pip install -r requirements.txt
1.1.2 roboflow 建立数据集

RoboFlow 的官方地址:https://roboflow.com/

创建 Project
在 roboflow 创建账户之后就可以建立公共 Project(免费用户只能建立公共项目和数据库),可以上传图片和标注、在线标注、生成数据集和在线训练。

采集图片
收集图片作为自己的数据库,并上传到 roboflow 建立数据库。
在边栏中选择 Upload 界面,直接选取图片文件夹和对应标注的文件夹,系统会根据文件名自动匹配图片和对应的标注。
同时,也可以上传未标注图片,并使用 roboflow 进行标注。

标注图片
上传图片成功后,边栏中进入 Dataset 界面,单击任意图片可以进入图片标注。

生成数据集
进入边栏的 Version 界面,单击 Create New Vision 开始生成数据库,进行四项设置便可以生成可以直接进行训练的数据集。

1.Source Images,可以查看数据库中的所有图片、类别数量和标注情况。

2.Train/Test Split,可以按照需求对数据库中的图片划分 train、val 和 test 集,实现 Data Balance。

3.Preprocessing,对数据库的图片进行一些预处理,这里只进行 Auto-Orient 和 Resize。

4.Augmentation,按要求对图片进行处理,如旋转、裁切和风格变化等等,按需使用。

5.Generate,生成数据集。

导出数据集
当数据库成功生成后,可以导出数据集,单击 Export 并选择对应模型所需要的数据类型就可以生成最终的可训练数据库。数据集下载到本地后解压到数据库文件夹中,其中 data.yaml 一般作为访问数据库的入口,建议确定数据库的保存位置后,将 data.yaml 中训练集和验证集的路径改为绝对路径。

1.2 训练自己的数据集

1.2.1 选择模型

YoloV5 有多个大小不同的模型,根据项目需求和硬件平台条件选择不同的模型,本文以 YoloV5s 作为范例。

1.2.2 训练模型

YoloV5 的训练方法很简单,但是在开始训练前,需要先修改 yolov5/models/yolov5s.yaml,将参数 nc(Number of Classes)修改为个人模型要检测的类别数目,然后从 YoloV5 项目下载对应的预训练参数(需要下载 YoloV5 对应版本的预训练模型),开始训练。

cd yolov5
# 修改参数 nc:80 的数值为个人模型要检测的类别数量
gedit models/yolov5s.yaml
# 下载预训练模型
wget https://github.com/ultralytics/yolov5/releases/download/v6.0/yolov5s.pt
mkdir weights
mv ./yolov5s.pt weights/
# 开始训练
python3 train.py --data /path/to/your/dataset/data.yaml --cfg models/yolov5s.yaml --weights weights/yolov5s.pt
cd yolov5
# 修改参数 nc:80 的数值为个人模型要检测的类别数量
gedit models/yolov5s.yaml
# 下载预训练模型
wget https://github.com/ultralytics/yolov5/releases/download/v6.0/yolov5s.pt
mkdir weights
mv ./yolov5s.pt weights/
# 开始训练
python3 train.py --data /path/to/your/dataset/data.yaml --cfg models/yolov5s.yaml --weights weights/yolov5s.pt

训练结果会保存在 /runs/train/exp/weights 中,将其移动到 YoloV5 的根目录下,并且重新命名。

cd yolov5
mv ./runs/train/exp/weights/best.pt ./yolov5s.pt

2. 模型转换(重点)

之前踩了很多坑,这部分是重点,直接生成 .engine 文件的方法我尝试了很多种都不能成功,此方法不生成 .engine 文件,而是只需要生成 .cfg 和 .wts 文件即可,.engine 文件的生成交给 Jetson 平台的 Deepstream 自动完成。

模型转换可以在 dGPU 或者 Jetson 平台上完成,但是都必须使用相应平台的相关依赖,dGPU 平台的依赖在第一部分已经详细说明了,Jetson 平台的依赖在后文中会详细说明!建议在 dGPU 平台完成模型转换,只需要将转换的模型直接拷贝到 Jetson 平台就能运行,避免在 Jetson 平台上重复工作。

2.1 下载 DeepStream-Yolo 并提取模型转换程序

DeepStream-Yolo 是部署成功的重点,DeepStream 所需要的设置文件和相关的模型转换程序都可以提供。

2.2 模型转换

利用 gen_wts_yoloV5.py 程序将 .pt 权重文件转化为.cfg 和 .wts 文件,注意该程序有个 bug,如果第一节最后训练生成的权重文件没有重命名成 yolov5s.pt 这样的通用名称,程序可能会因为名字报错,更改一下即可,可以在模型转换完成后更改为自定义名称。

cd yolov5
python gen_wts_yoloV5.py -c ./models/yolov5s.yaml -w yolov5s.pt
mv ./yolov5s.pt ./my_yolov5s.pt
mv ./yolov5s.cfg ./my_yolov5s.cfg
mv ./yolov5s.wts ./my_yolov5s.wts

至此,我们就可以得到最终的模型文件 my_yolov5s.cfg 和 my_yolov5s.wts,这两个文件可以在 dGPU 平台和 Jetson 平台通用。

3. Jetson 平台的环境搭建(Jetson AGX Xavier)

本人使用的是 Jetson AGX Xavier 开发者套件作为边缘端部署平台。

3.1 烧录系统的准备

3.1.1 进入 Recovery 模式
  • 将 Xavier 关机,确保 Xavier 处在关机状态
  • 按住机身案件中间的 Recovery 键 3 ~ 4 秒
  • 不松开 Recovery 键,同时按下 Power 键开机,两个键同时按住 2秒以上后再松开
  • Xavier 进入 Recovery 模式
  • 通过按键旁边的 type-c 接口连接 Jetson AGX Xavier 和 Host 主机
3.1.2 Host 主机

Host 主机必须使用 Ubuntu 18.04,下载并安装 JetPack SDK Manager,下载需要 NVIDIA 账户,JDK Manager 可以安装不同版本的 JetPack,本文使用的是 JetPack-4.6.1。

sudo dpkg -i sdkmanager_x.x.x-xxxx_amd64.deb

3.2 烧录系统

打开 SDK Manager 后,需要登录NVIDIA 账户,登录成功后可以看到连接到 Host 主机的 Jetson AGX Xavier,如果没有看到,重复3.1.1 中的过程,一切就绪后开始基本设置。

3.2.1 选项设置

建议不要勾选 Host Machine 选项(可以节省时间),选择 JetPack 版本,选择是否安装对应 JetPack 版本的 DeepStream,本文的基本设置如下:

点击 CONTINUE 进入第二步后,可以配置安装的组件,主要为两部分:

1.Jetson OS:生成系统镜像,并向 Jetson AGX Xavier 烧录系统,该系统为 Ubuntu 18.04(NVIDIA 定制),架构为 aarch64。
2.Jetson SDK Components:各种推理部署组件,主要会安装 CUDA、CUDNN、TensorRT、OpenCV 和 DeepStream,可以展开后查看详细内容。

同意协议后开始,点击 CONTINUE 开始安装,此时会要求输入 Host 主机的用户密码,如果之前未下载过相关组件,会自动开始下载组件,下载完成后自动开始安装,如果 Host 主机下载过 JetPack,可以直接开始安装。


3.2.2 配置 Jetson AGX Xavier 的基本信息

弹出该页面后开始安装设置,并配置 Jetson AGX Xavier 的用户名和用户密码,本文选择设置方式为 Manual Setup,用户名为 nvidia,密码为 nvidia(实验使用,工程部署请勿使用弱密码)。

点击 Flash,开始烧录系统。

如果报错,显示设备没有进入 Recovery 模式,请直接重复 3.1.1 过程,然后点击 Retry 即可。

系统烧录完成后,当弹出该页面后,暂时不要开始安装 SDK 组件,停止主机操作,为 Jetson AGX Xavier 连接显示器、键盘和鼠标,进入 Jetson AGX Xavier 的系统中,用户名为 nvidia,密码为 nvidia,这两项是在烧录系统时设置的。

3.3 进入系统

在进一步安装 Nvidia 提供的各项 SDK 之前,需要先进入系统,对系统进行更新,并按照个人的需求对系统进行设置。

3.3.1 配置软件源

将系统的软件源更换为国内的镜像源,使用的镜像为 ubuntu-ports。
清华大学开源软件镜像站:https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu-ports/

cd /etc/apt/
sudo cp sources.list sources.list.save
sudo gedit sources.list

将 sources.list 中的内容全部替换为以下内容:

# 清华大学开源软件镜像 Ubuntu Ports - Ubuntu 版本:18.04
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-proposed main restricted universe multiverse

对系统的组件进行更新:

# sudo apt-get update
# sudo apt-get upgrade
sudo apt-get update && sudo apt-get upgrade -y
# sudo apt-get dist-upgrade
sudo apt-get autoremove
sudo apt-get autoclean
3.3.2 安装 PIP

安装 PIP,并且更改 PIP 的软件源为国内镜像源。

sudo apt-get install python3-pip
# 更换为国内源
python3 -m pip install --upgrade pip
python3 -m pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

3.4 通过 JetPack SDK Manager 安装 SDK

当 Jetson AGX Xavier 的系统设置完成后,重新回到 Host 主机,开始 SDK 中组件的安装,输入用户名和密码,开始安装。
如果显示无法连接,进入 Jetson AGX Xavier 系统中查看 SSH 服务是否安装并开启,如果没有,请安装 SSH 服务器端!

sudo apt-get install openssh-server

安装完成!

4. 在 Jetson AGX Xavier 平台上使用 YoloV5

原文地址:https://cognitivexr.at/blog/2021/03/11/installing-pytorch-and-yolov5-on-an-nvidia-jetson-xavier-nx.html
从这一步开始,所有操作均在 Jetson AGX Xavier 上完成!

4.1 安装库和依赖
基于 Pytorch 的 YoloV5 需要以下库和依赖:

  • numpy
  • pandas
  • scipy
  • scikit-image
  • matplotlib
  • seaborn
  • opencv-python
    其中,Opencv 在安装 JetPack 时就已经安装在了系统中,无需再次安装。

除此之外,还有一些依赖需要更新到最新版本:

  • numpy: 1.13 (current 1.19.5)
  • matplotlib: (latest usable with Python 3.6 is 3.3.4)
  • pandas: 0.22.0 (current 1.1.5)
  • scipy: 0.19.1 (current 1.5.4)

4.1.1 安装基本的依赖库

sudo apt install -y python3-pip python3-venv python3-dev libpython3-dev
sudo apt install -y libopenblas-base
sudo apt install -y gfortran libopenmpi-dev liblapack-dev libatlas-base-dev
4.1.2 安装 Cython
python3 -m pip install Cython
4.1.3 升级 PIP 和 Protobuf
python3 -m pip install --upgrade pip
python3 -m pip install --upgrade protobuf
4.1.4 升级科学计算库
python3 -m pip install --upgrade numpy
python3 -m pip install --upgrade pandas
4.1.5 更新 matplotlib 到 3.3.4 (matplotlib 3.4 需要 python>=3.7)

这里之前尝试过多次pip3 install matplotlib ,都出现无法安装和编译的情况,但是按照本文的写法,一次成功。

python3 -m pip install "matplotlib==3.3.4"
4.1.6 更新 scipy (安装时间较长)
python3 -m pip install --upgrade scipy
4.1.7 更新 scikit-image (安装时间较长)
python3 -m pip install sklearn scikit-image

4.2 安装 Pytorch 以及 torchvison(重点)

部署的难点之一在于 torch 和 torchvision 的安装,Pytorch 为 Jetson 平台提供了专门的版本,在 Jetson Zoo 和 Nvidia Forums 中都可以找到,安装其他非 Jetson 版本的 Pytorch 也可以成功安装不报错,但是后续部署均不成功。而且,目前安装包只提供 Python 3.6 的版本,其他版本 Python 暂时无法使用。

Jetson Zoo 官方地址:https://www.elinux.org/Jetson_Zoo
Nvidia Forums官方地址:https://forums.developer.nvidia.com/t/pytorch-for-jetson-version-1-10-now-available/72048

4.2.1 安装 Pytorch

建议通过上方提供的地址直接下载 pytorch 的安装包,两者提供的包是同一个地址来源,没有任何差别。使用 wget 命令的过程中存在无法下载的问题,但是通过浏览器下载则可以成功。本文安装的版本是 Pytorch-1.8.0。

# 安装基本依赖
python3 -m pip install -U future psutil dataclasses typing-extensions pyyaml tqdm seaborn
# 下载 pytorch 
wget https://nvidia.box.com/shared/static/p57jwntv436lfrd78inwl7iml6p13fzh.whl -O torch-1.8.0-cp36-cp36m-linux_aarch64.whl 
# 安装 pytorch
python3 -m pip install torch-1.8.0-cp36-cp36m-linux_aarch64.whl

安装完成后,查看 pytorch 是否检测到系统中的 CUDA。

python3 -c 'import torch; print(torch.cuda.is_available())'

如果返回结果为 True,则 pytorch 已经检测到了系统中的 CUDA。

注意:这里会报错 Illegal instruction (core dumped),其他不走也有可能报这个错误,解决方法是编辑用户根目录下的 .bashrc 文件,在最后一行添加 export OPENBLAS_CORETYPE=ARMV8。

gedit .bashrc
# 将以下命令写入文件中,临时使用也可以直接使用该命令
export OPENBLAS_CORETYPE=ARMV8
source .bashrc
4.2.2 安装 torchvison

torchvision 和 pytorch 之间有严格的版本对应关系,可以在 Pypi 官网的 torchvison 中查看两者的对应关系,目前的对应关系如下:


本文使用的是 Pytorch-1.8.0,对应的 torchvison 版本为 torchvison-0.9.0,请按照以下方法编译安装,直接通过 PIP 安装存在 YoloV5 报错无法使用的情况。

# 安装基本组件
sudo apt-get install libjpeg-dev zlib1g-dev libpython3-dev libavcodec-dev libavformat-dev libswscale-dev
python3 -m pip install --upgrade pillow
# 下载 torchvison 的源码
git clone --branch v0.9.0 https://github.com/pytorch/vision torchvision
# 编译安装
cd torchvision
export BUILD_VERSION=0.9.0
python3 setup.py install --user
# torchvison 目录下运行 pytorch 会出错
cd ..

4.3 测试 YoloV5

wget -q https://github.com/pjreddie/darknet/raw/master/data/dog.jpg
python3 -c "import torch
import cv2
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
model = model.cuda()
img = cv2.cvtColor(cv2.imread('dog.jpg'), cv2.COLOR_BGR2RGB)
pred = model(img, 320 + 32 * 4)
for obj in pred.xyxy[0].cpu().numpy():
    xyxy, conf, label = obj[:4], obj[4], pred.names[int(obj[5])]
    print(xyxy, '%s (conf=%.2f%%)' % (label, conf*100))"

结果为:

[ 130.96 220.09 311.58 538.49] dog (conf=87.70%)
[ 126.34 133.22 565.66 423.71] bicycle (conf=82.05%)
[ 467.74 76.326 692.75 171.35] car (conf=56.09%)
[ 466.57 77.787 692.83 175.51] truck (conf=52.34%)

成功后,YoloV5 的依赖环境就全部安装成功,克隆 YoloV5-6.0 就可以正常使用 YoloV5 了。

git clone -b v6.0 https://github.com/ultralytics/yolov5.git
cd yolov5
# 可以使用 yolov5 训练、验证和检测

5. 在 Jetson AGX Xavier 平台上使用 DeepStream 实现目标检测

原文地址:https://blog.csdn.net/djj199301111/article/details/123628292
尝试了很多个版本,最终是基于 DeepStream-Yolo 实现了部署,可以提供DeepStream 所需要的配置文件。2. 模型转换中的工作也可以此时在 Jetson AGX Xavier 上的 YoloV5 中完成,步骤同样,最终都需要生成 my_yolov5s.cfg 文件和 my_yolov5s.wts 文件。到这一步时,默认所有模型已经转换成功,得到了 my_yolov5s.cfg 文件和 my_yolov5s.wts 文件。

5.1 部署 DeepStream-Yolo

DeepStream-Yolo 项目地址:https://github.com/marcoslucianops/DeepStream-Yolo
需要从 GitHub 克隆 repo,并且移动到 DeepStream 的Source 文件夹下。

git clone https://github.com/marcoslucianops/DeepStream-Yolo.git
#将项目拷贝至deepstream/source下
cp -r ./DeepStream-Yolo /opt/nvidia/deepstream/deepstream/source

编译 nvdsinfer_custom_impl_Yolo 文件夹下的文件,才能正常使用 DeepStream-Yolo,在编译前,修改部分参数:

  • Makefile:CUDA_VER?=10.2
cd /opt/nvidia/deepstream/deepstream-6.0/source/DeepStream-Yolo
make -C nvdsinfer_custom_impl_Yolo
# CUDA_VER=10.2 make -C nvdsinfer_custom_impl_Yolo

将 my_yolov5s.cfg 文件和 my_yolov5s.wts 文件 拷贝到 DeepStream-Yolo 的根目录下,即可完成 DeepStream-Yolo 所有的部署。

5.2 修改配置文件

修改配置文件,DeepStream 就可以实现不同的功能。

5.2.1 deepstream_app_config.txt 文件

主配置文件为 deepstream_app_config.txt,主要负责 DeepStream 视频读取和显示的。

显示 UI 的控制
rows 和 columns 控制最终显示的布局,这里 1 × 1 就是最终显示 1 路,如果是 3 × 2 就是三行两列的布局显示 6 路视频。
其中,width 和 height 是分辨率。

[tiled-display]
enable=1
rows=1
columns=1
width=1920
height=1080
gpu-id=0
nvbuf-memory-type=0

输入视频控制
控制视频输入来源,可以设置多个 source 实现多路视频流的读取,通过 type 确定视频流的类型和读取方式,还可以通过 num-sources 对同一路视频进行复制扩展。

[source0]
enable=1
type=3
uri=rtsp://admin:admin123@192.168.1.64/Streaming/CHannels/101?transportmode=unicast
num-sources=1
gpu-id=0
cudadec-memtype=0

输出方式控制
DeepStream 可以控制输出的方式,可以不输出结果、窗口显示和 RTSP 推流等方式。
同样可以使用多个 sink,通过不同的方式同时输出结果。

[sink0]
enable=1
type=2
sync=0
gpu-id=0
nvbuf-memory-type=0

修改模型配置文件路径
在文件 config_infer_primary_yoloV5.txt 中对模型的相关参数进行了设置,需要从主配置文件中加载。

[primary-gie]
enable=1
gpu-id=0
gie-unique-id=1
nvbuf-memory-type=0
config-file=config_infer_primary_yoloV5.txt

5.2.2 config_infer_primary_yoloV5.txt 文件

修改模型配置文件的路径,指向 my_yolov5s.cfg 文件和 my_yolov5s.wts 文件,运行时可以生成 my_yolov5s.engine 文件。

custom-network-config=my_yolov5s.cfg
model-file=my_yolov5s.wts
model-engine-file=my_yolov5s.engine

修改文件精度类型,是有模型决定的,本文使用的 FP16,并且按照检测的类别数量修改 num-detected-classes。

network-mode=2
num-detected-classes=1

5.2.3 labels.txt 文件

修改 labels.txt 文件中的类目名称和数量,保证所有配置文件中检测类别数目是匹配的。

5.3 运行

可以成功运行了!

deepstream-app -c deepstream_app_config.txt
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
Winki
红包 1 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
Winki
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区