Python处理Facebook ActivityNet Entities视频描述数据集指南

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:ActivityNet Entities 数据集是由Facebook发布的,用于视频内容理解和自然语言处理的大型视频理解资源。它扩展了原有的ActivityNet数据集,包含了活动的识别和视频中实体及其关系的标注。本文将介绍如何使用Python及其相关库来处理和分析这一数据集,包括熟悉基础编程、图像数据处理、数据分析、JSON解析,以及构建和训练深度学习模型。 Python-ActivityNetEntitiesdatasetFacebook发布的视频描述数据集

1. ActivityNet Entities数据集介绍

1.1 ActivityNet数据集概述

ActivityNet数据集是一个广泛应用于视频理解和行为识别领域的权威数据集。它由成千上万的视频片段组成,每个片段都有详细的活动标签和时间戳。这些标签覆盖了人类日常活动的广泛类别,从简单的动作到复杂的交互,这使得ActivityNet成为评估视频分析系统性能的理想选择。

1.2 数据集的结构与组成

ActivityNet的数据集结构支持多种类型的任务,包括活动检测、活动分类和活动检索。数据集中的每个视频都经过精心标注,标注信息不仅包括活动的类别和开始结束时间,还包含视频中物体的边界框信息。这种丰富的元数据支持了多模态的学习和复杂行为模式的识别。

1.3 数据集的应用场景

在机器学习和计算机视觉领域,ActivityNet已成为许多研究和实际应用的基础。开发者和研究者使用它来训练和测试他们的行为识别模型,而这些模型可以应用于视频监控、人机交互、自动驾驶等多个领域。ActivityNet为这些高级应用场景提供了丰富多变的训练素材,帮助推动了视频理解技术的快速发展。

2. Python基础编程技能要求

2.1 Python编程语言概述

2.1.1 Python的特点和应用场景

Python是一种高级编程语言,由Guido van Rossum于1989年圣诞节期间开始设计,并于1991年首次发布。Python的设计哲学强调代码的可读性和简洁性,它允许程序员用更少的代码行表达想法,相比C++或Java等语言,Python的语法更接近英语,这让初学者更容易上手。

Python的一些显著特点包括:

  • 简单易学 :清晰简洁的语法,上手快。
  • 可读性强 :代码可读性强,有利于团队协作。
  • 解释型语言 :无需编译,可直接运行。
  • 面向对象 :支持面向对象编程范式。
  • 跨平台 :在多个操作系统上运行,包括Windows、MacOS、Linux。
  • 丰富的库 :有强大的标准库和第三方库支持。

Python广泛应用于多种领域:

  • Web开发 :Django和Flask是流行的Python Web框架。
  • 数据科学 :Pandas、Numpy和SciPy等库让数据处理变得简单。
  • 人工智能 :TensorFlow和PyTorch等深度学习框架支持Python。
  • 自动化脚本 :轻松编写脚本自动化重复性任务。
  • 网络爬虫 :Scrapy和BeautifulSoup等库专用于网页数据抓取。
  • 科学计算 :广泛用于教育和研究领域进行数值计算。

2.1.2 Python的基本语法元素

Python的基本语法元素包括变量、数据类型、运算符、控制流语句和函数。下面简要介绍这些元素:

  • 变量 :在Python中,变量不需要声明类型即可直接使用。变量的类型由它所引用的对象决定。
x = 10       # x是整数类型
y = "Hello"  # y是字符串类型
  • 数据类型 :Python支持多种数据类型,包括整型(int)、浮点型(float)、字符串(str)、布尔型(bool)、列表(list)、元组(tuple)、字典(dict)和集合(set)等。
a = 10        # 整型
b = 10.5      # 浮点型
c = "python"  # 字符串
d = True      # 布尔型
  • 运算符 :Python支持标准的算术运算符、比较运算符、逻辑运算符和成员运算符等。
e = 10 + 5    # 加法运算
f = 10 == 5   # 比较运算(等于)
g = "python" in "I love python"  # 成员运算
  • 控制流语句 :控制流语句包括条件语句(if-elif-else)和循环语句(for和while)。
if x > 10:
    print("x is greater than 10")
elif x < 10:
    print("x is less than 10")
else:
    print("x is equal to 10")

for i in range(5):
    print(i)
  • 函数 :函数是组织好的、可重复使用的、用来执行特定任务的代码块。
def my_function():
    print("Hello from a function")

my_function()

在下一节中,我们将探讨Python的数据结构和操作,如列表、元组、字典和集合,以及如何定义和使用函数。

3. 视频图像处理与数据分析技术

视频图像处理与数据分析是现代IT行业不可或缺的技能之一。在本章节中,我们将深入探讨OpenCV这一强大的视觉处理库,以及如何使用Pandas和Numpy这两个Python库进行数据处理,最后对数据分析流程和方法进行剖析。

3.1 OpenCV基础与视频处理

3.1.1 OpenCV在视频处理中的关键功能

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。OpenCV提供了大量的计算机视觉功能,广泛应用于视频处理、图像分析、增强现实、机器人视觉等领域。

OpenCV的关键功能包括但不限于: - 图像处理:包括滤波、边缘检测、形态学操作等。 - 特征检测:如SIFT、SURF、ORB等。 - 对象识别:基于特征的方法和基于机器学习的方法。 - 视频分析:包括运动检测、跟踪、视频分割等。 - 摄像头校正:通过摄像机矩阵和畸变系数进行校正。

3.1.2 视频读取、处理和写入实例

在本小节中,我们将通过实例展示如何使用OpenCV读取视频文件、进行简单的视频处理,并将处理后的视频写入文件。以下是基本步骤:

import cv2

# 打开视频文件
cap = cv2.VideoCapture('input_video.mp4')

# 获取视频的宽度、高度和帧率信息
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)

# 定义视频编码器及输出视频对象
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output_video.avi', fourcc, fps, (width, height))

# 读取视频帧并进行处理
while True:
    ret, frame = cap.read()  # 读取视频帧

    if not ret:
        break

    # 在此处添加视频处理代码
    # 例如:转换为灰度图像
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 写入处理后的帧
    out.write(gray)

# 释放资源
cap.release()
out.release()
cv2.destroyAllWindows()

在这个代码块中,我们首先导入了 cv2 模块,然后使用 VideoCapture 读取视频文件。通过 get 方法获取视频的宽度、高度和帧率信息,这些信息对于创建输出视频至关重要。

接着,我们定义了视频编码器 fourcc 和输出视频文件 output_video.avi 。使用 VideoWriter 对象,我们能够将处理后的视频帧写入文件。

在循环中,我们不断读取帧,并可以在此处添加任何我们需要的视频处理代码,例如本例中将视频帧转换为灰度图像。最后,我们释放了 VideoCapture VideoWriter 对象,并关闭所有OpenCV窗口。

3.2 Pandas和Numpy在数据处理中的应用

3.2.1 Pandas数据结构与基本操作

Pandas是一个开源的、功能强大的Python数据分析库。它提供了快速、灵活和表达式丰富的数据结构,设计目的就是为了操作结构化(表格、多维、异质)和时间序列数据。

Pandas的主要数据结构包括: - Series:一维数组结构。 - DataFrame:二维的表格型数据结构。

接下来,我们将介绍如何使用Pandas读取数据、进行数据清洗和操作。假设我们有一个CSV文件,记录了视频中检测到的物体的信息,我们将进行以下操作:

import pandas as pd

# 读取CSV文件
data = pd.read_csv('video_objects.csv')

# 查看数据框架结构
print(data.head())

# 数据清洗:删除缺失值
cleaned_data = data.dropna()

# 数据操作:筛选特定条件的行
filtered_data = cleaned_data[cleaned_data['object_class'] == 'car']

# 数据处理:进行数据统计
stats = filtered_data.describe()
print(stats)

以上代码展示了Pandas在数据处理中的基本应用,首先通过 read_csv 函数读取CSV文件,然后我们查看数据框架结构的前几行,使用 head 方法输出。

通过 dropna 方法,我们移除了数据中的缺失值。 dropna 方法用于删除包含缺失值的行或列,是进行数据清洗时常用的方法之一。

之后,我们筛选出特定条件的行,这里以'car'为例,筛选出所有标注为'car'的物体。最后,我们进行了简单的数据统计,通过 describe 方法输出了筛选后数据的统计信息。

3.2.2 Numpy数组的创建和操作

Numpy是一个开源的Python库,用于进行科学计算。它的核心功能是提供高性能的多维数组对象,并提供了大量用于操作这些数组的数学函数库。

以下是创建和操作Numpy数组的实例:

import numpy as np

# 创建一个一维数组
array_1d = np.array([1, 2, 3, 4, 5])
print(array_1d)

# 创建一个二维数组
array_2d = np.array([[1, 2, 3], [4, 5, 6]])
print(array_2d)

# 数组的操作:数组的切片
slice_1d = array_1d[1:4]
print(slice_1d)

# 数组的运算:两个数组的元素级操作
array_2d_sum = array_2d + 10
print(array_2d_sum)

在这段代码中,我们首先导入了Numpy模块,并创建了一维数组 array_1d 和二维数组 array_2d 。数组创建后,我们展示了如何对数组进行切片操作,这是一个常用于数据处理的技术,可以选取数组的子集。

接着,我们演示了数组的运算功能。在Numpy中,可以轻松地对数组进行数学运算,如加法运算,这在进行图像处理和数据处理时十分有用。

3.3 数据分析流程和方法

3.3.1 数据探索性分析的基本步骤

数据探索性分析(Exploratory Data Analysis,简称EDA)是数据分析的重要组成部分,通过一系列的可视化和统计分析方法,来理解数据的特征和结构。

数据探索性分析一般包括以下步骤:

  1. 查看数据集的基本信息,包括数据结构、数据类型、缺失值情况等。
  2. 进行单变量分析,了解单个变量的分布情况。
  3. 进行双变量分析,探索变量之间的关系。
  4. 探索多变量分析,研究多个变量之间的复杂关系。

3.3.2 数据清洗和预处理技巧

数据清洗和预处理是确保数据质量的重要步骤,也是进行有效数据分析的基础。以下是常见的数据清洗和预处理技巧:

  1. 处理缺失值:包括删除含有缺失值的行或列,或者填充缺失值。
  2. 异常值处理:通过统计方法检测异常值,并决定如何处理。
  3. 数据类型转换:将数据转换为正确的数据类型。
  4. 标准化和归一化:调整数值型变量的范围和分布。
  5. 特征工程:包括特征选择、特征提取等。

以上是对本章节中视频图像处理与数据分析技术的详细介绍,下一章节我们将继续深入探讨深度学习模型的构建和评估。

4. 深度学习模型构建与评估

深度学习作为AI领域的重要分支,近年来在图像识别、自然语言处理等多个领域取得了突破性进展。本章将介绍如何构建和评估一个深度学习模型。内容涵盖从理解JSON文件解析技术、深度学习模型构建基础到模型训练与性能评估的详细步骤。

4.1 JSON文件解析技术

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript的一个子集,并且是文本形式的数据表示格式。在深度学习中,JSON文件常被用作配置文件、参数存储、模型结构的序列化等等。掌握JSON文件的解析对于深度学习模型的构建和数据处理至关重要。

4.1.1 JSON格式的理解与解析方法

JSON由两种结构组成:对象(object)和数组(array)。对象是由键值对(key-value pairs)组成的无序集合,数据在键和值之间用冒号 : 分隔,键值对之间用逗号 , 分隔。而数组则是值(value)的有序集合,值之间用逗号 , 分隔。JSON格式的数据在实际应用中,通常通过字符串的形式存储或传输。

下面是一个简单的JSON对象示例:

{
  "name": "John",
  "age": 30,
  "isStudent": false
}

解析JSON文件的基本方法有:

  • 使用内置库解析:Python有 json 库,可以直接解析JSON数据。其他语言也通常有类似的库。
  • 使用第三方库:如使用 pandas read_json 方法读取JSON数据到DataFrame中。

4.1.2 实际应用中JSON数据处理技巧

在深度学习模型构建中,我们经常需要从JSON文件中读取超参数或者模型结构等信息。一个有效的技巧是将这些信息存储在JSON文件中,并在代码中动态读取这些信息以构建模型。

例如,假定有一个JSON文件定义了网络层的结构:

{
  "layers": [
    {"type": "Conv2D", "filters": 32, "kernel_size": [3, 3]},
    {"type": "Activation", "activation": "relu"},
    {"type": "Flatten"},
    {"type": "Dense", "units": 10}
  ]
}

我们可以使用如下Python代码解析这个JSON文件,并基于其结构构建模型:

import json
import tensorflow as tf

# 读取JSON文件
with open('model_config.json', 'r') as file:
    config = json.load(file)

def build_model_from_config(config):
    model = tf.keras.models.Sequential()
    for layer in config['layers']:
        if layer['type'] == 'Conv2D':
            model.add(tf.keras.layers.Conv2D(
                filters=layer['filters'],
                kernel_size=layer['kernel_size'],
                activation='relu'))
        elif layer['type'] == 'Activation':
            model.add(tf.keras.layers.Activation(layer['activation']))
        # ... 添加其他层类型
    return model

# 构建模型
model = build_model_from_config(config)

在实际应用中,理解如何正确解析和使用JSON文件数据是非常关键的,它可以帮助我们更灵活地控制模型参数和结构。

4.2 深度学习模型构建基础

构建深度学习模型需要理解其基本组件和步骤。本节将介绍神经网络的基本概念以及如何在实际中构建模型。

4.2.1 神经网络的基本概念

神经网络是由许多简单、互联的处理单元(神经元)构成的复杂网络。每个神经元接收输入,进行处理,并产生输出。神经网络可以用来进行分类、回归、聚类和生成任务。

最基础的神经网络单元是感知器(Perceptron),它可以看作是一个带权重的线性函数。多个感知器可以被组织成多层结构,形成多层感知器(Multi-Layer Perceptron,MLP)。复杂的神经网络,如卷积神经网络(CNN)和循环神经网络(RNN),通过引入不同的连接方式和激活函数,能够处理图像、声音、文本等不同类型的数据。

4.2.2 模型构建的步骤和技巧

构建深度学习模型大致可以分为以下几个步骤:

  1. 定义模型架构 :根据问题定义输入层、隐藏层和输出层的结构。
  2. 选择损失函数 :损失函数用于衡量模型的预测值与真实值之间的差距。
  3. 选择优化器 :优化器用于调整模型的权重,以最小化损失函数。
  4. 编译模型 :将模型的架构、损失函数和优化器整合成一个可训练的模型。
  5. 训练模型 :输入数据和标签,运行训练过程。
  6. 评估模型 :使用验证集或测试集检查模型性能。
  7. 调整模型 :根据评估结果进行参数调优或模型结构调整。

在选择架构时,可以使用深度学习框架提供的预定义模型或自定义构建。常见的深度学习框架如TensorFlow、Keras和PyTorch都提供了丰富的API来帮助我们构建复杂的模型结构。

下面是一个使用Keras构建简单神经网络的示例代码:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

# 定义模型架构
model = Sequential()
model.add(Dense(units=64, activation='relu', input_shape=(input_size,)))
model.add(Dense(units=10, activation='softmax'))

# 选择损失函数和优化器
model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

# 编译、训练和评估模型的步骤在此省略

构建深度学习模型需要具备对不同类型的网络架构和算法的理解,同时在实践中不断尝试和优化。

4.3 模型训练与性能评估

训练一个深度学习模型是模型构建的中心环节,训练过程的监控和调优对于获得良好模型性能至关重要。本节将详细探讨模型训练的监控与调优方法以及性能评估的指标。

4.3.1 训练过程的监控和调优

在模型训练过程中,需要密切监控训练的进度和质量。可以使用诸如损失函数值、准确率等指标来监控模型的训练状态。同时,实时监控训练和验证集上的性能,以确保模型不过拟合或欠拟合。

一种常见的调优方法是使用回调函数(Callback),Keras框架提供了丰富的回调功能,例如:

  • ModelCheckpoint:保存训练过程中的最佳模型。
  • EarlyStopping:当验证集的性能不再提升时停止训练。
  • ReduceLROnPlateau:当验证集性能不再提升时减少学习率。

通过合理配置回调函数,可以有效控制模型训练过程,并获取最佳模型。

4.3.2 性能评估方法和指标解读

性能评估是深度学习模型开发周期中不可或缺的部分。在分类问题中,常用的性能评估指标有准确率(Accuracy)、精确率(Precision)、召回率(Recall)和F1分数(F1 Score)。在回归问题中,则常用均方误差(Mean Squared Error,MSE)或均方根误差(Root Mean Squared Error,RMSE)。

选择评估指标时,需要根据问题的类型和需求进行。例如,在医疗图像诊断中,高召回率可能是优先考虑的,因为漏检(false negative)的后果比误检(false positive)更严重。

以二分类问题为例,精确率和召回率可以通过混淆矩阵(Confusion Matrix)来计算:

from sklearn.metrics import confusion_matrix

# 假定y_true是真实的标签,y_pred是模型预测的标签
cm = confusion_matrix(y_true, y_pred)
TN, FP, FN, TP = cm.ravel()

# 计算精确率(Precision)和召回率(Recall)
Precision = TP / (TP + FP)
Recall = TP / (TP + FN)

这些指标不仅帮助我们了解模型的性能,还可以辅助我们进行模型的优化。例如,如果一个模型的召回率低,可以尝试调整模型或数据处理方式来提高。

在实际应用中,模型评估和优化是一个迭代过程,通过不断的试验和调整,直到获得满足需求的模型为止。

5. ActivityNet Entities数据集应用实践

在前几章中,我们已经介绍了Python的基础编程技能、视频图像处理与数据分析技术以及深度学习模型的构建与评估。本章将带您深入实践,通过ActivityNet Entities数据集,将这些知识综合应用到一个实际项目中。

5.1 预处理视频数据的步骤

视频数据通常来源于不同的来源,具有不同的格式和分辨率。为了使这些数据能够用于深度学习模型,我们需要进行一系列预处理操作。

5.1.1 视频数据的收集和格式转换

首先,我们需要从ActivityNet Entities数据集中收集视频数据。由于数据集中的视频可能存储在不同的格式和质量下,我们通常需要将其转换为一个统一的格式(如MP4或avi),以便后续处理。

import os
import cv2

def convert_video_format(input_video_path, output_video_path, output_format='mp4'):
    # 创建视频读取对象
    cap = cv2.VideoCapture(input_video_path)
    # 获取视频帧率和尺寸
    fps = cap.get(cv2.CAP_PROP_FPS)
    frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    # 创建视频写入对象
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')  # 或者 'XVID'
    out = cv2.VideoWriter(output_video_path, fourcc, fps, (frame_width, frame_height))
    # 读取帧并写入新视频
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break
        out.write(frame)
    # 释放资源
    cap.release()
    out.release()
    cv2.destroyAllWindows()

# 使用函数转换视频格式
convert_video_format('input_video.avi', 'output_video.mp4')

5.1.2 数据增强技术和实践

为了提高模型的泛化能力,我们通常需要对视频数据进行增强。常见的增强技术包括随机裁剪、旋转、缩放和颜色调整等。

import numpy as np
import random
from scipy.ndimage import rotate

def data_augmentation(video_frames, crop_size=None, rotate_angle=None):
    # 数据增强
    if crop_size is not None:
        # 随机裁剪
        height, width = video_frames.shape[1], video_frames.shape[2]
        top = np.random.randint(0, height - crop_size)
        left = np.random.randint(0, width - crop_size)
        video_frames = video_frames[:, top:top+crop_size, left:left+crop_size]
    if rotate_angle is not None:
        # 随机旋转
        video_frames = np.array([rotate(frame, rotate_angle, reshape=False) for frame in video_frames])
    return video_frames

# 应用数据增强
augmented_frames = data_augmentation(video_frames, crop_size=112, rotate_angle=15)

5.2 利用TensorFlow或PyTorch构建模型

在数据预处理完成后,我们需要构建一个深度学习模型。在本章节,我们将介绍如何使用TensorFlow和PyTorch来搭建视频分类模型。

5.2.1 深度学习框架的选择与环境搭建

根据项目需求和个人偏好,选择TensorFlow或PyTorch作为模型构建的框架。这里以TensorFlow为例,展示如何搭建开发环境。

# 使用Python虚拟环境安装TensorFlow
python -m venv tf_env
source tf_env/bin/activate
pip install tensorflow

5.2.2 模型搭建、训练与调优实例

搭建一个简单的卷积神经网络(CNN)模型进行视频分类。

import tensorflow as tf
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
from tensorflow.keras.models import Sequential

def build_cnn_model(input_shape):
    model = Sequential([
        Conv2D(32, (3, 3), activation='relu', input_shape=input_shape),
        MaxPooling2D((2, 2)),
        Conv2D(64, (3, 3), activation='relu'),
        MaxPooling2D((2, 2)),
        Conv2D(128, (3, 3), activation='relu'),
        Flatten(),
        Dense(128, activation='relu'),
        Dense(num_classes, activation='softmax')  # num_classes是分类的数量
    ])
    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
    return model

# 定义模型
input_shape = (112, 112, 3)  # 输入视频帧的尺寸
model = build_cnn_model(input_shape)

# 训练模型
# 假设我们已经有了训练数据和标签 train_frames 和 train_labels
history = model.fit(train_frames, train_labels, batch_size=32, epochs=10, validation_split=0.2)

5.3 模型性能评估与优化

训练完成后,我们需要对模型的性能进行评估。本节将讨论如何使用不同的评估指标来衡量模型的效果,以及如何对模型进行优化。

5.3.1 应用模型评估指标进行评估

使用准确率、召回率、精确率等指标来评估模型。

# 假设我们已经有了测试数据和标签 test_frames 和 test_labels
test_loss, test_accuracy = model.evaluate(test_frames, test_labels)

print(f"Test accuracy: {test_accuracy:.4f}")

5.3.2 模型的进一步优化与部署

根据评估结果,我们可以调整模型结构、超参数或使用更高级的训练技巧(如学习率衰减、权重衰减等)来提升模型性能。

# 使用回调函数来优化训练过程
reduce_lr = tf.keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.2, patience=5, min_lr=1e-4)
model.fit(train_frames, train_labels, batch_size=32, epochs=10, validation_split=0.2, callbacks=[reduce_lr])

# 部署模型
model.save('my_model.h5')

以上实践环节涵盖了从视频数据的预处理,到构建深度学习模型,再到模型训练、评估和优化的整个流程。通过使用ActivityNet Entities数据集,我们可以在这个过程中不断测试和改进我们的方法,以达到最佳的性能表现。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:ActivityNet Entities 数据集是由Facebook发布的,用于视频内容理解和自然语言处理的大型视频理解资源。它扩展了原有的ActivityNet数据集,包含了活动的识别和视频中实体及其关系的标注。本文将介绍如何使用Python及其相关库来处理和分析这一数据集,包括熟悉基础编程、图像数据处理、数据分析、JSON解析,以及构建和训练深度学习模型。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值