64位系统树莓派部署yolo-fatestv2---超多坑

2023-11-19

最近在研究yolo-fastest,开始面对作者大大的一堆部署的指令在pycharm的终端里面一顿操作,然后一路报错,后来才发现原来都是linux的指令...后来在虚拟机上也尝试部署过,成功之后本来想直接挪到树莓派上,但是尝试许久都以失败告终,当然最后都是成功跑起来了,过程比较曲折,但是也学到了不少东西,做个记录。

下面就opencv的安装,ncnn的部署,模型的移植和一些关于模型的修改展开

1.opencv的安装

首先是numpy

sudo pip3 install numpy

然后是opencv所需的依赖

sudo apt-get install build-essential git cmake pkg-config -y
sudo apt-get install libjpeg8-dev -y
sudo apt-get install libtiff5-dev -y
sudo apt-get install libjasper-dev -y
sudo apt-get install libpng12-dev -y

sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev -y

sudo apt-get install libgtk2.0-dev -y
sudo apt-get install libatlas-base-dev gfortran -y

在安装的过程中会遇到一些问题,最多的就是依赖的问题,这时候可以先

sudo apt-get aptitude

这个工具比较神奇,如果报依赖错误的话可以把apt-get换成aptitude,接下来他就会给你一些解决方案自己选

如果也不行的话那可以考虑换源,换成国内源,比如清华源,最终我自己实际上并没有都安装成功,但是最后也跑起来了,所以如果所有方法都尝试了都不行可以往下走

 这是我自己安装的情况,打问号的是没安装成功的,暂时没遇到问题

安装好依赖之后就可以下载opencv

需要下载Opencv和OpenCV_Contrib两个压缩包,链接如下,可能要打开好几次才能进去,我是尝试了好几次

OpenCV:Github
OpenCV_Contrib:Github

4.x代表四点几的版本,后面的tags是细分,可以自行选择,我安装的是4.5.5

选好版本之后点击Download ZIP下载,两个都要下载,然后传送到树莓派的/home/pi/Downloads目录下面,当然也可以是其他目录。

传文件用filezilla,这个可以传文件夹比较方便,只要把需要的文件夹拖到对应目录就可以

客户端 - FileZilla中文网

这里补充一下我当时在这里遇到的两个问题

第一个就是连不上树莓派,输入的地址完全正确但就是连不上

 之后我把端口改成了22莫名其妙就连上了,不知道什么原理

还有一个问题就是传送失败,传送到/home/pi/Downloads下面应该没什么问题,但是其他目录就会传送失败,这时候可以考虑把需要传到的地址的权限打开

sudo chmod -R 777 文件名

 文件名也就是路径,比如想要往/mnt里面写东西,文件名就写/mnt

ok回归正题,传送好之后应该是这样

划掉的是没有的,就两压缩包

然后就是解压

cd /home/pi/Downloads
unzip opencv-版本.zip   
unzip opencv_contrib-版本.zip
// 版本填你自己的

接下来是cmake

进入下载的解压后的opencv,然后创建build文件夹,进行配置

cd /home/pi/Downloads/opencv-版本
mkdir build
cd build

调好cmake的参数,然后执行

cmake -D CMAKE_BUILD_TYPE=BULLSEYE -D CMAKE_INSTALL_PREFIX=/usr/local -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D OPENCV_EXTRA_MODULES_PATH=/home/pi/Downloads/opencv_contrib-4.5.5/modules -D BUILD_EXAMPLES=ON -D WITH_LIBV4L=ON -D PYTHON3_EXECUTABLE=/usr/lib/python3.9 -D PYTHON_INCLUDE_DIR=/usr/include/python3.9 -D PYTHON_LIBRARY=/usr/lib/aarch64-linux-gnu/libpython3.9.so -D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/lib/python3/dist-packages/numpy/core/include ..

参数解释

CMAKE_BUILD_TYPE=RELEASE \ 代表编译类型为发行版本
CMAKE_INSTALL_PREFIX=/usr/local \ 安装路径
INSTALL_C_EXAMPLES=ON \ C demo
INSTALL_PYTHON_EXAMPLES=ON \ Python demo
OPENCV_EXTRA_MODULES_PATH=/home/pi/Downloads/opencv_contrib-4.5.5/modules \ OpenCV Contrib路径
BUILD_EXAMPLES=ON \ 编译demo
WITH_LIBV4L=ON \ 开启Video for Linux
PYTHON3_EXECUTABLE=/usr/lib/python3.9 \ Python3路径
PYTHON_INCLUDE_DIR=/usr/include/python3.9 \ Python3 include文件夹
PYTHON_LIBRARY=/usr/lib/arm-linux-gnueabihf/libpython3.9.so \ Python3库
PYTHON3_NUMPY_INCLUDE_DIRS=/usr/lib/python3/dist-packages/numpy/core/include \ Python3 Numpy安装路径

当然每个人的参数是不一样的,如果不知道有些文件在哪,那就需要针对性的去找,找文件的指令如下

find / -name 文件名

比如想要找libpython3.9.so那就在终端输入find / -name libpython3.9.so,找到了会返回给你路径,不过似乎是是对于/home/pi的相对路径,可以自己顺着去找到相应文件再复制路径,要用绝对路径 

编译

在build目录下面执行命令

make

这一步需要很长时间,我大概花了八个小时?也许还不止?可能是我的问题。中间卡住了好几次,就是直接断联一样,点击也没反应,后来查了一下可能跟默认的交换空间小也有一点关系。

下面是如何扩充交换空间的链接

https://blog.csdn.net/weixin_43053387/article/details/89204760?ops_request_misc=&request_id=&biz_id=102&utm_term=%E6%A0%91%E8%8E%93%E6%B4%BE%E5%BE%88%E5%8D%A1&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-4-89204760.142^v31^pc_rank_34,185^v2^control&spm=1018.2226.3001.4187

我当时照着做了,后来也没快多少,但确实没卡死过

接下来是安装

sudo make insall

 最后还需要告诉机器你的opencv在哪里,这就需要写一个.pc文件

cd /usr/local/lib/pkgconfig
sudo touch opencv.pc                                 

可能你的lib里面没有pkgconfig文件夹,手动创建一个然后再执行

打开opencv.pc,在里面写入
 

prefix=/usr/local
exec_prefix=${prefix}
includedir=${prefix}/include
libdir=${exec_prefix}/lib
 
Name: opencv
Description: The opencv library
Version:4.0.1
Cflags: -I${includedir}/opencv4
Libs: -L${libdir} -lopencv_shape -lopencv_stitching -lopencv_objdetect -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann  -lopencv_core
~        

自己改掉版本,其他应该不用改 

理论上到了这一步opencv就算安装完成了,但实际上还得看测试[狗头][狗头][狗头]

测试

先是py的测试

import cv2
cv2.__version__

能输出版本就算成功了

然后是c++的测试,这个比较重要,跟要部署的yolo-fastestv2还是有挺大关系的

当然以下代码是抄的别人的

随便找一个目录,创建一个test文件夹

mkdir test
cd test

创建一个demo test_opencv.cpp文件,写进测试程序

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
 
int main(int argc, const char * argv[]) {
    Mat image;
    VideoCapture capture(0);//打开摄像头
    while(1){
    	capture>>image;
	    imshow("test",image);
	    waitKey(20);
    }
}

然后创建一个CMakeLists.txt编译用

cmake_minimum_required(VERSION 2.6)
project(test_opencv)
find_package(OpenCV REQUIRED)
add_executable(test_opencv test_opencv.cpp)
target_link_libraries(test_opencv ${OpenCV_LIBS})

cpp所在目录下编译运行

​cmake .
make 
./test_opencv

当时在这里卡了很久,因为64位操作系统移除了对摄像头的一些驱动的支持,导致摄像头打不开。

如果你也有同样问题的话可以参考这篇文章:

树莓派4b 64bit无法使用 Pi Camera V2 的解决办法 - DouSTN - 博客园

不出意外到这里opencv就告一段落了。接下来是ncnn的部署。

2.ncnn的部署

打开终端,输入以下命令,建议一个一个来,方便定位错误

git clone https://github.com/Tencent/ncnn.git
cd ncnn
makedir build && cd build
cmake ../
make
make install

不出意外你的/home目录下面应该就已经多出了ncnn文件夹

然后把ncnn中build的install下的三个文件拷贝到你的项目yolo-fastest的sample/ncnn中,把三个替换掉

这样就已经安装好ncnn了,这个应该会比较顺利。

然后测试一下,cd到项目的ncnn的目录下执行以下命令

sh build.sh
./demo

3.模型转换

那么如何把windows下的训练好的模型转到树莓派中?我自己是在虚拟机中完成的,因为直接把虚拟机里面跑起来的模型在树莓派也能跑,所以应该也不会差太多。

下面是作者大大原话,也就是先转模型再简化得到onnx,这些都是在pycharm的终端中完成的,,记得改参数。

转换模型

python3 pytorch2onnx.py --data data/coco.data --weights modelzoo/coco2017-0.241078ap-model.pth --output yolo-fastestv2.onnx

 简化模型

python3 -m onnxsim yolo-fastestv2.onnx yolo-fastestv2-opt.onnx

 然后得到一个onnx模型,把这个传到树莓派(我自己是传到虚拟机,道理一样)

接下来是转换参数,也就是要把我们训练出来的参数换到项目中去

作者是这样写的

cd ncnn/build/tools/onnx
./onnx2ncnn yolo-fastestv2-opt.onnx yolo-fastestv2.param yolo-fastestv2.bin
cp yolo-fastestv2* ../
cd ../
./ncnnoptimize yolo-fastestv2.param yolo-fastestv2.bin yolo-fastestv2-opt.param yolo-fastestv2-opt.bin 1
cp yolo-fastestv2-opt* ~/Yolo-FastestV2/sample/ncnn/model

 我当时是蒙了挺久的,你要是直接复制这个到终端一执行估计也是直接破防。

下面就我的理解来解释一下。

首先刚开始的第一句没有任何问题,也就是转到下载的ncnn的onnx目录下,接下来这一句就比较坑,为什么说比较坑,因为这里的后面三个参数都相当于变量,所以你自己写的话就需要告诉计算机这些东西到底在哪里,第二个代表你自己的onnx的模型,后面两个也就是转换成的模型参数,一定要写这些文件的地址,我建议是绝对路径,方便自己找

./onnx2ncnn /hgfs/share/onnx_s/yolo-fastestv2.onnx /hgfs/share/Yolo-FastestV2-main/sample/ncnn/model/yolo-fastestv2-opt.param /hgfs/share/Yolo-FastestV2-main/sample/ncnn/model/yolo-fastestv2-opt.bin

后面也就是用转换出来的参数来替换你的项目文件yolo-fastest的目录下sample/ncnn/model的参数,我就直接把路径写到里面了,也就是执行完就直接替换掉了

4.一些修改 

首先对于这样的一个项目我们当然不可能满足于就是检测照片,检测视频才是我们想要的。

下面是抄来的一个代码,里面有一些小改动。

#include "yolo-fastestv2.h"
#include <opencv2/highgui/highgui_c.h>
int main()
{
	// ÕâžöÊÇÀà±ð,±ð˵Äã²»»ážÄ.
	/*
	static const char* class_names[] = {
		"person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck", "boat", "traffic light",
		"fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat", "dog", "horse", "sheep", "cow",
		"elephant", "bear", "zebra", "giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee",
		"skis", "snowboard", "sports ball", "kite", "baseball bat", "baseball glove", "skateboard", "surfboard",
		"tennis racket", "bottle", "wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple",
		"sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair", "couch",
		"potted plant", "bed", "dining table", "toilet", "tv", "laptop", "mouse", "remote", "keyboard", "cell phone",
		"microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors", "teddy bear",
		"hair drier", "toothbrush"
	};
	*/
	static const char* class_names[] = {
		"person",
		"cat",
		"motorbike",
		"bicycle"
	};
	
	//   ÕâžöÒ²ÊÇÀà±ð.
	//    static const char* class_names[] = {
	//        "airplane", "ship", "storage tank", "baseball diamond", "tennis court",
	//        "basketball court", "ground track field", "harbor", "bridge", "vehicle"
	//    };
		//ÔÚyolo-fastestv2.h ÖÐ, ÓÐÒ»žöÀຯÊý  yoloFastestv2
	yoloFastestv2 api;
	//  ¶ÁÈ¡Ä£ÐÍ
	//¶ÁÈ¡Ä£ÐÍ£¬µØÖ·ÒªžÄ?
	api.loadModel("./model/yolo-fastestv2-opt.param",
		"./model/yolo-fastestv2-opt.bin");

	//cv::Mat cvImg = cv::imread("058.jpg");
	// VectorÈÝÆ÷ÖÐŽæ·Å×Ô¶šÒåÊýŸÝÀàÐÍ,Žæ·ÅÄ¿±ê¿òµÄÐÅÏ¢(cls,score,x,y,w,h,area), ÔÚ yolo-fastestv2.h  ÓÐÉùÃ÷
	std::vector<TargetBox> boxes;
	cv::VideoCapture capture;
	//   Žò¿ª "person.mp4"ÎÄŒþ,žÄ³É 0 ŸÍÊÇÉãÏñÍ·.(ÊÇ 0 ²»ÊÇ "0")
	capture.open(0);
	//»ñÈ¡µ±Ç° ÊÓƵÐÅÏ¢
	cv::Size S = cv::Size((int)capture.get(cv::CAP_PROP_FRAME_WIDTH),
		(int)capture.get(cv::CAP_PROP_FRAME_HEIGHT));

	// -----------±£ŽæÊÓƵµÄŒì²âœá¹û--------------
	cv::VideoWriter outputVideo;
	
	//在这里我改过格式
	//原来的是avi格式?如下
	outputVideo.open("/hgfs/share/Yolo-FastestV2-main/sample/ncnn/out1.avi", cv::VideoWriter::fourcc('P', 'I', 'M', '1'), 30.0, S, true);
	//这个是mp4
	//outputVideo.open("./out.mp4", cv::VideoWriter::fourcc('M', 'P', '4', 'V'), 30.0, S, true);
	
	if (!outputVideo.isOpened()) {
		std::cout << "fail to open!" << std::endl;
		return -1;
	}
	// ---------------------------------

	cv::Mat frame;
	while (1) {
		capture >> frame;//¶ÁÈëÊÓƵµÄÖ¡
		if (frame.empty()) break;

		// Œì²â ÍŒÏñ,œá¹û±£ŽæÔÚ boxes
		api.detection(frame, boxes);
		// ¿ÉÊÓ»¯,»æÖÆ¿ò
		for (int i = 0; i < boxes.size(); i++) {
			std::cout << boxes[i].x1 << " " << boxes[i].y1 << " " << boxes[i].x2 << " " << boxes[i].y2
				<< " " << boxes[i].score << " " << boxes[i].cate << std::endl;

			char text[256];
			sprintf(text, "%s %.1f%%", class_names[boxes[i].cate], boxes[i].score * 100);

			int baseLine = 0;
			cv::Size label_size = cv::getTextSize(text, cv::FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine);

			int x = boxes[i].x1;
			int y = boxes[i].y1 - label_size.height - baseLine;
			if (y < 0)
				y = 0;
			if (x + label_size.width > frame.cols)
				x = frame.cols - label_size.width;

			cv::rectangle(frame, cv::Rect(cv::Point(x, y), cv::Size(label_size.width, label_size.height + baseLine)),
				cv::Scalar(255, 255, 255), -1);
			cv::putText(frame, text, cv::Point(x, y + label_size.height),
				cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(0, 0, 0));

			cv::rectangle(frame, cv::Point(boxes[i].x1, boxes[i].y1),
				cv::Point(boxes[i].x2, boxes[i].y2), cv::Scalar(255, 255, 0), 2, 2, 0);
		}

		cv::namedWindow("img", CV_WINDOW_NORMAL);
		cv::imshow("img", frame);

		// ±£Žæ ÊÓƵŒì²âÎÄŒþ
		outputVideo.write(frame); //°ÑÍŒÏñÐŽÈëÊÓƵÁ÷

		//°ŽÏÂESCÍ˳öÕûžö³ÌÐò
		//°ŽÏÂESCÍ˳öÕûžö³ÌÐò
		//°ŽÏÂESCÍ˳öÕûžö³ÌÐò
		int c = cv::waitKey(30);
		if (char(c) == 27) return -1;
	}
	//    cv::imwrite("output.png", cvImg);
		// ¹Ø±ÕÊÍ·Å
	capture.release();
	cv::waitKey(0);
	return 0;
}

 有不少乱码就不用管了,主要因为在系统之间转来转去,本来好的到虚拟机直接乱码了,主要是中文注释的几句,首先是关于类别,开始是八十个类别,但实际上自己根本用不了那么多可以直接删掉,或者注释掉自己写一个。同时在虚拟机后缀mp4似乎不能跑?我用的avi是跑起来了,同时不要忘记改动outputVideo的路径。

差不多就先写这么多吧,同时感谢文中出现的和以下几位大佬的博客

安装opencv,测试代码来源

树莓派配置opencv环境(包含c++和python)_菜鸡caiji的博客-CSDN博客_树莓派opencv环境搭建

ncnn的部署,视频代码来源

Ubuntu 安装Yolo-FastestV2 的一般流程(5),部署ncnn工程._蒼花星河的博客-CSDN博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

64位系统树莓派部署yolo-fatestv2---超多坑 的相关文章

  • 使用 OpenCV 裁剪黑色边缘

    我认为这应该是一个很简单的问题 但我找不到解决方案或有效的关键字进行搜索 我只有这个图像 黑边没有用 所以我想把它们剪掉 只留下 Windows 图标 和蓝色背景 我不想计算Windows图标的坐标和大小 GIMP 和 Photoshop
  • Python 函数前的星号[重复]

    这个问题在这里已经有答案了 我正在关注这个教程 http www pyimagesearch com 2015 04 20 sorting contours using python and opencv comment 405768 ht
  • 相机姿态估计(OpenCV PnP)

    我正在尝试使用网络摄像头从具有已知全球位置的四个基准点的图像中获取全局姿态估计 我检查了许多 stackexchange 问题和一些论文 但似乎无法得到正确的解决方案 我得到的位置数字是可重复的 但与相机移动绝不成线性比例 仅供参考 我正在
  • 编译使用Basler相机的程序

    我正在尝试使用 Basler 相机捕获图像的 C 程序来工作 我拿到 来自制造商的代码 它应该 非常容易使用 但是 链接它有 成为一场噩梦 我的 C 时代已经过去了 最近只使用 Matlab 所以我可能会犯一些愚蠢的错误 但请赐教 代码如下
  • opencv如何使用compareHist函数

    img cv2 imread mandrill png histg cv2 calcHist img 0 None 256 0 256 if len sys argv lt 2 print gt gt sys stderr Usage sy
  • 相机标定(OpenCV 2.3)-如何使用畸变参数?

    我有一组带有一些附加标记的刚体图像 我在这些标记之一中定义了一个原点坐标系 我想获得该坐标系与在相机原点定义的坐标系之间的旋转和平移 我尝试了一段时间 POSIT 以下this http goo gl cUYYt 但从未获得可接受的结果 直
  • Opencv matchTemplate 和 np.where():仅保留唯一值

    继带有马里奥硬币的 opencv 教程 https opencv python tutroals readthedocs io en latest py tutorials py imgproc py template matching p
  • 使用 opencv warpPerspective() 生成道路的自上而下视图

    我正在尝试实施逆透视映射计算与道路上另一辆车的距离 我知道在应用该函数之前我需要生成一个包含源点和目标点的变换矩阵warpPerspective 但我不知道如何计算目的地点 我在这个论坛和其他网站中搜索 但无法将第一张图片转换为第二张图片
  • 如何在opencv python中为图像添加边框

    如果我有如下图所示的图像 如何在图像周围添加边框 以便最终图像的整体高度和宽度增加 但原始图像的高度和宽度保持在中间 下面的代码添加了一个大小恒定的边框10像素到原始图像的所有四个边 对于颜色 我假设您想要使用背景的平均灰度值 这是我根据图
  • 我是否必须使用我的数据库训练 Viola-Jones 算法才能获得准确的结果?

    我尝试提取面部数据库的面部特征 但我认识到 Viola Jones 算法在两种情况下效果不佳 当我尝试单独检测眼睛时 当我尝试检测嘴巴时 运作不佳 检测图像的不同部分 例如眼睛或嘴巴 或者有时会检测到其中几个 这是不可能的情况 我使用的图像
  • 如何删除树莓派的相机预览

    我在我的 raspberryPi 上安装了 SimpleCv 并安装了用于使用相机板的驱动程序 uv4l 驱动程序 现在我想使用它 当我在 simpleCV shell Camera 0 getImage save foo jpg 上键入时
  • Python:opencv warpPerspective 既不接受 2 个也不接受 3 个参数

    我发现单应矩阵如下特征匹配 单应性教程 https docs opencv org 3 4 1 d1 de0 tutorial py feature homography html using M mask cv2 findHomograp
  • 使用opencv计算深度视差图

    我无法使用 opencv 从视差图计算深度 我知道两个立体图像中的距离是用以下公式计算的z baseline focal disparity p 但我不知道如何使用地图计算视差 我使用的代码如下 为我提供了两个图像的视差图 import n
  • Python中最相似的人脸识别

    如何使用Python和OpenCV来查找面部相似 我已成功使用 OpenCV 和 Python 使用 Haar Cascades 从多张照片中提取人脸 我现在有一个图像目录 所有这些都是不同人的面孔 我想做的是拍摄一张样本图像 然后看看它最
  • 多视图几何

    我从相距一定距离的两台相同品牌的相机捕获了两张图像 捕获了相同的场景 我想计算两个相机之间的现实世界旋转和平移 为了实现这一点 我首先提取了两张图像的 SIFT 特征并进行匹配 我现在有基本矩阵也单应性矩阵 然而无法进一步进行 有很多混乱
  • 来自连接到远程机器的相机的 Opencv 流

    我正在用 python 开发一个 wx 应用程序 用于流式传输和显示来自两个不同网络摄像头的视频 这工作正常 但现在我需要在不同的场景中执行此操作 其中两个摄像头连接在通过网络连接的 Windows 上运行的单独计算机中 我的应用程序将在机
  • opencv形态扩张滤波器作为最大滤波器

    就像中值滤波器的定义一样 我可以将 最大滤波器 定义为局部窗口 例如dst x y max 3x3 局部窗口像素 但我在opencv中找不到这样的过滤器 最接近的是 dilate 函数 然后我使用 dilate 函数的默认配置 但结果不正确
  • OpenCV C++ 如何知道每行的轮廓数进行排序?

    我有一个二值图像 https i stack imgur com NRLVv jpg在这张图片中 我可以使用重载的函数轻松地对从上到下 从左到右找到的轮廓进行排序std sort 我首先通过以下方式从上到下排序 sort contours
  • OpenCV 2.4.3 中的阴影去除

    我正在使用 OpenCV 2 4 3 最新版本 使用内置的视频流检测前景GMG http docs opencv org modules gpu doc video html highlight gmg gpu 3a 3aGMG GPU算法
  • OpenCV IP 相机应用程序崩溃 [h264 @ 0xxxxx] 访问单元中缺少图片

    我在 cpp 中有一个 opencv 应用程序 它使用 opencv 的简单结构捕获视频流并将其保存到视频文件中 它与我的网络摄像头完美配合 但是 当我运行它从 IP 摄像机捕获流时 它可能会在大约十秒后崩溃 我的编译命令是 g O3 IP

随机推荐

  • Filebeat监控 日志监控

    介绍 filebeat提供了两种监控 一种直接推送到ES集群 第二种就是Metricbeat 这里介绍第一种 也就四部 第1步 创建认证 账号密码 这一步基本可以略过了 如果你的filebeat在运行 你肯定已经有账号密码了 第2步 配置f
  • 设计模式学习笔记-工厂模式

    设计模式学习笔记 工厂模式 作用 实现了创建者和调用者的分离 详细分类 简单工厂模式 用来生产同一等级结构中的任意产品 对于增加新的产品 必须要扩展已有的代码 工厂方法模式 用来生产同一等级结构中的固定产品 支持增加任意产品 抽象工厂模式
  • 基于Zinx框架实现轻量级TCP服务器

    一 框架部分 包括一个sever 两个读 写模块 一个API管理 一个消息队列管理 一个读写池 建目录一个抽样层 一个实体层 二 基于zinx服务器的应用 对于一个框架 越简单来说越好 V0 1 简单的服务器客户端 1 对于开始 完成简单的
  • 使用CMake构建复杂工程

    转 https www cnblogs com autophyte p 6147751 html 0 什么是CMake CMake是一个跨平台的编译 安装 测试以及打包工具 CMake不直接编译软件 而是结合原生构建系统来构建软件 CMak
  • 计算机视觉之目标检测——R-CNN、Fast R-CNN和Faster R-CNN详解

    计算机视觉之目标检测 R CNN Fast R CNN和Faster R CNN详解 文章目录 计算机视觉之目标检测 R CNN Fast R CNN和Faster R CNN详解 目标检测的任务 目标检测的方法 R CNN Fast R
  • yagmail发送邮件

    分五步实现 1 导入yagmail第三方库 2 连接邮箱 3 添加邮件内容 4 发送邮件 5 释放邮箱 导入yagmail第三方库 import yagmail yagmail SMTP user 邮箱名 host SMTP服务器域名 ya
  • Vue 下拉框值变动事件传多个参数

    在使用 Vue 进行开发时 下拉框值变动事件 change 是很常用的 其传参一般分为两种方式 默认传参和自定义传参 默认传参 change 默认会传选中项标识的参数 在传参处不用定义 在方法中直接接受即可
  • Linux下的ssh

    SSH 为 Secure Shell 的缩写 由 IETF 的网络工作小组 Network Working Group 所制定 SSH 为建立在应用层和传输层基础上的安全协议 SSH 是目前较可靠 专为远程登录会话和其他网络服务提供安全性的
  • 将MindManager添加到鼠标右键新建项

    事情缘起于自己做事习惯为每个项目添加一个思维导图作为项目总看板 但每次都需要自己通过软件新建一个空白文件 再将空白文件索引到项目文件夹 再更名保存 虽然步骤不太多 但每次都需要这样的操作确实让我很困扰 所以就心想能不能让Mindmanage
  • ORM 的功能

    ORM要完成对象的初始化以及CRUD功能 在这些功能中尤其是query和update已经蕴含了相应的map的功能 除此之外还要提供transaction和concurrency的功能 这些基本的功能很好理解 不过相应的实现是比较复杂的 还要
  • 机器学习之朴素贝叶斯

    机器学习之朴素贝叶斯 1 朴素贝叶斯 2 朴素贝叶斯应用 3 代码实现贝努力朴素贝叶斯 4 代码实现高斯朴素贝叶斯 5 代码实现多项式朴素贝叶斯 6 总结 前言 主要介绍朴素贝叶斯的概念 公式 以及代码实现贝努利 高斯 多项式朴素贝叶斯 1
  • PyQt6 Designer与实际运行不一致问题

    我们在Designer设计布局时 会先定义好布局然后只在某个布局内存放元素 其他布局为空 可能就会产生布局不一致问题 其实已经存在了对应的布局只是里面为空 所以剩余空间优先被有元素的布局使用 我们在每个布局中加入某个组件即可解决
  • VC++ CMemDC类的扩展(新版)

    上一版本链接 https blog csdn net u012156872 article details 103755254 测试过程中发现存在问题 于是进行了功能补充 源码实现 CSWMemDC h pragma once namesp
  • vant + moment插件自定义count-down倒计时

    根据vant官网https vant ui github io vant v2 zh CN按需引入找到倒计时 自定义时间格式参考下图
  • matlab2016b版本安装

    安装包下载地址 链接 https pan baidu com s 1RrUp8TBIa7g7mhfSUtqAsg 提取码 foc1 1 解压文件包 2 在 matlab R2016b 64bit 文件下 找到 setup 文件 右击选择 以
  • 【C++】_5.模板

    目录 1 泛型编程 2 函数模板 2 1 概念 2 2 函数模板格式 2 3 函数模板原理 2 4 函数模板的实例化 2 5 函数模板的匹配原则 3 类模板 4 非类型模板参数 5 模板的特化 5 1 概念 5 2 函数模板特化 5 3 类
  • 解析request.getParameter() 和request.getAttribute() 区别

    一 request getParameter 和request getAttribute 区别 1 request getParameter 取得是通过容器的实现来取得通过类似post get等方式传入的数据 request setAttr
  • django高并发部署

    django高并发部署
  • React解密:React Hooks函数之useCallback和useMemo

    之所以将useCallback和useMemo放到一起 从某种意义上说 他们都是性能优化的始作俑者 他们也有很多的共性 我们先来回顾一下class组件性能优化的点 调用 setState 就会触发组件的重新渲染 无论前后 state 是否相
  • 64位系统树莓派部署yolo-fatestv2---超多坑

    最近在研究yolo fastest 开始面对作者大大的一堆部署的指令在pycharm的终端里面一顿操作 然后一路报错 后来才发现原来都是linux的指令 后来在虚拟机上也尝试部署过 成功之后本来想直接挪到树莓派上 但是尝试许久都以失败告终