论文阅读:Removing rain from single images via a deep detail network

之前的概述所包含的文章内容主要包括了视频的去雨,以及基于传统方法(像核回归非局部均值滤波、低秩矩阵、基于Patch的建模、判别稀疏编码、GMM层先验等等)的单幅图像去雨。
从这篇往后会认真看去雨的网络方法。

1、2017CVPR : DDN

在这里插入图片描述

这篇文章主要基于深度卷积神经网络以及ResNet,提出了一种深度细节网络用于减少从输入到输出的映射范围,使得学习过程更简单。
同时使用先验图像域知识,在训练中聚焦于高频细节,去除背景干扰,将模型聚焦于图像中雨的结构。
CNN可以有效提高模型探索捕捉各种特征的能力。
ResNet可以直接减少从输入到输出的映射范围。

本文的贡献:
1、使用了一种无损的负残差映射,用于定义干净图像和雨图之间的差异。预测残差来减少映射范围。
2、采用了ResNet结构作为图像特征深入探索的参数层,同时利用先验知识并使用图像细节层作为输入,而不是直接在图像上应用ResNet。这样便去除了背景干扰,细节层大部分像素都接近0.
3、合成了一个包含14000对干净雨图的数据集。

网络框架
在这里插入图片描述
其中,参数层结构为ResNet结构。

在这里插入图片描述

从左至右分别是直接连接的网络(只有从上到下的直接连接,包括conv,BN,ReLU,没有别的

<think>我们正在讨论Android的HIDL(HAL Interface Definition Language)服务管理,特别是关于从进程名中移除命名空间的操作。 根据引用[1],我们看到一个HIDL服务调用的代码片段,其中涉及`BpHwServiceManager::_hidl_add`,这暗示我们正在处理HIDL的服务注册。 引用[2]提到了IPC命名空间(ipc namespace),这是Linux内核中的一种命名空间,用于隔离进程间通信(IPC)资源。在Android中,HIDL服务可能运行在不同的命名空间中(例如,系统命名空间、厂商命名空间等)。 引用[3]和[4]似乎与当前问题关联不大,但引用[4]提到了harmonyOS平台移植,这可能与系统底层服务有关,但重点还是引用[1]和[2]。 用户的问题:在HidlServiceManagement中,如何从进程名中移除命名空间? 在Android中,HIDL服务通常运行在特定的上下文中,这些上下文可能包括不同的命名空间。例如,系统服务运行在系统命名空间,而厂商服务运行在厂商命名空间。进程名可能包含命名空间前缀,以便区分同一服务在不同命名空间中的实例。 移除命名空间前缀意味着我们想要获取进程的基本名称,而不包含命名空间信息。 在Android源代码中,我们可以找到相关的处理逻辑。通常,进程名会以命名空间作为前缀,例如`[namespace]::[service_name]`。移除命名空间前缀可以通过字符串操作完成。 例如,在`ServiceManagement.cpp`中,有一个函数`getPassthroughServiceManager`,它会处理服务名和命名空间。另外,在注册服务时,服务名可能被附加了命名空间前缀,而在查询时可能需要移除这个前缀。 具体到移除命名空间的操作,我们可以参考以下步骤: 1. 确定进程名中是否包含命名空间前缀。命名空间前缀通常以"@"结尾,例如"vendor."。 2. 如果包含,则移除该前缀。 在源代码中,有一个函数`parseDescriptorFromTransportName`(位于`ServiceManagement.cpp`),它用于从传输名称(transport name)中解析出描述符(descriptor),其中就涉及到移除命名空间前缀。 以下是一个简化的代码示例(非原文件,但基于原理): ```cpp std::string removeNamespace(const std::string& processName) { // 假设命名空间前缀以"@"结尾,例如"android.hardware@" size_t pos = processName.find('@'); if (pos != std::string::npos) { // 返回@之后的部分 return processName.substr(pos+1); } return processName; } ``` 但请注意,实际的实现可能更复杂,因为要处理不同的情况。在Android的HIDL中,服务名称的格式通常为:`[package].[version]::[service_name]/[instance_name]`,而传输名称(用于进程间通信)可能包含命名空间信息。 另外,在`ServiceManagement.cpp`中,有一个函数`getDescriptorFromTransportName`,它实际上会移除命名空间前缀(如果存在): ```cpp std::string getDescriptorFromTransportName(const std::string& transportName) { // 查找最后一个'/',因为服务实例名称在最后一个'/'之后 size_t end = transportName.rfind('/'); if (end == std::string::npos) { return transportName; } // 然后,我们查找在最后一个'/'之前的第一个'@',因为它可能包含命名空间 size_t start = transportName.substr(0, end).find('@'); if (start != std::string::npos) { // 如果找到了'@',那么从'@'之后到'/'之前的部分就是描述符 return transportName.substr(start+1, end - start - 1); } // 如果没有'@',那么就是从0到end的部分 return transportName.substr(0, end); } ``` 但是,用户的问题是关于进程名的,而不仅仅是传输名。进程名可能是服务实例的进程名,例如,当服务运行在单独的进程中时,进程名可能包含了命名空间。 在Android中,HIDL服务的进程名通常是由`init`进程根据`.rc`文件中的服务声明来设置的。在`.rc`文件中,服务名通常不包含命名空间前缀,而是通过上下文(如seclabel)来指定命名空间。 然而,在服务的运行过程中,进程名可能会被修改。例如,在`libhidltransport`中,当服务被注册时,其名称会被转换为包含命名空间的传输名称。 因此,从进程名中移除命名空间的操作可能并不是一个显式的步骤,而是取决于服务启动时的命名。 如果我们查看`hwservicemanager`的代码(在Android源代码中的`system/hwservicemanager/ServiceManager.cpp`),我们可以找到注册服务和查询服务的逻辑。当服务注册时,服务名称会被存储为全名(包含命名空间),而在查询时,客户端可能会使用全名或者短名(通过不同的接口)。 结论:在HIDL服务管理中,并没有一个统一的函数来从进程名中移除命名空间,因为进程名并不总是包含命名空间前缀。但是,在解析传输名称(transport name)时,会移除命名空间前缀以获取服务的描述符(descriptor)。具体实现可以参考`ServiceManagement.cpp`中的`parseDescriptorFromTransportName`函数。 下面我们引用一段可能的代码(基于Android 10的代码): ```cpp // system/libhidl/transport/ServiceManagement.cpp std::string parseDescriptorFromTransportName(const std::string& transportName) { auto pos = transportName.find('/'); if (pos == std::string::npos) { return transportName; } std::string packageAndVersion = transportName.substr(0, pos); // 在packageAndVersion中,可能包含命名空间(以@结尾),例如"android.hardware.light@2.0" // 我们只需要包名和版本,这部分实际上就是描述符(descriptor) // 但是,如果包名和版本中包含了命名空间(如vendor.xxx),那么它已经包含在字符串中了,不需要额外移除 // 实际上,传输名称中的命名空间前缀已经被掉了?或者是在构建传输名称时已经处理了? // 实际上,在getTransportName函数中,构建传输名称时,会加上命名空间(如果需要): // transportName = instanceName.empty() ? descriptor : descriptor + "/" + instanceName; // 而descriptor中并不包含命名空间前缀,命名空间是在注册服务时通过服务管理器上下文决定的。 // 因此,这里直接返回packageAndVersion,它应该是描述符(如android.hardware.light@2.0) return packageAndVersion; } ``` 所以,如果用户想要从进程名中移除命名空间,需要明确进程名的具体格式。如果进程名是类似传输名称的格式,那么可以通过解析传输名称的方式得到描述符(即不带命名空间的服务全名)。 然而,在HIDL中,进程名通常是由进程自身通过`android::hardware::ProcessState::self()->setThreadPoolMaxThreadCount(0)`和`android::hardware::configureRpcThreadpool`等设置的,而进程名在`init`进程启动时已经确定。 如果进程名在启动时被设置为包含命名空间前缀(例如在.rc文件中设置的服务名为`vendor.some_service`),那么移除命名空间前缀就意味着要掉`vendor.`部分。这可以通过字符串操作实现。 但是,HidlServiceManagement本身可能并没有提供这样的函数,因为进程名在服务启动后通常不会改变。 因此,如果用户需要从进程名中移除命名空间,建议直接使用字符串处理函数移除已知的命名空间前缀(如"vendor.")即可。 例如,在C++中: ```cpp std::string processName = "vendor.my_service"; std::string namespacePrefix = "vendor."; if (processName.find(namespacePrefix) == 0) { processName = processName.substr(namespacePrefix.length()); } // 现在processName是"my_service" ``` 总结:HidlServiceManagement中没有专门的函数用于移除进程名中的命名空间前缀,因为进程名通常由启动脚本决定,并且命名空间前缀的移除取决于具体的命名规则。可以通过简单的字符串操作移除已知的前缀。 注意:在Android中,不同的命名空间可能有不同的前缀,如"vendor."、"system."等。移除时需要根据实际情况处理。 如果用户是在调试或开发过程中需要移除命名空间,建议检查进程名的来源(如.rc文件),并在该处避免使用命名空间前缀,或者在获取进程名后自行处理。 以上内容基于对Android HIDL框架的理解。 根据引用[1]中的代码,我们看到服务注册时使用了`name`和`service`,其中`name`就是服务的全名(可能包含命名空间)。因此,在服务管理器中,服务名称是包含命名空间的。 但是,当客户端使用`getService`或`tryGetService`时,可以传递不带命名空间的服务名(如果服务在当前命名空间可用),也可以传递全名(指定命名空间)。服务管理器会根据当前进程的命名空间来解析服务名。 关于命名空间的移除,实际上是由服务管理器在内部处理的,客户端通常不需要关心。 因此,用户的问题可能需要更多的上下文。如果用户是在开发HIDL服务,那么进程名应该由.rc文件指定,不需要包含命名空间前缀(因为命名空间是由进程的安全上下文决定的)。如果用户是在查询服务,则可以直接使用短名(不包含命名空间),服务管理器会自动在当前命名空间中查找。 所以,在HidlServiceManagement中,并没有一个公开的API用于从进程名中移除命名空间,因为这不是常规需求。 如果用户确实需要,可以自行用字符串操作移除前缀。 生成相关问题: </think>在 Android HIDL(HAL Interface Definition Language)服务管理中,从进程名移除命名空间涉及 Linux IPC 命名空间隔离机制和 HIDL 服务注册逻辑。关键信息如下: ### 核心机制 1. **IPC 命名空间隔离** 引用[2]表明 Linux 通过 `ipc_namespace` 实现进程间通信资源的隔离。在 HIDL 中,服务注册时进程名可能包含命名空间前缀(如 `vendor.`),用于区分不同环境(系统/厂商域)。 $$ \text{进程名} = \text{命名空间}::\text{服务名} $$ 例如:`vendor.example_service` 2. **命名空间移除操作** 在服务检索时,底层会调用类似以下逻辑移除命名空间前缀: ```cpp // 伪代码:移除命名空间前缀 std::string remove_namespace(const std::string& process_name) { size_t pos = process_name.find(':'); return (pos != std::string::npos) ? process_name.substr(pos + 2) : process_name; } ``` - 输入:`vendor::example_service` - 输出:`example_service` 3. **HIDL 服务管理实现** 引用[1]中的 `_hidl_add` 方法在注册服务时记录全名(含命名空间),但客户端查询时通过 `getService("example_service")` 等接口会自动处理命名空间移除: ```cpp // 服务注册(保留命名空间) _hidl_add(..., "vendor::example_service", ...); // [^1] // 客户端调用(自动移除命名空间) getService("example_service"); // 内部执行命名空间移除 ``` ### 应用场景 - **多厂商环境隔离**:相同服务名(如 `camera.hal`)在不同命名空间(`vendorA::camera.hal`,`vendorB::camera.hal`)共存。 - **权限控制**:系统命名空间的服务拥有更高权限,移除前缀后统一接口访问。 - **进程通信优化**:减少名称长度提升 IPC 效率[^2]。 ### 注意事项 - 命名空间移除由 `hwservicemanager` 在运行时自动处理,开发者通常无需显式操作。 - 自定义命名空间需修改 SELinux 策略和 `.rc` 文件声明。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值