首页
关于
壁纸
history
Search
1
斑马扫码枪SDK调用
45 阅读
2
LabVIEW and Drivers 2019~2023
39 阅读
3
C#使用DataMatix.net生成二维码
39 阅读
4
Labview Actor Frame Work介绍
30 阅读
5
linux无法删除.user.ini文件,解决办法
26 阅读
默认分类
Labview
CSHARP
C/C++
AI生成
登录
Search
标签搜索
AI生成
labview
C#
python
linux
CloudZ
累计撰写
36
篇文章
累计收到
3
条评论
首页
栏目
默认分类
Labview
CSHARP
C/C++
AI生成
页面
关于
壁纸
history
搜索到
9
篇与
的结果
2023-05-22
yolov8訓練時如何通過回調函數獲取map和loss值
您可以使用Ultralytics YOLOv8中的回调函数来获取训练过程中的mAP和loss值。具体来说,您可以使用以下代码来添加回调函数: from ultralytics.yolo.v8 import * from ultralytics.yolo.v8.utils.loss import YOLOv8Loss # 定义回调函数 class LogCallback(Callback): def __init__(self): super().__init__() def on_train_batch_end(self, trainer, pl_module, outputs, batch, batch_idx, dataloader_idx): # 获取mAP和loss值 loss, loss_items = outputs['loss'], outputs['loss_items'] mAP = outputs['mAP'] # 打印mAP和loss值 print(f"mAP: {mAP:.2f}, loss: {loss:.2f}, loss_items: {loss_items}") # 创建模型 model = Model(cfg='yolov5s.yaml') # 创建训练器 trainer = DetectionTrainer(model=model, train_cfg='train.yaml', val_cfg='val.yaml', callbacks=[LogCallback()]) # 开始训练 trainer.train() 在上面的代码中,我们定义了一个名为LogCallback的回调函数,并在创建训练器时将其添加到回调列表中。在 on_train_batch_end方法中,我们可以获取训练过程中的mAP和loss值,并将其打印出来。需要注意的是,要获取mAP值,您需要在训练配置文件中设置val数据集的路径。此外,如果您想要获取更多的训练信息,可以在回调函数中添加相应的代码。{lamp/}在Ultralytics YOLOv8的训练过程中,outputs字典包含了许多有用的信息,其中包括以下几个关键字:loss: 训练过程中的总损失值。loss_items: 训练过程中的各个损失项的值,以字典的形式存储。mAP: 训练过程中的平均精度值。lr: 当前的学习率。step: 当前的训练步数。epoch: 当前的训练轮数。
2023年05月22日
6 阅读
0 评论
0 点赞
2023-05-20
使用OpenCV G-API构建一个面部分析管道
OpenCV的Graph API(或称G-API)是一个新模块,旨在使常规图像处理变得更快和轻量。这两种方式的是通过引入一个新的基于图像的执行模型实现的(graph-based model of execution)。G-API是一个特殊的OpenCV模块。与大多数其他主要模块相比,这个模块充当框架而不是某些特定的CV算法。G-API提供了定义CV操作,使用表达式构建图形,最后为特定后端实现和运行操作的方法¹。例如,您可以使用G-API来构建一个面部分析管道,该管道包括图像采集和解码、预处理、检测、分类和可视化等步骤。G-API负责管道本身,因此如果算法或平台发生更改,执行模型会自动适应它²。一个简化的面部分析管道包括以下步骤:图像采集和解码、预处理、检测、分类和可视化。构建G-API图形与常规使用G-API类似,仍然是定义图形数据(使用cv::GMat,cv::GScalar和cv::GArray)并对其进行操作。推理也成为图形中的一种操作,但定义方式略有不同。下面是一个使用G-API构建面部分析管道的示例代码: #include <opencv2/gapi.hpp> #include <opencv2/gapi/core.hpp> #include <opencv2/gapi/imgproc.hpp> #include <opencv2/gapi/infer.hpp> #include <opencv2/gapi/infer/ie.hpp> #include <opencv2/gapi/cpu/gcpukernel.hpp> #include <opencv2/gapi/streaming/cap.hpp> // 定义网络 G_API_NET(FaceDetector, <cv::GMat(cv::GMat)>, "face-detector"); G_API_NET(AgeGender, <cv::GMat(cv::GMat)>, "age-gender"); G_API_NET(Emotions, <cv::GMat(cv::GMat)>, "emotions"); // 定义自定义绘制函数 void drawFace(cv::Mat &m, const cv::Rect &rc) { cv::rectangle(m, rc, {0,255,0}, 2); } void drawAgeGender(cv::Mat &m, const cv::Rect &rc, const int age, const int gender) { std::ostringstream ss; ss << (gender == 0 ? "M" : "F") << ": " << age; auto label = ss.str(); int baseLine = 0; auto size = cv::getTextSize(label, cv::FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine); cv::rectangle(m, rc.tl() + cv::Point{0,-size.height-baseLine}, rc.tl() + cv::Point{size.width,size.height}, {0,255,0}, -1); cv::putText(m, label, rc.tl() + cv::Point{0,-baseLine}, cv::FONT_HERSHEY_SIMPLEX, 0.5, {0,0,0}, 1); } void drawEmotion(cv::Mat &m, const cv::Rect &rc, const std::string &emotion) { int baseLine = 0; auto size = cv::getTextSize(emotion, cv::FONT_HERSHEY_SIMPLEX, 0.5, 1,&baseLine); cv::rectangle(m, rc.br() + cv::Point{-size.width,size.height+baseLine}, rc.br() + cv::Point{0,-baseLine}, {0,255,0}, -1); cv::putText(m, emotion, rc.br() + cv::Point{-size.width,-baseLine}, cv::FONT_HERSHEY_SIMPLEX, 0.5, {0,0,0}, 1); } // 定义自定义操作 G_API_OP(PostProc, <cv::GMat(cv::GMat,cv::GArray<cv::Rect>, cv::GArray<int>,cv::GArray<int>, cv::GArray<std::string>)>, "sample.custom.post_proc") { static cv::GMatDesc outMeta(const cv::GMatDesc &in, const cv::GArrayDesc&, const cv::GArrayDesc&, const cv::GArrayDesc&, const cv::GArrayDesc&) { return in; } }; // 实现自定义操作 GAPI_OCV_KERNEL(OCVPostProc, PostProc) { static void run(const cv::Mat &in, const std::vector<cv::Rect> &faces, const std::vector<int> &ages, const std::vector<int> &genders, const std::vector<std::string> &emotions, cv::Mat &out) { out = in.clone(); for (std::size_t i = 0; i < faces.size(); i++) { drawFace(out, faces[i]); drawAgeGender(out, faces[i], ages[i], genders[i]); drawEmotion(out, faces[i], emotions[i]); } } }; int main(int argc, char *argv[]) { // 命令行参数 const std::string input = argc > 1 ? argv[1] : ""; const std::string fdPath = argc > 2 ? argv[2] : ""; const std::string agPath = argc > 3 ? argv[3] : ""; const std::string emPath = argc > 4 ? argv[4] : ""; // 加载网络 auto faceNet = cv::gapi::ie::Params<FaceDetector> { fdPath, // 路径到模型文件 fileNameNoExt(fdPath) + ".bin", // 路径到权重文件 "CPU" // 设备名称 }; auto ageGenderNet = cv::gapi::ie::Params<AgeGender> { agPath, fileNameNoExt(agPath) + ".bin", "CPU" }; auto emotionsNet = cv::gapi::ie::Params<Emotions> { emPath, fileNameNoExt(emPath) + ".bin", "CPU" }; // 构建管道 cv::GMat in; cv::GArray<cv::Rect> faces = cv::gapi::infer<FaceDetector>(in); cv::GArray<cv::GMat> ages; cv::GArray<cv::GMat> genders; std::tie(ages, genders) = cv::gapi::infer<AgeGender>(faces, in); cv::GArray<cv::GMat> emotions = cv::gapi::infer<Emotions>(faces, in); // 自定义后处理 cv::GMat out = PostProc::on(in, faces, custom::ExtractTopClass::on(ages), custom::ExtractTopClass::on(genders), custom::ExtractTopClass::on(emotions)); // 编译管道 auto pipeline = cv::GComputation(cv::GIn(in), cv::GOut(out)) .compileStreaming(cv::compile_args(faceNet, ageGenderNet, emotionsNet, cv::gapi::kernels<OCVPostProc>())); // 设置输入 try { pipeline.setSource(cv::gin(cv::cap::open(input))); } catch (...) { std::cerr << "Can't open source: " << input << std::endl; return -1; } // 运行管道 pipeline.start(); cv::Mat out_frame; while (pipeline.pull(cv::gout(out_frame))) { cv::imshow("Out", out_frame); cv::waitKey(1); } return 0; } 上面的代码展示了如何使用OpenCV G-API构建一个面部分析管道。您可以在OpenCV官方文档中找到更多有关如何使用G-API构建图像处理管道的信息。(1) OpenCV: Graph API. https://docs.opencv.org/4.x/d0/d1e/gapi.html.(2) OpenCV: Face analytics pipeline with G-API. https://docs.opencv.org/4.x/d8/d24/tutorial_gapi_interactive_face_detection.html.(3) OpenCV Graph API初体验 - 简书. https://www.jianshu.com/p/8c8c08496a2c.
2023年05月20日
8 阅读
0 评论
0 点赞
2023-05-09
CUDA安装及环境配置
CUDA是一种并行计算平台和编程模型,它可以利用GPU的强大计算能力来加速各种应用程序的运行。CUDA的安装和环境配置是使用CUDA编程的前提,本文将介绍如何在Windows 10系统下安装CUDA 11.4和配置相应的环境变量。安装CUDA 11.4的步骤如下:检查你的显卡是否支持CUDA,并且安装了最新的显卡驱动。你可以在NVIDIA官网上查询你的显卡型号和对应的CUDA计算能力,以及下载最新的驱动程序。下载CUDA 11.4 Toolkit的安装文件,你可以在NVIDIA官网上选择合适的版本和语言。本文选择的是Windows 10 x64的英文版。双击安装文件,按照提示进行安装。你可以选择自定义安装或者快速安装,本文选择的是自定义安装,并且勾选了所有的组件,包括CUDA开发工具、CUDA运行时库、CUDA示例、Visual Studio集成等。安装完成后,你需要配置CUDA的环境变量,以便于在命令行或者其他IDE中使用CUDA编译器和库。你可以在控制面板中打开系统属性,然后选择高级系统设置,再点击环境变量。在系统变量中,你需要添加或者修改以下几个变量:CUDA_PATH:指向CUDA Toolkit的安装目录,例如C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.4PATH:在原有的值后面追加以下几个路径,用分号隔开:%CUDA_PATH%\bin%CUDA_PATH%\libnvvp%CUDA_PATH%\extras\CUPTI\lib64%CUDA_PATH%\includeNVTOOLSEXT_PATH:指向CUDA Toolkit中的NVIDIA Tools Extension目录,例如C:\Program Files\NVIDIA Corporation\NvToolsExt配置完成后,你可以打开命令行,输入nvcc -V来检查CUDA编译器的版本,如果显示正确的版本信息,说明你已经成功地安装了CUDA 11.4并配置了环境变量。你还可以运行CUDA Toolkit中的示例程序来测试CUDA的功能和性能。你可以在%CUDA_PATH%\samples目录下找到各种示例程序,其中有一些是预先编译好的可执行文件,你可以直接运行它们
2023年05月09日
8 阅读
0 评论
0 点赞
2023-05-08
Labview Actor Frame Work介绍
Labview Actor Frame Work是一个基于对象的软件架构,它可以帮助开发者创建多个VI独立运行并相互通信的应用程序。每个VI都是一个Actor,它可以执行一些特定的系统任务,维护自己的内部状态,并通过消息和其他Actor交互。Labview Actor Frame Work有以下几个优点:容易学习:Labview Actor Frame Work提供了一些模板和范例,让开发者可以快速上手和参考。降低死锁和竞态条件:Labview Actor Frame Work采用了一种无共享的并发模型,每个Actor都有自己的内存空间,不会直接访问其他Actor的数据,只能通过消息传递来交换信息。这样可以避免因为共享资源而导致的死锁和竞态条件。代码复用:Labview Actor Frame Work支持面向对象的编程范式,开发者可以利用继承和多态来创建不同类型的Actor,实现代码的复用和扩展。Labview Actor Frame Work的基本组成部分有:Actor Core VI:这是每个Actor的主要VI,它负责接收和处理消息,执行任务,更新状态,发送消息等。Message类:这是一个抽象类,它定义了所有消息的基本属性和方法。开发者可以根据需要创建不同类型的消息类,继承自Message类,并添加自己的属性和方法。Actor类:这是一个抽象类,它定义了所有Actor的基本属性和方法。开发者可以根据需要创建不同类型的Actor类,继承自Actor类,并添加自己的属性和方法。Launch Actor VI:这是一个辅助VI,它用于启动一个新的Actor,并返回一个Actor引用。Send Message VI:这是一个辅助VI,它用于向一个指定的Actor发送一个消息,并返回一个错误码。Stop Actor VI:这是一个辅助VI,它用于停止一个指定的Actor,并释放其资源。Labview Actor Frame Work的基本工作流程如下:创建Actor类和Message类:开发者需要根据应用程序的需求,设计不同类型的Actor类和Message类,并实现其属性和方法。编写Actor Core VI:开发者需要为每个Actor类编写一个对应的Actor Core VI,实现其主要功能和逻辑。启动根Actor:开发者需要在主程序中使用Launch Actor VI来启动一个根Actor,作为应用程序的入口点。发送和接收消息:开发者可以在主程序或者其他Actor中使用Send Message VI来向其他Actor发送消息,并在Actor Core VI中使用Message Queue函数来接收消息。停止所有Actor:开发者需要在主程序或者根Actor中使用Stop Actor VI来停止所有Actor,并结束应用程序。以上就是Labview Actor Frame Work的简单介绍,如果您想了解更多详情,请参考以下网址:https://www.ni.com/en-us/shop/labview/ni-labview-virtual-user-group--introduction-to-actor-framework.html https://forums.ni.com/t5/Actor-Framework/ct-p/7001 https://blog.csdn.net/qq_26647635/article/details/104178681 https://www.zhihu.com/question/378650962 https://zhuanlan.zhihu.com/p/558515756
2023年05月08日
30 阅读
0 评论
0 点赞
2023-05-06
C# winform 输出DEBUG信息
如果你是一个使用C#开发winform应用程序的开发者,你可能会遇到这样一个问题:如何在程序运行时输出一些调试信息,以便于检查程序的运行状态和发现潜在的错误?有些人可能会想到使用Console.WriteLine方法来向控制台输出信息,但是这种方法有一个缺点,就是winform程序默认是没有控制台窗口的,所以你看不到控制台的输出。那么,有没有其他的方法可以实现这个功能呢?答案是肯定的。在C#中,有一个命名空间叫做System.Diagnostics,它提供了一些类和方法来帮助我们进行调试和跟踪程序的运行情况。其中,有两个类比较常用,分别是Debug类和Trace类。这两个类都有一个WriteLine方法,可以向输出窗口或者其他指定的目标输出信息。输出窗口是Visual Studio IDE中的一个工具窗口,可以通过视图->输出菜单来打开。当你使用Debug.WriteLine或者Trace.WriteLine方法时,你就可以在输出窗口中看到你输出的信息了。那么,Debug类和Trace类有什么区别呢?其实,它们的区别主要在于它们在不同的编译模式下的表现。当你在Visual Studio中编译和运行程序时,你可以选择Debug模式或者Release模式。Debug模式是为了方便调试而设计的,它会保留一些调试信息和符号,并且允许你使用断点和单步执行等功能。Release模式是为了发布程序而设计的,它会优化程序的性能和体积,并且去掉一些调试信息和符号。当你使用Debug.WriteLine方法时,只有在Debug模式下才会执行这个方法,并且只有在输出窗口中才能看到输出的信息。当你使用Trace.WriteLine方法时,在Debug模式和Release模式下都会执行这个方法,并且可以通过配置文件来指定输出的目标,比如文件、事件日志、网络等。因此,如果你只是想在开发阶段进行一些简单的调试,你可以使用Debug.WriteLine方法来向输出窗口输出信息。如果你想在发布阶段也能够跟踪程序的运行情况,并且可以自定义输出的目标,你可以使用Trace.WriteLine方法来输出信息。下面是一个简单的示例代码: using System; using System.Diagnostics; using System.Windows.Forms; namespace WinFormDemo { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Debug.WriteLine("This is a debug message."); Trace.WriteLine("This is a trace message."); } } }
2023年05月06日
8 阅读
0 评论
0 点赞
1
2