环境感知算法——2.CenterNet基于KITTI数据集训练

news2024/11/23 12:53:12

1. CenterNet简介

CenterNet采用了一种新的检测思路,即以目标中心点为基础,直接回归出目标的位置和大小。而传统的目标检测算法通常会先产生大量候选框(Anchor),再通过分类器进行筛选,这种方法比较复杂。CenterNet在准确率上比传统算法更好。相对于传统算法,CenterNet有更快的速度,因为采用端到端模型,没有二阶段修正,因此可以更快地进行目标检测。其AP精度相较YOLOCornerNet均有明显提高,相对于R-CNN方法有较大优势。下图为CenterNet在COCO数据集中的表现。

 2. 环境配置

训练环境Ubuntu20.04+Pytorch1.4+cuda10.4,笔者的训练硬件为RTX2080Ti(22G显存)。GPU驱动配置请参考:《环境感知算法——1.简介与GPU驱动、CUDA和cudnn配置》。

1)配置CenterNet虚拟环境

下面为在Anaconda虚拟环境中,配置运行CenterNet的环境。

conda create --name CenterNet python=3.6
conda activate CenterNet
conda install cudatoolkit=10.1
conda install --channel https://conda.anaconda.org/nvidia cudnn
conda install pytorch==1.4.0
pip install torchvision==0.5.0
pip install --upgrade jupyter_client

测试torch是否调用了虚拟环境中的cuda(在conda虚拟环境中不可以使用nvcc -V查看cuda信息):

进入CenterNet虚拟环境后,使用下列代码查看虚拟环境中的cuda版本:

# 使用python进入,exit()退出
import torch
print(torch.version.cuda)
print(torch.backends.cudnn.version())

测试显卡的算力:

AIscore = torch.cuda.get_device_capability()
AIscore = f'{AIscore[0]}{AIscore[1]}'
print(AIscore)

2) 下载CenterNet代码包

CenterNet源工程在GitHub的链接如下:

https://github.com/xingyizhou/CenterNethttps://github.com/xingyizhou/CenterNet

如果安装有git可以采用以下代码下载(或直接从Github页面下载压缩包文件后解压):

CenterNet_ROOT=/home/yaoyao/Documents/CenterNet # 视实际下载目录更改
git clone https://github.com/xingyizhou/CenterNet $CenterNet_ROOT

注意上述代码的位置应根据实际情况更改,并且目标目录不得存在名称为CenterNet的文件夹(否则会报错)。笔者下载CenterNet源代码的位置如下,请视自己实际目录情况修改:

CenterNet_ROOT=/home/yaoyao/Documents/CenterNet 

后续代码中CenterNet_ROOT请替换为对应CenterNet的目录。

3)替换DCNv2文件

源工程中的DCNv2并不适合于cuda10.0之后的版本,需要下载修改后的版本。下面链接给出了一个在本环境中经过测试可行的DCNv2版本。

https://github.com/CharlesShang/DCNv2https://github.com/CharlesShang/DCNv2

为了替换下载DCNv2,请逐步执行以下步骤:

# 切换至CenterNet中CenterNet所在目录
cd CenterNet_ROOT/src/lib/models/networks/
# 删除源程序中的DCNv2
rm -r DCNv2/
# 下载修改后、满足当前cuda版本的DCNv2
git clone https://github.com/CharlesShang/DCNv2.git

4)编译并测试DCNv2

# 编译DCNv2
cd CenterNet_ROOT/src/lib/models/networks/DCNv2
python setup.py build develop
# 测试DCNv2
cd CenterNet_ROOT/src/lib/models/networks/DCNv2
python testcpu.py
python testcuda.py

DCNv2需要使用python setup.py build develop编译(如果没有编译器需要补充安装gcc与g++等编译器)。DCNv2文件夹内分别基于CPU与GPU给出测试程序testcpu.py和testcuda.py。

编译过程中会出现部分Warning,可以忽略。若编译安装完成会提示:

DCNv2 0.1 is already the active version in easy-install.pth

Installed /home/yaoyao/Documents/CenterNet/src/lib/models/networks/DCNv2
Processing dependencies for DCNv2==0.1
Finished processing dependencies for DCNv2==0.1

此时,可以分别运行python testcpu.py和python testcuda.py测试DCNv2是否编译成功。

如果编译成功会出现:

check_gradient_dpooling: True
check_gradient_dconv:  True

如果出现了以下RuntimeError报错,笔者认为是正常现象(这个DCNv2版本可能也存在小问题但是不影响使用),可以反复重新运行testcpu.py和testcuda.py直至出现上列没有RuntimeError报错的结果。

Zero offset passed
/home/yaoyao/anaconda3/envs/CenterNet/lib/python3.6/site-packages/torch/autograd/gradcheck.py:242: UserWarning: At least one of the inputs that requires gradient is not of double precision floating point. This check will likely fail if all the inputs are not of double precision floating point. 
  'At least one of the inputs that requires gradient '
check_gradient_dpooling: True
Traceback (most recent call last):
  File "testcuda.py", line 265, in <module>
    check_gradient_dconv()
  File "testcuda.py", line 97, in check_gradient_dconv
    eps=1e-3, atol=1e-4, rtol=1e-2))
  File "/home/yaoyao/anaconda3/envs/CenterNet/lib/python3.6/site-packages/torch/autograd/gradcheck.py", line 289, in gradcheck
    'numerical:%s\nanalytical:%s\n' % (i, j, n, a))
  File "/home/yaoyao/anaconda3/envs/CenterNet/lib/python3.6/site-packages/torch/autograd/gradcheck.py", line 227, in fail_test
    raise RuntimeError(msg)
RuntimeError: Jacobian mismatch for output 0 with respect to input 1,
numerical:tensor([[0., 0., 0.,  ..., 0., 0., 0.],
        [0., 0., 0.,  ..., 0., 0., 0.],
        [0., 0., 0.,  ..., 0., 0., 0.],
        ...,
        [0., 0., 0.,  ..., 0., 0., 0.],
        [0., 0., 0.,  ..., 0., 0., 0.],
        [0., 0., 0.,  ..., 0., 0., 0.]])
analytical:tensor([[0., 0., 0.,  ..., 0., 0., 0.],
        [0., 0., 0.,  ..., 0., 0., 0.],
        [0., 0., 0.,  ..., 0., 0., 0.],
        ...,
        [0., 0., 0.,  ..., 0., 0., 0.],
        [0., 0., 0.,  ..., 0., 0., 0.],
        [0., 0., 0.,  ..., 0., 0., 0.]])

5)修改并编译NMS

在CenterNet\src\lib\external中找到set.py文件,修改set.py中的代码,在第10行处注释掉#extra_compile_args=["-Wno-cpp", "-Wno-unused-function"]。

编译NMS需要安装Cython,使用pip安装:

pip install Cython

之后,使用以下代码进行编译:

cd CenterNet_ROOT/src/lib/external
python setup.py build_ext --inplace

编译成功后,终端将输出:

gcc -pthread -shared -B /home/yaoyao/anaconda3/envs/CenterNet/compiler_compat -L/home/yaoyao/anaconda3/envs/CenterNet/lib -Wl,-rpath=/home/yaoyao/anaconda3/envs/CenterNet/lib -Wl,--no-as-needed -Wl,--sysroot=/ build/temp.linux-x86_64-3.6/nms.o -o /home/yaoyao/Documents/CenterNet/src/lib/external/nms.cpython-36m-x86_64-linux-gnu.so

此时,在.../CenterNet/src/lib/external文件夹内,将出现编译后的可执行文件nms.cpython-36m-x86_64-linux-gnu.so。

6)下载pth文件

CenterNet作者在Google Drive中放置了多个训练完成的.pth文件。

MODEL_ZOO.mdhttps://github.com/xingyizhou/CenterNet/blob/master/readme/MODEL_ZOO.md

以下载ctdet_coco_dla_2x为例,将其放入.../CenterNet/models中,模型大小为80.9MB,训练自COCO train 2017训练集。

接下来,需要进入.../CenterNet/code/src/lib/models/networks文件夹,找到pose_dla_dcn.py,并注释掉约309行处dla34函数的if pretrained代码段:

def dla34(pretrained=True, **kwargs):  # DLA-34
    model = DLA([1, 1, 1, 2, 2, 1],
                [16, 32, 64, 128, 256, 512],
                block=BasicBlock, **kwargs)
    # if pretrained:
    #     model.load_pretrained_model(data='imagenet', name='dla34', hash='ba72cf86')
    return model

7)安装必要的Python库

为了避免出现cvShowImage错误:

cv2.error: OpenCV(4.7.0) /tmp/pip-install-nqqlbtpw/opencv-contrib-python_7d60b527e6514716a754388095cd100d/opencv/modules/highgui/src/window.cpp:1272: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage'

需要在安装OpenCV前,安装一些必要的系统程序:

sudo apt-get install libgtk2.0-dev pkg-config

定位至.../CenterNet/src文件夹,安装所需Python包。

cd CenterNet_ROOT/src
conda install Cython numba progress matplotlib scipy
pip install opencv-contrib-python
pip install easydict

如果希望重新下载和从源码编译安装opencv-contrib-python,可相应更改代码如下:

pip install --no-cache-dir --no-binary opencv-contrib-python opencv-contrib-python

此外,还需要下载评估Kitti数据集所需的ddd_3dop模型:

KITTI 3DOP split modelhttps://github.com/xingyizhou/CenterNet/blob/master/experiments/ddd_3dop.sh

8)测试demo

在CenterNet/images文件夹内,有几个用于测试的图片文件。使用以下代码对于下载的.pth文件在demo图片上进行测试。

cd CenterNet_ROOT/src
python demo.py ctdet --demo ../images/16004479832_a748d55f21_k.jpg --load_model ../models/ctdet_coco_dla_2x.pth

上述代码内,16004479832_a748d55f21_k.jpg为两只可爱的小狗,使用CenterNet识别这张demo图片的结果如下:

此步完成,证明各DCNv2、NMS、OpenCV等库安装正确,也可以直接使用该.pth文件进行目标定位与分类。

9)安装COCO API

COCO 数据集是一个大型图像数据集,主要用于目标检测、分割和字幕等计算机视觉任务。COCO API是一种用于处理和解析 COCO 数据集的库。COCO API 提供了一系列的函数和方法,使得用户能够有效地加载、解析和可视化 COCO 数据集。针对 COCO 数据集进行查询和分析、评估模型的性能、用于数据预处理和后处理等设计了API。

使用以下代码进行下载、编译与安装:

# 定位到CenterNet文件夹
cd CenterNet_ROOT
# git下载cocoapi
git clone https://github.com/cocodataset/cocoapi.git
# 进入PythonAPI
cd ./cocoapi/PythonAPI/
# 编译并安装
make
python setup.py install --user

若安装完成,终端内会显示:

Using .../anaconda3/envs/CenterNet/lib/python3.6/site-packages
Finished processing dependencies for pycocotools==2.0

也可以在Python环境中测试coco API,使用以下代码,若COCO顺利导入则说明COCOAPI安装成功。

import torch    
from pycocotools.coco import COCO

10)准备KITTI数据集

CenterNet对于COCO、Pascal VOC、KITTI等预处理链接如下:

https://github.com/xingyizhou/CenterNet/blob/master/readme/DATA.mdhttps://github.com/xingyizhou/CenterNet/blob/master/readme/DATA.md以KITTI数据集为例,在CenterNet项目文件夹内,需要将KITTI数据集整理为如下格式:

${CenterNet_ROOT}
|-- data
`-- |-- kitti
    `-- |-- training
        |   |-- image_2
        |   |-- label_2
        |   |-- calib
        |-- ImageSets_3dop
        |   |-- test.txt
        |   |-- train.txt
        |   |-- val.txt
        |   |-- trainval.txt
        `-- ImageSets_subcnn
            |-- test.txt
            |-- train.txt
            |-- val.txt
            |-- trainval.txt

下面为CenterNet/data/kitti文件夹内的training、ImageSets_3dop、ImageSets_subcnn等文件夹分别传入图像与标签数据。

a)training文件夹

涉及文件的源下载链接分别为 images, annotations,  calibrations ,需要首先登记邮箱后通过邮件收到下载地址后下载。或者,使用以下网盘链接:

Kitti数据集提取码:yao1https://pan.baidu.com/s/1xJLKJQYGpc3PsdvSPZV8ag?pwd=yao1

下载其中data_object_label_2.zip、data_object_image_2.zip、data_object_calib.zip及对应的.z01与.z02文件,并按照training文件夹格式,(分卷)解压 image_2、label_2、calib至相应位置。

b)ImageSets_3dop文件夹

从以下链接下载获得imagesets.tar.gz,解压后重命名为ImageSets_3dop。3DOPhttps://xiaozhichen.github.io/files/mv3d/imagesets.tar.gz

c)ImageSets_subcnn文件夹

从以下链接获取 SubCNN-master,并提取subcnn/fast-rcnn/data/KITTI/内的test.txt、train.txt、val.txt、trainval.txt至ImageSets_subcnn文件夹内。SubCNNhttps://github.com/tanshen/SubCNN/tree/master/fast-rcnn/data/KITTI

获取各个图像与标签文件后,还需要在CenterNet/data/kitti文件夹内新建两个文件夹annotations与images。

cd CenterNet_ROOT/data/kitti
# 新建annotations与images文件夹
mkdir images
mkdir annotations

再在tools目录下运行convert_kitti_to_coco.py脚本,用于将KITTI格式的注释转换为COCO格式。

cd CenterNet_ROOT/src/tools
python convert_kitti_to_coco.py

链接文件

cd CenterNet_ROOT/data/kitti
ln -s CenterNet_ROOT/data/kitti/training/image_2/  CenterNet_ROOT/data/kitti/images/trainval

整理后的data/kitti文件夹配置如下:

${CenterNet_ROOT}
|-- data
`-- |-- kitti
    `-- |-- annotations
        |   |-- kitti_3dop_train.json
        |   |-- kitti_3dop_val.json
        |   |-- kitti_subcnn_train.json
        |   |-- kitti_subcnn_val.json
        `-- images
            |-- trainval
            |-- test (CenterNet的原作者标注了此行,但实际不会生成本test行)

11)编译kitti_eval

编译kitti-eval前首先需要安装Boost 库:

sudo apt upgrade
sudo apt-get install libboost-all-dev

使用下列代码编译kitti-eval:

cd CenterNet_ROOT/src/tools/kitti_eval
g++ -o evaluate_object_3d_offline evaluate_object_3d_offline.cpp -O3

12)安装可视化结果文件所需的gnuplot与pdfcrop

sudo apt upgrade
sudo apt install gnuplot
sudo apt-get install texlive-extra-utils

13)评估预训练模型3dop

根据预训练模型评估KITTI数据集(不是训练,而是直接使用预训练模型进行评估)。经过此步骤,可以了解不同.pth的识别精确度,便于与自己的训练结果进行对比。

为了避免以下错误:

ERROR: Couldn't read: 000212.txt of ground truth. Please write me an email!
An error occured while processing your results.

 需要在CenterNet/src/lib/datasets/dataset/kitti.py中,第87行将label_val修改为label_2,即有

  def run_eval(self, results, save_dir):
    self.save_results(results, save_dir)
    os.system('./tools/kitti_eval/evaluate_object_3d_offline ' + \
              '../data/kitti/training/label_2 ' + \ #修改此处Line87
              '{}/results/'.format(save_dir))

针对第(7)步下载的ddd_3dop.pth进行评估,目标数据集为kitti 3dop。

cd CenterNet_ROOT/src/
python test.py ddd --exp_id 3dop --dataset kitti --kitti_split 3dop --load_model ../models/ddd_3dop.pth

评估过程如下图所示: 

评估完成后,在CenterNet/exp/ddd/3dop/plot文件夹内,可以获得Kitti数据集不同类别(包括Car、Cyclist、Pedestrian等)的识别精度,以P-R(Precision-Recall)表征,每个种类根据困难程度均分为Easy、Moderate、Hard三个难度。

预训练模型的识别结果:

a)二维定位(XXX_detection)

b)三维定位(XXX_detection_3d)

3. 训练模型

终于做完了全部准备工作,可以训练模型了!
取训练参数如下表:

batch_sizelrmaster_batchnum_epochs
63.125e-5570

训练模型调用代码如下:

cd CenterNet_ROOT/src
python main.py ddd --exp_id 3dop --dataset kitti --kitti_split 3dop --batch_size 6 --lr 3.125e-5 --master_batch 5  --num_epochs 70 --lr_step 45,60 --gpus 0

训练过程中,终端如下所示: 

可在另一个终端中使用以下代码查看GPU占用率(5s刷新一次显存占用与GPU情况):

watch -n 5 nvidia-smi   

Tips: batch_size为6时,GPU显存约占用7.4GB。

4. 训练结果分析

在CenterNet对于Kitti数据集完成了70epochs的训练后,/3dop文件夹内出现了model_45、model_60与model_best、model_best等pth模型文件(45/60因各人的训练代码设置而异)。

使用以下代码评估模型(Kitti数据集3000+图片上验证): 

python test.py ddd --exp_id 3dop --dataset kitti --kitti_split 3dop --load_model ../exp/ddd/3dop/model_last.pth 

评估训练获得的.pth模型文件,其结果除上述CenterNet/exp/ddd/3dop/plot的P-R图外,识别结果还以txt文本储存于.../exp/ddd/3dop/results内。 

下图为740号图片的识别结果,两辆Car均能识别。

下图为1625号图片的识别结果,在高速上堵车的工况下进行识别。

测试223号图片,元数据为Car / Car / Van / Misc / Person_sitting / DontCare ,但训练后检测为三个Car(如下图标记),错误地将Van(厢式货车)识别为了Car,由于Van和Car在较远、较小的情况下很难区别,因此发生了误识别。

可视化代码如下(注意修改对应的png目录与labels框数据)。

import cv2
import numpy as np

# 读取图像和标签文件
img = cv2.imread('.../data/kitti/training/image_2/000740.png')
labels = [
'Car 0.0 0 -1.69 800.94 199.48 1244.19 366.32 1.41 1.61 3.87 2.93 1.50 5.22 -1.17 0.96',
'Car 0.0 0 2.06 419.74 180.67 640.23 306.54 1.55 1.62 4.07 -1.31 1.89 11.32 1.95 0.95',
]

# 解析标签并可视化物体
for label in labels:
    label_parts = label.split(' ')
    object_type = label_parts[0]
    truncation = float(label_parts[1])
    occlusion = int(label_parts[2])
    alpha = float(label_parts[3])
    bbox_2d = np.array([float(p) for p in label_parts[4:8]])
    dims_3d = np.array([float(p) for p in label_parts[8:11]])
    location_3d = np.array([float(p) for p in label_parts[11:14]])
    rotation_y = float(label_parts[14])

    # 可视化标签
    cv2.rectangle(img, (int(bbox_2d[0]), int(bbox_2d[1])), (int(bbox_2d[2]), int(bbox_2d[3])), (0, 255, 0), 2)
    cv2.putText(img, object_type, (int(bbox_2d[0]), int(bbox_2d[1]) - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1)

# 显示图像
cv2.imshow('Image with labels', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

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

相关文章

selenium浏览器自动化测试

Selenium是一个用于Web应用程序的自动化测试工具。它直接运行在浏览器中&#xff0c;可以模拟用户在浏览器上面的行为操作。 Selenium入门 下载驱动 查看谷歌浏览器版本 谷歌浏览器输入网址的地方输入&#xff1a;chrome://version 下载与浏览器对应&#xff08;或相近&#x…

RK3588平台开发系列讲解(驱动基础篇)驱动模块传参

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、驱动模块传参简介二、驱动模块传普通参数三、驱动模块传数组沉淀、分享、成长,让自己和他人都能有所收获!😄 📢在编写应用程序的时候,我们可以给 main 函数传递参数,比如 void main(int argc,char *argv[]…

【ChatGPT】如何利用ChatGPT来快速统计Excel数据?

系列文章目录 老板让你写个PPT没有头绪&#xff1f;没事&#xff0c;ChatGPT来帮你&#xff01;传送门 文章目录 系列文章目录前言一、不会公式&#xff1f;帮你生成二、不会处理数据&#xff1f;帮你处理写在最后 前言 自从人工智能横空而出&#xff0c;它在人们的生活中产生…

Apache配置与应用与网页安全优化

Apache配置与应用与网页安全优化 构建虚拟Web主机httpd服务支持的三种虚拟机类型基于域名的虚拟主机Options指令解释AllowOverride指令解析 基于IP地址的虚拟主机基于端口的虚拟主机Apache连接保持构建Web虚拟目录与用户授权限制Apache 日志分割AWStats分析系统 网页压缩网页缓…

研发工程师玩转Kubernetes——多Worker Node部署

在之前的系列中&#xff0c;我们都是在单Node上“玩转”kubernetes&#xff0c;熟悉了它很多指令和特性。从本节开始&#xff0c;我们开始探索多Worker Node的相关特性。 部署虚拟机 因为desktop版ubuntu非常占用内存&#xff0c;而且我们已经熟悉了一些基本操作&#xff0c;…

电能质量监测装置在半导体公司“大放异彩”

摘 要&#xff1a;半导体生产制造业在国民经济中起着举足轻重的作用&#xff0c;相关企业的规模也越来越大。其供配电系统稳定、可靠的运维不仅是其安全生产的基本保证&#xff0c;还关系到产品质量和生产的顺利进行。而半导体行业中大部分工艺设备对电能质量比较敏感&#xff…

kafka 的内部结构和 kafka 的工作原理

基本设置 让我们开始安装kafka。下载最新的 Kafka 版本并解压缩。打开终端并启动 kafka 和 zookeeper。 $ cd $HOME $ tar -xzf kafka_<version>.tgz $ cd kafka_<version> $ bin/zookeeper-server-start.sh config/zookeeper.properties # open another termina…

Web安全之常见攻防

前言&#xff1a; 在当下&#xff0c;数据安全与个人隐私受到了前所未有的挑战。如何才能更好地保护我们的数据&#xff1f;接下来分析几种常见的攻击的类型以及防御的方法。 一、XSS&#xff08;Cross Site Script&#xff09; 首先了解最常见的 XSS 漏洞&#xff0c;XSS (Cr…

Nginx的网站服务

Nginx网站服务 一、Nginx与apache的差异二、编译安装Nginx服务三、Nginx命令四、向系统添加nginx服务五、nginx配置文件六、http块的配置 一、Nginx与apache的差异 nginx相对于apache的优点&#xff1a; 轻量级&#xff0c;同样是web服务&#xff0c;比apache占用内存更少及资…

chatgpt赋能python:Python为什么运行不出结果?

Python为什么运行不出结果&#xff1f; 简介 Python是一种高级编程语言&#xff0c;可以帮助程序员快速开发软件应用。不过&#xff0c;在使用Python的过程中&#xff0c;你可能会遇到一些麻烦。其中一个常见的问题是Python运行不出结果。 如果你正在遇到这个问题&#xff0…

DAY18_基础加强-XMLDTDschema注解单元测试

目录 1 xml1.1 概述1.2 标签的规则1.3 语法规则1.4 xml解析1.5 DTD约束1.6 schema约束 2 注解2.1 概述2.2 自定义注解2.3 元注解 3 单元测试3.1 概述3.2 特点3.3 使用步骤3.4 相关注解 1 xml 1.1 概述 万维网联盟(W3C)官网&#xff1a;https://www.w3school.com.cn 万维网联盟…

解释公有云、私有云、混合云、边缘云、分布式云

Author:skate Time:2023/06/01 云计算是一种基于互联网的计算模式&#xff0c;它通过网络提供IT资源和服务&#xff0c;包括计算、存储、网络、应用等&#xff0c;以服务的形式向用户提供&#xff0c;用户可以按需获取和使用这些资源和服务&#xff0c;而无需拥有和管理这些资…

chatgpt赋能python:Python主类:一个强大的编程工具

Python主类&#xff1a;一个强大的编程工具 介绍 Python是一种高级编程语言&#xff0c;它已经成为了世界上最流行和广泛使用的编程语言之一。Python在各种领域都有着广泛的应用&#xff0c;包括科学计算、数据分析、网络编程、机器学习等等。 虽然Python具有许多有用的功能…

iPhone技巧之「合并PDF文档」

有时候我们在手机上需要将多个PDF文档合并为一个&#xff0c;方便发送或者观看。 如果电脑不在身边&#xff0c;或只想直接在手机上合并PDF&#xff0c;是不是需要下载什么新的app或者工具呢&#xff1f;答案是不需要的&#xff0c;如果你用的是苹果手机&#xff0c;用苹果自带…

点云数据处理方法的应用PCL函数库为例的设计与实现_kaic

摘 要 在计算机视觉和虚拟现实技术的发展过程中&#xff0c;点云数据已成为主要的三维数据表达形式。将点云数据转换成灰值图时&#xff0c;测算每一个像素点周边领域的点云&#xff0c;但是其效率精密度比较低。文中探讨了点云数据的多视图拼凑和滤波处理&#xff0c;明确提出…

网络编程知识点总结(1)

TCP/UDP对比 1.TCP面向连接 (如打电话要先拨号建立连接);UDP是无连接的&#xff0c;即发送数据之前不需要建立连接 2.TCP提供可靠的服务。也就是说&#xff0c;通过TCP连接传送的数据&#xff0c;无差错&#xff0c;不丢失&#xff0c;不重复&#xff0c;且按序到达;UDP尽最大…

【蓝桥刷题】备战国赛——区间修改、区间查询

蓝桥杯线段树模板题——区间修改、区间查询 &#x1f680; 每日一题&#xff0c;冲刺国赛 &#x1f680; 题目导航&#xff1a; 区间修改、区间查询 &#x1f387;思路&#xff1a;线段树 &#x1f531;思路分析&#xff1a; 本题涉及到了对区间操作的问题&#xff0c;因此&a…

《商用密码应用与安全性评估》第四章密码应用安全性评估实施要点4.2密码应用基本要求与实现要点

4.2.1 标准介绍 2018年2月8日&#xff0c;GM/T0054-2018《信息系统密码应用基本要求》由国家密码 管理局发布并实施。 ① 总体要求规定了密码算法、密码技术、密码产品和密码服务应当符合商用密码管理的相关规定&#xff0c;满足标准规范的相关要求&#xff0c;即合规性。 ②密…

校园综合能效管理平台建设的意义

摘要&#xff1a;为响应国家绿色校园建设的号召&#xff0c;切实提高高校能源利用水平&#xff0c;推动学校能源资源合理配置&#xff0c;服务学校高质量发展大局&#xff0c;根据教育部印发的《关于开展节能减排学校行动的通知》《关于勤俭节约办教育建设节约型校园的通知》《…

ESP8285 多个bin文件合并烧录

可通过两种方式烧录固件&#xff0c;一种是基于esp-idf开发时&#xff0c;中命令终端执行make flash命令烧录&#xff1b;二是使用ESPFlashDownloadTool工具。 bin文件说明 ESP8285/ESP8266的固件一般包含4个bin文件。 查看各bin文件的路径 以带OTA的固件为例&#xff0c;在…