基于Jetson Nano的并行图像滤波算法优化与部署

news2024/12/24 20:29:03

基于 Jetson Nano 的并行图像滤波算法优化

在这里插入图片描述

我们实现了基于 GPU (CUDA) 和 CPU (PThread) 的卷积算法,在此基础之上,我们进一步实现 Sobel、Laplacian、均值和高斯滤波器,它们可以被用于图像处理,一个典型的应用场景就是图像降噪。
因此,我们的实验内容主要围绕这些滤波器在图像降噪上效果和它们在Jetson Nano 上的性能表现展开。

在这里插入图片描述

我们分别从两个角度对这些滤波器进行上层封装,即实验角度和部署角度。
既然谈到部署,当然不能局限于人工输入图像,因此,我们加入了摄像头。

您只需要一个普通的USB摄像头,和 Nvidia Jetson 系列下的任意产品即可完整体验我们的项目。
当然,我们的项目是可以在任意支持 CUDA 的 x86 或 ARM 平台上运行的。
当您需要在 x86平台运行我们的项目时,您只需要重新编译即可。
本文档中提供编译指令。

注意:Nano支持最大线程数为 1024 1024 1024,在我们的项目中,实际线程数等于 Block Size 的平方。也就是是说,Block Size 最大为 32 32 32

项目分工相关文件
基于PThread的矩阵运算
和卷积算法
conv_cpu.cpp
基于CUDA的矩阵运算
和卷积算法
conv_gpu.cu
上层应用(图像滤波)
项目整合
其余内容

项目源码下载链接

基于Jetson Nano的并行图像滤波算法优化与部署源码

硬件特性

我们的核心算法(卷积)最初是在 x86 架构的 Linux 上进行的,但所有的实验和部署都是在 Jetson Nano (ARM 架构)上进行。

据 Nvidia 官网:

Jetson Nano 包含一个基于 Maxwell 架构的 GPU,具有 128 个 CUDA 核心和 4GB 的 LPDDR4 内存,最大内存带宽为 25.6 GB/s。此外,Jetson Nano 还配备了一个四核 ARM Cortex-A57 CPU,最高主频为 1.43 GHz。

执行下列语句查看 Jetson Nano 信息:

./executable/infoNano

infoNano由下列命令编译:

nvcc src/utils/infoNano.cu -w -O3 -o executable/infoNano

实验材料

通过 materials.py为 实验生成材料,实验材料包括:

  • 一组原图
  • 一组加高斯噪声的图
  • 一组加椒盐噪声的图
  • 一组加泊松噪声的图
    这些图像被存储在 images/Origin 目录下。

执行下列语句,即可对 images/Origin 目录下的图片增加不同噪声:

python3 src/utils/materials.py

实验

注意:所有的程序都不会创建目录,因此需要确保输出路径存在,否则将无法得到图片结果。

编译

快速开始

你可以执行 buildAll.sh 以编译所有程序。

sh buildAll.sh

CPU 滤波

编译 Gauss、Laplacian、Mean和Sobel多合一滤波器:

g++ src/exp/expCPU.cpp src/filters/cpuFilters.cpp src/utils/utils.cpp src/core/conv_cpu.cpp -Iinclude -O3 -w -pthread -o executable/exp/cpuFilter `pkg-config --cflags --libs opencv4`

对实验材料执行滤波

./executable/exp/cpuFilter mean images/Origin/ output/CPU 2 3 

【Filter】:滤波器类型,可选 gauss lap mean sobel
【Input (Image) Path】:输入图片路径,可以是图片或目录
【Output Path】:输出图片路径,只能是目录
【Num of Thread】:线程数
【Kernel Size】:对于一些滤波器这个参数可能是无效的
【Sigma】:对于一些滤波器这个参数可能是无效的

GPU 滤波

编译 Gauss、Laplacian、Mean和Sobel多合一滤波器:

nvcc src/exp/expGPU.cpp src/filters/gpuFilters.cpp src/core/conv_gpu.cu src/utils/utils.cpp -Iinclude -O3 -w -o executable/exp/gpuFilter `pkg-config --cflags --libs opencv4`

对实验材料执行滤波

./executable/exp/gpuFilter sobel images/Origin/ output/exp/ 32

【Filter】:滤波器类型,可选 gauss lap mean sobel
【Input (Image) Path】:输入图片路径,可以是图片或目录
【Output Path】:输出图片路径,只能是目录
【Block Size】:实际值为传入值的平方
【Kernel Size】:对于一些滤波器这个参数可能是无效的
【Sigma】:对于一些滤波器这个参数可能是无效的

OpenCV 滤波

编译 Gauss、Laplacian、Mean和Sobel多合一滤波器:

nvcc src/exp/expOpenCV.cpp src/filters/openCVFilters.cpp src/utils/utils.cpp -Iinclude -O3 -w -o executable/exp/openCVFilter `pkg-config --cflags --libs opencv4`

对实验材料执行滤波

./executable/exp/openCVFilter sobel images/Origin/ output/epx/

【Filter】:滤波器类型,可选 gauss lap mean sobel
【Input (Image) Path】:输入图片路径,可以是图片或目录
【Output Path】:输出图片路径,只能是目录
【Kernel Size】:对于一些滤波器这个参数可能是无效的
【Sigma】(必须):对于一些滤波器这个参数可能是无效的

部署

与实验部分的编译内容不同的是,每个滤波器是独立的,并没有被集成到一个对象,因此它们占用资源更少。

编译

编译相机

g++ src/deploy/capture.cpp src/utils/utils.cpp -o executable/deploy/capture  -O3 -w -Iinclude `pkg-config --cflags --libs openc
v4`

捕获视频

./executable/deploy/capture 

【Camera】:相机编号
【FPS】:写入帧率
【Path to save Video】:保存路径

CPU

编译 Gaussian Filter 部署应用

g++ -pthread src/deploy/cpuGauss.cpp src/filters/cpuFilters.cpp src/utils/utils.cpp src/core/conv_cpu.cpp -Iinclude -O3 -w -o executable/deploy/cpuGauss `pkg-config --cflags --libs opencv4`

编译 Laplacian Filter 部署应用

g++ -pthread src/deploy/cpuLap.cpp src/filters/cpuFilters.cpp src/utils/utils.cpp src/core/conv_cpu.cpp -Iinclude -O3 -w -o executable/deploy/cpuLap `pkg-config --cflags --libs opencv4`

编译 Mean Filter 部署应用

g++ -pthread src/deploy/cpuMean.cpp src/filters/cpuFilters.cpp src/utils/utils.cpp src/core/conv_cpu.cpp -Iinclude -O3 -w -o executable/deploy/cpuMean `pkg-config --cflags --libs opencv4`

编译 Sobel Filter 部署应用

g++ -pthread src/deploy/cpuSobel.cpp src/filters/cpuFilters.cpp src/utils/utils.cpp src/core/conv_cpu.cpp -Iinclude -O3 -w -o executable/deploy/cpuSobel `pkg-config --cflags --libs opencv4`

GPU

编译 Gaussian Filter 部署应用

nvcc src/deploy/gpuGauss.cpp src/filters/gpuFilters.cpp src/utils/utils.cpp src/core/conv_gpu.cpp -Iinclude -O3 -w -o executable/deploy/gpuGauss `pkg-config --cflags --libs opencv4`

编译 Laplacian Filter 部署应用

nvcc src/deploy/gpuLap.cpp src/filters/gpuFilters.cpp src/utils/utils.cpp src/core/conv_gpu.cpp -Iinclude -O3 -w -o executable/deploy/gpuLap `pkg-config --cflags --libs opencv4`

编译 Mean Filter 部署应用

nvcc src/deploy/gpuMean.cpp src/filters/gpuFilters.cpp src/utils/utils.cpp src/core/conv_gpu.cpp -Iinclude -O3 -w -o executable/deploy/gpuMean `pkg-config --cflags --libs opencv4`

编译 Sobel Filter 部署应用

nvcc src/deploy/gpuSobel.cpp src/filters/gpuFilters.cpp src/utils/utils.cpp src/core/conv_gpu.cpp -Iinclude -O3 -w -o executable/deploy/gpuSobel `pkg-config --cflags --libs opencv4`

OpenCV

编译 Gaussian Filter 部署应用

g++ src/deploy/openCVGauss.cpp src/filters/openCVFilters.cpp src/utils/utils.cpp -Iinclude -O3 -w -o executable/deploy/openCVGauss `pkg-config --cflags --libs opencv4`

编译 Laplacian Filter 部署应用

g++ src/deploy/openCVLap.cpp src/filters/openCVFilters.cpp src/utils/utils.cpp -Iinclude -O3 -w -o executable/deploy/openCVLap `pkg-config --cflags --libs opencv4`

编译 Mean Filter 部署应用

g++ src/deploy/openCVMean.cpp src/filters/openCVFilters.cpp src/utils/utils.cpp -Iinclude -O3 -w -o executable/deploy/openCVMean `pkg-config --cflags --libs opencv4`

编译 Sobel Filter 部署应用

g++ src/deploy/openCVSobel.cpp src/filters/openCVFilters.cpp src/utils/utils.cpp -Iinclude -O3 -w -o executable/deploy/openCVSobel `pkg-config --cflags --libs opencv4`

运行

CPU

运行 Gaussian Filter 部署应用

./executable/deploy/cpuGauss 0 32 1 0.5 on on on

【Camera/Video】:相机/视频路径,视频仅支持MP4
【Num of Thread】
【Kernel Size】
【Sigma】
【Open Origin】:开启原图窗口 (设置为“on”时开启,其他情况不开启)
【Save Origin Video】:保存原视频 (设置为“on”时开启,其他情况不开启)
【Save Output Video】:保存输出视频(设置为“on”时开启,其他情况不开启)

运行 Laplacian Filter 部署应用

./executable/deploy/cpuLap 0 32 on on on

【Camera/Video】:相机/视频路径,视频仅支持MP4
【Num of Thread】
【Open Origin】:开启原图窗口 (设置为“on”时开启,其他情况不开启)
【Save Origin Video】:保存原视频 (设置为“on”时开启,其他情况不开启)
【Save Output Video】:保存输出视频(设置为“on”时开启,其他情况不开启)

运行 Mean Filter 部署应用

./executable/deploy/cpuMean 0 32 5 on on on

【Camera/Video】:相机/视频路径,视频仅支持MP4
【Num of Thread】
【Kernel Size】
【Open Origin】:开启原图窗口 (设置为“on”时开启,其他情况不开启)
【Save Origin Video】:保存原视频 (设置为“on”时开启,其他情况不开启)
【Save Output Video】:保存输出视频(设置为“on”时开启,其他情况不开启)

运行 Sobel Filter 部署应用

./executable/deploy/cpuSobel 0 32 on on on

【Camera/Video】:相机/视频路径,视频仅支持MP4
【Num of Thread】
【Open Origin】:开启原图窗口 (设置为“on”时开启,其他情况不开启)
【Save Origin Video】:保存原视频 (设置为“on”时开启,其他情况不开启)
【Save Output Video】:保存输出视频(设置为“on”时开启,其他情况不开启)

GPU

运行 Gaussian Filter 部署应用

./executable/deploy/gpuGauss 0 32 1 0.5 on on on

【Camera/Video】:相机/视频路径,视频仅支持MP4
【Block Size】
【Kernel Size】
【Sigma】
【Open Origin】:开启原图窗口 (设置为“on”时开启,其他情况不开启)
【Save Origin Video】:保存原视频 (设置为“on”时开启,其他情况不开启)
【Save Output Video】:保存输出视频(设置为“on”时开启,其他情况不开启)

运行 Laplacian Filter 部署应用

./executable/deploy/gpuLap 0 32 on on on

【Camera/Video】:相机/视频路径,视频仅支持MP4
【Block Size】
【Open Origin】:开启原图窗口 (设置为“on”时开启,其他情况不开启)
【Save Origin Video】:保存原视频 (设置为“on”时开启,其他情况不开启)
【Save Output Video】:保存输出视频(设置为“on”时开启,其他情况不开启)

运行 Mean Filter 部署应用

./executable/deploy/gpuMean 0 32 5 on on on

【Camera/Video】:相机/视频路径,视频仅支持MP4
【Block Size】
【Kernel Size】
【Open Origin】:开启原图窗口 (设置为“on”时开启,其他情况不开启)
【Save Origin Video】:保存原视频 (设置为“on”时开启,其他情况不开启)
【Save Output Video】:保存输出视频(设置为“on”时开启,其他情况不开启)

运行 Sobel Filter 部署应用

./executable/deploy/gpuSobel 0 32 on on on

【Camera/Video】:相机/视频路径,视频仅支持MP4
【Block Size】
【Open Origin】:开启原图窗口 (设置为“on”时开启,其他情况不开启)
【Save Origin Video】:保存原视频 (设置为“on”时开启,其他情况不开启)
【Save Output Video】:保存输出视频(设置为“on”时开启,其他情况不开启)

OpenCV

运行 Gaussian Filter 部署应用

./executable/deploy/openCVGauss 0 1 0.5 on on on

【Camera/Video】:相机/视频路径,视频仅支持MP4
【Block Size】
【Kernel Size】
【Sigma】
【Open Origin】:开启原图窗口 (设置为“on”时开启,其他情况不开启)
【Save Origin Video】:保存原视频 (设置为“on”时开启,其他情况不开启)
【Save Output Video】:保存输出视频(设置为“on”时开启,其他情况不开启)

运行 Laplacian Filter 部署应用

./executable/deploy/openCVLap 0 on on on

【Camera/Video】:相机/视频路径,视频仅支持MP4
【Open Origin】:开启原图窗口 (设置为“on”时开启,其他情况不开启)
【Save Origin Video】:保存原视频 (设置为“on”时开启,其他情况不开启)
【Save Output Video】:保存输出视频(设置为“on”时开启,其他情况不开启)

运行 Mean Filter 部署应用

./executable/deploy/openCVMean 0 5 on on on

【Camera/Video】:相机/视频路径,视频仅支持MP4
【Kernel Size】
【Open Origin】:开启原图窗口 (设置为“on”时开启,其他情况不开启)
【Save Origin Video】:保存原视频 (设置为“on”时开启,其他情况不开启)
【Save Output Video】:保存输出视频(设置为“on”时开启,其他情况不开启)

运行 Sobel Filter 部署应用

./executable/deploy/openCVSobel 0 on on on

【Camera/Video】:相机/视频路径,视频仅支持MP4
【Open Origin】:开启原图窗口 (设置为“on”时开启,其他情况不开启)
【Save Origin Video】:保存原视频 (设置为“on”时开启,其他情况不开启)
【Save Output Video】:保存输出视频(设置为“on”时开启,其他情况不开启)

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

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

相关文章

nc细节点

nc细节点 1.每个新home都要替换这个xml文件 2.新建的自定义档案所在的路径 3.在已经发布好的单据上新加一个表体时生成Java源代码的注意事项 可以重新生成Java源代码到其他路径位置上,然后再去生成的路径上把新加的表体VO拿到工作空间里面就可以了 4.rest.proper…

什么是手术麻醉系统?

一、手术麻醉系统的主要作用 手术麻醉系统能更好、更准确地记录和管理手术与麻醉的临床信息,提高医生和麻醉师的工作效率。它主要用于病人手术与麻醉的申请、审批、安排,精确记录病人在手术过程中的术中医嘱、术中费用等信息,追踪生命体征等…

新唐nuc980笔记3-led指示灯测试

记录测试新唐nuc980的指示灯功能。 1、新唐nuc980开发板的指示灯电路如下&#xff1a; 使用的是PB8。 2、新建led工程&#xff0c;测试工程代码如下&#xff1a; #include <string.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h>//GP…

01. Kubernetes基础入门

目录 1、前言 2、Kubernetes介绍 2.1、什么是Kubernetes 2.2、主要功能 2.3、与Docker的关系 2.4、Kubernetes集群架构体系 3、Kubernetes组件 3.1、核心组件 3.2、附加组件 4、Kubernetes对象 4.1、对象管理 4.2、命名空间 4.3、标签 1、前言 Docker 容器技术将…

静态路由:配置和使用详解

文章目录 一、静态路由的配置和使用详解1. 配置要点1.1 点到点接口配置1.2 以太网接口配置 2. 默认路由3. 静态路由的配置命令4. 静态路由实现路由备份和负载分担 二、静态路由的优先级和比较1. 静态路由的优先级设置2. 静态路由与动态路由的比较2.1 静态路由优缺点2.2 动态路由…

《阿里巴巴 Java 开发手册》(一)命名风格

《阿里巴巴 Java 开发手册》 一、编程规约(一)命名风格 一、编程规约 (一)命名风格

【U盘】实现U盘清空并重置恢复存储

打开电脑&#xff0c;将U盘插入USB端口&#xff0c;点按快捷键【WinR】&#xff0c;弹出运行对话框&#xff0c;输入命令 diskpart 进入命令提示符窗口 输入指令 list disk 查看现在的硬盘 这里显示的U盘编号是“1”&#xff0c;因此输入select disk “1”&#xff0c;就是选择…

leetcode56. 合并区间(java)

合并区间 题目描述贪心算法代码演示 题目描述 难度 - 中等 leetcode56. 合并区间 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好…

微服务[Nacos]

CAP 1&#xff09;一致性(Consistency) (所有节点在同一时间具有相同的数据) 2&#xff09;可用性(Availability)(保证每个请求不管成功或者失败都有响应) 3&#xff09;分区容错(Partition tolerance)(系统中任意信息的丢失或失败不会影响系统的继续运作) 一、虚拟机镜像准备 …

知识储备--基础算法篇-滑动窗口

1.滑动窗口 1.1第3题-无重复字符的最长子串 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。 心得&#…

2023年海运行业研究报告

第一章 行业概况 1.1 定义 海运行业&#xff0c;按照全球行业分类标准&#xff08;GICS&#xff09;的定义&#xff0c;是交通运输行业的一个重要子集。这个行业包括那些提供以海洋为主要运输途径的货物和乘客运输服务的公司。这些公司可以运营各种类型的船只&#xff0c;包括…

购物商场项目实践

1.项目开始 1&#xff09;此项目为在线电商项目 2&#xff09;包含首页&#xff0c;搜索列表&#xff0c;商品详情&#xff0c;购物车&#xff0c;订单&#xff0c;支付&#xff0c;用户登录/注册等多个子模块 3&#xff09;使用Vue全家桶ES6webpackAxios等前端技术 4&…

IDea寻找冲突的依赖包

场景&#xff1a;boot项目运行时&#xff0c;提示log4j2依赖包冲突。 SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/D:/maven/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/Stati…

Web安全测试(五):XSS攻击—存储式XSS漏洞

一、前言 结合内部资料&#xff0c;与安全渗透部门同事合力整理的安全测试相关资料教程&#xff0c;全方位涵盖电商、支付、金融、网络、数据库等领域的安全测试&#xff0c;覆盖Web、APP、中间件、内外网、Linux、Windows多个平台。学完后一定能成为安全大佬&#xff01; 全部…

RHCA之路---EX280(5)

RHCA之路—EX280(5) 1. 题目 Using the example files from the wordpress directory under http://materials.example.com/exam280/wordpress create a WordPress application in the farm project For permanent storage use the NFS shares /exports/wordpress and /export…

蓝桥杯打卡Day1

文章目录 全排列八皇后 一、全排列IO链接 本题思路:本题是一道经典的全排列问题&#xff0c;深度优先搜索即可解决。 #include <bits/stdc.h>constexpr int N10;std::string s; std::string ans; int n; bool st[N];void dfs(int u) {if(un){std::cout<<ans<…

java 基础面试题 静态绑定与动态绑定

一 静态绑定与动态绑定 1.1 前言概述 昨天去用友面试&#xff0c;被问到了如下几个问题 1.单例模式使用场景 2.责任链模式 3.分布式事务TCC 4.动态绑定和静态绑定 5.类加载器 今天就来研究一下静态绑定和动态绑定 1.2 静态绑定代码 1.父类&#xff1a;定义一个stati…

OpenCV实现Photoshop曲线调整

《QT 插件化图像算法研究平台》有仿Photoshop曲线调整图像的功能&#xff0c;包括RGB曲线调整和HSV曲线调整。 Photoshop曲线调整原理&#xff1a;RGB、HSV各通道曲线&#xff0c;可以理解为一个值映射&#xff08;值转换&#xff09;函数。X轴是输入&#xff0c;Y轴是输出。x0…

什么是SpringCloud Eureka服务注册与发现

&#x1f600;前言 本篇博文是关于SpringCloud Eureka 介绍&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&…

包管理工具--》npm的配置及使用(一)

目录 &#x1f31f;概念 &#x1f31f;背景 &#x1f31f;前端包管理器 &#x1f31f;包的安装 本地安装 全局安装 &#x1f31f;包配置 配置文件 保存依赖关系 &#x1f31f;包的使用 &#x1f31f;概念 模块&#xff08;module&#xff09; 通常以单个文件形式存…