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

yolov5-7.0模型DNN加载函数及参数详解(重要)

yolov5-7.0模型DNN加载函数及参数详解(重要)

  • 引言
  • yolov5(v7.0)
    • 1,yolov5.h(加载对应模型里面的相关参数要更改)
    • 2,main主程序
      • (1)加载网络
      • (2)检测推理(forward)
        • (2.1)制作黑背景正方形,用于blobFromImage的无损缩放
        • (2.2)blobFromImage改变图像格式为网络出入格式
        • (2.3)输入setInput图像并forward推理
        • (2.4)结果解析
          • (2.4.0)方法0直接Mat读取解析(主要用于理解输出结构)
          • (2.4.1)方法1指针法Mat.data解析(快但不易理解)
        • (2.5)绘制结果

引言

  使用opencv的dnn模块对应yolov5(v7.0)的导出的onnx模型进行推理解析,明确各个参数的对应含义及结果。理论上,有了onnx模型,有了该网络模型的输入输出各个参数含义,就可以使用任意的可以读取onnx模型的部署框架进行部署推理。

yolov5(v7.0)

Yolov5(v7.0)
部署:使用opencv4.5.5(opencv4.5.4以上可以读取网络),dnn模块部署

已经导出的cpu、opset=12、640大小图像、默认静态
在这里插入图片描述

如上,输入输出层在后面的DNN模块推理会用到

1,yolov5.h(加载对应模型里面的相关参数要更改)

需要修改的相关参数如下:要根据自己的模型来进行
在这里插入图片描述
在这里插入图片描述

#include <fstream>
#include <sstream>
#include <iostream>
#include <opencv2/dnn.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
using namespace cv;
using namespace dnn;
using namespace std;class YOLO
{
public:struct Detection{int class_id;float confidence;Rect box;};
public:YOLO();~YOLO();bool loadNet(string model_path, bool is_cuda);Mat formatYolov5(const Mat& source);void detect(Mat& image, vector<Detection>& output);void drawRect(Mat& image, vector<Detection>& output);
private:Net m_net;//修改为训练时自己模型Img大小float inputWidth = 640;float inputHeight = 640;//修改 dimensions = 类别数 + 5const int dimensions = 6;//修改 通过Netron可查看,图片大小320,rows为6300,图片大小640,rows为25200const int rows = 25200;float scoreThreshold = 0.2;float nmsThreshold = 0.4;float confThreshold = 0.4;
public://修改为自己的类别数const vector<string> m_classNames = { "qrcode" };/*const std::vector<std::string> m_classNames = { "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" };*/const vector<Scalar> colors = { Scalar(255, 255, 0), Scalar(0, 255, 0), Scalar(0, 255, 255), Scalar(255, 0, 0) };
};

2,main主程序

int main(int argc, char** argv)
{Mat frame = imread("2.jpeg");YOLO yolov5;//加载模型yolov5.loadNet("qrcode.onnx", false);std::vector<YOLO::Detection> output;//进行检测//检测时间DWORD time_start, time_end;/* 获取开始时间 */time_start = GetTickCount(); //从操作系统启动经过的毫秒数yolov5.detect(frame, output);time_end = GetTickCount();int time = (time_end - time_start);cout << "Time = " << (time_end - time_start) << "ms\n ";//将所耗时间显示到图片上putText(frame, format("time:%dms", time), Point(20, 50), FONT_HERSHEY_SIMPLEX, 1.2, Scalar(255, 0,0), 2);//绘制结果yolov5.drawRect(frame, output);imshow("output", frame);waitKey(0);return 0;
}

(1)加载网络

加载已经导出的onnx网络,打印各个层级参数,此时网络读取成功(opencv要在4.5.4以上)
bool YOLO::loadNet(string model_path, bool is_cuda)
{try {m_net = readNet(model_path);//获取各层信息vector<string> layer_names = m_net.getLayerNames();		//此时我们就可以获取所有层的名称了,有了这些可以将其ID取出for (int i = 0; i < layer_names.size(); i++) {int id = m_net.getLayerId(layer_names[i]);			//通过name获取其idauto layer = m_net.getLayer(id);						//通过id获取layerprintf("layer id:%d,type:%s,name:%s\n", id, layer->type.c_str(), layer->name.c_str());	//将每一层的id,类型,姓名打印出来(可以明白此网络有哪些结构信息了)}}catch (const std::exception&) {cout << "load faild" << endl;return false;}if (is_cuda){cout << "Attempty to use CUDA\n";m_net.setPreferableBackend(DNN_BACKEND_CUDA);m_net.setPreferableTarget(DNN_TARGET_CUDA_FP16);}else{cout << "Running on CPU\n";m_net.setPreferableBackend(DNN_BACKEND_OPENCV);m_net.setPreferableTarget(DNN_TARGET_CPU);}return true;
}

在这里插入图片描述

(2)检测推理(forward)

推理前要对图像进行预处理,使其变为网络的输入格式

(2.1)制作黑背景正方形,用于blobFromImage的无损缩放

也可以不制作黑背景,但后面blobFromImage缩放计算可能结果有损失

//制作黑背景正方形,用于blobFromImage的无损缩放
//对于长宽比过大的图片,由于opencv的blobFromImage()函数在缩放的时候不是无损缩放,
//会导致图像变形严重导致结果错误或者漏检。虽然blobFromImage里面有个参数可以保持比例缩放,
//但是只会保留中间的部分,两边信息全部丢掉,所以如果你的目标全部在中间就可以无所谓,
//如果不是,那么需要简单的自己做个无损缩放,制作一张全黑的3通道正方形图片,边长为原图的长边,
//最后将原图放在(0,0)的位置上面,这样就可以直接输入blobFromImage里面就可以实现无损缩放了,
//而且不用对检测结果进行二次修正位置了。
//https ://blog.csdn.net/qq_34124780/article/details/116464727
Mat YOLO::formatYolov5(const Mat& source)
{int col = source.cols;int row = source.rows;int _max = MAX(col, row);Mat result = Mat::zeros(_max, _max, CV_8UC3);source.copyTo(result(Rect(0, 0, col, row)));return result;
}
(2.2)blobFromImage改变图像格式为网络出入格式
 Mat blob;auto input_image = formatYolov5(image);blobFromImage(input_image, blob, 1. / 255., Size(inputWidth, inputHeight), Scalar(), true, false);//1. / 255.数据归一化,图像大小变为输入格式(640*640)true进行通道交换,false不进行切片

此时经过blobFromImage的图像就变成4维了,在imagewatch中不显示
在这里插入图片描述
在这里插入图片描述

(2.3)输入setInput图像并forward推理
m_net.setInput(blob);
vector<Mat> outputs;
m_net.forward(outputs, m_net.getUnconnectedOutLayersNames());

Forward函数有很多,可以得到如下,有的是将所有的输出结果得到(有时输出层有多个),有的是将对应层的输出结果得到,这里直接得到所有最终输出结果就行了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实际这里推理只有1个输出结果

 cout << "outputs.size():" << outputs.size() << endl;

在这里插入图片描述

(2.4)结果解析

实际此时推理输出为[1252006]共三维的图像,使用指针的方法的话二维还是三维都会展开成一维指针进行读取
在这里插入图片描述

输出结果如下dims=3维度
在这里插入图片描述

将其转换成Mat可以显示的方式,用于查看对应的效果
在这里插入图片描述

效果如下
在这里插入图片描述

(2.4.0)方法0直接Mat读取解析(主要用于理解输出结构)

在这里插入图片描述

与指针相比,通过mat数组获取对应的第4列的数据是对应的起来的,如下应该使用32F数据格式即可(要将其结果转为(25200*6格式的数据保存到mat中))
在这里插入图片描述

上图最右侧的第6列的数据是类的分数(虽然显示1,但实际上分值是浮点数接近1的)
在这里插入图片描述

三维的
在这里插入图片描述

//使用Mat进行相关数据的保存解析(这里主要通过mat用于理解对应的输出结构)
void YOLO::detect2(Mat& image, vector<Detection>& output) {Mat blob;auto input_image = formatYolov5(image);blobFromImage(input_image, blob, 1. / 255., Size(inputWidth, inputHeight), Scalar(), true, false);//1. / 255.数据归一化,图像大小变为输入格式(640*640)true进行通道交换,false不进行切片m_net.setInput(blob);vector<Mat> outputs;m_net.forward(outputs, m_net.getUnconnectedOutLayersNames());//结果解析//方法0、使用Mat进行解析//***********输出测试//几个输出结果cout << "outputs.size():" << outputs.size() << endl;/*Mat detect_res = m_net.forward("output0");cout << "detect_res.channels():" << detect_res.size() << endl;cout << "outputs[0].channels():" << outputs[0].size() << endl;*///对其结果使用下方的重新复制一个MAT,这样的才能在imagewatch中看到,否则无法显示Mat d1 = outputs[0].clone();//重新定义一个Mat对象接收(将其转换成输出结构)(rows = 25200, dimensions=6)Mat detectionMat2(rows, dimensions, CV_32F, d1.ptr<float>());		//此处是初始化一个行为size[2],深度为浮点型,数据从detection中获取	//使用imagewatch可以看到6*25200的数组,单通道32F深度cout << "detect_res.rows:" << detectionMat2.rows << endl;//先得到原始用于blobFromImage归一化的input_image图像与/640的比例,后面用于目标框的结果返回float x_factor1 = float(input_image.cols) / inputWidth;   //用于blobFromImage归一化的input_image图像/640,得到对应的比例float y_factor1 = float(input_image.rows) / inputHeight;  //用于blobFromImage归一化的input_image图像/640vector<int> class_ids1;vector<float> confidences1;vector<Rect> boxes1;//25200行的数据(对应的onnx的输出参数)for (int i = 0; i < detectionMat2.rows; i++) {float confidence1 = detectionMat2.at<float>(i, 4);         //置信度方框box的得分分值//cout << "confidence1:" << confidence1 << endl;if (confidence1 >= confThreshold)    //求置信度>某个值{//cout << "confidence1:" << confidence1 << endl;//求类别得分将第一个类别后面的所有的类别作为一个mat一行//制作一个vector对象,//循环从类别后面截取各个类的分值,并保存vector<float> classes_scores1;for (int j = 5; j < detectionMat2.cols; j++) {classes_scores1.push_back(detectionMat2.at<float>(i, j));}//求classes_scores1的最大值及对应的索引auto max_class_score = max_element(classes_scores1.begin(), classes_scores1.end());int idMax = max_class_score - classes_scores1.begin();//cout << "类别的分数值:" << *max_class_score << "id:" << idMax << endl;if (*max_class_score > scoreThreshold){confidences1.push_back(confidence1);class_ids1.push_back(idMax);//前4行对应的(物体的x、y、w、h)(这里的x、y、w、h结果只是图像640*640的结果的,要返回)float x = detectionMat2.at<float>(i, 0);float y = detectionMat2.at<float>(i, 1);float w = detectionMat2.at<float>(i, 2);float h = detectionMat2.at<float>(i, 3);//将x、y、w、h结果返回(由640*640的结果返回到原图size()大小的结果)int left = int((x - 0.5 * w) * x_factor1);//(x_factor1*x)int top = int((y - 0.5 * h) * y_factor1);int width = int(w * x_factor1);             //宽高直接*对应比列即可int height = int(h * y_factor1);boxes1.push_back(Rect(left, top, width, height));   //得到最终原图对应的矩形框大小}}}cout << "boxes.size():" << boxes1.size() << endl;//NMS结果非极大值抑制(有些结果是重合的,此处通过nms去除)vector<int> nms_result; //保存对应的索引值NMSBoxes(boxes1, confidences1, scoreThreshold, nmsThreshold, nms_result);for (int i = 0; i < nms_result.size(); i++){int idx = nms_result[i];Detection result;result.class_id = class_ids1[idx];result.confidence = confidences1[idx];result.box = boxes1[idx];output.push_back(result);}
}
(2.4.1)方法1指针法Mat.data解析(快但不易理解)
//使用指针进行相关的结果解析(更快速,但不易理解)(相关取值计算过程和上方一样,可以看detect2进行理解)
void YOLO::detect(Mat& image, vector<Detection>& output)
{Mat blob;auto input_image = formatYolov5(image);blobFromImage(input_image, blob, 1. / 255., Size(inputWidth, inputHeight), Scalar(), true, false);//1. / 255.数据归一化,图像大小变为输入格式(640*640)true进行通道交换,false不进行切片m_net.setInput(blob);vector<Mat> outputs;m_net.forward(outputs, m_net.getUnconnectedOutLayersNames());//方法1、使用指针进行解析(1*25200*6)float x_factor = float(input_image.cols) / inputWidth;   //用于blobFromImage归一化的input_image图像/640,得到对应的比例float y_factor = float(input_image.rows) / inputHeight;  //用于blobFromImage归一化的input_image图像/640float* data = (float*)outputs[0].data;  //获取输出结果的初始指针vector<int> class_ids;vector<float> confidences;vector<Rect> boxes;for (int i = 0; i < rows; ++i){float confidence = data[4];          //置信度方框box的分值if (confidence >= confThreshold)    //求置信度{float* classes_scores = data + 5;   //求类别得分//求类别得分将第一个类别后面的所有的类别作为一个mat一行(x、y、w、h、confidence、class1、class2、、、)//一行,m_classNames.size()个长度Mat scores(1, m_classNames.size(), CV_32FC1, classes_scores);//求当前最大分数的类别及其索引Point class_id;double max_class_score;minMaxLoc(scores, 0, &max_class_score, 0, &class_id);if (max_class_score > scoreThreshold){confidences.push_back(confidence);class_ids.push_back(class_id.x);//boxfloat x = data[0];float y = data[1];float w = data[2];float h = data[3];int left = int((x - 0.5 * w) * x_factor);int top = int((y - 0.5 * h) * y_factor);int width = int(w * x_factor);int height = int(h * y_factor);boxes.push_back(Rect(left, top, width, height));}}data += dimensions;  //data隔着对应结果(类别数1+5(x、y、w、h))}//NMS结果非极大值抑制vector<int> nms_result;NMSBoxes(boxes, confidences, scoreThreshold, nmsThreshold, nms_result);for (int i = 0; i < nms_result.size(); i++){int idx = nms_result[i];Detection result;result.class_id = class_ids[idx];result.confidence = confidences[idx];result.box = boxes[idx];output.push_back(result);}
}
(2.5)绘制结果

就是将矩形框、分值等数据绘制到对应的图像上

void YOLO::drawRect(Mat& image, vector<Detection>& output)
{int detections = output.size();for (int i = 0; i < detections; ++i){auto detection = output[i];auto box = detection.box;auto classId = detection.class_id;const auto color = colors[classId % colors.size()];rectangle(image, box, color, 3);rectangle(image, Point(box.x, box.y - 40), Point(box.x + box.width, box.y), color, FILLED);string label = m_classNames[classId] + ":" + to_string(output[i].confidence);putText(image, label, Point(box.x, box.y - 5), FONT_HERSHEY_SIMPLEX, 1.5, Scalar(0, 0, 0), 2);}}

下面是Yolov5s.onnx对应模型的结果

在这里插入图片描述

相关文章:

yolov5-7.0模型DNN加载函数及参数详解(重要)

yolov5-7.0模型DNN加载函数及参数详解&#xff08;重要&#xff09; 引言yolov5&#xff08;v7.0&#xff09;1&#xff0c;yolov5.h(加载对应模型里面的相关参数要更改)2&#xff0c;main主程序&#xff08;1&#xff09;加载网络&#xff08;2&#xff09;检测推理&#xff0…...

StringEntity 用于将字符串内容作为 HTTP 请求实体(请求体)

StringEntity 类是 Apache HttpClient 库中的一个类&#xff0c;它用于将字符串内容作为 HTTP 请求实体&#xff08;请求体&#xff09;。这个类非常适合用于发送 JSON、XML 或其他需要以字符串形式发送的数据。以下是 StringEntity 类的一些常用方法和代码案例&#xff1a; …...

校园系统校园小程序 论坛校园圈系统失物招领、闲置二手、跑腿外卖等校园圈子系统应该具备有哪些功能

针对校园系统、校园小程序、论坛校园圈系统以及失物招领、闲置二手、跑腿外卖等具体功能&#xff0c;一个综合性的校园圈子系统应该具备以下主要功能&#xff1a; 前后端源码查看 一、基础功能 用户注册与登录 提供用户注册和登录功能&#xff0c;支持学生身份验证、手机号验…...

[AWS云]kafka调用和创建

背景:因为因为公司的项目需要使用AWS的kafka&#xff0c;但是在创建和使用过程中都遇到了一些报错和麻烦&#xff0c;毕竟老外的东西&#xff0c;和阿里云、华为使用起来还是不一样。 一、创建&#xff08;创建的配置过程就略了&#xff0c;就是配置一下可用区、型号&#xff0…...

查看 Excel 应用程序中已打开的 Excel 文件的完整路径

要查看 Excel 应用程序中已打开的 Excel 文件的完整路径&#xff08;全路径&#xff09;&#xff0c;你可以通过以下几种方法获取具体路径&#xff0c;尤其是在 VSTO 应用程序中。 方法1&#xff1a;使用 VSTO Excel 外接程序代码 在 VSTO 外接程序代码中&#xff0c;您可以直接…...

学习 RocketMQ 单机部署、消息发送、消息接收

文章目录 RocketMQ 介绍为什么要使用 MQ &#xff1f;RocketMQ 与其他产品对比vs Kafkavs RabbitMQvs ActiveMQ RocketMQ 重要概念部署 Namesrver、Broker、Dashboard快速入门消息生产者消息消费者 消费模式简单消息1&#xff09;同步发送2&#xff09;异步发送3&#xff09;单…...

【计算机网络】CDN

CDN&#xff08;Content Delivery Network&#xff0c;内容分发网络&#xff09;是一种分布式的服务器网络&#xff0c;旨在通过将内容缓存到多个地理位置的服务器上&#xff0c;加速内容的分发和传递。CDN 的主要目的是减少用户访问网站时的延迟&#xff0c;提升用户体验&…...

数据结构:插入排序

1.插入排序 此排序如打扑克牌一样&#xff1b;每次抓牌&#xff0c;把扑克从前向后扒拉&#xff1b;找到合适的位置插入进去—所以叫插入排序&#xff1b; 时间复杂度&#xff1a;O&#xff08;N^2&#xff09; int arr[10] { 9,8,7,6,5,4,3,2,1,0 };//数据太多就不好写了 …...

Nginx反向代理配置与负载均衡配置

简介&#xff1a;整理自黑马程序员苍穹外卖的第11节 nginx是什么&#xff1f; nginx的好处 nginx反向代理配置方式 nginx负载均衡的配置方式 nginx负责均衡策略...

axios 前端与 Django 后端的 POST 交互

背景 自己在写一些油猴脚本&#xff0c;前端需要用 JS&#xff0c;后端是自己的服务&#xff0c;是用 Python 的 Django 框架完成的。 油猴脚本中需要通过 POST 方法&#xff0c;向后端传一些数据&#xff0c;所以前端我用的是 axios 库&#xff0c;后端需要用 Django 处理 P…...

数据结构常用术语

一. 常见术语 数据相关 英文术语中文术语Data数据Data element数据元素Data item数据项Data structure数据结构Logical structure逻辑结构Data type数据类型 指针与存储 英文术语中文术语Pointer指针Sequential storage structure顺序存储结构Linked storage structure链状…...

Flask 轻松上手:从零开始搭建属于你的Web应用

引言 随着互联网技术的发展&#xff0c;Web应用程序的需求日益增长。对于开发者来说&#xff0c;选择一个合适的框架至关重要。Flask以其简洁的设计、高度的可定制性和对各种扩展的良好支持&#xff0c;成为了很多项目的基础。无论你是初学者还是有经验的开发者&#xff0c;掌…...

[MyBatis-Plus]快速入门

介绍 MyBatis-Plus是MyBatis的好朋友, 与MyBatis配合, 实现开发效率的提高 官网: 特点: 润物细无声: 只做增强不做改变, 引入它不会对现有工程产生影响, 如丝般顺滑效率自上: 只需简单配置, 即可快速进行单表CRUD, 从而节省大量时间功能丰富: 代码生产, 自动分页, 逻辑删除, …...

单例模式和读者写者问题

文章目录 10. 线程安全的单例模式10.1 什么是设计模式10.2 什么是单例模式10.3 单例模式的特点10.4 饿汉方式和懒汉方式10.5 单例模式的线程池 11. STL和智能指针的线程安全 问题11.1 STL中的容器是否是线程安全的?11.2 智能指针是否是线程安全的? 12. 其他常见的各种锁13. 读…...

内网wordpress更换IP后无法访问的解决办法

一、现象 一台装有wordpress的台式机&#xff0c;从一个校区移到了另一个校区&#xff0c;更换了IP地址&#xff0c;导致无法正常访问。 二、分析 安装wordpress的时候里面的ip&#xff08;或域名&#xff09;都已固定。安装好后&#xff0c;内网通过IP访问&am…...

Spring Boot课程答疑:技术难题一网打尽

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…...

云卷云舒【超级数据库】:算力网络时代的云原生数据库

一直关注算力网络&#xff0c;再次分析下移动云的数据库团队&#xff0c;他们在做的一些事情其实比较务实&#xff0c;在推进数据库依托云原生演进到算力网络阶段&#xff0c;这都是在构建一个能够承载无限容量、无感接入、多模融合、智能调度的超级数据库。 未来数据库&#…...

电脑分盘分盘

方案一&#xff1a;使用磁盘管理工具扩展卷功能将未分配磁盘合并到C盘 按WinR输入diskmgmt.msc并按Enter键打开磁盘管理工具。在主界面中右键单击C盘驱动器并选择“扩展卷”&#xff0c;然后按照提示流程操作即可扩展C盘空间。 WinR diskmgmt.msc 注意&#xff1a;虽然系统内置…...

四元数基础知识

背景 四元数是方向的 4 元组表示形式&#xff0c;它比旋转矩阵更简洁。 四元数对于分析涉及三维旋转的情况非常有效。 四元数广泛用于机器人技术、量子力学、计算机视觉和 3D 动画。 您可以在 Wikipedia 上了解有关基本数学概念的更多信息。 您还可以观看由 3blue1brown 制…...

『网络游戏』进入游戏主城UI跳转主城【26】

首先在Unity客户端中创建一个空节点重命名为MainCityWnd 设置父物体为全局 创建空节点钉在左上角作为角色信息UI 在钉子下创建Image 创建脚本&#xff1a;MainCityWnd.cs 编写脚本&#xff1a;MainCityWnd.cs 挂载脚本 创建脚本&#xff1a;MainCitySys.cs 编写脚本&#xff1a…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...