基于机器学习的网络入侵检测二元分类模型构建与性能评估(NSL-KDD数据集)

简介

该项目是一个基于NSL-KDD数据集的网络入侵检测系统,主要采用机器学习方法对网络流量数据进行使用了多种机器学习模型,如逻辑回归、线性SVM、多项式核SVM、高斯核SVM、决策树、随机森林、朴素贝叶斯和K近邻算法训练二元分类(正常/异常)模型及预测,最后比较了各个算法的检测效果。

实现步骤

  1. 加载和导入数据:
  • 导入所需的Python库,如numpy、pandas、matplotlib等,以及sklearn中的各种机器学习算法和评估指标。
  • 读取KDDTrain+.txt和KDDTest+.txt文件作为训练集和测试集,并给数据列添加对应的标签。
  1. 数据预处理:
  • 检查并打印训练集和测试集中重复的数据行数。
  • 将攻击类别转化为二元分类:‘normal’ 和 ‘abnormal’,并将原始攻击类别列删除。
  • 对分类特征(如protocol_type, service, flag)进行标签编码。
  1. 特征选择:
  • 使用mutual_info_classif方法计算特征与目标变量之间的互信息,并根据结果选择最重要的20个特征。
  1. 数据标准化:
    选定筛选后的特征子集后,对训练集和测试集的特征进行标准化处理,使用MinMaxScaler将所有特征缩放到[0, 1]区间内。

  2. 模型初始化与训练:

  • 初始化多种分类模型,包括逻辑回归、支持向量机(线性核、多项式核、高斯核)、决策树、随机森林、朴素贝叶斯和K近邻。
  • 对每个模型进行训练,使用训练好的模型在测试集上进行预测。
  1. 性能评估:
  • 计算并存储每个模型在测试集上的准确率、精确度和召回率。

实现代码

导入必要的库和数据

# 导入和加载数据
import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split,StratifiedKFold,GridSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier,VotingClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.metrics import confusion_matrix
from sklearn.model_selection import GridSearchCV,RandomizedSearchCV
from sklearn.svm import SVC
from sklearn import metrics
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import make_scorer, roc_auc_score
import scipy
from scipy import stats
import warnings
warnings.filterwarnings("ignore")
from sklearn.preprocessing import StandardScaler

# 设置列标签
columns = (['duration'
,'protocol_type'
,'service'
,'flag'
,'src_bytes'
,'dst_bytes'
,'land'
,'wrong_fragment'
,'urgent'
,'hot'
,'num_failed_logins'
,'logged_in'
,'num_compromised'
,'root_shell'
,'su_attempted'
,'num_root'
,'num_file_creations'
,'num_shells'
,'num_access_files'
,'num_outbound_cmds'
,'is_host_login'
,'is_guest_login'
,'count'
,'srv_count'
,'serror_rate'
,'srv_serror_rate'
,'rerror_rate'
,'srv_rerror_rate'
,'same_srv_rate'
,'diff_srv_rate'
,'srv_diff_host_rate'
,'dst_host_count'
,'dst_host_srv_count'
,'dst_host_same_srv_rate'
,'dst_host_diff_srv_rate'
,'dst_host_same_src_port_rate'
,'dst_host_srv_diff_host_rate'
,'dst_host_serror_rate'
,'dst_host_srv_serror_rate'
,'dst_host_rerror_rate'
,'dst_host_srv_rerror_rate'
,'attack'
,'level'])

# 从文件中读取训练集和测试集
df_train=pd.read_csv('../input/nslkdd/KDDTrain+.txt',header=None,names=columns)
df_test=pd.read_csv('../input/nslkdd/KDDTest+.txt',header=None,names=columns)

数据内容如下所示:

durationprotocol_typeserviceflagsrc_bytesdst_byteslandwrong_fragmenturgenthot...dst_host_same_srv_ratedst_host_diff_srv_ratedst_host_same_src_port_ratedst_host_srv_diff_host_ratedst_host_serror_ratedst_host_srv_serror_ratedst_host_rerror_ratedst_host_srv_rerror_rateattacklevel
00tcpftp_dataSF49100000...0.170.030.170.000.000.000.050.00normal20
10udpotherSF14600000...0.000.600.880.000.000.000.000.00normal15
20tcpprivateS0000000...0.100.050.000.001.001.000.000.00neptune19
30tcphttpSF23281530000...1.000.000.030.040.030.010.000.01normal21
40tcphttpSF1994200000...1.000.000.000.000.000.000.000.00normal21
..................................................................
1259680tcpprivateS0000000...0.100.060.000.001.001.000.000.00neptune20
1259698udpprivateSF1051450000...0.960.010.010.000.000.000.000.00normal21
1259700tcpsmtpSF22313840000...0.120.060.000.000.720.000.010.00normal18
1259710tcpkloginS0000000...0.030.050.000.001.001.000.000.00neptune20
1259720tcpftp_dataSF15100000...0.300.030.300.000.000.000.000.00normal21

125973 rows × 43 columns

数据格式如下所示:
在这里插入图片描述

检查训练集和测试集中重复数据的数量。

# 检查并打印训练集中重复数据的数量
print(df_train.duplicated().sum())

# 检查并打印测试集中重复数据的数量
print(df_test.duplicated().sum())

0
0

计算DataFrame中每个列的空值数量

df_train.isnull().sum()

在这里插入图片描述

检查异常值

绘制所有列的箱线图以查看异常值

# 绘制箱线图
df_train.plot(kind='box', subplots=1, layout=(15, 3), figsize=(20, 40))
plt.show()

在这里插入图片描述
计算并返回训练数据集中‘attack’列中各标签的出现次数

df_train['attack'].value_counts()

用于计算数据框 df_train 中指定列 ‘attack’ 中不同值的出现次数,并以降序排列。这里没有参数传递,函数直接返回一个 Series 对象,其中包含各标签的计数。这个操作对于了解数据的分布非常有用,特别是当需要了解数据集中各类攻击的相对频率时。
在这里插入图片描述
将数据集中的异常类别转换为单一的异常类
该代码块主要对训练集和测试集进行处理,将原始攻击类别转化为二元分类:
正常(normal)和异常(abnormal)。这有助于简化后续的模型训练和评估过程。

# 将训练集中的攻击类别转化为二元分类
df_train["binary_attack"]=df_train.attack.map(lambda a: "normal" if a == 'normal' else "abnormal")
# 删除原始的攻击类别列
df_train.drop('attack',axis=1,inplace=True)

# 将测试集中的攻击类别转化为二元分类
df_test["binary_attack"]=df_test.attack.map(lambda a: "normal" if a == 'normal' else "abnormal")
# 删除测试集中的原始攻击类别列
df_test.drop('attack',axis=1,inplace=True)
df_train.select_dtypes(['object']).columns

Index([‘protocol_type’, ‘service’, ‘flag’, ‘binary_attack’], dtype=‘object’)

数据编码

该代码块主要功能是对给定的数据集的几个指定列进行标签编码。
使用的是sklearn库中的preprocessing模块的LabelEncoder类。

from sklearn import preprocessing
le=preprocessing.LabelEncoder()  # 创建标签编码器实例

clm=['protocol_type', 'service', 'flag', 'binary_attack']  # 需要进行标签编码的列名列表
for x in clm:  # 遍历列名列表
    df_train[x]=le.fit_transform(df_train[x])  # 对训练数据集的指定列进行标签编码
    df_test[x]=le.fit_transform(df_test[x])  # 对测试数据集的指定列进行标签编码

数据分割

对输入的数据集进行处理,分割为训练集和测试集的特征和标签。

主要步骤包括:

  1. 从训练集数据框(df_train)中去除标签列(‘binary_attack’),保留其余特征列,得到训练集的特征(x_train);
  2. 从训练集数据框(df_train)中提取标签列(‘binary_attack’),得到训练集的标签(y_train);
  3. 从测试集数据框(df_test)中去除标签列(‘binary_attack’),保留其余特征列,得到测试集的特征(x_test);
  4. 从测试集数据框(df_test)中提取标签列(‘binary_attack’),得到测试集的标签(y_test)。
# 分割训练集的特征和标签
x_train=df_train.drop('binary_attack',axis=1)
y_train=df_train["binary_attack"]

# 分割测试集的特征和标签
x_test=df_test.drop('binary_attack',axis=1)
y_test=df_test["binary_attack"]

特征工程

计算特征与目标变量之间的互信息。

:param x_train: 训练集的特征矩阵,其中每一列是一个特征。
:param y_train: 训练集的目标变量向量。

from sklearn.feature_selection import mutual_info_classif

# 使用mutual_info_classif计算特征与目标变量的互信息
mutual_info = mutual_info_classif(x_train, y_train)

# 将计算结果转换为pandas Series,方便后续处理
mutual_info = pd.Series(mutual_info)

# 设置Series的索引为特征名,这样可以方便地与特征矩阵相对应
mutual_info.index = x_train.columns

# 按照互信息值降序排序,使得最重要的特征排在前面
mutual_info.sort_values(ascending=False)

在这里插入图片描述

绘制相互信息的柱状图

对名为mutual_info的数据结构(假设为DataFrame)按值进行降序排序,
然后使用bar方法绘制柱状图。figsize(图形大小)参数设置为(20, 8),以确保图形足够大,
便于细节查看和展示。该图形可用于展示不同变量间的相互信息量,帮助分析者理解变量间的关联程度。

mutual_info.sort_values(ascending=False).plot.bar(figsize=(20, 8));

在这里插入图片描述

# 选择最重要的20个特征进行筛选
from sklearn.feature_selection import SelectKBest
# 使用mutual_info_classif方法评估特征重要性,选择最重要的20个特征
sel_five_cols = SelectKBest(mutual_info_classif, k=20)
# 对训练数据进行特征选择
sel_five_cols.fit(x_train, y_train)
# 获取选择出的特征的列名
x_train.columns[sel_five_cols.get_support()]

Index([‘service’, ‘flag’, ‘src_bytes’, ‘dst_bytes’, ‘logged_in’, ‘count’,
‘serror_rate’, ‘srv_serror_rate’, ‘same_srv_rate’, ‘diff_srv_rate’,
‘srv_diff_host_rate’, ‘dst_host_count’, ‘dst_host_srv_count’,
‘dst_host_same_srv_rate’, ‘dst_host_diff_srv_rate’,
‘dst_host_same_src_port_rate’, ‘dst_host_srv_diff_host_rate’,
‘dst_host_serror_rate’, ‘dst_host_srv_serror_rate’, ‘level’],
dtype=‘object’)

为了确保训练集和测试集在进行模型训练和评估前,其特征维度和类型保持一致,只包含对模型有意义或者相关的特征,从而提高模型的准确性和泛化能力。

# 将训练集和测试集的数据调整为只包含指定的列
col=['service', 'flag', 'src_bytes', 'dst_bytes', 'logged_in',
       'same_srv_rate', 'diff_srv_rate', 'dst_host_srv_count',
       'dst_host_same_srv_rate', 'dst_host_diff_srv_rate']

# 调整训练集特征矩阵,仅包含指定的列
x_train=x_train[col]

# 调整测试集特征矩阵,也仅包含指定的列
x_test=x_test[col]

生成并显示一个热力图,用于可视化x_train数据集的协方差矩阵。

# 创建一个新的图形窗口,设置其宽度和高度
plt.figure(figsize=(12,10))
# 生成热力图,显示元素值,使用'RdYlGn'颜色映射
p=sns.heatmap(x_train.corr(), annot=True, cmap='RdYlGn')  

在这里插入图片描述

数据缩放

对机器学习模型的输入数据(训练集和测试集)进行标准化处理,使得数据的范围在0到1之间,以提升模型的性能和稳定性。

# 导入MinMaxScaler类,用于数据的标准化处理
from sklearn.preprocessing import MinMaxScaler

# 实例化MinMaxScaler对象,用于后续的数据转换
scaler = MinMaxScaler()

# 对训练集数据进行标准化处理,转换后的数据范围在[0, 1]之间
x_train = scaler.fit_transform(x_train)

# 对测试集数据进行标准化处理,同样的转换确保训练集和测试集的特征缩放一致
x_test = scaler.fit_transform(x_test)

二元分类模型训练及预测

# 初始化各种模型并将它们以名称为键存储在一个字典中
models = {}

# 初始化逻辑回归模型
from sklearn.linear_model import LogisticRegression
models['Logistic Regression'] = LogisticRegression()

# 初始化线性支持向量机模型
from sklearn.svm import LinearSVC
models['Support Vector Machines linear'] = LinearSVC()

# 初始化多项式核支持向量机模型
models['Support Vector Machines plonomial'] = SVC(kernel='poly')

# 初始化高斯核支持向量机模型,通过调整C参数来避免过拟合
models['Support Vector Machines RBf'] =  SVC(C=100.0)

# 初始化决策树模型,限制树的最大深度为3
from sklearn.tree import DecisionTreeClassifier
models['Decision Trees'] = DecisionTreeClassifier(max_depth=3)

# 初始化随机森林模型
from sklearn.ensemble import RandomForestClassifier
models['Random Forest'] = RandomForestClassifier()

# 初始化朴素贝叶斯模型
from sklearn.naive_bayes import GaussianNB
models['Naive Bayes'] = GaussianNB()

# 初始化K最近邻模型,选择20个最近邻点
from sklearn.neighbors import KNeighborsClassifier
models['K-Nearest Neighbor'] = KNeighborsClassifier(n_neighbors=20)

根据提供的模型集合,分别训练每个模型,作出预测,并计算与存储各个模型的准确度、精确度和召回率。
使用的指标来自sklearn.metrics模块,包括:accuracy_score(准确率)、precision_score(精确度)、recall_score(召回率)。
三个字典accuracy、precision、recall用于存储每个模型对应的指标结果。

from sklearn.metrics import accuracy_score, precision_score, recall_score

accuracy, precision, recall = {}, {}, {}

for key in models.keys():
    # 对当前循环到的模型进行训练
    models[key].fit(x_train, y_train)
    
    # 使用训练好的模型对测试集进行预测
    predictions = models[key].predict(x_test)
    
    # 计算并存储当前模型的准确率、精确度和召回率
    accuracy[key] = accuracy_score(predictions, y_test)
    precision[key] = precision_score(predictions, y_test)
    recall[key] = recall_score(predictions, y_test)

根据提供的模型准确度、精确度和召回率生成一个DataFrame

df_model = pd.DataFrame(index=models.keys(), columns=['Accuracy', 'Precision', 'Recall'])
# 初始化DataFrame,设置索引为模型名称,列名为Accuracy, Precision, Recall

df_model['Accuracy'] = accuracy.values()
# 将accuracy字典的值赋给DataFrame的Accuracy列

df_model['Precision'] = precision.values()
# 将precision字典的值赋给DataFrame的Precision列

df_model['Recall'] = recall.values()
# 将recall字典的值赋给DataFrame的Recall列

df_model
# 输出生成的DataFrame
AccuracyPrecisionRecall
Logistic Regression0.7170420.9435690.611111
Support Vector Machines linear0.7238730.9556170.615630
Support Vector Machines plonomial0.7643720.9627230.653822
Support Vector Machines RBf0.7729330.9573680.663977
Decision Trees0.8230130.8409020.769579
Random Forest0.7622870.9696220.650276
Naive Bayes0.5462650.4406340.471463
K-Nearest Neighbor0.7889460.9620020.680358

使用条形图可视化模型数据。

# 绘制条形图
ax = df_model.plot.barh()

# 设置图例
ax.legend(
    ncol=len(models.keys()),  # 根据模型数量确定图例列数
    bbox_to_anchor=(0, 1),  # 将图例位置设置在绘图区右上角
    loc='lower left',  # 位置细节调整,将图例放置在左下角
    prop={'size': 14}  # 设置图例文字大小
)

# 调整布局,确保图表各部分之间没有空隙
plt.tight_layout()

在这里插入图片描述

遍历所有模型并绘制ROC曲线

from sklearn.metrics import plot_roc_curve

# 遍历所有模型并绘制ROC曲线
for key in models.keys():
    plot_roc_curve( models[key], x_test, y_test)
    """
    plot_roc_curve函数用于绘制ROC(受试者操作特性)曲线。
    参数:
        models[key]:表示模型,从字典models中通过key获取对应的模型。
        x_test:测试集的特征向量。
        y_test:测试集的真实标签。
    返回值:
        无返回值,直接在图形窗口中绘制ROC曲线。
    """

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

在这里插入图片描述
在这里插入图片描述
不难得出,随机森林和决策树分类器对于NSL-KDD数据集来说有较好的分类效果。

优化建议

  1. 平衡数据处理:
  • NSL-KDD数据集中各类别的样本分布可能存在不均衡情况,应考虑使用欠采样、过采样或SMOTE等方法来平衡正负样本。
  1. 特征工程改进:
  • 除了基于互信息的选择外,可以尝试其他特征选择方法,例如递归特征消除(RFE)、基于卡方检验的选择等,以及探索更高阶的交互特征。
  • 可以进一步研究数据集中的特征关联性和冗余性,减少共线性特征的影响。
  1. 模型调优:
  • 对于每个模型,通过GridSearchCV或RandomizedSearchCV进行参数网格搜索,寻找最优超参数组合,提高模型性能。
  • 考虑集成学习方法,比如AdaBoost、BaggingClassifier或者StackingClassifier,结合多个基础模型提升整体表现。
  1. 评估指标:
  • 由于这是一个二分类问题且可能涉及类不平衡,仅依赖准确率评价模型效果可能不够全面。应引入F1分数、AUC-ROC曲线等相关指标进行综合评估。
  1. 模型解释性:
  • 引入模型可解释性技术,例如SHAP值、LIME等,帮助理解模型在各个特征上的重要性,以及为何做出特定预测,增加系统的透明度和可信度。

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

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

相关文章

漫谈技术成长

引言 相信很多程序员在自己的技术成长之路上,总会遇到许许多多的难关,有些难关咬咬牙就过去了,而有点难关则需要有一定的能力,才能克服。因此,本文主要围绕“技术成长” 话题,为何会选择技术方向&#xff0…

数据结构从入门到精通——队列

队列 前言一、队列1.1队列的概念及结构1.2队列的实现1.3队列的实现1.4扩展 二、队列面试题三、队列的具体实现代码Queue.hQueue.ctest.c队列的初始化队列的销毁入队列出队列返回队头元素返回队尾元素检测队列是否为空检测元素个数 前言 队列是一种特殊的线性数据结构&#xff…

练习ROS动作编程

ROS学习记录:动作编程 引言: ​ 通过本实验,我们将联系我们学过的动作编程,客户端发送一个运动目标,模拟小乌龟运动到目标位置的过程,包含服务端和客户端的代码实现,并且带有实时的位置反馈。 希望你在本次学习过后&am…

计算机网络谢希仁第8版课后习题答案(PDF)

百度网盘:https://pan.baidu.com/s/1cY_DkwaljjL7kU00-APLhw 提取码:5488

linux网络通信(TCP)

TCP通信 1.socket----->第一个socket 失败-1,错误码 参数类型很多,man查看 2.connect 由于s_addr需要一个32位的数,使用下面函数将点分十进制字符串ip地址以网络字节序转换成32字节数值 同理端口号也有一个转换函数 我们的端口号位两个字…

Spring boot 请求参数包含[]等特殊字符,导致无法接收问题

前言对字符进行转义修改tomcat 配置 前言 Spring boot 请求参数包含[]等特殊字符,导致无法接收问题 对字符进行转义 中括号[] 必须用%5B%5D转义,否则tomcat无法解析,回抛出不合法字符异常,不会进入控制器 修改tomcat 配置 p…

Kubernetes 安全秘籍:5 个你必须知道的知识点

Kubernetes 安全和身份验证是确保集群和应用安全的关键。今天将深入探讨 Service Account、身份验证和RBAC的关键概念和实践,帮助您构建安全可靠的应用。今天本文将着重于安全相关的内容,并提供更详细的示例和配置说明,帮助兄弟们更深入地理解…

Java8 CompletableFuture异步编程-进阶篇

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java全栈-专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 前言 我们在前面文章讲解了CompletableFuture这个异步编程类的基本用法,…

猫头虎分享已解决Bug || 系统监控故障:MonitoringServiceDown, MetricsCollectionError

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

【敬伟ps教程】文字处理工具

文章目录 文字工具使用方式文字图层文字工具选项字符面板段落面板文字工具使用方式 文字工具(快捷键T),包含横排和直排两种类型 创建文本两种类型:点式文本、段落文本 创建文字方式 1、在画面上单击,出现文字光标,可输入文字,然后需要在工具栏中点击“√”或者 Ctrl+…

存算一体成为突破算力瓶颈的关键技术?

大模型的训练和推理需要高性能的算力支持。以ChatGPT为例,据估算,在训练方面,1746亿参数的GPT-3模型大约需要375-625台8卡DGX A100服务器训练10天左右,对应A100 GPU数量约3000-5000张。 在推理方面,如果以A100 GPU单卡…

UnityShader——09数学知识3

方阵 行与列数量相等的矩阵,n*n阶矩阵 对角矩阵 当对角线以外的矩阵内元素全为0,则称之为对角矩阵,对角矩阵的前提是必须是方阵 单位矩阵 对角线元素全为1,其余元素全为0,属于对角矩阵的一部分 矩阵和向量 把1 * n阶矩阵称…

JavaWeb - 2 - HTML、CSS

什么是HTML、CSS? HTML(HyperText Markup Language):超文本标记语言 超文本:超越了文本的限制,比普通文本更强大,除了文字信息,还可以定义图片、音频、视频等内容 标记语言&…

ESP8266程序烧录方法(以ESPFlashDownloadTool为例)

0 工具准备 ESP8266必须包含的目标bin ESPFlashDownloadTool_v3.6.3.exe NodeMCU(ESP8266) sscom5 1 ESP8266程序烧录方法(以ESPFlashDownloadTool为例) 1.1 生成ESP8266所需的bin文件 可以参考前面所写的《安信可IDE&#xff0…

被唤醒的“第二十条”深入人心

近来张艺谋执导的电影《第二十条》,因为它与正在召开中的全国两会所发布的《最高人民法院工作报告》联系相当紧密,加之可免费收看,网民便相互转告,于是此信息条目立即冲上了网络热搜榜,观者如潮。因为最高人民法院工作…

STM32 HAL库RTC复位丢失年月日的解决办法

STM32 HAL库RTC复位丢失年月日的解决办法 0.前言一、实现方式1.CubeMX配置:2.MX_RTC_Init()函数修改2.编写手动解析函数 二、总结 参考文章:stm32f1 cubeMX RTC 掉电后日期丢失的问题 0.前言 最近在使用STM32F103做RTC实验时,发现RTC复位后时…

LeetCode-Hot100

哈希 1.两数之和: 给定一个整数数组nums和一个整数目标值target,请你再该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。 思路:暴力解法是使用两层循环来遍历每一个数,然后找出两数之和等于target的…

2024/3/9d打卡整数划分---背包动态规划方式,计数类动态规划

目录 题目 DP分析 第一种方法,背包DP 代码 第二种方法(有点难想到) 代码 题目 一个正整数 n 可以表示成若干个正整数之和,形如:nn1n2…nk,其中 n1≥n2≥…≥nk,k≥1。 我们将这样的一种表示称为正整数 …

maven项目引入私有jar,并打包到java.jar中

私有jar存放位置 maven依赖 <dependency><groupId>com.hikvision.ga</groupId><artifactId>artemis-http-client</artifactId><version>1.1.10</version><scope>system</scope><systemPath>${project.basedir}/s…

FPGA高端项目:FPGA基于GS2971的SDI视频接收+HLS图像缩放+多路视频拼接,提供4套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收转HDMI输出应用本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收OSD多路视频融合叠加应用本方案的SDI接收HLS多路视频融合叠加应用本方案…