首页
关于
壁纸
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
搜索到
36
篇与
的结果
2023-06-23
黑群晖DSM-7.X开启NVME缓存的方法
1、群晖在控制面板-终端机与SMNP,启用SSH功能;2、在电脑的SSH工具,以root登录群晖,输入命令查看nvme的名字:ls /dev/nvme*如果只有一个nvme硬盘并且硬盘为空,一般会显示/dev/nvme0n1,如果有两个空的nvme硬盘则显示/dev/nvme0n1和/dev/nvme1n1,只需要记住这些名字就行了;如果nvme有分区了,还会显示如/dev/nvme0n1、/dev/nvme0n1p1、/dev/nvme0n1p2等,这些分区名字不用理会。3、输入命令,查看nvme硬盘的ID:udevadm info /dev/nvme0n1我们要记住自己的nvme所在的位置,比如我的就是0000:00:1d.0,这个数字一定要记下来;3、之所以NVME硬盘黑群晖的空间管理员中无法识别,是因为群晖提前设定了各个机型的NVME所在的PCI位置,这些信息保存在 /lib64/libsynonvme.so.1 这个文件中,而我们需要将这个文件中,关于DS918+机型的NVME所在的PCI位置改为自己机器实际所在的位置就能正确识别了;4、先备份一下原文件,输入命令:cp /lib64/libsynonvme.so.1 /lib64/libsynonvme.so.1.bak5、把原文件 libsynonvme.so.1 复制到一个可以供其他电脑下载的共享文件夹中,比如我将其复制到 Download 这个共享文件夹(具体以实际路径为准,请自行更改),输入命令:cp /lib64/libsynonvme.so.1 /volume1/Download/libsynonvme.so.16、在电脑访问群晖,将在Download文件中的 libsynonvme.so.1 下载到本地电脑;7、在电脑上使用 winhex 软件打开刚才下载的 libsynonvme.so.1 文件,按ctrl+F键输入DS918+搜索,在右侧找到如下图字段的原数据为0000:00:13.0和0000:00:13.1,根据第一步查到的本机NVME所在的PCI位置,修改为0000:00:1d.0,顺便把另外一个nvme插槽也该了即0000:00:1d.1,修改后保存;8、将修改后的 libsynonvme.so.1 文件,上传到群晖的 Download 共享文件夹下(以第5步使用的文件夹为准),覆盖原文件。9、返回 ssh 工具,以root账户登录群晖;10、删除群晖系统原文件:rm /lib64/libsynonvme.so.111、把修改好的文件复制到系统(把 /volume1/Download 替换为第5步实际使用的路径):cp /volume1/Download/libsynonvme.so.1 /lib64/libsynonvme.so.112、修改文件权限:chmod 755 /lib64/libsynonvme.so.113、重启群晖,再打开存储管理器,就发现正常识别NVME并可以按照提示进行缓存的设置。上述内容原文地址:http://www.gebi1.com/thread-299964-1-1.html上面操作,博主在DS918-7.01-42218版本下亲测,是OK的。如果群晖系统型号不是DS918+,而是别的系统型号(比如DS3617xs/DS3622xs+等,除了DS3615xs以外)的DSM7.X版本,那么就不能用上面的方法,需要按照以下流程操作:1、群晖在控制面板-终端机与SMNP,启用SSH功能;2、在电脑的SSH工具,以root登录群晖,输入命令查看nvme的名字:ls /dev/nvme*如果只有一个nvme硬盘并且硬盘为空,一般会显示/dev/nvme0n1,如果有两个空的nvme硬盘则显示/dev/nvme0n1和/dev/nvme1n1,只需要记住这些名字就行了;如果nvme有分区了,还会显示如/dev/nvme0n1、/dev/nvme0n1p1、/dev/nvme0n1p2等,这些分区名字不用理会。3、输入命令,查看nvme硬盘的ID:udevadm info /dev/nvme0n1找到这个nvme硬盘的ID,比如我的就是0000:00:1d.0,这个数字一定要记下来;4、输入命令,修改文件:vi /etc.defaults/extensionPorts使文件里面的ID与实际nvme硬盘的相匹配,比如我这个要改成(以你实际的ID为准):[PCI]pci1="0000:00:1d.0"如果有两个nvme硬盘,则改成(以你实际的ID为准):[PCI]pci1="0000:00:1d.0"pci2="0000:00:1d.1"5、保存退出,重启群晖生效。
2023年06月23日
8 阅读
0 评论
0 点赞
2023-06-23
黑群晖DS918开启m.2 nvme固态硬盘做存储空间(支持DSM6.2X和DSM7.X)
众所周知,官方群晖DS918+可以用两条m.2 nvme固态硬盘做缓存盘,黑群晖也可以通过打补丁的方式支持用m.2 nvme固态硬盘做缓存盘。黑群晖其实还可以用m.2 nvme固态硬盘来做存储盘,在万兆网络里面可以提高内网复制文件的速度。本教程于DS918-6.2.3系统下测试通过。一、黑群晖打m.2 nvme补丁(如果已经打过补丁,此步骤跳过)1、如果DSM系统是918-6.23版本的,下载Nvme的补丁 libsynonvme.so.1( 点我下载)到电脑 ;2、把下载的文件复制到群晖的 /usr/lib64 目录下,,并设置成可执行的权限(此步骤需要用root权限);3、如果之前是6.22的版本,打过6.2.2的nvme补丁,需要进 /usr/local/etc/rc.d 文件夹,把 libNVMEpatch.sh 删除(如果没有打过上面的补丁,此步骤可以跳过);4、如果DSM系统是918-7.X版本的,需要先按照《黑群晖DS918-7.X开启NVME缓存的方法》修改系统文件;5、重启群晖,重启后在存储空间管理员—hdd/ssd,查看能否正确识别nvme固态硬盘。二、创建nvme存储盘(以下操作,都需要用root权限)1、输入命令查看NVME硬盘状态ls /dev/nvme*此时会显示所有的nvme固态硬盘,第一个为nvme0n1;2、查看第一个nvme固态硬盘信息fdisk -l /dev/nvme0n13、创建分区synopartition --part /dev/nvme0n1 12在第一块NVME的上创建分区输入“Y”,确认4、查看刚刚创建的分区fdisk -l /dev/nvme0n1查看第一块NVME的分区布局,没有问题5、查看当前储存池情况,记一下最后一个存储池的数字(比如我的是md2)cat /proc/mdstat6、创建NVME存储池mdadm --create /dev/md3 --level=1 --raid-devices=1 --force /dev/nvme0n1p3需要注意的是:需要在上一步骤显示的储存池数字基础上加1,作为nvme的存储池(所以是md3)输入“y”确认7、创建储存空间,btrfs格式和ext4格式,只能二选一:创建ext4格式请输入以下命令mkfs.ext4 -F /dev/md3创建btrfs格式请输入以下命令mkfs.btrfs -f /dev/md38、重启群晖;三、存储空间2就是nvme固态硬盘了,搞定!特别说明:如果你的群晖版本是DSM7.X版本,需要先按照《黑群晖DS918-7.X开启NVME缓存的方法》教程识别到nvme,才可以敲命令建立存储。
2023年06月23日
8 阅读
0 评论
0 点赞
2023-06-09
[AI]我的影子,我的自由
以下均为AI生成的虚假内容{lamp/}我有一个影子,它总是跟在我身后,无论我走到哪里,它都不会离开我。有时候,我觉得它很可爱,就像一个忠实的朋友,陪伴着我。有时候,我觉得它很烦人,就像一个拖油瓶,限制着我。我想要摆脱它,但是我做不到。它是我的影子,也是我的枷锁。我曾经问过我的影子,你为什么要跟着我?你有没有自己的想法和意志?你不觉得这样很无聊吗?我的影子沉默了一会儿,然后说:我是因为有所依赖才是这样的。我依赖你的身体和光线的角度,才能形成这样的形状和大小。如果没有你,我就不存在了。我所依赖的东西又有所依赖,你依赖空气和食物,光线依赖太阳和月亮。我们都是有所依赖的,没有谁能够完全自由。你问我有没有自己的想法和意志,其实我也不知道。我只是按照自然的规律而行动,没有刻意去思考或选择。或许这就是我的想法和意志吧。你说这样很无聊,其实我也不觉得。我觉得这样很安稳,没有什么风险和困难。我不需要担心未来或后悔过去,只需要顺应当下。听了我的影子的话,我感到很惊讶,也很困惑。原来我的影子也有自己的思想,虽然和我不一样。它对自己的状态很满意,也很理解自己的局限。它没有抱怨或反抗,也没有渴望或追求。它只是简单地存在着,跟随着我。而我呢?我对自己的状态并不满意,也不理解自己的局限。我常常抱怨或反抗,也常常渴望或追求。我想要更多的自由和选择,想要掌控自己的命运。但是这样做有什么意义呢?难道我就能比我的影子更自由吗?难道我就能摆脱所有的依赖吗?难道我就能找到真正的幸福吗?庄子在《齐物论》中讲了一个有趣又值得深思的故事。这个故事就是罔两问影。罔两是影子的影子。一天,影子的影子诘问影子:“影子啊!你看你,一会儿动一动,一会儿又不动;一会儿坐着,一会儿又站着。你能不能有独立的操守啊?”影子若有所思,它也很疑惑。它回答说:“这是怎么回事呢?我是因为有所依赖才是这样的吗?那我有所依赖的东西又有所依赖才是这样的吗?那我所依赖的像什么呢?是不是像蛇要游走需要依赖它的腹鳞,蝉要飞翔需要依赖它的翅膀吗?我分不清了。谁能告诉我?我怎能知道为什么会这样,又怎能知道为什么不会这样呢?”这个故事让我想起了我和我的影子的对话,也让我思考了什么是“不由自主”。我觉得“不由自主”并不是一种消极或被动的状态,而是一种顺应或认同的态度。我们都是在一定的条件和环境下生活,我们都有我们的依赖和局限,我们都不能完全控制自己的一切。但是我们可以选择如何看待自己的处境,如何对待自己的影子。我们可以把它们当作负担或敌人,也可以把它们当作伙伴或朋友。我们可以把它们视为障碍或困扰,也可以把它们视为机遇或启示。我们可以因为它们而感到沮丧或绝望,也可以因为它们而感到欣慰或感恩。我们可以试图摆脱或改变它们,也可以试图接受或理解它们。这就是我们的自由,也是我们的操守。我想,我的影子其实很聪明,它知道自己的本质和位置,它不会做超出自己能力和范围的事情,它也不会期待超出自己现实和理想的事情。它只是做好自己的本分,跟随着我。而我呢?我是否也能做到这样呢?我是否也能找到自己的本质和位置呢?我是否也能做好自己的本分,跟随着自然呢?我想,这就是我要学习的地方,也是我要追求的目标。我要学习我的影子,我的自由。
2023年06月09日
10 阅读
0 评论
0 点赞
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
使用gapi的传统推理的简单示例
https://forum.opencv.org/t/simple-example-of-traditional-inference-using-gapi/2872 #include "opencv2/imgcodecs.hpp" #include "opencv2/imgproc.hpp" #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" // 命令行参数 const std::string about = "This is an OpenCV-based version of Security Barrier Camera example"; const std::string keys = "{ h help | | print this help message }" "{ input | | Path to an input img file }" "{ fdm | | IE face detection model IR }" "{ fdw | | IE face detection model weights }" "{ fdd | | IE face detection device }"; namespace custom { //! [G_API_NET] // 面部检测器:接受一个Mat,返回另一个Mat G_API_NET(Faces, <cv::GMat(cv::GMat)>, "face-detector"); // SSD后处理函数 - 这不是网络而是内核。 // 内核体单独声明,这只是一个接口。 // 此操作接受两个Mats(检测结果和源图像), // 并返回ROI的向量(由默认阈值过滤)。 // 阈值(或要选择的类)可能成为参数,但由于 // 此内核是自定义的,因此没有太大意义。 G_API_OP(PostProc, <cv::GArray<cv::Rect>(cv::GMat, cv::GMat)>, "custom.fd_postproc") { static cv::GArrayDesc outMeta(const cv::GMatDesc &, const cv::GMatDesc &) { // 此函数需要由G-API引擎确定 // 给定输入参数时输出格式是什么。 // 由于输出是数组(具有特定类型), // 因此没有什么可描述的。 return cv::empty_array_desc(); } }; // 上述内核的基于OpenCV的实现。 GAPI_OCV_KERNEL(OCVPostProc, PostProc) { static void run(const cv::Mat &in_ssd_result, const cv::Mat &in_frame, std::vector<cv::Rect> &out_faces) { const int MAX_PROPOSALS = 200; const int OBJECT_SIZE = 7; const cv::Size upscale = in_frame.size(); const cv::Rect surface({0,0}, upscale); out_faces.clear(); const float *data = in_ssd_result.ptr<float>(); for (int i = 0; i < MAX_PROPOSALS; i++) { const float image_id = data[i * OBJECT_SIZE + 0]; // batch id const float confidence = data[i * OBJECT_SIZE + 2]; const float rc_left = data[i * OBJECT_SIZE + 3]; const float rc_top = data[i * OBJECT_SIZE + 4]; const float rc_right = data[i * OBJECT_SIZE + 5]; const float rc_bottom = data[i * OBJECT_SIZE + 6]; if (image_id < 0.f) { // indicates end of detections break; } if (confidence < 0.5f) { // a hard-coded snapshot continue; } // 将浮点坐标转换为绝对图像 // 帧坐标;剪切源图像边界。 cv::Rect rc; rc.x = static_cast<int>(rc_left * upscale.width); rc.y = static_cast<int>(rc_top * upscale.height); rc.width = static_cast<int>(rc_right * upscale.width) - rc.x; rc.height = static_cast<int>(rc_bottom * upscale.height) - rc.y; out_faces.push_back(rc & surface); } } }; //! [Postproc] } // namespace custom int main(int argc, char *argv[]) { cv::CommandLineParser cmd(argc, argv, keys); cmd.about(about); if (cmd.has("help")) { cmd.printMessage(); return 0; } const std::string input = cmd.get<std::string>("input"); // 表达我们的处理管道。使用基于lambda的构造函数 // 用于在专用作用域中保留所有临时对象。 //! [GComputation] cv::GComputation pp([]() { // 声明一个空的GMat - 管道的开端。 cv::GMat in; // 在输入帧上运行面部检测。结果是一个单独的GMat, // 在内部表示1x1x200x7 SSD输出。 // 这是infer的单补丁版本: // - 推理在整个输入图像上运行; // - 图像自动转换并调整为网络预期的格式。 cv::GMat detections = cv::gapi::infer<custom::Faces>(in); // 使用自定义内核解析SSD输出到ROI(矩形)列表。 // 注意:解析SSD可能成为“标准”内核。 cv::GArray<cv::Rect> faces = custom::PostProc::on(detections, in); // 现在指定计算的边界 - 我们的管道消耗 // 一个图像并产生一个输出。 return cv::GComputation(cv::GIn(in), cv::GOut(faces)); }); //! [GComputation] // 注意:此时加载尺寸可能非常有用! // 在我们的计算定义之后,指定它应如何执行。 // 执行由我们用于编译管道(这是不同步骤)的推理后端和内核后端定义。 // 声明FaceDetection网络的IE参数。注意这里custom::Face // 是我们先前在GAPI_NETWORK()中指定的类型名称。 // cv::gapi::ie::Params<>是通用配置描述,它是 // 针对我们使用的每个特定网络进行专门化。 // // OpenCV DNN后端将具有其自己的带有设置的参数结构 // 与OpenCV DNN模块相关。其他可能的推理也适用 // 后端... //! [Param_Cfg] auto det_net = cv::gapi::ie::Params<custom::Faces> { cmd.get<std::string>("fdm"), // read cmd args: path to topology IR cmd.get<std::string>("fdw"), // read cmd args: path to weights cmd.get<std::string>("fdd"), // read cmd args: device specifier }; // 形成一个内核包(带有我们的单个基于OpenCV的后处理实现) // 和一个网络包(持有我们的三个网络)。 auto kernels = cv::gapi::kernels<custom::OCVPostProc>(); auto networks = cv::gapi::networks(det_net); { // inference ! // 声明我们将从管道接收的数据对象。 cv::Mat in_frame = cv::imread("input"); // the input ! // 捕获到的帧本身 std::vector<cv::Rect> faces; // 检测到的面部数组 pp.apply(cv::gin(in_frame), cv::gout(faces), cv::compile_args(kernels, networks)); // do something with the face rects } return 0; }
2023年05月20日
7 阅读
0 评论
0 点赞
1
2
3
4
...
8