当前位置: 首页 > news >正文

yolov5+bytetrack算法在华为NPU上进行端到端开发

        自从毕业后开始进入了华为曻腾生态圈,现在越来越多的公司开始走国产化路线了,现在国内做AI芯片的厂商比如:寒武纪、地平线等,虽然我了解的不多,但是相对于瑞芯微这样的AI开发板来说,华为曻腾的生态比瑞芯微好太多了,参考文档非常多,学习资料也有很多,也容易上手开发。

华为曻腾官网:昇腾AI应用案例-昇腾社区 (hiascend.com)

        直接步入正题,现在的目标检测已经很成熟了,所以越来越多的公司会用到基于检测的跟踪算法,这样不仅起到了单一检测功能,还有跟踪目标或者计数的功能;

        现在应用较广泛的目标检测算法从最开始的yolov5一直到现在的yolov8,虽然只是简单的看了一下算法的原理,整体来说yolo的更新还是针对神经网络在GPU上的优化加速,而对比曻腾NPU,yolov5的速度还是在其他yolo算法中速度最快的一个;

        目标跟踪算法以前是sort+yolo,deepsort+yolo,bytetrack,fairmot等算法,本章主要介绍如何利用华为的ACL语言+ffmpeg推流进行整个业务的开发流程,大家可以借鉴下面的开发代码,首先你要具备基本的ACL语言知识,以及yolov5的后处理逻辑,跟踪方面直接借鉴开源作者的卡尔曼滤波进行预测更新即可:参考主函数代码如下:

//1.先测试yolov5_nms可以泡桐?
//使用dvpp+aipp编解码再使用opencv进行#include<iostream>#include"acl/acl.h"
#include "opencv2/opencv.hpp"
#include "opencv2/imgproc/types_c.h"
#include "acllite/AclLiteUtils.h"
#include "acllite/AclLiteError.h"
#include "acllite/AclLiteResource.h"
#include "acllite/AclLiteModel.h"
#include "acllite/AclLiteImageProc.h"
#include "AclLiteVideoProc.h"
#include "AclLiteVideoCapBase.h"
#include "BYTETracker.h"
#include <chrono>
extern"C" {#include <libavutil/mathematics.h>#include <libavutil/time.h>#include "libavcodec/avcodec.h"#include "libavformat/avformat.h"#include "libswscale/swscale.h"#include "libavutil/imgutils.h"#include "libavutil/opt.h"
};
using namespace std;
using namespace cv;
typedef struct box {float x;float y;float w;float h;float score;size_t classIndex;size_t index; // index of output buffer
} box;
namespace{int a  = 0;
}
int main()
{//1.定义初始化变量dvpp\model\acl\rtsp解码接口capAclLiteResource aclDev;aclrtRunMode g_runMode_;AclLiteVideoProc* cap_;AclLiteImageProc g_dvpp_;AclLiteModel g_model_;string streamName_;streamName_ = "rtsp://admin:ascend666@10.1.16.108/LiveMedia/ch1/Media1";//ffmpeg初始化AVFormatContext* g_fmtCtx;AVCodecContext* g_codecCtx;AVStream* g_avStream;AVCodec* g_codec;AVPacket* g_pkt;AVFrame* g_yuvFrame;uint8_t* g_yuvBuf;AVFrame* g_rgbFrame;uint8_t* g_brgBuf;int g_yuvSize;int g_rgbSize;struct SwsContext* g_imgCtx;
//参数初始化
//rtsp初始化g_avStream = NULL;g_codec = NULL;g_codecCtx = NULL;g_fmtCtx = NULL;g_pkt  = NULL;g_imgCtx = NULL;g_yuvSize = 0;g_rgbSize = 0;int picWidth = 416;int picHeight = 416;string rtsp_url = "rtsp://192.168.3.38:8554/stream";int channelId = 0;string g_outFile = rtsp_url + to_string(channelId);
//rtsp初始化avformat_network_init();if (avformat_alloc_output_context2(&g_fmtCtx, NULL, g_avFormat.c_str(), g_outFile.c_str()) < 0) {ACLLITE_LOG_ERROR("Cannot alloc output file context");return ACLLITE_ERROR;}av_opt_set(g_fmtCtx->priv_data, "rtsp_transport", "tcp", 0);av_opt_set(g_fmtCtx->priv_data, "tune", "zerolatency", 0);av_opt_set(g_fmtCtx->priv_data, "preset", "superfast", 0);//获取编码器的ID返回一个编码器g_codec = avcodec_find_encoder(AV_CODEC_ID_H264);if (g_codec == NULL) {ACLLITE_LOG_ERROR("Cannot find any endcoder");return ACLLITE_ERROR;}g_codecCtx = avcodec_alloc_context3(g_codec);if (g_codecCtx == NULL) {ACLLITE_LOG_ERROR("Cannot alloc context");return ACLLITE_ERROR;}//创建流g_avStream = avformat_new_stream(g_fmtCtx, g_codec);if (g_avStream == NULL) {ACLLITE_LOG_ERROR("failed create new video stream");return ACLLITE_ERROR;}//设置帧率g_avStream->time_base = AVRational{1, g_frameRate};//设置编码参数AVCodecParameters* param = g_fmtCtx->streams[g_avStream->index]->codecpar;param->codec_type = AVMEDIA_TYPE_VIDEO;param->width = picWidth;param->height = picHeight;avcodec_parameters_to_context(g_codecCtx, param);//参数绑定设置g_codecCtx->pix_fmt = AV_PIX_FMT_NV12;g_codecCtx->time_base = AVRational{1, g_frameRate};g_codecCtx->bit_rate = g_bitRate;g_codecCtx->gop_size = g_gopSize;g_codecCtx->max_b_frames = 0;if (g_codecCtx->codec_id == AV_CODEC_ID_H264) {g_codecCtx->qmin = 10;g_codecCtx->qmax = 51;g_codecCtx->qcompress = (float)0.6;}if (g_codecCtx->codec_id == AV_CODEC_ID_MPEG1VIDEO)g_codecCtx->mb_decision = 2;//初始化codeif (avcodec_open2(g_codecCtx, g_codec, NULL) < 0) {ACLLITE_LOG_ERROR("Open encoder failed");return ACLLITE_ERROR;}//g_codecCtx参数传递给codecparavcodec_parameters_from_context(g_avStream->codecpar, g_codecCtx);//指定输出数据的形式av_dump_format(g_fmtCtx, 0, g_outFile.c_str(), 1);//写文件头int ret1 = avformat_write_header(g_fmtCtx, NULL);if (ret1 != AVSTREAM_INIT_IN_WRITE_HEADER) {ACLLITE_LOG_ERROR("Write file header fail");return ACLLITE_ERROR;}g_pkt = av_packet_alloc();//传输数据初始化g_rgbFrame = av_frame_alloc();g_yuvFrame = av_frame_alloc();g_rgbFrame->width = g_codecCtx->width;g_yuvFrame->width = g_codecCtx->width;g_rgbFrame->height = g_codecCtx->height;g_yuvFrame->height = g_codecCtx->height;g_rgbFrame->format = AV_PIX_FMT_BGR24;g_yuvFrame->format = g_codecCtx->pix_fmt;g_rgbSize = av_image_get_buffer_size(AV_PIX_FMT_BGR24, g_codecCtx->width, g_codecCtx->height, 1);g_yuvSize = av_image_get_buffer_size(g_codecCtx->pix_fmt, g_codecCtx->width, g_codecCtx->height, 1);g_brgBuf = (uint8_t*)av_malloc(g_rgbSize);g_yuvBuf = (uint8_t*)av_malloc(g_yuvSize);//内存分配int ret2 = av_image_fill_arrays(g_rgbFrame->data, g_rgbFrame->linesize,g_brgBuf, AV_PIX_FMT_BGR24,g_codecCtx->width, g_codecCtx->height, 1);ret2 = av_image_fill_arrays(g_yuvFrame->data, g_yuvFrame->linesize,g_yuvBuf, g_codecCtx->pix_fmt,g_codecCtx->width, g_codecCtx->height, 1);g_imgCtx = sws_getContext(g_codecCtx->width, g_codecCtx->height, AV_PIX_FMT_BGR24,g_codecCtx->width, g_codecCtx->height, g_codecCtx->pix_fmt,SWS_BILINEAR, NULL, NULL, NULL);//2.类变量初始化AclLiteError ret = aclDev.Init();if (ret) {ACLLITE_LOG_ERROR("Init resource failed, error %d", ret);return ACLLITE_ERROR;}if (ACLLITE_OK != OpenVideoCapture()) {return ACLLITE_ERROR;}ret = g_dvpp_.Init();if (ret) {ACLLITE_LOG_ERROR("Dvpp init failed, error %d", ret);return ACLLITE_ERROR;}cap_ = nullptr;ret = g_model_.Init();if (ret) {ACLLITE_LOG_ERROR("Model init failed, error %d", ret);return ACLLITE_ERROR;}//3.创建模型img_info的输入以及数据拷贝操作g_runMode_ = g_aclDev_.GetRunMode();const float imageInfo[4] = {(float)g_modelInputWidth, (float)g_modelInputHeight,(float)g_modelInputWidth, (float)g_modelInputHeight};g_imageInfoSize_ = sizeof(imageInfo);g_imageInfoBuf_ = CopyDataToDevice((void *)imageInfo, g_imageInfoSize_,g_runMode_, MEMORY_DEVICE);if (g_imageInfoBuf_ == nullptr) {ACLLITE_LOG_ERROR("Copy image info to device failed");return ACLLITE_ERROR;}//4.获取视频源cap_ = new AclLiteVideoProc(streamName_);//5.视频流解码以及dvpp硬件-resizeint i =0;while(true){//6.获取解码图片(在device侧的YUV420图片)(存放在ImageDta结构体中)
//         struct ImageData {
//     acldvppPixelFormat format;
//     uint32_t width = 0;
//     uint32_t height = 0;
//     uint32_t alignWidth = 0;
//     uint32_t alignHeight = 0;
//     uint32_t size = 0;
//     std::shared_ptr<uint8_t> data = nullptr;
// };
i++;ImageData image;ret = cap_->Read(image);ImageData resizedImage;ret = g_dvpp_.Resize(resizedImage, image, 640, 640);//7.创建模型输入进行模型推理ret = g_model_.CreateInput(resizedImage.data.get(), resizedImage.size,g_imageInfoBuf_, g_imageInfoSize_);if (ret != ACLLITE_OK) {ACLLITE_LOG_ERROR("Create mode input dataset failed, error:%d", ret);return ACLLITE_ERROR;}std::vector<InferenceOutput> inferenceOutput;ret = g_model_.Execute(inferenceOutput);if (ret != ACLLITE_OK) {g_model_.DestroyInput();ACLLITE_LOG_ERROR("Execute model inference failed, error: %d", ret);return ACLLITE_ERROR;}g_model_.DestroyInput();//8.将YUV图像转换为opencv图像ImageData yuvImage;ret = CopyImageToLocal(yuvImage, image, g_runMode_);if (ret == ACLLITE_ERROR) {ACLLITE_LOG_ERROR("Copy image to host failed");return ACLLITE_ERROR;}cv::Mat yuvimg(yuvImage.height * 3 / 2, yuvImage.width, CV_8UC1, yuvImage.data.get());cv::Mat origImage;cv::cvtColor(yuvimg, origImage, CV_YUV2BGR_NV12);//模型后处理(根据目标跟踪需要的输入进行获取xywh)float* detectData = (float *)inferenceOutput[0].data.get();float* boxNum = (float *)inferenceOutput[1].data.get();uint32_t totalBox = boxNum[0];//获取(x,y,w,h) std::vector<Object> obj;float widthScale = (float)(origImage.cols) / 640.0;float heightScale = (float)(origImage.rows) / 640.0;vector<box> detectResults;for (uint32_t i = 0; i < totalBox; i++) {box boundBox;boundBox.score = float(detectData[totalBox * SCORE + i]);boundBox.x = detectData[totalBox * TOPLEFTX + i] * widthScale;boundBox.y = detectData[totalBox * TOPLEFTY + i] * heightScale;boundBox.w = detectData[totalBox * BOTTOMRIGHTX + i] * widthScale;boundBox.h = detectData[totalBox * BOTTOMRIGHTY + i] * heightScale;boundBox.classIndex = (uint32_t)detectData[totalBox * LABEL + i];detectResults.emplace_back(boundBox);}for (size_t i = 0; i < detectResults.size(); i++){if (res[i].classId != class_id){ continue; }obj[i].label = detectResults[i].classIndex;obj[i].rect.x = detectResults[i].x;obj[i].rect.y = detectResults[i].y;obj[i].rect.height = detectResults[i].h;obj[i].rect.width = detectResults[i].w;obj[i].prob = detectResults[i].score;}std::vector<STrack> output_stracks = tracker.update(obj);for (size_t i = 0; i < output_stracks.size(); i++){std::vector<float> tlwh = output_stracks[i].tlwh;cv::Scalar __color = tracker.get_color(output_stracks[i].track_id);cv::putText(origImage, std::to_string(output_stracks[i].track_id), cv::Point(tlwh[0], tlwh[1] - 10), cv::FONT_ITALIC, 0.75, __color, 2);cv::rectangle(origImage, cv::Rect(tlwh[0], tlwh[1], tlwh[2], tlwh[3]), __color, 2);    }//跟踪完成后写推流memcpy(g_brgBuf, origImage.data, g_rgbSize);sws_scale(g_imgCtx,g_rgbFrame->data,g_rgbFrame->linesize,0,g_codecCtx->height,g_yuvFrame->data,g_yuvFrame->linesize);g_yuvFrame->pts = i;if (avcodec_send_frame(g_codecCtx, g_yuvFrame) >= 0) {// cout<<a<<endl;while (avcodec_receive_packet(g_codecCtx, g_pkt) >= 0) {cout<<"avcodec_receive_packet"<<endl;g_pkt->stream_index = g_avStream->index;av_packet_rescale_ts(g_pkt, g_codecCtx->time_base, g_avStream->time_base);g_pkt->pos = -1;int ret = av_interleaved_write_frame(g_fmtCtx, g_pkt);if (ret < 0) {ACLLITE_LOG_ERROR("error is: %d", ret);}}}}av_packet_free(&g_pkt);avcodec_close(g_codecCtx);if (g_fmtCtx) {avio_close(g_fmtCtx->pb);avformat_free_context(g_fmtCtx);}if (cap_ != nullptr) {cout << "cap is not open" << endl;cap_->Close();delete cap_;}dvpp_.DestroyResource();return 0;
}

跟踪器方面的函数,可以搜索开源代码yolov5-bytetrack-main.cpp截取内部跟踪部分,检测部分使用华为ACL编写的推理代码进行检测;

可以加入学习讨论:1076799627

相关文章:

yolov5+bytetrack算法在华为NPU上进行端到端开发

自从毕业后开始进入了华为曻腾生态圈&#xff0c;现在越来越多的公司开始走国产化路线了&#xff0c;现在国内做AI芯片的厂商比如&#xff1a;寒武纪、地平线等&#xff0c;虽然我了解的不多&#xff0c;但是相对于瑞芯微这样的AI开发板来说&#xff0c;华为曻腾的生态比瑞芯微…...

【Java-LangChain:使用 ChatGPT API 搭建系统-1】简介

简介 欢迎来到课程《使用 ChatGPT API 搭建系统》 , 旨在指导开发者如何基于 ChatGPT 搭建完整的智能问答系统。 使用 ChatGPT 不仅仅是一个单一的 Prompt 或单一的模型调用&#xff0c;本课程将分享使用 LLM 构建复杂应用的最佳实践。 本课程以构建客服助手为例&#xff0c…...

BJT晶体管

BJT晶体管也叫双极结型三极管&#xff0c;主要有PNP、NPN型两种&#xff0c;符号如下&#xff1a; 中间的是基极&#xff08;最薄&#xff0c;用于控制&#xff09;&#xff0c;带箭头的是发射极&#xff08;自由电子浓度高&#xff09;&#xff0c;剩下的就是集电极&#xff0…...

ORACLE中SQL运算符的优先级

SQL运算符优先级: 注&#xff1a; 1、可以使用括号改变优先级顺序 2、可以看出OR的优先级最低&#xff0c;算术运算符的优先级最高 另&#xff1a;操作符优先级 * / - 1、乘除的优先级高于加减&#xff1b; 2、同一优先级运算符从左向右执行&#xff1b; 3、括号内的…...

springboot和vue:十一、Axios网络请求的安装引入与使用、跨域问题解决(CORS)

Axios简介与安装 Axios是一个基于promise的网络请求库&#xff0c;作用于node.js和浏览器中Axios在浏览器端使用XMLHttpRequests发送网络请求&#xff0c;并自动完成json数据的转换安装&#xff1a;npm install axios官方文档&#xff1a;https://www.axios-http.cn/ Axios基…...

外汇天眼:真实记录,投资者在盗版MT4平台SCE Group上做交易的经历!

外汇市场是全球最大的金融市场&#xff0c;比起其他市场有着更多天然的优势&#xff0c;但也因为资讯的不对等&#xff0c;导致很多人上当受骗。而在外汇市场上最常见的骗局之一&#xff0c;就是黑平台使用盗版MT4/5交易软件&#xff0c;因为截至目前MT4/5仍是外汇市场交易使用…...

FFmpeg 命令:从入门到精通 | ffmpeg 命令视频录制

FFmpeg 命令&#xff1a;从入门到精通 | ffmpeg 命令视频录制 FFmpeg 命令&#xff1a;从入门到精通 | ffmpeg 命令视频录制安装软件&#xff1a;Screen Capturer Recorder查看可用设备名字音视频录制录制视频&#xff08;默认参数&#xff09;录制声音&#xff08;默认参数&am…...

html 笔记:CSS

1 什么是CSS CSS 指层叠样式表 (Cascading Style Sheets) 样式定义如何显示 HTML 元素样式通常存储在样式表中 1.1 css的语法格式 1.1.1 选择器种类 HTML选择器&#xff1a; 重新定义HTML的某种标签的显示格式id选择器 对于HTML文档中的某个标签&#xff0c;定义它的显示格式…...

【LeetCode - 每日一题】901. 股票价格跨度(23.10.07)

901. 股票价格跨度 题意 设计一个数据结构返回股票当日价格的跨度&#xff08;必须是当日开始的&#xff09; 解法 暴力 优化 一开始没理解题意&#xff0c;以为是求第 i 天及以前&#xff0c;小于等于 prices[i] 的最大连续子串的长度。后来才发现&#xff0c;这个最大连…...

第二证券:突发!A股T+0?刚刚,紧急回应!

沪深生意所急迫回应 6日&#xff0c;商场传出一个消息&#xff0c;传延伸A股生意时刻和部分票可日内T0一次。一个版本是提早至9点&#xff0c;然后下午延伸至15&#xff1a;30&#xff0c;另一个版本是上午推延至12点&#xff0c;下午延伸至16&#xff1a;00。 7日&#xff0…...

ShardingSphereJDBC5.4.0支持Nacos配置(SpringCloud版)

背景 在ShardingSphere在5.3.0版本之前&#xff0c;我们可以通过依赖shardingsphere-jdbc-core-spring-boot-starter模块&#xff0c;在application.yml文件里配置数据库连接信息。再结合spring-cloud-starter-alibaba-nacos-config&#xff0c;在项目启动时&#xff0c;从Nac…...

基于SSM的学院学生论坛系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…...

Unity记录5.4-地图-带种子的柏林噪声

文章首发见博客&#xff1a;https://mwhls.top/4850.html。 无图/格式错误/后续更新请见首发页。 更多更新请到mwhls.top查看 欢迎留言提问或批评建议&#xff0c;私信不回。 汇总&#xff1a;Unity 记录 现在卡在了跨地图洞穴生成&#xff0c;没想到什么好的方法能够像地面一样…...

阅读论文:Label-Free Liver Tumor Segmentation

论文标题&#xff1a;Label-Free Liver Tumor Segmentation 翻译&#xff1a;无标记的肝肿瘤分割 摘要 论文的目的&#xff1a;肿瘤合成&#xff0c;通过使用合成数据来改进医学图像分析和AI在肝脏肿瘤检测方面的性能 我们的主要贡献是合成了一种肿瘤生成器&#xff0c;它提…...

leetcode64 最小路径和

题目 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 示例 输入&#xff1a;grid [[1,3,1],[1,5,1],[4,2,1]] 输出&#xff1a;7 解释&a…...

金盘图书馆微信管理后台信息泄露漏洞 复现

金盘图书馆微信管理后台信息泄露漏洞 复现 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果…...

nginx实现负载均衡(三)

之前说过大部分我们用到的配置都是在http模块中配置的&#xff0c;这里要实现的负载均衡也是一样的&#xff0c;要在http模块中的http全局块中指定&#xff0c;这里我们先给出一个例子 demo #user nobody; worker_processes 1;#error_log logs/error.log; #error_log log…...

Android---深入理解ClassLoader的加载机制

目录 Java 中的 ClassLoader 1. APPClassLoader 系统类加载器 2. ExtClassLoader 扩展类加载器 3. BootstrapClassLoader 启动类加载器 双亲委派模式(Parents Delegation Model) Android 中的 ClassLoader 1. PathClassLoader 2. DexClassLoader 总结 一个完整的 Java…...

超自动化加速落地,助力运营效率和用户体验显著提升|爱分析报告

RPA、iPaaS、AI、低代码、BPM、流程挖掘等在帮助企业实现自动化的同时&#xff0c;也在构建一座座“自动化烟囱”。自动化工具尚未融为一体&#xff0c;协同价值没有得到释放。Gartner于2019年提出超自动化&#xff08;Hyperautomation&#xff09;概念&#xff0c;主要从技术组…...

Linux posix_spawn和fork的区别

posix_spawn和fork都是用于在Linux中创建新进程的函数&#xff0c;但它们的工作方式有所不同。posix_spawn它的工作方式类似于fork()后跟exec()。 fork&#xff1a;fork函数创建一个新的进程&#xff0c;该进程是调用进程的一个副本。这意味着除了必要的启动资源外&#xff0c;…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

API网关Kong的鉴权与限流:高并发场景下的核心实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中&#xff0c;API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关&#xff0c;Kong凭借其插件化架构…...

spring Security对RBAC及其ABAC的支持使用

RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型&#xff0c;它将权限分配给角色&#xff0c;再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...

【深度学习新浪潮】什么是credit assignment problem?

Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...