Flink技术简介与入门实践

news2024/11/16 7:54:50

架构简介

        Flink 是一个分布式流处理和批处理计算框架,具有高性能、容错性和灵活性。下面是 Flink 的架构概述:

  1. JobManager:JobManager 是 Flink 集群的主节点,负责接收和处理用户提交的作业。JobManager 的主要职责包括:

    • 解析和验证用户提交的作业。
    • 生成执行计划,并将作业图分发给 TaskManager。
    • 协调任务的调度和执行。
    • 管理作业的状态和元数据信息。
  2. TaskManager:TaskManager 是 Flink 集群的工作节点,负责执行具体的任务。每个 TaskManager 可以运行多个任务(子任务),每个子任务运行在一个单独的线程中,共享 TaskManager 的资源。TaskManager 的主要职责包括:

    • 接收并执行 JobManager 分配的任务。
    • 负责任务的数据处理、状态管理、故障恢复等操作。
    • 将处理结果返回给 JobManager。
  3. StateBackend:StateBackend 是 Flink 的状态管理机制,用于保存和恢复任务的状态信息,确保任务在失败后可以进行故障恢复。Flink 提供了多种 StateBackend 实现,包括内存、文件系统、RocksDB 等。

  4. DataStream API / DataSet API:Flink 提供了两种不同的编程接口,用于流处理和批处理:

    • DataStream API:面向流式计算,支持实时数据流的处理和分析。它提供了丰富的操作符(例如 map、filter、window、join 等)和窗口函数,以便进行数据转换和聚合操作。
    • DataSet API:面向批处理,适用于有界数据集的处理。它提供了类似于 Hadoop MapReduce 的操作符(例如 map、reduce、join 等),用于对数据集进行转换和计算。
  5. Connectors:Flink 提供了多种连接器,用于与外部系统进行数据交互。常见的连接器包括 Kafka、Hadoop、Elasticsearch、JDBC 等,可以用于读取和写入外部数据源。

  6. 资源管理器:Flink 可以与各种集群管理工具(如 YARN、Mesos、Kubernetes)集成,以实现资源的动态分配和任务调度。

        Flink 的架构使得它能够实现高性能的流处理和批处理,同时具备良好的容错性和可伸缩性。它广泛应用于实时数据处理、数据湖分析、事件驱动应用等场景。

        5688cc16378d42feb9c2b2f7284ab24e.png

组件模块

大数据流处理框架 Flink 和 Aflink 的技术架构主要包括以下组件:

  1. JobManager:负责接收 Job 图,并将其分发给 TaskManager。
  2. TaskManager:负责执行任务,包括数据源、数据计算、数据汇总等操作。
  3. StateBackend:用于保存状态信息,支持容错和恢复。
  4. DataStream API:用于定义数据流处理逻辑,包括窗口函数、聚合操作等。
  5. Connector:用于连接外部数据源,如 Kafka。

1606d8abc53c40d684bb9f11b08d8dd1.png

JobManager 和 TaskManager 之间的通信方式主要有两种:心跳机制和RPC(远程过程调用)。

  1. 心跳机制:JobManager 和 TaskManager 通过心跳机制保持连接和通信。具体流程如下:

    • JobManager 定期向所有的 TaskManager 发送心跳信号,确认 TaskManager 是否存活。
    • TaskManager 接收到心跳信号后,回复确认信号给 JobManager,表示自己还活着。
    • 如果 JobManager 在一段时间内没有收到 TaskManager 的心跳信号,就会认为该 TaskManager 失效,并进行相应的处理。
  2. RPC:JobManager 和 TaskManager 使用 RPC 机制进行通信,以传递任务和数据等信息。具体流程如下:

    • JobManager 将任务调度图发送给 TaskManager。这包括任务的执行计划、数据源、算子操作等。
    • TaskManager 接收到任务调度图后,根据指令执行任务,处理数据流。
    • TaskManager 在处理过程中将结果返回给 JobManager,以便进行状态更新和后续处理。

7323e1e6b9264fb68d7625a1d35dd68a.jpeg

        需要注意的是,JobManager 和 TaskManager 的通信是基于网络的,它们可以部署在不同的机器上。在一个 Flink 集群中,通常会有一个 JobManager 和多个 TaskManager,它们通过上述的通信方式协同工作,实现数据流的处理和任务调度。

与其他大数据集成

ab0c2cfe1fb743bdaa5eae73f4991b27.webp

流式计算和窗口函数原理

  • 流式计算:Flink 和 Aflink 是流式计算框架,能够实时处理无界数据流。流式计算基于事件驱动的模型,能够处理实时数据并支持低延迟计算。
  • 窗口函数:窗口函数用于对数据流进行分组聚合操作,常见的窗口类型包括滚动窗口、滑动窗口和会话窗口。窗口函数允许用户在有限的数据集上执行计算操作。

窗口类型

        Flink 框架提供了多种窗口函数,用于对数据流进行分组聚合操作。以下是一些常见的窗口函数:

  1. 滚动窗口(Tumbling Window):将数据流划分为固定大小的、不重叠的窗口。每个窗口包含相同数量的元素,并且窗口之间没有重叠。可以通过 window(Tumble.over()) 方法来定义滚动窗口。

  2. 滑动窗口(Sliding Window):将数据流划分为固定大小的、可能重叠的窗口。每个窗口包含指定数量的元素,并且窗口之间可以有重叠。可以通过 window(Slide.over()) 方法来定义滑动窗口。

  3. 会话窗口(Session Window):根据事件之间的时间间隔将数据流划分为不固定长度的会话窗口。如果在指定时间间隔内没有新事件到达,则会话窗口关闭。可以通过 window(Session.withGap()) 方法来定义会话窗口。

  4. 全局窗口(Global Window):将整个数据流视为一个窗口,不进行数据切分。适用于需要计算整个数据流的聚合结果的场景。可以通过 window(Global()) 方法来定义全局窗口。

  5. 自定义窗口函数:Flink 还支持自定义窗口函数,以便满足特定需求。您可以实现 WindowFunction 接口来定义自己的窗口函数,并通过 apply() 方法来处理窗口中的元素。

        这些窗口函数可以和其他操作符(例如 groupBy()reduce()aggregate() 等)一起使用,以实现各种数据流处理和聚合操作。

        不同类型的窗口函数适用于不同的业务场景,具体选择哪种窗口函数取决于您的需求和数据流的特点。

        窗口函数都有其特定的使用场景,下面我会简要介绍每种窗口函数的典型应用场景,并提供 Java 和 Python 代码示例。

滚动窗口(Tumbling Window)

  • 使用场景:适用于需要对固定大小的数据范围进行聚合计算的场景,例如统计每5分钟内的数据总和。
  • Java 代码示例
DataStream<Tuple2<String, Integer>> input = ... ; 
// 输入数据流
 DataStream<Tuple2<String, Integer>> result = input .keyBy(0) .window(TumblingEventTimeWindows.of(Time.minutes(5))) .sum(1);
  • Python 代码示例
from pyflink.datastream import StreamExecutionEnvironment 
from pyflink.datastream.window import TumblingEventTimeWindows 
from pyflink.common import WatermarkStrategy env = StreamExecutionEnvironment.get_execution_environment() 
input_stream = ... 
# 输入数据流
result_stream = input_stream.key_by(lambda x: x[0]).window(TumblingEventTimeWindows.of('5 minutes')).sum(1)

滑动窗口(Sliding Window)

  • 使用场景:适用于需要对数据流进行连续且重叠的窗口计算的场景,例如统计每5分钟计算一次数据总和,并且每次计算时包含前一个窗口的部分数据。
  • Java 代码示例
DataStream<Tuple2<String, Integer>> input = ... ; 
// 输入数据流 
DataStream<Tuple2<String, Integer>> result = input .keyBy(0) .window(SlidingEventTimeWindows.of(Time.minutes(10), Time.minutes(5))) .sum(1);
  • Python 代码示例
from pyflink.datastream.window import SlidingEventTimeWindows
result_stream = input_stream .key_by(lambda x: x[0]).window(SlidingEventTimeWindows.of('10 minutes', '5 minutes')).sum(1)

会话窗口(Session Window)

  • 使用场景:适用于需要基于活动之间的间隔时间来划分窗口的场景,例如用户在网站上的一系列操作之间的时间间隔作为窗口的划分条件。
  • Java 代码示例
DataStream<Tuple2<String, Integer>> input = ... ; 
// 输入数据流 
DataStream<Tuple2<String, Integer>> result = input .keyBy(0).window(EventTimeSessionWindows.withGap(Time.minutes(10))) .sum(1);
  • Python 代码示例
from pyflink.datastream.window import EventTimeSessionWindows 
result_stream = input_stream .key_by(lambda x: x[0]).window(EventTimeSessionWindows.with_gap('10 minutes')).sum(1)

全局窗口(Global Window)

  • 使用场景:适用于对整个数据流进行聚合计算的场景,例如统计全天的数据总和。
  • Java 代码示例
DataStream<Tuple2<String, Integer>> input = ... ; 
// 输入数据流 
DataStream<Tuple2<String, Integer>> result = input .keyBy(0) .window(GlobalWindows.create()) .trigger(CountTrigger.of(1)) .sum(1);

 

  • Python 代码示例
from pyflink.datastream.window import GlobalWindows 
from pyflink.datastream.trigger import CountTrigger 
result_stream = input_stream .key_by(lambda x: x[0]).window(GlobalWindows.create()) .trigger(CountTrigger(1)).sum(1)

读取 Kafka 数据并计算指标

        以下是一个简单的示例代码,使用 Java 和 Python 分别演示读取 Kafka 数据并计算指标的过程:

Java 代码示例:

// 创建 Flink 程序入口 
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); 
// 从 Kafka 中读取数据
 FlinkKafkaConsumer<String> kafkaConsumer = new FlinkKafkaConsumer<>("topic", new SimpleStringSchema(), properties); 
DataStream<String> stream = env.addSource(kafkaConsumer); 
// 对数据流进行处理,计算指标 
DataStream<Result> resultStream = stream .flatMap(new UserAccessFlatMapFunction()) .keyBy("userId") .timeWindow(Time.minutes(5)) .apply(new UserAccessWindowFunction());
 // 执行任务 
env.execute("User Access Analysis");

Python 代码示例:

from pyflink.datastream import StreamExecutionEnvironment 
from pyflink.table import StreamTableEnvironment, EnvironmentSettings 
from pyflink.table.descriptors import Schema, Kafka 
# 创建 Flink 环境 
env = StreamExecutionEnvironment.get_execution_environment() 
env.set_parallelism(1) t_env = StreamTableEnvironment.create( env, environment_settings=EnvironmentSettings.new_instance().in_streaming_mode().use_blink_planner().build()) 
# 从 Kafka 读取数据 
t_env.connect( Kafka() .version("universal") .topic("topic") .property("zookeeper.connect", "localhost:2181") .property("bootstrap.servers", "localhost:9092") .start_from_earliest() .finish() ).with_format( Json() ).with_schema( Schema() .field("user_id", DataTypes.STRING()) .field("timestamp", DataTypes.TIMESTAMP(3)) ).create_temporary_table("MySource") 
# 计算指标 
t_env.from_path("MySource") \ .window(Tumble.over("5.minutes").on("timestamp").alias("w")) \ .group_by("user_id, w") \ .select("user_id, w.end as window_end, count(user_id) as pv, count_distinct(user_id) as uv") \ .execute_insert("MySink")

加载数据湖进行 AI 模型训练

        Flink 和 Aflink 可以用于加载数据湖中的大规模数据集,进行 AI 模型训练。通过流式处理和批处理相结合,可以有效处理图片、音频、文本等多媒体数据,用于风控等场景。

        

        当使用 Flink 进行机器学习时,通常会使用 Flink 的批处理和流处理 API 结合机器学习库(如 Apache Flink ML、Apache Mahout 等)来实现各种机器学习任务。这里我将为您提供一个简单的示例,演示如何在 Flink 中使用批处理 API 来进行线性回归的训练。

首先,让我们看一下 Java 代码示例:

import org.apache.flink.api.java.ExecutionEnvironment; 
import org.apache.flink.api.java.DataSet; 
import org.apache.flink.ml.common.LabeledVector; import org.apache.flink.ml.regression.MultipleLinearRegression; 
public class LinearRegressionExample { 
    public static void main(String[] args) throws Exception {    
        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment(); 
        // 创建带标签的向量数据集 
        DataSet<LabeledVector> trainingData = ... ; 
        // 从数据源加载带标签的向量数据集 
        // 初始化线性回归模型 
        MultipleLinearRegression mlr = new MultipleLinearRegression();                 
        mlr.setStepsize(0.5); 
        // 设置步长 
        mlr.setIterations(100); 
        // 设置迭代次数 
        // 训练线性回归模型 
        mlr.fit(trainingData); 
        // 获取训练后的模型参数 
        double[] weights = mlr.weights(); 
        double intercept = mlr.intercept(); 
        // 打印模型参数 
        System.out.println("Weights: " + Arrays.toString(weights));         
        System.out.println("Intercept: " + intercept);
     }
 }

 Python 代码示例:

from pyflink.dataset import ExecutionEnvironment 
from pyflink.datastream import LabeledVector 
from pyflink.ml.preprocessing import Splitter 
from pyflink.ml.regression import MultipleLinearRegression env = ExecutionEnvironment.get_execution_environment() 
# 创建带标签的向量数据集 
training_data = ... 
# 从数据源加载带标签的向量数据集 
# 初始化线性回归模型 
mlr = MultipleLinearRegression() mlr.set_step_size(0.5) # 
设置步长 mlr.set_max_iterations(100) 
# 设置最大迭代次数 # 训练线性回归模型
mlr.fit(training_data) 
# 获取训练后的模型参数 
weights = mlr.weights_ intercept = mlr.intercept_ 
# 打印模型参数 
print("Weights: ", weights) print("Intercept: ", intercept)

        在 Flink 中使用批处理 API 进行线性回归模型的训练。实际上,在 Flink 中进行更复杂的机器学习任务时,可能需要结合更多的预处理、特征工程、模型评估等步骤,以及更丰富的机器学习算法和模型库。

Flink Table API

        Flink Table API 是 Apache Flink 提供的一种用于处理结构化数据的高级 API,它提供了一种类 SQL 的声明性编程方式,使用户可以通过类 SQL 的语法来操作流式和批处理数据。使用 Table API,用户可以方便地进行数据查询、转换、聚合等操作,而无需编写复杂的低级别代码。

下面是一个简单的示例,演示如何在 Flink 中使用 Table API 来实现对输入数据流的简单转换和聚合:

Java 示例:

import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; 
import org.apache.flink.table.api.Table; 
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment; 
public class TableAPIExample {
    public static void main(String[] args) throws Exception { 
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); 
        StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env); 
        // 创建输入数据流 
        Table inputTable = tableEnv.fromDataStream(inputDataStream, "name, age"); 
        // 查询和转换操作 
        Table resultTable = inputTable .filter("age > 18") .groupBy("name") .select("name, count(1) as count"); 
        // 将结果表转换为数据流并打印输出 tableEnv.toRetractStream(resultTable, Row.class).print(); env.execute("Table API Example"); 
    } 
}

Python 示例:

from pyflink.datastream import StreamExecutionEnvironment 
from pyflink.table import 
StreamTableEnvironment env = StreamExecutionEnvironment.get_execution_environment() 
table_env = StreamTableEnvironment.create(env) 
# 创建输入数据流 input_table = table_env.from_data_stream(input_data_stream, ['name', 'age']) 
# 查询和转换操作 
result_table = input_table \ .filter("age > 18") \ .group_by("name") \ .select("name, count(1) as count") 
# 将结果表转换为数据流并打印输出 
table_env.to_retract_stream(result_table, Row).print() env.execute("Table API Example")

        创建了一个输入数据流,然后使用 Table API 对数据流进行过滤、分组和聚合操作,最后将结果表转换为数据流并打印输出。这展示了 Table API 的简单用法,更复杂的操作和功能可以根据具体需求进行扩展。

发展历史和市场优势

  • 发展历史:Flink 于 2015 年正式发布,是一个快速发展的流处理引擎,Aflink 是 Flink 在国内的一个分支,也得到了广泛应用。
  • 市场优势:Flink 和 Aflink 具有低延迟、高吞吐量等优势,适用于实时数据处理场景。在大数据领域,它们已成为重要的流式计算框架,广泛应用于金融、电商、物联网等行业。

 

 

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

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

相关文章

NASA数据集——亚马逊盆地与其大气边界层之间各种气溶胶和气体交换率的估计值数据

简介 Pre-LBA ABLE-2A and ABLE-2B Expedition Data ABLE 2A 和 2B&#xff08;大气边界层实验&#xff09;数据包括亚马逊盆地与其大气边界层之间各种气溶胶和气体交换率的估计值&#xff0c;以及这些气溶胶和气体在边界层和自由对流层之间的移动过程。前言 – 人工智能教程…

HTML静态网页成品作业(HTML+CSS)——非遗昆曲介绍设计制作(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

如何查找、恢复误清空的 Android 回收站?

“我的回收站里有一些照片。当我点击“恢复”时&#xff0c;没有任何反应。我可以将我的 Android 手机插入我的电脑。这样我就可以手动恢复它们。但我在 Android 上找不到 bin 文件夹。我还可以做些什么&#xff1f;” 随着 Android 手机上的文件数量不断增加&#xff0c;了解…

SimplifyRODataLoads - 优化阅读笔记

// 只支持 X86 static cl::opt<bool> SimplifyRODataLoads("simplify-rodata-loads",cl::desc("通过用相应节中找到的常数替换内存操作数&#xff0c;简化来自只读节的加载"),cl::cat(BoltOptCategory));测试用例&#xff1a; ./build4/bin/llvm-li…

【汇编】#3 8086与数据有关的寻址方式

文章目录 操作码与操作数1. 8086处理器的与数据有关的寻址方式1.1 立即数寻址方式1.2 寄存器寻址方式 2. 有效&#xff08;偏移&#xff09;地址&#xff08;effective address&#xff0c;EA&#xff09;与缺省段寄存器选择tips:段跨越前缀2.1 直接寻址tips:直接寻址与立即寻址…

什么是农业气象站?——气象科普

农业气象站&#xff0c;也被称为田间气象站或农业小气候仪&#xff0c;是一款综合的物联网农业气象参数观测系统。它能够实时、准确、有针对性地监测农田区域内的多种气象参数&#xff0c;包括温湿度、光照、二氧化碳浓度、大气压、雨量、土壤温湿度、风速风向等。 农业气象站…

【MATLAB 】 EMD信号分解+FFT傅里叶频谱变换组合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 展示出图效果 1 EMD信号分解算法 EMD 分解又叫经验模态分解&#xff0c;英文全称为 Empirical Mode Decomposition。 EMD 是一种信号分解方法&#xff0c;它将一个信号分解成有限个本质模态函数 (EMD) 的和&#xff0c…

【Linux】文件缓冲区|理解文件系统

目录 预备知识 观察现象 第一&#xff1a;携带\n&#xff0c;不使用fork()&#xff0c;打印到显示器 第二&#xff1a;携带\n&#xff0c;使用fork()&#xff0c;打印到显示器 第三&#xff1a;携带\n&#xff0c;使用fork()&#xff0c;打印到文件里 第四&#xff1a;不携…

【R语言实战】——金融时序分布拟合

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…

常见的限流算法- python版本

shigen坚持更新文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 个人IP&#xff1a;shigen 在系统的稳定性设计中&#xff0c;需要考虑到的就是限流&#xff0c;避免高并发…

DC/DC高压模块直流升压可调稳压输出升压变换器5V12V24V48V转50V110V150V130V200V250V300V450V500V600V800V

特点 效率高达 80%以上1*2英寸标准封装单电压输出价格低稳压输出工作温度: -40℃~85℃阻燃封装&#xff0c;满足UL94-V0 要求温度特性好可直接焊在PCB 上 应用 HRB W2~40W 系列模块电源是一种DC-DC升压变换器。该模块电源的输入电压分为&#xff1a;4.5~9V、9~18V、及18~36V、…

容量治理三板斧:扩容、限流与降级

前言 随着现代软件系统日益复杂和用户规模的不断增长&#xff0c;分布式架构成为了保持系统高可用性与高性能的标准解决方案。然而&#xff0c;随之而来的是对系统容量治理的新挑战。在这样的背景下&#xff0c;容量治理成为了分布式系统设计和运维中不可或缺的一环。要确保系…

【PyTorch][chapter 22][李宏毅深度学习]【无监督学习][ WGAN]【理论一】

简介&#xff1a; 2014年Ian Goodfellow提出以来&#xff0c;GAN就存在着训练困难、生成器和判别器的loss无法指示训练进程、生成样本缺乏多样性等问题。从那时起&#xff0c;很多论文都在尝试解决&#xff0c;但是效果不尽人意&#xff0c;比如最有名的一个改进DCGAN依靠的是对…

AI毕业设计生成器(基于AI大模型技术开发)支持Java和Python

这是一个辅助生成计算机毕业设计的工具&#xff0c;可以自动完成毕业设计的源码。它基于几百个github上面开源的java和python项目&#xff0c;运用tengsorflow技术&#xff0c;训练出了AI大模型。基本实现了计算机毕业设计生成器&#xff0c;能够初步生成Java或python基本源码。…

嵌入式驱动学习第三周——container_of()宏

前言 Linux内核编程中&#xff0c;会经常看见一个宏函数container_of&#xff0c;那么这究竟是什么呢&#xff0c;本篇博客记录学习container_of的过程。 嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程&#xff0c;未来预计四个月将高强度更新本专栏&#xff0c;喜欢的可…

1688平台最关键的接口接入实例|获得1688商品详情| 按关键字搜索商品| 按图搜索1688商品(拍立淘)| 获得淘口令真实url

参数说明 通用参数说明 version:API版本key:调用key,测试key:test_api_keyapi_name:API类型[item_get,item_search]cache:[yes,no]默认yes&#xff0c;将调用缓存的数据&#xff0c;速度比较快result_type:[json,xml,serialize,var_export]返回数据格式&#xff0c;默认为jsonl…

【JavaScript 漫游】【034】AJAX

文章简介 本篇文章为【JavaScript 漫游】专栏的第 034 篇文章&#xff0c;对浏览器模型的 XMLHttpRequest 对象&#xff08;AJAX&#xff09;的知识点进行了总结。 XMLHttpRequest 对象概述 浏览器与服务器之间&#xff0c;采用 HTTP 协议通信。用户在浏览器地址栏键入一个网…

Cisco Packet Tracer模拟器实现交换机的vlan配置、生成树技术及模拟器路由设置

1. 内容 1.对交换机进行Vlan配置&#xff0c;完成交换机Vlan的划分、交换机间相同Vlan的通信以及三层交换机的配置。 2.实现交换机的生成树技术&#xff0c;在两个交换机上配置生成树协议&#xff0c;实现Vlan的负载均衡 3.对路由器进行设置&#xff0c;包括模拟器中路由器的…

案例分析篇07:数据库设计相关28个考点(23~28)(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

基于yolov5的草莓成熟度检测系统,可进行图像目标检测,也可进行视屏和摄像检测(pytorch框架)【python源码+UI界面+功能源码详解】

功能演示&#xff1a; 基于yolov5的草莓成熟度检测系统&#xff0c;系统既能够实现图像检测&#xff0c;也可以进行视屏和摄像实时检测_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于yolov5的草莓成熟度系统是在pytorch框架下实现的&#xff0c;这是一个完整的项目…