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

Ubuntu20.04安装运行DynaSLAM

目录

一、安装Anaconda

二、相关依赖库安装 

1、boost安装

2、Eigen 3安装

3、opencv安装 

4、Pangolin安装

三、配置Mask_RCNN环境

四、DynaSLAM编译

五、DynaSLAM运行


一、安装Anaconda

打开以下链接:

Index of /

下载和自己系统匹配的安装包。这里下载的是Anaconda3-2024.02-1-Linux-x86_64.sh。

148cccaf43e249e5a4cad1d878a2e189.png

在下载安装包的目录下打开终端,执行以下命令进行安装。

bash Anaconda3-2024.02-1-Linux-x86_64.sh

出现以下画面,按提示进行回车:

33e1734597ee48578835573f6b5e73b3.png

一直按回车,或按q直接跳过,直到出现“Do you accept the license terms”, 输入“yes” 。

4f82f76b6a1c4e6ea4f80047b34023a7.png

默认位置已经足够,按ENTER确认安装位置。

b89dfbfc76d74bd2988a8be445179f12.png

出现是否要运行conda init,输入yes。

e27837ec4f0c44f08b0b725efa58b3f6.png

出现以下画面,Anaconda安装成功:

e794e3355bd946a6a29f622c333ba6f4.png

安装好后,source一下环境或者重新打开一个终端。

source ~/.bashrc 

会多一个(base)的前缀。

5b3c54a4e7cd40fab3acb94c209a1097.png

附:如果希望 conda 的基础环境在启动终端时不被激活,将 auto_activate_base 参数设置为 false:

conda config --set auto_activate_base false

后面想要再进入conda的base环境,只需要使用conda指令激活:

conda activate base

二、相关依赖库安装 

1、boost安装

 通过以下链接下载boost1.71:

https://archives.boost.io/release/1.71.0/source/boost_1_71_0.tar.gz

将下载的源码解压缩至home下,在boost目录下打开终端,依次执行以下命令,等待安装完成即可:

sudo ./bootstrap.sh
sudo ./b2 install

2、Eigen 3安装

在home下打开终端,终端执行以下命令下载Eigen3源码:

git clone https://github.com/eigenteam/eigen-git-mirror

 然后依次执行以下命令进行安装:

cd eigen-git-mirror
mkdir build && cd build
cmake ..
sudo make install

3、opencv安装 

版本一定要对应,不然编译过程中会报各种错误。

通过以下链接下载opencv3.4.5:

https://github.com/opencv/opencv/archive/refs/tags/3.4.5.tar.gz

终端执行以下命令,安装所需的依赖项:

sudo apt-get install build-essential libgtk2.0-dev libjpeg-dev  libtiff5-dev libopenexr-dev libtbb-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libgtk-3-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev pkg-config

在opencv目录下打开终端,执行以下命令编译安装: 

mkdir build && cd build
cmake ..
sudo make -j4
sudo make install

终端执行以下命令,修改/etc/ld.so.conf文件:

sudo gedit /etc/ld.so.conf

在打开的文件中加上一行 include /usr/local/lib,/usr/local是opencv的默认安装路径,这样告诉系统以后去lib目录下找opencv的库文件。

include /usr/local/lib

执行以下,命令使得conf生效: 

sudo ldconfig

终端执行以下命令,修改bash.bashrc文件:

sudo gedit /etc/bash.bashrc 

在文件末尾加上以下内容: 

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH

 然后source使得bash生效:

source /etc/bash.bashrc

输入以下命令查看opencv版本信息: 

pkg-config opencv --modversion

显示版本,表示安装成功!
 

4、Pangolin安装

Pangolin一定要v0.5版本的,其他版本会报错。

由于我这里之前安装过Pangolin,因此需要卸载之前的版本。

(1)删除库和头文件

cd Pangolin/build
make clean
sudo make uninstall

(2)删除源代码

cd ../..
sudo rm -r Pangolin

(3)删除残留文件夹

sudo updatedb
locate pangolin
sudo rm -r /usr/local/include/pangolin

通过以下链接下载Pangolinv0.5源码:

 https://github.com/stevenlovegrove/Pangolin/archive/refs/tags/v0.5.tar.gz

将其解压缩到主目录home下,打开Pangolin文件夹,打开终端执行以下命令:

mkdir build && cd build
cmake ..
sudo make -j4
sudo make install

安装时会出现报错,因此需要对文件进行修改:

/Pangolin/CMakeModules/FindFFMPEG.cmake中63,64行

        sizeof(AVFormatContext::max_analyze_duration2);}" HAVE_FFMPEG_MAX_ANALYZE_DURATION2

换成

        sizeof(AVFormatContext::max_analyze_duration);}" HAVE_FFMPEG_MAX_ANALYZE_DURATION

/Pangolin/src/video/drivers/ffmpeg.cpp中第37行 namespace pangolin上面加上

#define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER

第78,79行

TEST_PIX_FMT_RETURN(XVMC_MPEG2_MC); 
TEST_PIX_FMT_RETURN(XVMC_MPEG2_IDCT);

改为

#ifdef FF_API_XVMCTEST_PIX_FMT_RETURN(XVMC_MPEG2_MC);TEST_PIX_FMT_RETURN(XVMC_MPEG2_IDCT);
#endif

第101-105行

    TEST_PIX_FMT_RETURN(VDPAU_H264);TEST_PIX_FMT_RETURN(VDPAU_MPEG1);TEST_PIX_FMT_RETURN(VDPAU_MPEG2);TEST_PIX_FMT_RETURN(VDPAU_WMV3);TEST_PIX_FMT_RETURN(VDPAU_VC1);

改为

#ifdef FF_API_VDPAUTEST_PIX_FMT_RETURN(VDPAU_H264);TEST_PIX_FMT_RETURN(VDPAU_MPEG1);TEST_PIX_FMT_RETURN(VDPAU_MPEG2);TEST_PIX_FMT_RETURN(VDPAU_WMV3);TEST_PIX_FMT_RETURN(VDPAU_VC1);
#endif

第127行

	TEST_PIX_FMT_RETURN(VDPAU_MPEG4);

改为

#ifdef FF_API_VDPAUTEST_PIX_FMT_RETURN(VDPAU_MPEG4);
#endif

Pangolin/include/pangolin/video/drivers/ffmpeg.h开头加上

#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22)
#define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER
#define AVFMT_RAWPICTURE 0x0020

更改完后,重新安装即可。

三、配置Mask_RCNN环境

在Anaconda虚拟环境下配置,终端依次执行以下命令:

# 创建一个虚拟环境
conda create -n MaskRCNN python=2.7
conda activate MaskRCNN
# 这一步可能报错,多尝试几次
pip install tensorflow==1.14.0
pip install keras==2.0.9
pip install scikit-image
pip install pycocotools

 在安装pycocotools时报错:

通过以下命令安装pycocotools:

conda install -c conda-forge pycocotools

下载DynaSLAM并测试环境,终端执行以下命令下载DynaSLAM源码:

git clone  https://github.com/BertaBescos/DynaSLAM.git

通过以下链接,下载mask_rcnn_coco.h5文件:

https://github.com/matterport/Mask_RCNN/releases/download/v1.0/mask_rcnn_coco.h5

然后把mask_rcnn_coco.h5文件放在DynaSLAM/src/python/文件夹下。

在DynaSLAM目录下打开终端,然后执行以下命令(需在刚刚创建的MaskRCNN环境下):

python src/python/Check.py

出现如下:Mask R-CNN is correctly working

则说明Mask_RCNN环境配置成功了。

四、DynaSLAM编译

编译之前需要对部分代码进行修改。

(1)DynaSLAM/CMakeLists.txt

C++11改为C++14

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}  -Wall  -O3 ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall   -O3 ")
# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}  -Wall  -O3 -march=native ")
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall   -O3 -march=native")
......................
#find_package(OpenCV 2.4.11 QUIET)
#if(NOT OpenCV_FOUND)
#    message("OpenCV > 2.4.11 not found.")
#    find_package(OpenCV 3.0 QUIET)
#    if(NOT OpenCV_FOUND)
#        message(FATAL_ERROR "OpenCV > 3.0 not found.")
#    endif()
#endif()find_package(OpenCV 3.4 QUIET)
if(NOT OpenCV_FOUND)find_package(OpenCV 2.4 QUIET)if(NOT OpenCV_FOUND)message(FATAL_ERROR "OpenCV > 2.4.x not found.")endif()
endif()
......................
set(Python_ADDITIONAL_VERSIONS "2.7")
#This is to avoid detecting python 3
find_package(PythonLibs 2.7 EXACT REQUIRED)
if (NOT PythonLibs_FOUND)message(FATAL_ERROR "PYTHON LIBS not found.")
else()message("PYTHON LIBS were found!")message("PYTHON LIBS DIRECTORY: " ${PYTHON_LIBRARY} ${PYTHON_INCLUDE_DIRS})
endif()
......................
#find_package(Eigen3 3.1.0 REQUIRED)
find_package(Eigen3 3 REQUIRED)
......................
# add_executable(mono_carla
# Examples/Monocular/mono_carla.cc)
# target_link_libraries(mono_carla ${PROJECT_NAME})

(2)DynaSLAM/Thirdparty/DBoW/CMakeLists.txt

#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}  -Wall  -O3 -march=native ")
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall  -O3 -march=native")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}  -Wall  -O3 ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall  -O3 ")
......................
# find_package(OpenCV 3.0 QUIET)
find_package(OpenCV 3.4 QUIET)

(3)DynaSLAM/Thirdparty/g2o/CMakeLists.txt

#SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -march=native") 
#SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3 -march=native")
SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 ") 
SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3 ")
......................
#FIND_PACKAGE(Eigen3 3.1.0 REQUIRED)
FIND_PACKAGE(Eigen3 3 REQUIRED)

(4)DynaSLAM/include/Conversion.h

// cv::Mat toMat(const PyObject* o);cv::Mat toMat(PyObject* o);

(5)DynaSLAM/src/Conversion.cc

/*** This file is part of DynaSLAM.* Copyright (C) 2018 Berta Bescos <bbescos at unizar dot es> (University of Zaragoza)* For more information see <https://github.com/bertabescos/DynaSLAM>.**/#include "Conversion.h"
#include <iostream>namespace DynaSLAM
{static void init(){import_array();}static int failmsg(const char *fmt, ...){char str[1000];va_list ap;va_start(ap, fmt);vsnprintf(str, sizeof(str), fmt, ap);va_end(ap);PyErr_SetString(PyExc_TypeError, str);return 0;}class PyAllowThreads{public:PyAllowThreads() : _state(PyEval_SaveThread()) {}~PyAllowThreads(){PyEval_RestoreThread(_state);}private:PyThreadState *_state;};class PyEnsureGIL{public:PyEnsureGIL() : _state(PyGILState_Ensure()) {}~PyEnsureGIL(){// std::cout << "releasing"<< std::endl;PyGILState_Release(_state);}private:PyGILState_STATE _state;};using namespace cv;static PyObject *failmsgp(const char *fmt, ...){char str[1000];va_list ap;va_start(ap, fmt);vsnprintf(str, sizeof(str), fmt, ap);va_end(ap);PyErr_SetString(PyExc_TypeError, str);return 0;}class NumpyAllocator : public MatAllocator{public:
#if (CV_MAJOR_VERSION < 3)NumpyAllocator(){}~NumpyAllocator() {}void allocate(int dims, const int *sizes, int type, int *&refcount,uchar *&datastart, uchar *&data, size_t *step){// PyEnsureGIL gil;int depth = CV_MAT_DEPTH(type);int cn = CV_MAT_CN(type);const int f = (int)(sizeof(size_t) / 8);int typenum = depth == CV_8U ? NPY_UBYTE : depth == CV_8S ? NPY_BYTE: depth == CV_16U  ? NPY_USHORT: depth == CV_16S  ? NPY_SHORT: depth == CV_32S  ? NPY_INT: depth == CV_32F  ? NPY_FLOAT: depth == CV_64F  ? NPY_DOUBLE: f * NPY_ULONGLONG + (f ^ 1) * NPY_UINT;int i;npy_intp _sizes[CV_MAX_DIM + 1];for (i = 0; i < dims; i++){_sizes[i] = sizes[i];}if (cn > 1){_sizes[dims++] = cn;}PyObject *o = PyArray_SimpleNew(dims, _sizes, typenum);if (!o){CV_Error_(CV_StsError, ("The numpy array of typenum=%d, ndims=%d can not be created", typenum, dims));}refcount = refcountFromPyObject(o);npy_intp *_strides = PyArray_STRIDES(o);for (i = 0; i < dims - (cn > 1); i++)step[i] = (size_t)_strides[i];datastart = data = (uchar *)PyArray_DATA(o);}void deallocate(int *refcount, uchar *, uchar *){// PyEnsureGIL gil;if (!refcount)return;PyObject *o = pyObjectFromRefcount(refcount);Py_INCREF(o);Py_DECREF(o);}
#elseNumpyAllocator(){stdAllocator = Mat::getStdAllocator();}~NumpyAllocator(){}UMatData *allocate(PyObject *o, int dims, const int *sizes, int type,size_t *step) const{UMatData *u = new UMatData(this);u->data = u->origdata = (uchar *)PyArray_DATA((PyArrayObject *)o);npy_intp *_strides = PyArray_STRIDES((PyArrayObject *)o);for (int i = 0; i < dims - 1; i++)step[i] = (size_t)_strides[i];step[dims - 1] = CV_ELEM_SIZE(type);u->size = sizes[0] * step[0];u->userdata = o;return u;}UMatData *allocate(int dims0, const int *sizes, int type, void *data,size_t *step, int flags, UMatUsageFlags usageFlags) const{if (data != 0){CV_Error(Error::StsAssert, "The data should normally be NULL!");// probably this is safe to do in such extreme casereturn stdAllocator->allocate(dims0, sizes, type, data, step, flags,usageFlags);}PyEnsureGIL gil;int depth = CV_MAT_DEPTH(type);int cn = CV_MAT_CN(type);const int f = (int)(sizeof(size_t) / 8);int typenum =depth == CV_8U ? NPY_UBYTE : depth == CV_8S ? NPY_BYTE: depth == CV_16U  ? NPY_USHORT: depth == CV_16S  ? NPY_SHORT: depth == CV_32S  ? NPY_INT: depth == CV_32F  ? NPY_FLOAT: depth == CV_64F  ? NPY_DOUBLE: f * NPY_ULONGLONG + (f ^ 1) * NPY_UINT;int i, dims = dims0;cv::AutoBuffer<npy_intp> _sizes(dims + 1);for (i = 0; i < dims; i++)_sizes[i] = sizes[i];if (cn > 1)_sizes[dims++] = cn;PyObject *o = PyArray_SimpleNew(dims, _sizes, typenum);if (!o)CV_Error_(Error::StsError,("The numpy array of typenum=%d, ndims=%d can not be created", typenum, dims));return allocate(o, dims0, sizes, type, step);}bool allocate(UMatData *u, int accessFlags,UMatUsageFlags usageFlags) const{return stdAllocator->allocate(u, accessFlags, usageFlags);}void deallocate(UMatData *u) const{if (u){PyEnsureGIL gil;PyObject *o = (PyObject *)u->userdata;Py_XDECREF(o);delete u;}}const MatAllocator *stdAllocator;
#endif};NumpyAllocator g_numpyAllocator;NDArrayConverter::NDArrayConverter() { init(); }void NDArrayConverter::init(){import_array();}cv::Mat NDArrayConverter::toMat(PyObject *o){cv::Mat m;if (!o || o == Py_None){if (!m.data)m.allocator = &g_numpyAllocator;}if (!PyArray_Check(o)){failmsg("toMat: Object is not a numpy array");}int typenum = PyArray_TYPE(o);int type = typenum == NPY_UBYTE ? CV_8U : typenum == NPY_BYTE                     ? CV_8S: typenum == NPY_USHORT                     ? CV_16U: typenum == NPY_SHORT                      ? CV_16S: typenum == NPY_INT || typenum == NPY_LONG ? CV_32S: typenum == NPY_FLOAT                      ? CV_32F: typenum == NPY_DOUBLE                     ? CV_64F: -1;if (type < 0){failmsg("toMat: Data type = %d is not supported", typenum);}int ndims = PyArray_NDIM(o);if (ndims >= CV_MAX_DIM){failmsg("toMat: Dimensionality (=%d) is too high", ndims);}int size[CV_MAX_DIM + 1];size_t step[CV_MAX_DIM + 1], elemsize = CV_ELEM_SIZE1(type);const npy_intp *_sizes = PyArray_DIMS(o);const npy_intp *_strides = PyArray_STRIDES(o);bool transposed = false;for (int i = 0; i < ndims; i++){size[i] = (int)_sizes[i];step[i] = (size_t)_strides[i];}if (ndims == 0 || step[ndims - 1] > elemsize){size[ndims] = 1;step[ndims] = elemsize;ndims++;}if (ndims >= 2 && step[0] < step[1]){std::swap(size[0], size[1]);std::swap(step[0], step[1]);transposed = true;}if (ndims == 3 && size[2] <= CV_CN_MAX && step[1] == elemsize * size[2]){ndims--;type |= CV_MAKETYPE(0, size[2]);}if (ndims > 2){failmsg("toMat: Object has more than 2 dimensions");}m = Mat(ndims, size, type, PyArray_DATA(o), step);if (m.data){
#if (CV_MAJOR_VERSION < 3)m.refcount = refcountFromPyObject(o);m.addref(); // protect the original numpy array from deallocation// (since Mat destructor will decrement the reference counter)
#elsem.u = g_numpyAllocator.allocate(o, ndims, size, type, step);m.addref();Py_INCREF(o);// m.u->refcount = *refcountFromPyObject(o);
#endif};m.allocator = &g_numpyAllocator;if (transposed){Mat tmp;tmp.allocator = &g_numpyAllocator;transpose(m, tmp);m = tmp;}return m;}PyObject *NDArrayConverter::toNDArray(const cv::Mat &m){if (!m.data)Py_RETURN_NONE;Mat temp;Mat *p = (Mat *)&m;
#if (CV_MAJOR_VERSION < 3)if (!p->refcount || p->allocator != &g_numpyAllocator){temp.allocator = &g_numpyAllocator;m.copyTo(temp);p = &temp;}p->addref();return pyObjectFromRefcount(p->refcount);
#elseif (!p->u || p->allocator != &g_numpyAllocator){temp.allocator = &g_numpyAllocator;m.copyTo(temp);p = &temp;}// p->addref();// return pyObjectFromRefcount(&p->u->refcount);PyObject *o = (PyObject *)p->u->userdata;Py_INCREF(o);return o;
#endif}
}

 终端执行以下命令进行编译:

conda activate MaskRCNN
cd DynaSLAM
chmod +x build.sh
./build.sh

若报出以下错误: 

终端执行以下命令安装: 

sudo apt-get install python2.7-dev

若还有其他的错误,按照对应的包即可解决。 

安装完后,重新编译即可。重新编译时把前一次编译生成的​build文件删除。

五、DynaSLAM运行

运行时需要先激活创建的虚拟环境:

conda activate MaskRCNN

创建dataset文件夹,将数据集文件rgbd_dataset_freiburg3_walking_xyz放在dataset下,如果不知道如何生成associations.txt关联文件,以下这两篇均有提到:

使用evo工具/rgbd_benchmark_tools评估TUM RGB-D数据集_orb-slam3 评测工具evo-CSDN博客

 YOLO_ORB_SLAM3编译运行_yolo-orb-slam3-CSDN博客

在DynaSLAM目录下打开终端,执行以下命令:

./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt ./Examples/RGB-D/TUM3.yaml ./dataset/rgbd_dataset_freiburg3_walking_xyz/ ./dataset/rgbd_dataset_freiburg3_walking_xyz/associations.txt ./dataset/mask ./dataset/output

如果运行时报以下错误:Light Tracking not working because Tracking is not initialized...

Geometry not working.

可以将DynaSLAM/Examples/RGB-D/TUM3.yaml文件里的ORBextractor.nFeatures参数值由1000改为3000。或再检查一下需要修改的文件内容有没有全部修改。

运行成功画面如下:

相关文章:

Ubuntu20.04安装运行DynaSLAM

目录 一、安装Anaconda 二、相关依赖库安装 1、boost安装 2、Eigen 3安装 3、opencv安装 4、Pangolin安装 三、配置Mask_RCNN环境 四、DynaSLAM编译 五、DynaSLAM运行 一、安装Anaconda 打开以下链接&#xff1a; Index of / 下载和自己系统匹配的安装包。这里下…...

Apache Shiro反序列化漏洞深度剖析:从原理到利用

引言 在Web安全的世界里&#xff0c;反序列化漏洞一直是最危险的漏洞类型之一。今天&#xff0c;我们将深入探讨Apache Shiro框架中的两个著名反序列化漏洞.通过通俗易懂的解释和详细的实例&#xff0c;帮助你理解这类漏洞的本质和危害。 Shiro框架与"记住我"功能简…...

Android UI 组件系列(二):Button 进阶用法

引言 在上一篇博客中&#xff0c;我们介绍了 Button 的基本用法和常见属性&#xff0c;掌握了 Button 的基础知识。然而&#xff0c;在实际开发中&#xff0c;Button 远不止于简单的点击功能&#xff0c;它还可以支持不同的变体、丰富的自定义样式&#xff0c;以及更灵活的状态…...

CentOS-7安装Docker(更新时间:2025-03-12)

CentOS-7安装Docker 该文章记录在CentOS 7上安装Docker的过程和步骤&#xff0c;以及在安装过程中遇到的困难和解决方案。 目录 CentOS-7安装Docker一、环境准备二、安装Docker1.验证服务器是否接入互联网2. 检查CentOS内核版本3.使用root权限登录CentOS。确保yum包更新到最新…...

网络空间安全(31)安全巡检

一、定义与目的 定义&#xff1a; 安全巡检是指由专业人员或特定部门负责&#xff0c;对各类设施、设备、环境等进行全面或重点检查&#xff0c;及时发现潜在的安全隐患或问题。 目的&#xff1a; 预防事故发生&#xff1a;通过定期的安全巡检&#xff0c;及时发现并解决潜在的…...

Kubernetes学习笔记-移除Nacos迁移至K8s

项目服务的配置管理和服务注册发现由原先的Nacos全面迁移到Kubernetes上。 一、移除Nacos 移除Nacos组件依赖。 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <…...

Docker 构建 nginx-redis-alpine 项目详解

Docker 构建 nginx-redis-alpine 项目详解 一、课程概述 嘿&#xff0c;朋友们&#xff01;今天咱们要深入探索一个超级实用的项目 ——nginx-redis-alpine&#xff01;这个项目可不简单&#xff0c;它包含了好多重要的知识点&#xff0c;像文件目录结构、核心文件的作用及配…...

【教学类-43-26】20240312 数独4宫格的所有可能(图片版 576套样式,空1格-空8格,每套65534张*576小图=3千万张小图)

背景需求&#xff1a; 之前做了三宫格所有可能图片 510小图*12套6120图&#xff0c;所以3分钟就生成了 【教学类-43-25】20240311 数独3宫格的所有可能&#xff08;图片版 12套样式&#xff0c;空1格-空8格&#xff0c;每套510张&#xff0c;共6120小图&#xff09;-CSDN博客…...

ChromeOS 134 版本更新

ChromeOS 134 版本更新 一、ChromeOS 134 更新内容 1. ChromeOS 自助终端&#xff08;Kiosk&#xff09;模式支持隔离 Web 应用&#xff08;Isolated Web Apps&#xff09; 从 ChromeOS 134 开始&#xff0c;自助终端&#xff08;Kiosk&#xff09;模式支持 隔离 Web 应用&a…...

Redis面试篇

目录 Redis面试篇 1.什么是Redis&#xff1f;作用是什么&#xff1f; 2.什么是缓存穿透、缓存击穿、缓存雪崩 2.1缓存穿透 2.2缓存击穿 2.3缓存雪崩 3.redis如何持久化 1. RDB&#xff08;快照存储&#xff09; 2. AOF&#xff08;追加日志&#xff09; 4.Redis 的过…...

C#中通过Response.Headers设置自定义参数

一、基础设置方法 1. 直接添加自定义头 // ASP.NET Core方案 Response.Headers.Append("X-API-Version", "2.3.1"); Response.Headers.Append("Custom-Auth-Token", Guid.NewGuid().ToString());• 底层原理&#xff1a;通过IHeaderDictionary…...

C++标准模板库学习--函数模板返回值参数类型

template<typename T1, typename T2> 2 T1 max (T1 a, T2 b) 3 { 4 return b < a ? a : b; 5 } 6 ... 7 auto m ::max(4, 7.2); // OK, 不过返回类型与第一个参数类型一样 如何解决模板的返回类型 法一&#xff0c;使用decltype进行类型推断&#xff0c;在编译时…...

BUG修复 | 一次钉钉工作台应用远程调试实战(开发者工具)

#1 ℹ️背景故事 最近用户反馈&#xff0c;钉钉工作台的应用无法正常使用&#xff0c;卡在自动登录页面。 天&#xff0c;这是运行10年的老程序&#x1f631;&#xff0c;我当时真是吓得不轻。这老古董完全不记得怎么改了&#x1f602;。 #2 &#x1f41e;开启远程调试 钉钉…...

[目标检测] 训练之前要做什么

背景&#xff1a;训练一个Yolo8模型&#xff0c;在训练之前&#xff0c;数据集的处理是影响效果的关键因素。 Step1 定义规则 什么是人/车&#xff0c;比如人的话可能是站着的人&#xff0c;如果是骑电动车/自行车就不算是人。 Step2 收集数据集 1. 自己标注。如果是自己标…...

一窥DeepSeek开源EPLB项目:揭开技术背后的面纱

摘要 在DeepSeek开源DualPipe项目的同一天&#xff0c;EPLB项目也正式对外公开。EPLB&#xff08;Enhanced Pipeline Balancing&#xff09;并非一蹴而就的奇迹&#xff0c;而是经过长时间的研发与优化。该项目旨在通过改进管道平衡机制&#xff0c;提升系统的稳定性和效率。本…...

达梦数据库中插入导出图片的方法与应用

达梦数据库中插入导出图片的方法与应用 在数据库的实际应用场景中&#xff0c;图片存储是一项常见且重要的需求。以电商平台为例&#xff0c;商品展示图片是吸引消费者的关键元素&#xff1b;而在社交软件里&#xff0c;用户头像更是个人形象的直观体现。针对达梦数据库&#…...

问deepseek: OpenFOAM并行分区后,是如何实现ldumatrix矩阵向量乘法计算逻辑的?

在OpenFOAM中&#xff0c;lduMatrix 是用于存储稀疏矩阵的类&#xff0c;支持并行计算。并行分区后&#xff0c;lduMatrix 的矩阵向量乘法通过以下步骤实现&#xff1a; 1. 矩阵分区 分区&#xff1a;将矩阵和向量分配到多个处理器上&#xff0c;每个处理器负责一部分。接口&…...

linux(ubuntu)中Conda、CUDA安装Xinference报错ERROR: Failed to build (llama-cpp-python)

文章目录 一、常规办法二、继续三、继续四、缺少 libgomp库&#xff08;最终解决&#xff09;在 Conda 环境中安装 libgomp 如果符合标题情况 执行的&#xff1a; pip install "xinference[all]"大概率是最终解决的情况。 一、常规办法 llama-cpp-python 依赖 CMak…...

蓝耘携手通义万象 2.1 图生视频:开启创意无限的共享新时代

在科技飞速发展的今天&#xff0c;各种新奇的技术不断涌现&#xff0c;改变着我们的生活和工作方式。蓝耘和通义万象 2.1 图生视频就是其中两项非常厉害的技术。蓝耘就像是一个超级大管家&#xff0c;能把各种资源管理得井井有条&#xff1b;而通义万象 2.1 图生视频则像是一个…...

04 1个路由器配置一个子网的dhcp服务

前言 这是最近一个朋友的 ensp 相关的问题, 这里来大致了解一下 ensp, 计算机网络拓扑 相关基础知识 这里一系列文章, 主要是参照了这位博主的 ensp 专栏 这里 我只是做了一个记录, 自己实际操作了一遍, 增强了一些 自己的理解 当然 这里仅仅是一个 简单的示例, 实际场景…...

Android studio运行报错处理

没装HAXM报错&#xff1a; Intel HAXM 7.6.5 下载 下载链接&#xff1a; https://www.filehorse.com/download-intel-haxm/54766/download/#google_vignette 运行时弹窗提示&#xff1a;Device manager The emulator process for AVD Pixel_3a_API_34_extension_level_7_x86_6…...

【CXX】6.7 SharedPtr<T> — std::shared_ptr<T>

std::shared_ptr 的 Rust 绑定称为 SharedPtr。 限制&#xff1a; SharedPtr 不支持 T 为不透明的 Rust 类型。对于在语言边界上传递不透明 Rust 类型的所有权&#xff0c;应改用 Box&#xff08;C 中的 rust::Box&#xff09;。 示例 // src/main.rsuse std::ops::Deref; …...

NocoBase 本周更新汇总:双因素身份认证(2FA)

原文链接&#xff1a;https://www.nocobase.com/cn/blog/weekly-updates-202503013 汇总一周产品更新日志&#xff0c;最新发布可以前往我们的博客查看。 本周我们发布了 NocoBase 1.6.0 版本&#xff0c;带来集群模式部署、安全策略优化和迁移管理等多项新特性。 NocoBase …...

【Go学习】04-1-Gin框架-路由请求响应参数

【Go学习】04-1-Gin框架 初识框架go流行的web框架GinirisBeegofiber Gin介绍Gin快速入门 路由RESTful API规范请求方法URI静态url路径参数模糊匹配 处理函数分组路由 请求参数GET请求参数普通参数数组参数map参数 POST请求参数表单参数JSON参数 路径参数文件参数 响应字符串方式…...

DataX的python3使用

datax这东西本身是python2写的&#xff0c;这导致python3&#xff0c;就各种语法报错&#xff0c;问题是&#xff0c;现在的工程都是python3搞的&#xff0c;这就很难受.... 网上找到一篇帖子&#xff0c;可以解决这个问题&#xff1a; 原帖&#xff1a;python3执行datax报错…...

部署项目至服务器:响应时间太长,无法访问此页面?

在我们部署项目到服务器上的时候&#xff0c;一顿操作猛如虎&#xff0c;打开页面..... 这里记录一下这种情况是怎么回事。一般就是服务器上的安全组没有放行端口。 因为我是用宝塔进行项目部署的。所以遇到这种情况&#xff0c;要去操作两边&#xff08;宝塔and服务器所属平台…...

Map<String,Object>中Fastjson提取entrys对应的值

今天在处理接口数据时&#xff0c;需要解析出对方传入的json数据&#xff0c;并需要取出其中一个字段的值来判断&#xff0c;记录下我的步骤&#xff0c;提供参考&#xff1a; 1.json数据准备 {"hrOrgUnit": "00000000-0000-0000-0000-000000000000CCE7AED4&q…...

【毕业论文格式】word分页符后的标题段前间距消失

文章目录 【问题描述】 分页符之后的段落开头&#xff0c;明明设置了标题有段前段后间距&#xff0c;但是没有显示间距&#xff1a; 【解决办法】 选中标题&#xff0c;选择边框 3. 选择段前间距&#xff0c;1~31磅的一个数 结果...

Android,Java,Kotlin 确保线程顺序执行的多种实现方式

在多线程编程中&#xff0c;有时需要确保一个线程必须等待另一个线程执行完毕后再执行。本文将介绍几种常见的方法来实现这一需求&#xff0c;并提供详细的代码示例。 1. 使用 Thread.join() Thread.join() 是最简单直接的方法&#xff0c;它会让当前线程等待目标线程执行完毕…...

AWK 入门教程:强大的文本处理工具

AWK 是一种强大的文本处理工具&#xff0c;广泛用于 Linux/Unix 系统中对文本文件或数据流进行操作。它能够基于条件筛选、统计字段、重新排列数据等。主要特点包括&#xff1a; 2. AWK 的基本语法 2.1 AWK 程序的结构 AWK 程序的结构: awk pattern { action } file 2.2 常…...

【Linux】在VMWare中安装Ubuntu操作系统(2025最新_Ubuntu 24.04.2)#VMware安装Ubuntu实战分享#

今天田辛老师为大家带来一篇关于在VMWare虚拟机上安装Ubuntu系统的详细教程。无论是学习、开发还是测试&#xff0c;虚拟机都是一个非常实用的工具&#xff0c;它允许我们在同一台物理机上运行多个操作系统。Ubuntu作为一款开源、免费且用户友好的Linux发行版&#xff0c;深受广…...

基于yolov8+streamlit实现目标检测系统带漂亮登录界面

【项目介绍】 基于YOLOv8和Streamlit实现的目标检测系统&#xff0c;结合了YOLOv8先进的目标检测能力与Streamlit快速构建交互式Web应用的优势&#xff0c;为用户提供了一个功能强大且操作简便的目标检测平台。该系统不仅具备高精度的目标检测功能&#xff0c;还拥有一个漂亮且…...

安装 Powerlevel10k 及 Oh My Zsh 的使用

1. 简介 Powerlevel10k 是 Oh My Zsh 最流行的终端主题&#xff0c;它不仅美观&#xff0c;还提供 Git 状态显示、命令执行时间、网络状态、Python 虚拟环境指示等 实用功能。相比其他主题&#xff0c;Powerlevel10k 速度更快、可定制性更强。 本教程将详细介绍如何安装 Powe…...

虚拟机下ubuntu进不了图形界面

6.844618] piix4_smbus 0000:07.3: SMBus Host ContrFoller not enabled! 7.859836] sd 2:0:0:0:0: [sda] Assuming drive cache: wirite through /dev/sda1: clean, 200424/1966080 files, 4053235/7864064 blocks ubuntu启动时&#xff0c;卡在上面输出位置 当前遇到的原因…...

从 root 一滴水看 Spring Data JPA 的汪洋大海

&#x1f525; 从 root 一滴水看 Spring Data JPA 的汪洋大海 &#x1f30a; 在 Spring Data JPA 的世界里&#xff0c;Specification 是个让人又爱又恨的家伙 &#x1f4a1;。它能帮你动态构建查询&#xff0c;但那个神秘的 Root<T> root 却总让人摸不着头脑&#xff1…...

二进制安装指定版本的MariaDBv10.11.6

一、官网下载mariadb安装包 Download MariaDB Server - MariaDB.org 找到对应的版本 下载安装包后上传到服务器这里不再赘述。 二、安装二进制包 1、解压安装包 2、查看安装包内的安装提示文档根据提示文档进行安装 # 解压安装包 tar xf mariadb-10.11.6-linux-systemd-x8…...

日志Python安全之SSTI——Flask/Jinja2

ssti的概念和模板引擎介绍等基础知识前面已经学过了&#xff0c;接下来直接进入正题 先了解flask/jinja2&#xff1a; flask&#xff1a; 用python编写的一个框架&#xff0c;集成 Jinja2 模板引擎&#xff08;用于动态生成 HTML 内容&#xff09;。 Flask 的核心组件&…...

梯度下降法以及随机梯度下降法

梯度下降法就是在更新weight的时候&#xff0c;向函数值下降的最快方向进行更新&#xff0c;具体的原理我就不再写了&#xff0c;就是一个求偏导的过程&#xff0c;有高数基础的都能够很快的理解过程。我在我的github里面会一直更新自己学习pytorch的过程&#xff0c;地址为&am…...

从零基础到能独立设计单片机产品,一般需要经历哪些学习阶段?

相信很多人&#xff0c;内心都有“钢铁侠”的幻想&#xff0c;成为能写程序&#xff0c;能设计硬件&#xff0c;能设计结构&#xff0c;能焊接的全能型人才。 上次徐工问我&#xff0c;如果你财富自由了&#xff0c;想去做啥&#xff1f; 我说出来&#xff0c;可能大家都不信&a…...

ORACLE 19.8版本遭遇ORA-600 [kqrHashTableRemove: X lock].宕机的问题分析

客户反馈单机环境的一个数据库半夜突然宕机了&#xff0c;这是一个比较重要的系统&#xff1b;接到通知后分析对应日志&#xff0c;发现ALERT日志中有明显报错&#xff1a;ORA-600 [kqrHashTableRemove: X lock]. 600报错我简单的分为2类&#xff0c;一类不会导致宕机&#x…...

OpenCV实现图像分割与无缝合并

一、图像分割核心方法 1、阈值分割 #include <opencv2/opencv.hpp> using namespace cv; int main() {Mat img imread("input.jpg", IMREAD_GRAYSCALE);Mat binary;threshold(img, binary, 127, 255, THRESH_BINARY); // 固定阈值分割imwrite("binary.…...

《AI浪潮中的璀璨新星:Meta Llama、Ollama与DeepSeek的深度剖析》:此文为AI自动生成

《AI浪潮中的璀璨新星&#xff1a;Meta Llama、Ollama与DeepSeek的深度剖析》&#xff1a;此文为AI自动生成 引言&#xff1a;AI 大模型的群雄逐鹿时代 在科技飞速发展的当下&#xff0c;AI 大模型领域已成为全球瞩目的焦点&#xff0c;竞争激烈程度堪称白热化。从 OpenAI 推出…...

如何搭建个人静态住宅IP:从零开始

你好&#xff01;今天我们将一起探索如何从头开始搭建个人静态住宅IP。无论您是为了远程办公、在线教育还是游戏加速&#xff0c;静态住宅IP都能带给您更稳定的网络体验。 一、准备阶段 1. 明确需求 首先&#xff0c;您需要清楚自己为什么需要静态住宅IP。可能是为了实现远程…...

机器人触觉的意义

机器人触觉的重要性 触觉在机器人领域至关重要&#xff0c;尤其是在自主操作、精细操控、人机交互等方面。虽然视觉和语音技术已高度发展&#xff0c;但机器人在现实世界中的操作仍然受限&#xff0c;因为&#xff1a; 视觉有局限性&#xff1a;仅凭视觉&#xff0c;机器人难…...

【赵渝强老师】达梦数据库的目录结构

达梦数据库安装成功后&#xff0c;通过使用Linux的tree命令可以非常方便地查看DM 8的目录结构。 tree -L 1 -d /home/dmdba/dmdbms#输出的信息如下&#xff1a; /home/dmdba/dmdbms ├── bin 存放DM数据库的可执行文件&#xff0c;例如disql命令等。 ├── bin2 ├── d…...

centos7使用gpu加速的MinerU

https://mineru.readthedocs.io/zh-cn/latest/user_guide/install/boost_with_cuda.html 由于官方只有ubantu的安装教程&#xff0c;并没有基于centos7的&#xff0c;故需要自己修改命令安装并使用。 在运行此 Docker 容器之前&#xff0c;您可以使用以下命令检查您的设备是否…...

反射、反射调用以及修改成员变量,成员方法,构造函数、反射的应用

DAY11.2 Java核心基础 反射&#xff08;第二弹&#xff09; 第一弹请访问链接&#xff1a; 反射&#xff08;第一篇&#xff09; getMethod(String name, Class… parameterTypes)getMethods()getDeclaredMethod(String name,Class… parameterTypes)getDeclaredMethods() …...

对Spring的每种事务传播级别的应用场景和失效场景

好的&#xff0c;下面针对Spring的每种事务传播级别&#xff0c;详细说明其应用场景和失效场景&#xff0c;帮助更好地理解它们的实际使用。 1. REQUIRED&#xff08;默认&#xff09; 应用场景&#xff1a; 大多数业务方法&#xff0c;尤其是需要事务支持的操作。例如&#x…...

DeepSeek linux服务器(CentOS)部署命令笔记

Linux&#xff08;CentOS&#xff09;FinalShellOllama远程访问&#xff0c;本地部署deepseek 自备CentOS服务器&#xff0c;并且已经使用FinalShell连接到服务器 一、准备工作 1.更新服务器 apt-get update-y 2.下载Ollama curl -fsSL https://ollama.com/install.sh | …...

阿里巴巴发布 R1-Omni:首个基于 RLVR 的全模态大语言模型,用于情感识别

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...