SpringBoot 使用海康 SDK 和 flv.js 显示监控画面
由于工作需要将海康监控的画面在网页上显示,经过查找资料最终实现了。过程中发现网上的资料都不怎么完整,没办法直接用,所以记录一下,也帮后人避避坑。我把核心代码放到下面,完整工程放到码云上。完整工程带有前端页面,简单调整后即可运行。需要的下载参考:hikDemo。
海康
有以下几个关键点:
- flv.js 需要 flv 格式的数据,并且最先接收到的必须是 flv 头,否则无法继续
- VideoDemo.getESRealStreamData 方法中回调返回的是 H264 格式数据
- 回调数据只需要处理 I 帧和 P 帧, I 帧大概接 49 帧 P 帧,需要将 I 帧和下一帧 I 帧前的 P 帧一块打包给 FFmpegFrameRecorder 解析
下方代码是在官方 Demo 的基础上删减修改而来。
import com.NetSDKDemo.ClientDemo;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;
import org.springframework.stereotype.Controller;import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;@ServerEndpoint("/live")
@Controller
public class Websocket {/*** 与某个客户端的连接会话,需要通过它来给客户端发送数据*/public static Session session;private static FFmpegFrameRecorder recorder;private static ByteArrayOutputStream outputStream;private static boolean initialized = false;/*** 连接成功** @param session*/@OnOpenpublic void onOpen(Session session) throws IOException {Websocket.session = session; // 保存客户端连接的Session对象outputStream = new ByteArrayOutputStream();recorder = new FFmpegFrameRecorder(outputStream, 0);ClientDemo.start();}/*** 连接关闭** @param session*/@OnClosepublic void onClose(Session session) {}/*** 接收到消息** @param text*/@OnMessagepublic String onMsg(String text) throws IOException {System.out.println("连接成功");return null;}public static void sendBuffer(byte[] bytes) {try {// 使用ByteArrayInputStream作为输入流ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);// 创建FFmpegFrameGrabberFFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputStream);grabber.setFormat("h264");grabber.start();if (!initialized) {initialized = true;recorder = new FFmpegFrameRecorder(outputStream, 0);recorder.setVideoCodec(grabber.getVideoCodec());recorder.setFormat("flv");recorder.setFrameRate(grabber.getFrameRate());recorder.setGopSize((int) (grabber.getFrameRate() * 2));recorder.setVideoBitrate(grabber.getVideoBitrate());recorder.setImageWidth(grabber.getImageWidth());recorder.setImageHeight(grabber.getImageHeight());recorder.start();}Frame frame;while ((frame = grabber.grab()) != null) {recorder.record(frame);}grabber.stop();grabber.release();byte[] flvData = outputStream.toByteArray();System.out.println("flvData size: " + flvData.length);outputStream.reset();synchronized (session) {session.getBasicRemote().sendBinary(ByteBuffer.wrap(flvData));}} catch (IOException e) {throw new RuntimeException(e);}}
}
import Common.osSelect;
import com.sun.jna.Native;
import com.sun.jna.Pointer;public class ClientDemo {static HCNetSDK hCNetSDK = null;static int lUserID = -1;// 用户句柄static int lPlayHandle = -1; // 预览句柄static FExceptionCallBack_Imp fExceptionCallBack;static class FExceptionCallBack_Imp implements HCNetSDK.FExceptionCallBack {public void invoke(int dwType, int lUserID, int lHandle, Pointer pUser) {System.out.println("异常事件类型:" + dwType);}}/*** 动态库加载** @return*/private static boolean createSDKInstance() {if (hCNetSDK == null) {synchronized (HCNetSDK.class) {String strDllPath = "";try {if (osSelect.isWindows())// win系统加载库路径strDllPath = System.getProperty("user.dir") + "\\lib\\HCNetSDK.dll";else if (osSelect.isLinux())// Linux系统加载库路径strDllPath = System.getProperty("user.dir") + "/lib/libhcnetsdk.so";hCNetSDK = (HCNetSDK) Native.loadLibrary(strDllPath, HCNetSDK.class);} catch (Exception ex) {System.out.println("loadLibrary: " + strDllPath + " Error: " + ex.getMessage());return false;}}}return true;}public static void start() {if (hCNetSDK == null) {if (!createSDKInstance()) {System.out.println("Load SDK fail");return;}}// linux系统建议调用以下接口加载组件库if (osSelect.isLinux()) {HCNetSDK.BYTE_ARRAY ptrByteArray1 = new HCNetSDK.BYTE_ARRAY(256);HCNetSDK.BYTE_ARRAY ptrByteArray2 = new HCNetSDK.BYTE_ARRAY(256);// 这里是库的绝对路径,请根据实际情况修改,注意改路径必须有访问权限String strPath1 = System.getProperty("user.dir") + "/lib/libcrypto.so.1.1";String strPath2 = System.getProperty("user.dir") + "/lib/libssl.so.1.1";System.arraycopy(strPath1.getBytes(), 0, ptrByteArray1.byValue, 0, strPath1.length());ptrByteArray1.write();hCNetSDK.NET_DVR_SetSDKInitCfg(HCNetSDK.NET_SDK_INIT_CFG_LIBEAY_PATH, ptrByteArray1.getPointer());System.arraycopy(strPath2.getBytes(), 0, ptrByteArray2.byValue, 0, strPath2.length());ptrByteArray2.write();hCNetSDK.NET_DVR_SetSDKInitCfg(HCNetSDK.NET_SDK_INIT_CFG_SSLEAY_PATH, ptrByteArray2.getPointer());String strPathCom = System.getProperty("user.dir") + "/lib/";HCNetSDK.NET_DVR_LOCAL_SDK_PATH struComPath = new HCNetSDK.NET_DVR_LOCAL_SDK_PATH();System.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length());struComPath.write();hCNetSDK.NET_DVR_SetSDKInitCfg(HCNetSDK.NET_SDK_INIT_CFG_SDK_PATH, struComPath.getPointer());}// SDK初始化,一个程序只需要调用一次boolean initSuc = hCNetSDK.NET_DVR_Init();// 异常消息回调if (fExceptionCallBack == null) {fExceptionCallBack = new FExceptionCallBack_Imp();}Pointer pUser = null;if (!hCNetSDK.NET_DVR_SetExceptionCallBack_V30(0, 0, fExceptionCallBack, pUser)) {return;}System.out.println("设置异常消息回调成功");// 启动SDK写日志hCNetSDK.NET_DVR_SetLogToFile(3, "./sdkLog", false);// 设备登录lUserID = loginDevice("192.168.89.19", (short) 8000, "admin", "admin123");System.out.println("实时获取裸码流示例代码");lPlayHandle = VideoDemo.getESRealStreamData(lUserID, 35);}/*** 登录设备,支持 V40 和 V30 版本,功能一致。** @param ip 设备IP地址* @param port SDK端口,默认为设备的8000端口* @param user 设备用户名* @param psw 设备密码* @return 登录成功返回用户ID,失败返回-1*/public static int loginDevice(String ip, short port, String user, String psw) {// 创建设备登录信息和设备信息对象HCNetSDK.NET_DVR_USER_LOGIN_INFO loginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();HCNetSDK.NET_DVR_DEVICEINFO_V40 deviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();// 设置设备IP地址byte[] deviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN];byte[] ipBytes = ip.getBytes();System.arraycopy(ipBytes, 0, deviceAddress, 0, Math.min(ipBytes.length, deviceAddress.length));loginInfo.sDeviceAddress = deviceAddress;// 设置用户名和密码byte[] userName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN];byte[] password = psw.getBytes();System.arraycopy(user.getBytes(), 0, userName, 0, Math.min(user.length(), userName.length));System.arraycopy(password, 0, loginInfo.sPassword, 0, Math.min(password.length, loginInfo.sPassword.length));loginInfo.sUserName = userName;// 设置端口和登录模式loginInfo.wPort = port;loginInfo.bUseAsynLogin = false; // 同步登录loginInfo.byLoginMode = 0; // 使用SDK私有协议// 执行登录操作int userID = hCNetSDK.NET_DVR_Login_V40(loginInfo, deviceInfo);if (userID == -1) {System.err.println("登录失败,错误码为: " + hCNetSDK.NET_DVR_GetLastError());} else {System.out.println(ip + " 设备登录成功!");// 处理通道号逻辑int startDChan = deviceInfo.struDeviceV30.byStartDChan;System.out.println("预览起始通道号: " + startDChan);}return userID; // 返回登录结果}
}
import com.demo.impl.Websocket;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;import static com.NetSDKDemo.ClientDemo.hCNetSDK;/*** 视频取流预览,下载,抓图mok** @create 2022-03-30-9:48*/
public class VideoDemo {static fPlayEScallback fPlayescallback; // 裸码流回调函数static FileOutputStream outputStream;static IntByReference m_lPort = new IntByReference(-1);/*** 获取实时裸码流回调数据** @param userID 登录句柄* @param iChannelNo 通道号参数*/public static int getESRealStreamData(int userID, int iChannelNo) {if (userID == -1) {System.out.println("请先注册");return -1;}HCNetSDK.NET_DVR_PREVIEWINFO previewInfo = new HCNetSDK.NET_DVR_PREVIEWINFO();previewInfo.read();previewInfo.hPlayWnd = null; // 窗口句柄,从回调取流不显示一般设置为空previewInfo.lChannel = iChannelNo; // 通道号previewInfo.dwStreamType = 0; // 0-主码流,1-子码流,2-三码流,3-虚拟码流,以此类推previewInfo.dwLinkMode = 1; // 连接方式:0- TCP方式,1- UDP方式,2- 多播方式,3- RTP方式,4- RTP/RTSP,5- RTP/HTTP,6- HRUDP(可靠传输) ,7- RTSP/HTTPS,8- NPQpreviewInfo.bBlocked = 1; // 0- 非阻塞取流,1- 阻塞取流previewInfo.byProtoType = 0; // 应用层取流协议:0- 私有协议,1- RTSP协议previewInfo.write();// 开启预览int Handle = hCNetSDK.NET_DVR_RealPlay_V40(userID, previewInfo, null, null);if (Handle == -1) {int iErr = hCNetSDK.NET_DVR_GetLastError();System.err.println("取流失败" + iErr);return -1;}System.out.println("取流成功");// 设置裸码流回调函数if (fPlayescallback == null) {fPlayescallback = new fPlayEScallback();}if (!hCNetSDK.NET_DVR_SetESRealPlayCallBack(Handle, fPlayescallback, null)) {System.err.println("设置裸码流回调失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());}/*Boolean bStopSaveVideo = hCNetSDK.NET_DVR_StopSaveRealData(lPlay);if (bStopSaveVideo == false) {int iErr = hCNetSDK.NET_DVR_GetLastError();System.out.println("NET_DVR_StopSaveRealData failed" + iErr);return;}System.out.println("NET_DVR_StopSaveRealData suss");if (lPlay>=0) {if (hCNetSDK.NET_DVR_StopRealPlay(lPlay)){System.out.println("停止预览成功");return;}}*/return Handle;}static class fPlayEScallback implements HCNetSDK.FPlayESCallBack {private final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();private boolean start = false;public void invoke(int lPreviewHandle, HCNetSDK.NET_DVR_PACKET_INFO_EX pstruPackInfo, Pointer pUser) {pstruPackInfo.read();// 保存I帧和P帧数据// 从第一帧 I 帧开始解析if (pstruPackInfo.dwPacketType == 1) {start = true;}if (!start) {return;}if (pstruPackInfo.dwPacketType == 1 || pstruPackInfo.dwPacketType == 3) {// 如果是 I 帧,则将上一帧 I 帧到当前 I 帧的数据发送给 Websocket 解析if (pstruPackInfo.dwPacketType == 1) {byte[] byteArray = outputStream.toByteArray();outputStream.reset();if (byteArray.length > 0) {// 通过websocket发送long start = System.currentTimeMillis();Websocket.sendBuffer(byteArray);System.out.println("cost: "+(System.currentTimeMillis() - start));}}// System.out.println("dwPacketType:" + pstruPackInfo.dwPacketType// + ":wWidth:" + pstruPackInfo.wWidth// + ":wHeight:" + pstruPackInfo.wHeight// + ":包长度:" + pstruPackInfo.dwPacketSize// + ":帧号:" + pstruPackInfo.dwFrameNum);ByteBuffer buffers = pstruPackInfo.pPacketBuffer.getByteBuffer(0, pstruPackInfo.dwPacketSize);byte[] bytes = new byte[pstruPackInfo.dwPacketSize];buffers.rewind();buffers.get(bytes);try {outputStream.write(bytes);} catch (IOException e) {e.printStackTrace();}}}}
}
Websocket 建立连接后执行 onOpen 方法,保存 session ,初始化 FFmpegFrameRecorder,然后启动 ClientDemo。
ClientDemo 的代码基本上都是官方 Demo 的,修改的地方在 start 方法。 start 方法是在原 main 方法的基础上删除输入控制部分,直接调用 VideoDemo 的 getESRealStreamData 方法。
VideoDemo 原代码中有两个和实时预览相关的方法,上方代码使用的是 getESRealStreamData 方法,此方法返回的是 H264 编码的帧数据。帧的类型有多种,需要解析的是 I 帧和 P 帧。I 帧和 I 帧之间有多个 P 帧,将打印帧信息的代码注释后可以看到一般是 1 帧 I 帧紧跟 49 帧 P 帧。解析帧数据时必须从 I 帧开始,等到下一个 I 帧到来后将累计的数据交给 FFmpegFrameRecorder 解析,然后将封装成的 flv 格式数据发给前端的 flv.js 解析然后显示。
注意: I 帧和 P 帧 1:49 的比例不是固定的,必须等待下一帧 I 帧到来。
大华
大华的更简单,调用 Demo 中的 CommonWithCallBack.RealPlayByDataType 方法,确保
stIn.emDataType = EM_REAL_DATA_TYPE.EM_REAL_DATA_TYPE_FLV_STREAM,然后在 RealDataCallBack 的 invoke 方法的
if (dwDataType == (NetSDKLib.NET_DATA_CALL_BACK_VALUE + EM_REAL_DATA_TYPE.EM_REAL_DATA_TYPE_FLV_STREAM)) 块中将数据直接通过 Websocket 传给 flv.js 即可。
相关文章:
SpringBoot 使用海康 SDK 和 flv.js 显示监控画面
由于工作需要将海康监控的画面在网页上显示,经过查找资料最终实现了。过程中发现网上的资料都不怎么完整,没办法直接用,所以记录一下,也帮后人避避坑。我把核心代码放到下面,完整工程放到码云上。完整工程带有前端页面…...
分析一个深度学习项目并设计算法和用PyTorch实现的方法和步骤
算法设计分析 明确问题类型 分类问题:例如图像分类,像判断一张图片是猫还是狗。算法设计可能会采用经典的卷积神经网络(CNN)结构,如ResNet、VGG等。以ResNet为例,其通过残差连接解决了深层网络训练时梯度…...
大模型训练策略与架构优化实践指南
标题:大模型训练策略与架构优化实践指南 文章信息摘要: 该分析全面探讨了大语言模型训练、架构选择、部署维护等关键环节的优化策略。在训练方面,强调了pre-training、mid-training和post-training的不同定位与目标;在架构选择上…...
机器学习:支持向量机
支持向量机(Support Vector Machine)是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的广义线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。 假设两类数据可以被 H x : w T x…...
Spring Boot(6)解决ruoyi框架连续快速发送post请求时,弹出“数据正在处理,请勿重复提交”提醒的问题
一、整个前言 在基于 Ruoyi 框架进行系统开发的过程中,我们常常会遇到各种有趣且具有挑战性的问题。今天,我们就来深入探讨一个在实际开发中较为常见的问题:当连续快速发送 Post 请求时,前端会弹出 “数据正在处理,请…...
「 机器人 」扑翼飞行器控制的当前挑战与后续潜在研究方向
前言 在扑翼飞行器设计与控制方面,虽然已经取得了显著的进步,但在飞行时间、环境适应性、能量利用效率及模型精度等方面依旧存在亟待解决的挑战。以下内容概括了这些挑战和可能的改进路径。 1. 当前挑战 1.1 飞行时间短 (1)主要原因 能源存储有限(电池容量小)、驱动系…...
2023年版本IDEA复制项目并修改端口号和运行内存
2023年版本IDEA复制项目并修改端口号和运行内存 1 在idea中打开server面板,在server面板中选择需要复制的项目右键,点击弹出来的”复制配置…(Edit Configuration…)“。如果idea上没有server面板或者有server面板但没有springbo…...
Spring Boot中如何实现异步处理
在 Spring Boot 中实现异步处理可以通过使用 Async 注解和 EnableAsync 注解来实现。以下是如何配置和使用异步处理的步骤和示例代码。 步骤: 启用异步支持: 在 Spring Boot 配置类上使用 EnableAsync 注解启用异步处理。使用 Async 注解异步方法&…...
微信小程序怎么制作自己的小程序?手把手带你入门(适合新手小白观看)
对于初学者来说,制作一款微信小程序总感觉高大上,又害怕学不会。不过,今天我就用最简单、最有耐心的方式,一步一步给大家讲清楚!让你知道微信小程序的制作,居然可以这么轻松(希望你别吓跑啊!)。文中还加了实战经验&…...
Vuex 的核心概念:State, Mutations, Actions, Getters
Vuex 的核心概念:State, Mutations, Actions, Getters Vuex 是 Vue.js 的官方状态管理库,提供了集中式的状态管理机制。它的核心概念包括 State(状态)、Mutations(变更)、Actions(动作…...
Python OrderedDict 实现 Least Recently used(LRU)缓存
OrderedDict 实现 Least Recently used(LRU)缓存 引言正文 引言 LRU 缓存是一种缓存替换策略,当缓存空间不足时,会移除最久未使用的数据以腾出空间存放新的数据。LRU 缓存的特点: 有限容量:缓存拥有固定的…...
3.3 Go函数可变参数
可变参数(variadic parameters)是一种允许函数接受任意数量参数的机制。它在函数定义中使用 ...type 来声明参数类型,所有传递的参数会被收集为一个切片,函数内部可以像操作普通切片一样处理这些参数。 package mainimport "…...
EventBus事件总线的使用以及优缺点
EventBus EventBus (事件总线)是一种组件通信方法,基于发布/订阅模式,能够实现业务代码解耦,提高开发效率 发布/订阅模式 发布/订阅模式是一种设计模式,当一个对象的状态发生变化时,所有依赖…...
vim如何设置自动缩进
:set autoindent 设置自动缩进 :set noautoindent 取消自动缩进 (vim如何使设置自动缩进永久生效:vim如何使相关设置永久生效-CSDN博客)...
LongLoRA:高效扩展大语言模型上下文长度的微调方法
论文地址:https://arxiv.org/abs/2309.12307 github地址:https://github.com/dvlab-research/LongLoRA 1. 背景与挑战 大语言模型(LLMs)通常在预定义的上下文长度下进行训练,例如 LLaMA 的 2048 个 token 和 Llama2 的…...
NoSQL使用详解
文章目录 NoSQL使用详解一、引言二、NoSQL数据库的基本概念三、NoSQL数据库的分类及使用场景1. 键值存储数据库示例代码(Redis): 2. 文档存储数据库示例代码(MongoDB): 3. 列存储数据库4. 图数据库 四、使用…...
《FreqMamba: 从频率角度审视图像去雨问题》学习笔记
paper:FreqMamba: Viewing Mamba from a Frequency Perspective for Image Deraining GitHub:GitHub - aSleepyTree/FreqMamba 目录 摘要 1、介绍 2、相关工作 2.1 图像去雨 2.2 频率分析 2.3 状态空间模型 3、方法 3.1 动机 3.2 预备知识 3…...
试用ChatGPT开发一个大语言模型聊天App
参考官方文档,安装android studio https://developer.android.com/studio/install?hlzh-cn 参考这个添加permission权限: https://blog.csdn.net/qingye_love/article/details/14452863 参考下面链接完成Android Studio 给项目添加 gradle 依赖 ht…...
第30周:文献阅读
目录 摘要 Abstract 文献阅读 问题引入 方法论 堆叠集成模型 深度学习模型 创新点 堆叠模型 敏感性和不确定性分析 优化模型 实验研究 数据集 水质指数WQI的计算 模型的构建与训练 模型性能评估 敏感性和不确定性分析 结论 摘要 本文聚焦于利用深度学习算…...
The just sharing principle: advice for advice givers
原文 A while ago I wrote about how Only you know what’s best for your application. That’s because only you fully understand the context within which you are making technical decisions. Any advice need to filtered through that context in order to determi…...
【PVE】PVE部署磁盘阵列
什么是磁盘阵列? 磁盘阵列是一种存储技术,通过将多个物理磁盘组合成一个逻辑存储单元,提供数据冗余和/或性能提升。它的核心目的是提高数据的可靠性、可用性和访问速度。磁盘阵列可以由专用硬件或软件实现。 PVE部署磁盘阵列并加入虚拟机 …...
实战Linux Swap扩展分区
文章目录 定义命令格式案例注释 定义 Swap分区是Linux系统中的一种虚拟内存实现方式,它是磁盘上预留的专用区域。当系统的物理内存不足时,会将部分不活跃的数据从物理内存移动到Swap分区,从而释放更多可用内存空间。 命令格式 关闭Swap分区…...
FlinkSql使用中rank/dense_rank函数报错空指针
问题描述 在flink1.16(甚至以前的版本)中,使用rank()或者dense_rank()进行排序时,某些场景会导致报错空指针NPE(NullPointerError) 报错内容如下 该报错没有行号/错误位置,无法排查 现状 目前已经确认为bug,根据github上的PR日…...
AF3 AtomAttentionDecoder类源码解读
AlphaFold3的AtomAttentionDecoder类旨在从每个 token 的表示扩展到每个原子的表示,同时通过交叉注意力机制对原子及其对关系进行建模。这种设计可以在生物分子建模中捕获复杂的原子级别交互。 源代码: class AtomAttentionDecoder(nn.Module):"""AtomAtten…...
Ubuntu介绍、与centos的区别、基于VMware安装Ubuntu Server 22.04、配置远程连接、安装jdk+Tomcat
目录 ?编辑 一、Ubuntu22.04介绍 二、Ubuntu与Centos的区别 三、基于VMware安装Ubuntu Server 22.04 下载 VMware安装 1.创建新的虚拟机 2.选择类型配置 3.虚拟机硬件兼容性 4.安装客户机操作系统 5.选择客户机操作系统 6.命名虚拟机 7.处理器配置 8.虚拟机内存…...
一个基于Python+Appium的手机自动化项目~~
本项目通过PythonAppium实现了抖音手机店铺的自动化询价,可以直接输出excel,并带有详细的LOG输出。 1.excel输出效果: 2. LOG效果: 具体文件内容见GitCode: 项目首页 - douyingoods:一个基于Pythonappium的手机自动化项目,实现了…...
ubuntu 更新24LTS中断导致“系统出错且无法恢复,请联系系统管理员”
22LTS to 24LTS 更新过程中手jian把更新程序controlC导致的。 解决 目前企图完成更新来恢复,重启后有软件包冲突,sudo apt upgrade报冲突。无法进行。 将原来source.list重新 sudo dpkg --configure -a sudo apt install -f 这些都不管用。还是显示gno…...
(2025,DeepSeek-R1-Zero,DeepSeek-R1,两阶段强化学习,两阶段监督微调,蒸馏,冷启动数据)通过强化学习激励 LLM 的推理能力
DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning 目录 0. 摘要 1. 简介 1.1 贡献 1.2 评测结果总结 2. 方法 2.1 概述 2.2 DeepSeek-R1-Zero:基础模型上的强化学习 2.2.1. 强化学习算法 2.2.2. 奖励建模 2.2.3. 训练…...
k8s支持自定义field-selector spec.hostNetwork过滤
好久没写博客啦,年前写一个博客就算混过去啦😂 写一个小功能,对于 Pod,在没有 label 的情况下,支持 --field-selector spec.hostNetwork 查询 Pod 是否为 hostNetwork 类型,只为了熟悉 APIServer 是如何构…...
图漾相机搭配VisionPro使用简易教程
1.下载并安装VisionPro软件 请自行下载VisonPro软件。 VisionPro 9.0/9.5/9.6版本经测试,可正常打开图漾相机,建议使用图漾测试过的版本。 2.下载PercipioCameraForVisionPro软件包 使用浏览器下载:https://gitee.com/percipioxyz/camport3…...
