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

YOLOv11 NCNN安卓部署

YOLOv11 NCNN安卓部署

前言

yolov11 NCNN安卓部署

在这里插入图片描述

目前的帧率可以稳定在20帧左右,下面是这个项目的github地址:https://github.com/gaoxumustwin/ncnn-android-yolov11

上面的检测精度很低时因为这个模型只训练了5个epoch,使用3090训练一个epoch需要15分钟,后续会把训练50个epoch和100个epoch的权重更新到仓库中;

在之前复现了一个yolov8pose ncnn安卓部署的项目,在逛github的时候发现了一个关于yolov11的ncnn仓库,看了一下代码,发现作者是根据三木君大佬的代码进行改写,所以跟yolov8pose ncnn的非常的类似,所以就趁着刚改写的热乎劲,把yolov11 ncnn 安卓部署的代码改写出来;

环境配置

写这个blog的时候,安装时间为2024年11月29日

pip install ultralytics

安装后的ultralytics版本为:8.3.39,安装后的路径为:/root/miniconda3/lib/python3.8/site-packages/ultralytics

数据配置

yolov11的默认检测模型是使用COCO2017数据集进行训练,如果训练COCO数据集建议在autodl上进行训练,因为coco2017数据集在autodl上是公开数据集

如何查看autodl的共享数据

root@autodl-container-3686439328-168c7bd7:~# ls  /root/autodl-pub/
ADEChallengeData2016  COCO2017     DIV2K     ImageNet100                 VOCdevkit   mvtec_anomaly_detection.tar.xz
Aishell               CUB200-2011  DOTA      KITTI_Depth_Completion.tar  Vimeo-90k   nuScenes
BERT-Pretrain-Model   CULane       GOT10k    KITTI_Object                cifar-100
CASIAWebFace          CelebA       ImageNet  SemanticKITTI               cityscapes

数据制作

如果在实例中找到了自己需要的数据集,想使用共享数据,不能直接解压会出现只读错误,需要解压到自己的数据盘中(/root/autodl-tmp)

按照下面的流程操作即可

cd /root/autodl-tmp/
mkdir images
cd images
unzip /root/autodl-pub/COCO2017/train2017.zip
unzip /root/autodl-pub/COCO2017/val2017.zip

此时images下面只有 train2017 val2017

下载COCO2017的标签

cd /root/autodl-tmp
mkdir labels
cd labels
wget https://github.com/ultralytics/assets/releases/download/v0.0.0/coco2017labels.zip
unzip coco2017labels.zip
rm coco2017labels.zip
cd coco
rm -r annotations/
rm -r images/
rm -r LICENSE 
rm -r README.txt 
rm -r test-dev2017.txt 
rm -r train2017.txt 
rm -r val2017.txt 
mv labels/* ../
rm -r coco/  

此时labels下面只有 train2017 val2017

数据配置文件

复制COCO2017的配置文件到训练目录下

# workspace  root
mkdir train
cp /root/miniconda3/lib/python3.8/site-packages/ultralytics/cfg/datasets/coco.yaml ./train

修改coco.yaml中的path、train和val

# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: /root/autodl-tmp # dataset root dir
train: images/train2017 # train images (relative to 'path') 118287 images
val: images/val2017 # val images (relative to 'path') 5000 images

更换激活函数

YOLOv11默认使用的激活函数是SiLU,换成计算更高效的ReLU

更换激活函数后,原有的Pytorch模型需要重新训练再导出ONNX

修改/root/miniconda3/lib/python3.8/site-packages/ultralytics/nn/modules/conv.py中的第39行左右的default_act = nn.SiLU() 修改为 default_act = nn.ReLU()

训练

下载预训练权重

wget https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11n.pt

训练

训练脚本train.py

from ultralytics import YOLOmodel = YOLO('yolo11.yaml').load('yolo11n.pt')  # 加载预训练模型  还是有用的 有助于训练results = model.train(data='./coco.yaml', epochs=100, imgsz=640, batch=64, project='runs')

模型导出

模型结构修改

使用下面的方式修改模型结构不影响训练

修改/root/miniconda3/lib/python3.8/site-packages/ultralytics/nn/modules/head.py文件,修改Detect类的导出函数在其forward函数中加如下代码

if self.export or torch.onnx.is_in_onnx_export():results = self.forward_export(x)return tuple(results)

同时在Detect类新加上如下函数

def forward_export(self, x):results = []for i in range(self.nl):dfl = self.cv2[i](x[i]).permute(0, 2, 3, 1)cls = self.cv3[i](x[i]).sigmoid().permute(0, 2, 3, 1)results.append(torch.cat((dfl, cls), -1))return results

修改后的整体代码效果如下:

class Detect(nn.Module):"""YOLO Detect head for detection models."""dynamic = False  # force grid reconstructionexport = False  # export modeformat = None  # export formatend2end = False  # end2endmax_det = 300  # max_detshape = Noneanchors = torch.empty(0)  # initstrides = torch.empty(0)  # initlegacy = False  # backward compatibility for v3/v5/v8/v9 modelsdef __init__(self, nc=80, ch=()):"""Initializes the YOLO detection layer with specified number of classes and channels."""super().__init__()self.nc = nc  # number of classesself.nl = len(ch)  # number of detection layersself.reg_max = 16  # DFL channels (ch[0] // 16 to scale 4/8/12/16/20 for n/s/m/l/x)self.no = nc + self.reg_max * 4  # number of outputs per anchorself.stride = torch.zeros(self.nl)  # strides computed during buildc2, c3 = max((16, ch[0] // 4, self.reg_max * 4)), max(ch[0], min(self.nc, 100))  # channelsself.cv2 = nn.ModuleList(nn.Sequential(Conv(x, c2, 3), Conv(c2, c2, 3), nn.Conv2d(c2, 4 * self.reg_max, 1)) for x in ch)self.cv3 = (nn.ModuleList(nn.Sequential(Conv(x, c3, 3), Conv(c3, c3, 3), nn.Conv2d(c3, self.nc, 1)) for x in ch)if self.legacyelse nn.ModuleList(nn.Sequential(nn.Sequential(DWConv(x, x, 3), Conv(x, c3, 1)),nn.Sequential(DWConv(c3, c3, 3), Conv(c3, c3, 1)),nn.Conv2d(c3, self.nc, 1),)for x in ch))self.dfl = DFL(self.reg_max) if self.reg_max > 1 else nn.Identity()if self.end2end:self.one2one_cv2 = copy.deepcopy(self.cv2)self.one2one_cv3 = copy.deepcopy(self.cv3)def forward(self, x):"""Concatenates and returns predicted bounding boxes and class probabilities."""if self.export or torch.onnx.is_in_onnx_export():results = self.forward_export(x)return tuple(results)if self.end2end:return self.forward_end2end(x)for i in range(self.nl):x[i] = torch.cat((self.cv2[i](x[i]), self.cv3[i](x[i])), 1)if self.training:  # Training pathreturn xy = self._inference(x)return y if self.export else (y, x)def forward_export(self, x):results = []for i in range(self.nl):dfl = self.cv2[i](x[i]).permute(0, 2, 3, 1)cls = self.cv3[i](x[i]).sigmoid().permute(0, 2, 3, 1)results.append(torch.cat((dfl, cls), -1))return results

导出的名字修改

如果需要修改输出的名称则要去修改/root/miniconda3/lib/python3.8/site-packages/ultralytics/engine/exporter.py 的 export_onnx函数

导出

导出脚本export.py

from ultralytics import YOLO# load  model
model = YOLO('best.pt')# export onnx
model.export(format='onnx', opset=11, simplify=True, dynamic=False, imgsz=640)

NCNN转化和优化

$ ./onnx2ncnn best.onnx yolov11-relu.param yolov11-relu.bin$ ./ncnnoptimize yolov11-relu.param  yolov11-relu.bin  yolov11-relu-opt.param yolov11-relu-opt.bin 1
fuse_convolution_activation /model.0/conv/Conv /model.0/act/Relu
fuse_convolution_activation /model.1/conv/Conv /model.1/act/Relu
fuse_convolution_activation /model.2/cv1/conv/Conv /model.2/cv1/act/Relu
fuse_convolution_activation /model.2/m.0/cv1/conv/Conv /model.2/m.0/cv1/act/Relu
fuse_convolution_activation /model.2/m.0/cv2/conv/Conv /model.2/m.0/cv2/act/Relu
fuse_convolution_activation /model.2/cv2/conv/Conv /model.2/cv2/act/Relu
fuse_convolution_activation /model.3/conv/Conv /model.3/act/Relu
fuse_convolution_activation /model.4/cv1/conv/Conv /model.4/cv1/act/Relu
fuse_convolution_activation /model.4/m.0/cv1/conv/Conv /model.4/m.0/cv1/act/Relu
fuse_convolution_activation /model.4/m.0/cv2/conv/Conv /model.4/m.0/cv2/act/Relu
fuse_convolution_activation /model.4/cv2/conv/Conv /model.4/cv2/act/Relu
fuse_convolution_activation /model.5/conv/Conv /model.5/act/Relu
fuse_convolution_activation /model.6/cv1/conv/Conv /model.6/cv1/act/Relu
fuse_convolution_activation /model.6/m.0/cv1/conv/Conv /model.6/m.0/cv1/act/Relu
fuse_convolution_activation /model.6/m.0/cv2/conv/Conv /model.6/m.0/cv2/act/Relu
fuse_convolution_activation /model.6/m.0/m/m.0/cv1/conv/Conv /model.6/m.0/m/m.0/cv1/act/Relu
fuse_convolution_activation /model.6/m.0/m/m.0/cv2/conv/Conv /model.6/m.0/m/m.0/cv2/act/Relu
fuse_convolution_activation /model.6/m.0/m/m.1/cv1/conv/Conv /model.6/m.0/m/m.1/cv1/act/Relu
fuse_convolution_activation /model.6/m.0/m/m.1/cv2/conv/Conv /model.6/m.0/m/m.1/cv2/act/Relu
fuse_convolution_activation /model.6/m.0/cv3/conv/Conv /model.6/m.0/cv3/act/Relu
fuse_convolution_activation /model.6/cv2/conv/Conv /model.6/cv2/act/Relu
fuse_convolution_activation /model.7/conv/Conv /model.7/act/Relu
fuse_convolution_activation /model.8/cv1/conv/Conv /model.8/cv1/act/Relu
fuse_convolution_activation /model.8/m.0/cv1/conv/Conv /model.8/m.0/cv1/act/Relu
fuse_convolution_activation /model.8/m.0/cv2/conv/Conv /model.8/m.0/cv2/act/Relu
fuse_convolution_activation /model.8/m.0/m/m.0/cv1/conv/Conv /model.8/m.0/m/m.0/cv1/act/Relu
fuse_convolution_activation /model.8/m.0/m/m.0/cv2/conv/Conv /model.8/m.0/m/m.0/cv2/act/Relu
fuse_convolution_activation /model.8/m.0/m/m.1/cv1/conv/Conv /model.8/m.0/m/m.1/cv1/act/Relu
fuse_convolution_activation /model.8/m.0/m/m.1/cv2/conv/Conv /model.8/m.0/m/m.1/cv2/act/Relu
fuse_convolution_activation /model.8/m.0/cv3/conv/Conv /model.8/m.0/cv3/act/Relu
fuse_convolution_activation /model.8/cv2/conv/Conv /model.8/cv2/act/Relu
fuse_convolution_activation /model.9/cv1/conv/Conv /model.9/cv1/act/Relu
fuse_convolution_activation /model.9/cv2/conv/Conv /model.9/cv2/act/Relu
fuse_convolution_activation /model.10/cv1/conv/Conv /model.10/cv1/act/Relu
fuse_convolution_activation /model.10/m/m.0/ffn/ffn.0/conv/Conv /model.10/m/m.0/ffn/ffn.0/act/Relu
fuse_convolution_activation /model.10/cv2/conv/Conv /model.10/cv2/act/Relu
fuse_convolution_activation /model.13/cv1/conv/Conv /model.13/cv1/act/Relu
fuse_convolution_activation /model.13/m.0/cv1/conv/Conv /model.13/m.0/cv1/act/Relu
fuse_convolution_activation /model.13/m.0/cv2/conv/Conv /model.13/m.0/cv2/act/Relu
fuse_convolution_activation /model.13/cv2/conv/Conv /model.13/cv2/act/Relu
fuse_convolution_activation /model.16/cv1/conv/Conv /model.16/cv1/act/Relu
fuse_convolution_activation /model.16/m.0/cv1/conv/Conv /model.16/m.0/cv1/act/Relu
fuse_convolution_activation /model.16/m.0/cv2/conv/Conv /model.16/m.0/cv2/act/Relu
fuse_convolution_activation /model.16/cv2/conv/Conv /model.16/cv2/act/Relu
fuse_convolution_activation /model.17/conv/Conv /model.17/act/Relu
fuse_convolution_activation /model.23/cv2.0/cv2.0.0/conv/Conv /model.23/cv2.0/cv2.0.0/act/Relu
fuse_convolution_activation /model.23/cv2.0/cv2.0.1/conv/Conv /model.23/cv2.0/cv2.0.1/act/Relu
fuse_convolution_activation /model.23/cv3.0/cv3.0.0/cv3.0.0.1/conv/Conv /model.23/cv3.0/cv3.0.0/cv3.0.0.1/act/Relu
fuse_convolution_activation /model.19/cv1/conv/Conv /model.19/cv1/act/Relu
fuse_convolution_activation /model.19/m.0/cv1/conv/Conv /model.19/m.0/cv1/act/Relu
fuse_convolution_activation /model.23/cv3.0/cv3.0.1/cv3.0.1.1/conv/Conv /model.23/cv3.0/cv3.0.1/cv3.0.1.1/act/Relu
fuse_convolution_activation /model.19/m.0/cv2/conv/Conv /model.19/m.0/cv2/act/Relu
fuse_convolution_activation /model.23/cv3.0/cv3.0.2/Conv /model.23/Sigmoid
fuse_convolution_activation /model.19/cv2/conv/Conv /model.19/cv2/act/Relu
fuse_convolution_activation /model.20/conv/Conv /model.20/act/Relu
fuse_convolution_activation /model.23/cv2.1/cv2.1.0/conv/Conv /model.23/cv2.1/cv2.1.0/act/Relu
fuse_convolution_activation /model.23/cv2.1/cv2.1.1/conv/Conv /model.23/cv2.1/cv2.1.1/act/Relu
fuse_convolution_activation /model.23/cv3.1/cv3.1.0/cv3.1.0.1/conv/Conv /model.23/cv3.1/cv3.1.0/cv3.1.0.1/act/Relu
fuse_convolution_activation /model.22/cv1/conv/Conv /model.22/cv1/act/Relu
fuse_convolution_activation /model.22/m.0/cv1/conv/Conv /model.22/m.0/cv1/act/Relu
fuse_convolution_activation /model.22/m.0/cv2/conv/Conv /model.22/m.0/cv2/act/Relu
fuse_convolution_activation /model.23/cv3.1/cv3.1.1/cv3.1.1.1/conv/Conv /model.23/cv3.1/cv3.1.1/cv3.1.1.1/act/Relu
fuse_convolution_activation /model.22/m.0/m/m.0/cv1/conv/Conv /model.22/m.0/m/m.0/cv1/act/Relu
fuse_convolution_activation /model.23/cv3.1/cv3.1.2/Conv /model.23/Sigmoid_1
fuse_convolution_activation /model.22/m.0/m/m.0/cv2/conv/Conv /model.22/m.0/m/m.0/cv2/act/Relu
fuse_convolution_activation /model.22/m.0/m/m.1/cv1/conv/Conv /model.22/m.0/m/m.1/cv1/act/Relu
fuse_convolution_activation /model.22/m.0/m/m.1/cv2/conv/Conv /model.22/m.0/m/m.1/cv2/act/Relu
fuse_convolution_activation /model.22/m.0/cv3/conv/Conv /model.22/m.0/cv3/act/Relu
fuse_convolution_activation /model.22/cv2/conv/Conv /model.22/cv2/act/Relu
fuse_convolution_activation /model.23/cv2.2/cv2.2.0/conv/Conv /model.23/cv2.2/cv2.2.0/act/Relu
fuse_convolution_activation /model.23/cv2.2/cv2.2.1/conv/Conv /model.23/cv2.2/cv2.2.1/act/Relu
fuse_convolution_activation /model.23/cv3.2/cv3.2.0/cv3.2.0.1/conv/Conv /model.23/cv3.2/cv3.2.0/cv3.2.0.1/act/Relu
fuse_convolution_activation /model.23/cv3.2/cv3.2.1/cv3.2.1.1/conv/Conv /model.23/cv3.2/cv3.2.1/cv3.2.1.1/act/Relu
fuse_convolution_activation /model.23/cv3.2/cv3.2.2/Conv /model.23/Sigmoid_2
fuse_convolutiondepthwise_activation /model.23/cv3.0/cv3.0.0/cv3.0.0.0/conv/Conv /model.23/cv3.0/cv3.0.0/cv3.0.0.0/act/Relu
fuse_convolutiondepthwise_activation /model.23/cv3.0/cv3.0.1/cv3.0.1.0/conv/Conv /model.23/cv3.0/cv3.0.1/cv3.0.1.0/act/Relu
fuse_convolutiondepthwise_activation /model.23/cv3.1/cv3.1.0/cv3.1.0.0/conv/Conv /model.23/cv3.1/cv3.1.0/cv3.1.0.0/act/Relu
fuse_convolutiondepthwise_activation /model.23/cv3.1/cv3.1.1/cv3.1.1.0/conv/Conv /model.23/cv3.1/cv3.1.1/cv3.1.1.0/act/Relu
fuse_convolutiondepthwise_activation /model.23/cv3.2/cv3.2.0/cv3.2.0.0/conv/Conv /model.23/cv3.2/cv3.2.0/cv3.2.0.0/act/Relu
fuse_convolutiondepthwise_activation /model.23/cv3.2/cv3.2.1/cv3.2.1.0/conv/Conv /model.23/cv3.2/cv3.2.1/cv3.2.1.0/act/Relu
Input layer images without shape info, shape_inference skipped
Input layer images without shape info, estimate_memory_footprint skipped

安卓代码的修改

参考这两个代码进行修改

https://github.com/gaoxumustwin/ncnn-android-yolov8-pose

https://github.com/zhouweigogogo/yolo11-ncnn

对于yolo11-ncnn有以下几个修改的地方:

  1. 将softmax函数修改为了使用快速指数fast_exp的sigmoid
  2. 将 cv::dnn::NMSBoxes 修改了使用纯C++代码的实现

对于ncnn-android-yolov8-pose修改为ncnn-android-yolov11主要为将各种与yolov8pose相关的内容替换为yolov11

具体的代码过程,有兴趣的可以去查看

本人技术水平不高,代码肯定还有提升优化的地方!!!

参考资料

https://github.com/gaoxumustwin/ncnn-android-yolov8-pose

https://github.com/zhouweigogogo/yolo11-ncnn

https://github.com/triple-Mu/ncnn-examples/blob/main/cpp/yolov8/src/triplemu-yolov8.cpp

https://zhuanlan.zhihu.com/p/769076635

https://blog.csdn.net/u012863603/article/details/142977809?ops_request_misc=&request_id=&biz_id=102&utm_term=yolov11%E7%9A%84%E8%BE%93%E5%87%BA%E6%98%AF%E4%BB%80%E4%B9%88&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-1-142977809.142v100pc_search_result_base2&spm=1018.2226.3001.4187

相关文章:

YOLOv11 NCNN安卓部署

YOLOv11 NCNN安卓部署 前言 yolov11 NCNN安卓部署 目前的帧率可以稳定在20帧左右,下面是这个项目的github地址:https://github.com/gaoxumustwin/ncnn-android-yolov11 上面的检测精度很低时因为这个模型只训练了5个epoch,使用3090训练一个…...

对载入的3dtiles进行旋转、平移和缩放变换。

使用 params: {tx: 129.75845, //模型中心X轴坐标(经度,单位:十进制度)//小左ty: 46.6839, //模型中心Y轴坐标(纬度,单位:十进制度)//小下tz: 28, //模型中心Z轴坐标(高…...

Rust个人认为将抢占C和C++市场,逐渐成为主流的开发语言

本人使用C开发8年、C#开发15年、中间使用JAVA开发过项目、后期在学习过程中发现了Rust语言说它是最安全的语言,能够解决C、C的痛点、于是抽出一部分时间网上买书,看网上资料进行学习,这一学习起来发现和其它语言比较起来,在编码的…...

在openEuler中使用top命令

在openEuler中使用top命令 概述 top 命令是Linux系统中最常用的实时性能监控工具之一,允许用户查看系统的整体状态,包括CPU使用率、内存使用情况、运行中的进程等。本文档将详细介绍如何在openEuler操作系统中有效利用top命令进行系统监控。 启动top命令 打开终端并输入t…...

探索文件系统,Python os库是你的瑞士军刀

文章目录 探索文件系统,Python os库是你的瑞士军刀第一部分:背景介绍第二部分:os库是什么?第三部分:如何安装os库?第四部分:简单库函数使用方法1. 获取当前工作目录2. 改变当前工作目录3. 列出目…...

【小白学机器学习41】如何从正态分布的总体中去抽样? 获得指定正态分布的样本的2种方法

目录 1 目标:使用2种方法,去从正态分布的总体中去抽样,获得样本 1.1 step1: 首先,逻辑上需要先有符合正态分布的总体population 1.2 从总体中取得样本,模拟抽样的过程 2 从正态分布抽样的方法1 3 从正态分布抽样…...

将VSCode设置成中文语言环境

目录 VSCode默认是英文语言环境,这对于像我这种英语比较菜的人来说不是那么友好 另外也习惯了用中文,所以接下来介绍下如何将VSCode设置成中文语言环境。 1、打开VSCode软件,按快捷键【CtrlShiftP】 2、在弹出的搜索框中输入【configure l…...

Applied Intelligence投稿

一、关于手稿格式: 1、该期刊是一个二区的,模板使用Springer nature格式, 期刊投稿要求,详细期刊投稿指南,大部分按Soringernature模板即可,图片表格声明参考文献命名要求需注意。 2、参考文献&#xff…...

AI-agent矩阵营销:让品牌传播无处不在

矩阵营销是一种通过多平台联动构建品牌影响力的策略,而 AI-agent 技术让这一策略变得更加智能化。AI社媒引流王凭借其矩阵管理功能,帮助品牌在多个平台上实现深度覆盖与精准传播。 1. 矩阵营销的优势 品牌触达更广:多平台联动可以覆盖不同用…...

【0346】Postgres内核 Startup Process 通过 signal 与 postmaster 交互实现 (5)

1. Startup Process 进程 postmaster 初始化过程中, 在进入 ServerLoop() 函数之前,会先通过调用 StartChildProcess() 函数来开启辅助进程,这些进程的目的主要用来完成数据库的 XLOG 相关处理。 如: 核实 pg_wal 和 pg_wal/archive_status 文件是否存在Postgres先前是否发…...

NSSCTF-做题笔记

[羊城杯 2020]easyre 查壳,无壳,64位,ida打开 encode_one encode_tow encode_three 那么我们开始一步一步解密,从最外层开始 def decode_three(encrypted_str):decrypted_str ""for char in encrypted_str:char_code …...

【小白学机器学习35】数据表:整洁数据表,交叉表/列联表,以及两者转化pd.pivot_table()

目录 1 虽然这是个很基础的知识,但是我觉得有必要记录下 2 整洁数据表 3 交叉数据表的2种形式 3.0 交叉表的名字 3.1 2维的交叉表 3.2 用2维表现3维的 3.3 上述内容,具体的markdown文本 4 交叉数据表 4.1 交叉数据表并不整洁 4.2 但是交叉表也…...

springboot旅游管理系统的设计与实现

springboot旅游管理系统的设计与实现 如需源码pc端👉👉👉资源 手机端👉👉👉资源 摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于…...

k8s 1.28 聚合层部署信息记录

–requestheader-client-ca-file –requestheader-allowed-namesfront-proxy-client –requestheader-extra-headers-prefixX-Remote-Extra- –requestheader-group-headersX-Remote-Group –requestheader-username-headersX-Remote-User –proxy-client-cert-file –proxy-cl…...

自由学习记录(25)

只要有修改,子表就不用元表的参数了,用自己的参数(只不过和元表里的那个同名) 子表用__index“继承”了父表的值,此时子表仍然是空表 一定是创建这样一个同名的变量在原本空空的子表里, 传参要传具体的变…...

关于函数式接口和编程的解析和案例实战

文章目录 匿名内部类“匿名”在哪里 函数式编程lambda表达式的条件Supplier使用示例 ConsumeracceptandThen使用场景 FunctionalBiFunctionalTriFunctional 匿名内部类 匿名内部类的学习和使用是实现lambda表达式和函数式编程的基础。是想一下,我们在使用接口中的方…...

Linux 僵尸进程和孤儿进程, 进程优先级

僵尸进程 之间在进程状态中了解到了 "僵尸状态". 那么处于僵尸状态的进程就是僵尸进程. 僵尸状态是一种特殊的进程状态, 它表示一个进程已经完成执行, 但其父进程尚未回收其终止状态. "僵尸状态" 的本质就是死亡状态. 如何理解僵尸进程: 举个例子: 一个正…...

爬虫笔记24——纷玩岛自动抢票脚本笔记

纷玩岛自动抢票,协议抢票思路实现 一、获取Authorization凭证二、几个关键的参数三、几个关键的接口获取参数v,这个参数其实可以写死,可忽略通过价位获取演出的参数信息获取观演人信息,账号提前录入即可提交订单接口 先看实现图&a…...

《白帽子讲Web安全》15-16章

《白帽子讲Web安全》15-16章 《白帽子讲Web安全》15章15、Web Server配置安全15.1、Apache安全15.2、Nginx安全15.3、jBoss远程命令执行15.4、Tomcat远程命令执行15.5、HTTP Parameter Pollution15.6、小结 第四篇 互联网公司运营安全《白帽子讲Web安全》16章16、互联网业务安全…...

计算机毕业设计Python+LSTM天气预测系统 AI大模型问答 vue.js 可视化大屏 机器学习 深度学习 Hadoop Spark

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...

大语言模型压缩技术;推理优化技术;SparseGPT算法;GPTQ算法

目录 大语言模型落地的成本、效率与效果 模型压缩技术 推理优化技术 SparseGPT算法 GPTQ算法 大语言模型落地的成本、效率与效果 模型压缩技术 模型压缩技术是大语言模型轻量化的关键。介绍了多种模型压缩方法,其中权重量化和模型稀疏化是两种主要的技术。 权重量化:权重…...

Facebook的开源项目解析:推动开发者社区的技术进步

Facebook,作为全球领先的社交平台之一,其在技术领域的创新不仅体现在产品功能的实现上,也积极推动开源社区的发展。开源项目已经成为Facebook技术战略的重要组成部分,通过开源,Facebook不仅加速了技术进步,…...

力扣--LCR 149.彩灯装饰记录I

题目 代码 /** Definition for a binary tree node. public class TreeNode { int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val val; }TreeNode(int val, TreeNode left, TreeNode right) {this.val val;this.left left;this.right ri…...

Rust SQLx CLI 同步迁移数据库

上文我们介绍了SQLx及SQLite,并介绍了如何使用代码同步迁移数据库。本文介绍Sqlx cli 命令行工具,介绍如何安装、使用,利用其提供的命令实现数据表同步迁移。Java生态中有flyway, sqlx cli 功能类似,利用命令行工具可以和其他语言…...

批量生成不同用户的pdf 文件(html样式)

技术 selenium thymeleaf itextpdf chromedriver 使用thymeleaf 将动态数据替换 使用selenium chromedriver 进行js &#xff0c;css等逻辑运算后渲染视图 使用itextpdf 将html 转为pdf 文件 html模板 <!DOCTYPE html> <html xmlns:th"http://www.thymeleaf…...

混淆零碎知识点

minifyEnabled true //混淆开关 zipAlignEnabled true // Zipalign优化 shrinkResources true // 移除无用的resource文件 &#xff08;必须要混淆开了之后才才可以设置为true&#xff09; proguard-rules.pro 为混淆文件 //整个文件保留 不被混淆 -keep class com.cn…...

排序算法2

排序算法1-CSDN博客 排序算法1中提及的是较为基础(暴力实现&#xff0c;复杂度较高)的排序算法&#xff0c;不适合于数据量较大的场景&#xff0c;比如序列长度达到1e5 接下来以蓝桥另一道题目来理解其它的排序算法 蓝桥3226 蓝桥账户中心 样例 5 1 5 9 3 7 4、快速排序 快速排…...

【Web开发基础学习——corsheaders 应用的理解】

Web开发基础学习系列文章目录 第一章 基础知识学习之corsheaders 应用的理解 文章目录 Web开发基础学习系列文章目录前言一、使用1.1 安装1.2 配置 二、功能总结 前言 corsheaders 是一个 Django 第三方应用&#xff0c;用于处理跨域资源共享 (CORS)。CORS 是一种机制&#x…...

Redis和MySQL之间如何进行数据同步

原因 为什么要进行Redis和MySQL的数据同步&#xff1f; 性能优化&#xff1a;MySQL是关系型数据库&#xff0c;数据读取和存储相对复杂&#xff1b;Redis是内存数据库&#xff0c;读写速度极快&#xff0c;将热点数据存在Redis&#xff0c;可以大大提高系统的访问速度。 数据…...

css:转换

转换 移动 /* transform: translate(100px, 200px); */transform: translateX(100px);transform: translateY(100px); /*一个意思*/ 如果后面跟百分数的意思是移动盒子自身x/y方向长度的百分比&#xff0c;可以用作子绝父相控制盒子水平居中垂直居中 translate里的xy值是相对…...

html5 网站布局应用教程/百度站长工具seo查询

现在我们继续这个新闻客户端的开发&#xff0c;今天分享的是下拉刷新的实现&#xff0c;我们都知道下拉刷新是一个应用很常见也很实用的功能。我这个应用是通过拉ListView来实现刷新的&#xff0c;先看一张刷新的原理图 从图中可知&#xff0c;手指移动的距离就是dy。 刷新分…...

浙江广厦建设职业技术学院招生网站/长尾关键词爱站网

1、确认系统已经安装了SSH。rpm –qa | grep opensshyum install ssh -y ##安装SSH协议2、生成秘钥对ssh-keygen -t rsa -P ##直接回车生成的密钥对&#xff1a;id_rsa和id_rsa.pub&#xff0c;默认存储在用户的目录下 如&#xff1a;/home/oldboy/.ssh。 如下&#xff1…...

有域名了怎么做网站/百度信息流推广技巧

目录一、RequestMapping1.作用范围&#xff1a;2.属性二、请求参数的绑定三、请求参数乱码问题四、自定义类型转换器1.定义一个转换类实现Converter接口2.在springmvc的配置文件中配置类型转换器3.在springmvc配置文件中引用配置的类型转换五、使用Servlet原生API六、一些常用注…...

wordpress信用卡支付宝/sem投放是什么意思

在 Spring.Net 中对象初始化的方式分为两种&#xff1a; ① 急切实例化&#xff0c;也就是说 Spring.Net 容器初始化的时候将对象先实例化出来。 ② 延迟实例化&#xff0c;也就是说我们在调用 GetObject 方法时才实例化该对象。 Spring.Net 默认使用的 急切实例化 ( lazy-init…...

怎么做一个网站推广/个人发布信息的免费平台

1 stackFromBottom 你做好的列表就会显示你列表的最下面 值为true false2 android:transcriptMode"alwaysScroll" 通过设置的控件transcriptMode属性可以将Android平台的控件&#xff08;支持ScrollBar&#xff09;自动滑动到最底部。3 cacheColorHint 如…...

电商网站怎么做微信支付/怎样宣传自己的产品

有时候我们需要在图片的某一个地方添加一个url&#xff0c;最好的办法就是为图片添加热点&#xff0c; 实例&#xff1a; <img src"zhaobiaowang.jpg" width"1002" height"750" border"0" usemap"#Map" /> <map n…...