win10+vs2017+opencv4.5.3+yolov5-5.0

news2024/11/18 2:58:40

win10+vs2017+opencv4.5.3+yolov5-5.0

  • 1,安装OpenCV4.5.3配置环境
  • 2,进行模型加载
  • 3,如何导出自己的onnx模型
    • (1)下载YOLOv5的5.0版本的代码
    • (2)在谷歌实验室更改两部分代码
      • (1-1)在model文件下的common.py更改focus模块为下(直接参考上面链接即可,下面的模块选择第一个就行,另一个注释掉即可)
      • (1-2),最后发现只要修改下yolo.py中的detect模块就可以达到修改网络输出格式的效果。先看下/models/yolo.py里面的detect模块
    • (2)导出onnx,在输入如下
    • (3)打包导出工具
  • 4,C++加载onnx模型识别图片
    • Yolo.h
    • Yolo.cpp
    • Main.cpp
  • 5,测试本人的阀板训练模型

注意此处一定要使用的OpenCV版本是4.5版本以上,否则在后面读取onnx模型会失败

这里使用opencv的dnn模块读取onnx模型进行目标检测,目前已经部署成功了

也就是说明不需要安装libtorch安装包就能直接读取onnx模型,不需要读取pt模型

https://blog.csdn.net/dongjuexk/article/details/124243178
opencv dnn模块实现Yolov5_6.1

1,安装OpenCV4.5.3配置环境

下载OpenCV版本如下
https://sourceforge.net/projects/opencvlibrary/files/4.5.3/opencv-4.5.3-vc14_vc15.exe/download

下载直接解压到当前文件即可

属性表的配置如下:
这里是debug 64位的
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2,进行模型加载

https://blog.csdn.net/nihate/article/details/112731327#comments_14884604
用opencv的dnn模块做yolov5目标检测(重要必看,运行成功)

下方的github文件是使用OpenCV部署YOLOX,支持YOLOX-S、YOLOX-M、YOLOX-L、YOLOX-X、YOLOX-Darknet53五种结构
而本人之前是使用yolov5_s结构的所以应该是可以的

https://github.com/hpc203/yolox-opencv-dnn

下载上方的github文件
在这里插入图片描述

只需要main.cpp coco.names images即可

使用OpenCV部署YOLOX,支持YOLOX-S、YOLOX-M、YOLOX-L、YOLOX-X、YOLOX-Darknet53五种结构,包含C++和Python两种版本的程序
onnx文件在百度云盘,下载链接:https://pan.baidu.com/s/11UAVSPWbDKY_LmmoHlUQXw 提取码:147w
下载完成后,把文件放在代码文件所在目录里,就可以运行程序了。如果出现读取onnx文件失败, 那很有可能是你的opencv版本低了,需要升级到4.5以上的

在本地新建空项目,直接把main.cpp文件导入,配置好OpenCV环境,然后读取其给的yolox_s.onnx模型

目前已经成功读取onnx读取测试成功了

关键就是如何获得onnx的模型文件,即如何将pt模型转换成onnx模型,用于此处的导入

3,如何导出自己的onnx模型

https://blog.csdn.net/qq_34124780/article/details/114666312
c++下使用opencv部署yolov5模型(一)(必看)
https://blog.csdn.net/qq_34124780/article/details/115363855
2021.04.15更新 c++下使用opencv部署yolov5模型 (二)

https://blog.csdn.net/qq_34124780/article/details/116464727
2021.09.02更新说明 c++下使用opencv部署yolov5模型 (三)
在这里插入图片描述

上方三个博客是必看的,最后本人成功将其导出onnx并进行部署了

参考上方文件后,将

发现使用yolov5的export直接导出时,出现问题,无法导出onnx(本地环境问题直接使用了谷歌实验室导出成功)
https://github.com/ultralytics/yolov5

在本地导出yolov5的onnx模型失败

尝试在谷歌实验室导出看看效果
在这里插入图片描述

https://blog.csdn.net/qq_45057749/article/details/115016683
yolov5模型转换(一) pt文件转onnx

注意这里的是在YOLOV5的releases的5.0的源代码版本下导出的

并且在谷歌实验室及云服务器导出onnx成功了,本地环境导出onnx失败,可能是被污染了环境

所以这次在本地搭建界面,然后去云服务器pyinstaller为exe再转到本地运行看看效果

注意直接导出的onnx是1个输入,3个输出,在前面的C++程序代码中无法调用,需要更改导出的代码

(1)下载YOLOv5的5.0版本的代码

https://github.com/ultralytics/yolov5/releases
在这里插入图片描述

此版本代码也是本地进行模型训练的代码,注意不是主页的代码,而是历史5.0的代码
https://github.com/ultralytics/yolov5/issues/251

注意要先安装相关环境如下:

git clone https://github.com/ultralytics/yolov5cd yolov5
pip install -r requirements.txt
pip install -U coremltools onnx scikit-learn==0.19.2  # export requirements

python models/export.py --weights weights/yolov5s.pt --img 640 --batch 1
  # export at 640x640 with batch size 1

在这里插入图片描述

(2)在谷歌实验室更改两部分代码

参考https://blog.csdn.net/qq_34124780/article/details/115363855
2021.04.15更新 c++下使用opencv部署yolov5模型 (二)
要更改两部分代码

1.一个是focus切片代码
2.一个是将三个输出变成一个输出代码(注意改完后,要再次进行训练的时候需要改回来,可以将一个YOLOV5-5.0代码作为专门用于将pt文件转onnx的工具,这样之间就不会相互干扰了)

(1-1)在model文件下的common.py更改focus模块为下(直接参考上面链接即可,下面的模块选择第一个就行,另一个注释掉即可)

class Focus(nn.Module):
    # Focus wh information into c-space
    def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True):  # ch_in, ch_out, kernel, stride, padding, groups
        super(Focus, self).__init__()
        #self.contract=Conv(c1 * 4, c2, k, s, p, g, act)
        self.conv = Conv(c1 * 4, c2, k, s, p, g, act)
    def forward(self, x):  # x(b,c,w,h) -> y(b,4c,w/2,h/2)
        #return self.conv(torch.cat([x[..., ::2, ::2], x[..., 1::2, ::2], x[..., ::2, 1::2], x[..., 1::2, 1::2]], 1))
        N, C, H, W = x.size()  # assert (H / s == 0) and (W / s == 0), 'Indivisible gain'
        s = 2
        x = x.view(N, C, H // s, s, W // s, s)  # x(1,64,40,2,40,2)
        x = x.permute(0, 3, 5, 1, 2, 4).contiguous()  # x(1,2,2,64,40,40)
        y=x.view(N, C * s * s, H // s, W // s)  # x(1,256,40,40)
        return self.conv(y)
 
################################################################
##############       另外一种比较简单的方法         ##############
################################################################
class Focus(nn.Module):
    # Focus wh information into c-space
    def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True):  # ch_in, ch_out, kernel, stride, padding, groups
        super().__init__()
        self.conv = Conv(c1 * 4, c2, k, s, p, g, act)
 
    def forward(self, x):  # x(b,c,w,h) -> y(b,4c,w/2,h/2)
        contract = Contract(gain=2)
        #return self.conv(torch.cat([x[..., ::2, ::2], x[..., 1::2, ::2], x[..., ::2, 1::2], x[..., 1::2, 1::2]], 1))
        return self.conv(contract(x))

(1-2),最后发现只要修改下yolo.py中的detect模块就可以达到修改网络输出格式的效果。先看下/models/yolo.py里面的detect模块

在这里插入图片描述
在这里插入图片描述

(2)导出onnx,在输入如下

!python models/export.py --weights weights/yolov5s.pt --img 640 --batch 1

在这里插入图片描述

导出后生成的yolov5s.onnx会在yolov5s.pt权重文件所在文件夹下生成的

然后下载,最后就是和C++联合使用了

(3)打包导出工具

专门用来导出的文件已经更改完成了,这样就不用一值更改其它文件了
在这里插入图片描述

4,C++加载onnx模型识别图片

这里直接使用的是OpenCV4.5.3的代码
参考https://blog.csdn.net/qq_34124780/article/details/116464727
2021.09.02更新说明 c++下使用opencv部署yolov5模型 (三)

上面的博客一定要读

本人已经在本地搭建好了环境如下

本人将此运行成功的环境及模型放到百度云上,
在这里插入图片描述

一共三个代码文件如下

Yolo.h

//yolo.h
#pragma once
#include<iostream>
#include<math.h>
#include<opencv2/opencv.hpp>

//结果结构体
struct Output {
	int id;//结果类别id
	float confidence;//结果置信度
	cv::Rect box;//矩形框
};

class Yolo {

	//参数为私有参数,当然也可以是设置成公开或者保护。
private:
	//计算归一化函数
	float Sigmoid(float x) {
		return static_cast<float>(1.f / (1.f + exp(-x)));
	}
	//anchors
	const float netAnchors[3][6] = { { 10.0, 13.0, 16.0, 30.0, 33.0, 23.0 },{ 30.0, 61.0, 62.0, 45.0, 59.0, 119.0 },{ 116.0, 90.0, 156.0, 198.0, 373.0, 326.0 } };
	//stride
	const float netStride[3] = { 8.0, 16.0, 32.0 };
	const int netWidth = 640; //网络模型输入大小
	const int netHeight = 640;
	float nmsThreshold = 0.45;
	float boxThreshold = 0.35;
	float classThreshold = 0.35;
	//类名
	std::vector<std::string> className = { "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" };

public:
	//在yolo.h中的 Yolo类中添加成员函数readModel:
	bool readModel(cv::dnn::Net &net, std::string &netPath, bool isCuda);
	bool Detect(cv::Mat &SrcImg, cv::dnn::Net &net, std::vector<Output> &output);
	void drawPred(cv::Mat &img, std::vector<Output> result, std::vector<cv::Scalar> color);

	Yolo() {
	}
	~Yolo() {}
};

Yolo.cpp

//yolo.cpp中实现readModel函数
//在yolo.cpp中使用命名空间
#include "yolo.h"
using namespace std;
using namespace cv;
using namespace dnn;

bool Yolo::readModel(Net &net, string &netPath, bool isCuda = false) {
	try {
		net = readNetFromONNX(netPath);
	}
	catch (const std::exception&) {
		return false;
	}
	//cuda
	if (isCuda) {
		net.setPreferableBackend(cv::dnn::DNN_BACKEND_CUDA);
		net.setPreferableTarget(cv::dnn::DNN_TARGET_CUDA);
	}
	//cpu
	else {
		net.setPreferableBackend(cv::dnn::DNN_BACKEND_DEFAULT);
		net.setPreferableTarget(cv::dnn::DNN_TARGET_CPU);
	}
	return true;
}

bool Yolo::Detect(Mat &SrcImg, Net &net, vector<Output> &output) {
	Mat blob;
	blobFromImage(SrcImg, blob, 1 / 255.0, cv::Size(netWidth, netHeight), Scalar(0, 0, 0), true, false);
	net.setInput(blob);
	vector<Mat> netOutputImg;
	net.forward(netOutputImg, net.getUnconnectedOutLayersNames());
	//接上面
	vector<int> classIds;//结果id数组
	vector<float> confidences;//结果每个id对应置信度数组
	vector<Rect> boxes;//每个id矩形框
	float ratio_h = (float)SrcImg.rows / netHeight;
	float ratio_w = (float)SrcImg.cols / netWidth;
	int net_width = className.size() + 5;  //输出的网络宽度是类别数+5
	float* pdata = (float*)netOutputImg[0].data;
	for (int stride = 0; stride < 3; stride++) {    //stride
		int grid_x = (int)(netWidth / netStride[stride]);
		int grid_y = (int)(netHeight / netStride[stride]);
		for (int anchor = 0; anchor < 3; anchor++) { //anchors
			const float anchor_w = netAnchors[stride][anchor * 2];
			const float anchor_h = netAnchors[stride][anchor * 2 + 1];
			for (int i = 0; i < grid_y; i++) {
				for (int j = 0; j < grid_y; j++) {
					float box_score = Sigmoid(pdata[4]);//获取每一行的box框中含有某个物体的概率
					if (box_score > boxThreshold) {
						//为了使用minMaxLoc(),将85长度数组变成Mat对象
						cv::Mat scores(1, className.size(), CV_32FC1, pdata + 5);
						Point classIdPoint;
						double max_class_socre;
						minMaxLoc(scores, 0, &max_class_socre, 0, &classIdPoint);
						max_class_socre = Sigmoid((float)max_class_socre);
						if (max_class_socre > classThreshold) {
							//rect [x,y,w,h]
							float x = (Sigmoid(pdata[0]) * 2.f - 0.5f + j) * netStride[stride];  //x
							float y = (Sigmoid(pdata[1]) * 2.f - 0.5f + i) * netStride[stride];   //y
							float w = powf(Sigmoid(pdata[2]) * 2.f, 2.f) * anchor_w;   //w
							float h = powf(Sigmoid(pdata[3]) * 2.f, 2.f) * anchor_h;  //h
							int left = (x - 0.5*w)*ratio_w;
							int top = (y - 0.5*h)*ratio_h;
							classIds.push_back(classIdPoint.x);
							confidences.push_back(max_class_socre);
							boxes.push_back(Rect(left, top, int(w*ratio_w), int(h*ratio_h)));
						}
					}
					pdata += net_width;//指针移到下一行
				}
			}
		}
	}

	//接上面
	//执行非最大抑制以消除具有较低置信度的冗余重叠框(NMS)
	vector<int> nms_result;
	NMSBoxes(boxes, confidences, classThreshold, nmsThreshold, nms_result);
	for (int i = 0; i < nms_result.size(); i++) {
		int idx = nms_result[i];
		Output result;
		result.id = classIds[idx];
		result.confidence = confidences[idx];
		result.box = boxes[idx];
		output.push_back(result);
	}

	if (output.size())
		return true;
	else
		return false;
}

//这里的color是颜色数组,对没一个id随机分配一种颜色
void Yolo::drawPred(Mat &img, vector<Output> result, vector<Scalar> color) {
	for (int i = 0; i < result.size(); i++) {
		int left, top;
		left = result[i].box.x;
		top = result[i].box.y;
		int color_num = i;
		rectangle(img, result[i].box, color[result[i].id], 2, 8);

		string label = className[result[i].id] + ":" + to_string(result[i].confidence);

		int baseLine;
		Size labelSize = getTextSize(label, FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine);
		top = max(top, labelSize.height);
		//rectangle(frame, Point(left, top - int(1.5 * labelSize.height)), Point(left + int(1.5 * labelSize.width), top + baseLine), Scalar(0, 255, 0), FILLED);
		putText(img, label, Point(left, top), FONT_HERSHEY_SIMPLEX, 1, color[result[i].id], 2);
	}
	//namedWindow("窗口名", 0);//创建窗口
	//imshow("res", img);
	//imwrite("./result.jpg", img);
	//waitKey();
	//destroyAllWindows();
}

Main.cpp

#include "yolo.h"
#include <iostream>
#include<opencv2//opencv.hpp>
#include<math.h>

using namespace std;
using namespace cv;
using namespace dnn;


int main()
{
	cout << "Hello World" << endl;
	string img_path = "./bus.jpg";
	string model_path = "./yolov5s.onnx";

	Yolo test;
	Net net;
	if (test.readModel(net, model_path, true)) {
		cout << "read net ok!" << endl;
	}
	else {
		return -1;
	}

	//生成随机颜色
	vector<Scalar> color;
	srand(time(0));
	for (int i = 0; i < 80; i++) {
		int b = rand() % 256;
		int g = rand() % 256;
		int r = rand() % 256;
		color.push_back(Scalar(b, g, r));
	}
	vector<Output> result;
	Mat img = imread(img_path);
	if (test.Detect(img, net, result)) {
		test.drawPred(img, result, color);
		namedWindow("res", 0);//创建窗口Flags=0,是WINDOW_NORMAL
		imshow("res", img);
	}
	else {
		cout << "Detect Failed!" << endl;
	}

//system("pause");
	waitKey(0);
	destroyAllWindows();
	return 0;
}

最后运行结果如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5,测试本人的阀板训练模型

将之前的阀板训练模型 云服务器bs10 epoch50 workers4
的导出onnx看效果如何

注意,更换onnx的时候要在 头文件中更改类名
如下std::vector<std::string> className = { "gridingDefect" };
在这里插入图片描述

检测结果如下:

在这里插入图片描述

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

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

相关文章

1个maven命令快速查看jar包依赖路径

本文目标&#xff1a;开发人员&#xff0c;在了解maven工具的dependency命令的条件下&#xff0c;进行查看jar包依赖关系&#xff0c;达到确认jar包引入来源的程度。 文章目录 1 痛点2 解决方案3 总结/练习 1 痛点 maven项目依赖包多时&#xff0c;项目某个包有问题时&#xff…

小赢卡贷公益行:乡村振兴与多元公益并进

在金融科技的浪潮中&#xff0c;小赢卡贷不仅以其创新的金融产品和服务赢得了市场的广泛认可&#xff0c;更以其背后的公益之心&#xff0c;积极履行社会责任&#xff0c;传递着温暖与希望。小赢公益基金会&#xff0c;作为小赢卡贷社会责任的延伸&#xff0c;主要聚焦于乡村振…

IEEE754浮点数的表示

在学习浮点数的表示之前&#xff0c;先看一下二进制和十进制之间的转换。再来学习IEEE754标准的浮点数。 十进制转二进制 对于十进制整数转换位2进制小数。 例如125转换为二进制小数方法为除二取余。 125/262 余数1 62/231 余数0 31/215 余数1 15…

USB转多路RS485应用-组态软件调试

前言 在工业领域&#xff0c;经常使用组态软件来监控和控制生产设备。组态是指不需要编写计算机程序、通过类似“配置”的方式完成工业应用开发的系统。终端设备包括仪表&#xff0c;PLC&#xff0c;传感器等&#xff0c;大部分支持RS485接口和Modbus协议。 运维或部署人员在实…

并发事务演示及隔离级别

引言 在MySQL数据库中&#xff0c;事务是一组不可分割的操作单元&#xff0c;这些操作要么全部成功&#xff0c;要么全部失败。事务的四大特性&#xff0c;通常被称为ACID特性&#xff0c;包括原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#x…

yolov11人物背景扣除

有时候我们需要对图片进行背景扣除和替换,本文将基于yolov11对一张图片进行背景扣除,对视频的处理同理。 安装 pip install ultralytics 2 、获取测试图片 3、代码 from ultralytics import YOLO import cv2 import nu

前海中粮创新中心附近无名路的长期免费停车点探寻

​中粮前海创新中心附近有一条无名路&#xff0c;我数了下大概可以停50个停车位&#xff0c;就是这个路需要点技巧才能进去。 ​可以看到直接从正面是开不进去的&#xff0c;水泥挡着了哈。但是可以观察附近地面车轮印痕就可以参考里面的车怎么停进去的哈 ​上图中的无名路是很…

基于SpringBoot+Vue+Redis+Mybatis+前后端分离旅游平台推荐系统

我 | 在这里 ⭐ 全栈开发攻城狮、全网10W粉丝、2022博客之星后端领域Top1、专家博主。 &#x1f393;擅长 指导毕设 | 论文指导 | 系统开发 | 毕业答辩 | 系统讲解等。已指导60位同学顺利毕业 ✈️个人公众号&#xff1a;乡下小哥编程。回复 Java全套视频教程 或 前端全套视频教…

SeaTunnel Web1.0.0安装

注&#xff1a;安装SeaTunnel Web1.0.1没区别&#xff0c;步骤全部都一样。 安装的SeaTunnel为2.3.7版本&#xff0c;以下安装基于SeaTunnel已经安装好的场景。 一、下载包 Apache SeaTunnel ​上传到服务器上并解压 -- 路径&#xff1a;/data/seatunnel/apache-seatunnel…

一个月学会Java 第8天 方法与递归

Day8 方法与递归 方法这个东西我们之前讲过&#xff0c;但是只是讲了原理并没有详细的讲解东西&#xff0c;还有构造器这个东西&#xff0c;也只是介绍过全貌&#xff0c;构造器其实就是一个特殊的方法&#xff0c;但是由于特殊&#xff0c;所以我们之后再讲&#xff0c;还有一…

【C++】单例模式「详尽版」

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 什么是单例模式如何实现单例模式饿汉模式和懒汉模式饿汉模式懒汉模式饿汉模式和懒汉模式的优缺点1.饿汉模式的优缺点2.懒汉模式的优缺点 什么是单例模式 C单例模式是一种非常重要的设计模式&#xf…

看历史远比看未来更加清楚,太像了

目录 ‌1994年8月,中国进行了分税制改革 ‌2024年9月,中国经济经历了一系列显著的经济变化和政策调整。‌ 经济政策密集出台 资本市场反应热烈 制造业趋稳运行 外汇储备保持稳定 信心与预期提升 ‌2024年10月,股市回调和消费市场的活跃 ‌1994年8月,中国进行了分税…

通过SE38编写一个报表

该编写操作重点在于理解语法基础&#xff0c;并不具有实际意义。 然后进入代码编辑界面。 首先定义X M Z三个字段的类型为C&#xff08;字符类型&#xff09;&#xff0c;最大长度为10然后给X M进行赋值第三步使用ABAP链接语句&#xff0c;把X M两个值进行链接在屏幕上输出Z值。…

SVM及其实践1 --- 概念、理论以及二分类实践

说明 SVM(support vector machine,支持向量机)的理论其实是很漂亮的&#xff0c;只是对于初学者而言有点晦涩难懂和繁琐(特别是诸多的公式推导)。因为其经典且应用范围广&#xff0c;其实网上(各编程语言)已经有很多很成熟的包/函数可以直接调用&#xff0c;而且有关SVM的比较细…

Spring Boot教学资源库:开发者的成长之路

2 相关技术简介 2.1Java技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xff0c;任…

llama3 implemented from scratch 笔记

github地址&#xff1a;https://github.com/naklecha/llama3-from-scratch?tabreadme-ov-file 分词器的实现 from pathlib import Path import tiktoken from tiktoken.load import load_tiktoken_bpe import torch import json import matplotlib.pyplot as plttokenizer_p…

大数据新视界 --大数据大厂之 GraphQL 在大数据查询中的创新应用:优化数据获取效率

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

12.2 Linux_进程间通信_共享内存

概述 什么是共享内存&#xff1a; 共享内存又叫内存映射&#xff0c;可以通过mmap()映射普通文件。 实际上就是将磁盘中的一个文件映射到内存的一个缓冲区中去&#xff0c;这样进程就可以直接将这块空间当作普通内存来访问&#xff0c;不需要再使用I/O中的read/write去访问这…

霍普菲尔德(Hopfield)神经网络求解旅行商问题TSP,提供完整MATLAB代码,复制粘贴即可运行

Hopfield神经网络是以美国物理学家约翰霍普菲尔德&#xff08;John Hopfield&#xff09;的名字命名的。他在1982年提出了这种类型的神经网络模型&#xff0c;因此通常被称为Hopfield网络。旅行商问题&#xff08;Traveling Salesman Problem&#xff0c;TSP&#xff09;是一个…

IEDA创建文件模板

1、点击设置-编辑器-文件与代码模板 2、输入对应的名称、扩展名、文件名 3、复制模板代码-点击应用、确定即可 4、新建配置项目&#xff0c;右键点击新建选择SpringMVC即可&#xff08;刚刚模板中的名称&#xff09;