【论文阅读笔记】Noise2Noise: Learning Image Restoration without Clean Data

news2024/11/18 5:36:36

官方代码地址:https://github.com/NVlabs/noise2noise
论文地址:https://arxiv.org/abs/1803.04189

  第一次接触这方向,相当于翻译了。

摘要

  作者通过机器学习将基础统计推理应用于信号重建上:学习将损坏的观察结果(corrupted observations)映射到干净信号上。作者从这个管道得到了一个简单且有力的结论:通过仅查看损坏样例来学习恢复图像,能达到甚至有时会超越那些没有精确的图像先验或没有退化方法的相似模型情况下(注意前提),使用干净数据训练的模型的
  在实际上,作者仅仅基于噪声数据去学习一个单独的模型,目标是学习相机图片噪声的移除,合成蒙特卡罗图像去噪,和欠采样MRI 扫描的重构。这些图像都被不同的处理方式破坏了。

论文简介

  从损坏或者不完整的测量中重建信号是统计数据分析一个重要的子领域。深度神经网络的最新进展激发了人们对避免信号损坏的传统、显式先验统计建模的浓厚兴趣,而是学习将损坏的观察结果映射到未观察到的干净版本。
  训练数据可能是同一场景的短曝光和长曝光图像对,可能是磁共振图像在K空间采样完整和不完整的对,可能是光线追踪渲染合成场景下快但有噪声和慢但收敛好的光线追踪渲染图像等。

  最近有多项应用方向取得了巨大进展,包括高斯去噪,去JPEG,文字移除,超分辨率,着色(colorization)和图像修复等。但是,获得干净的训练目标通常是困难或乏味的:一个没有噪声的照片需要长曝光才能获得,完整的MRI采样排除了动态对象等等。

  在这项工作中,我们观察到我们通常可以通过仅查看不良图像来学习将不良图像变成良好图像,并且做得很好 - 有时甚至更好 - 就像我们使用干净的例子一样。此外,本文方法既不需要损坏的显式统计似然模型,也不需要先验图像,而是从训练数据中间接学习这些。除了去噪之外,本文的观察直接适用于逆问题,例如从欠采样数据重建 MRI

理论背景

有监督训练前置知识

  当有样本对(可靠的 x x x y y y)的时候,神经网络的优化目标为 arg min ⁡ θ ∑ i L ( f θ ( x ^ i ) , y i ) (1) \argmin\limits_{\theta}\sum\limits_{i}L(f_{\theta}(\hat{x}_i),y_i) \tag{1} θargminiL(fθ(x^i)yi)(1)

  假设符号 y = { y 1 , y 2 , y 3 } y=\{y1, y2, y3\} y={y1,y2,y3}为不靠谱的测量结果,比如室内温度。一个估计真实未知温度 z z z的通用策略是通过一个损失函数 L L L,寻找和测量值有最小平均偏差的温度值: arg min ⁡ z E { L ( z , y ) } (2) \argmin\limits_z\mathbf{E}\{L(z,y)\} \tag{2} zargminE{L(zy)}(2)

  对于 L 2 L_2 L2损失 L ( z , y ) = ( z − y ) 2 L(z,y)=(z-y)^2 L(z,y)=(zy)2,公式 ( 2 ) (2) (2)的最小数值为其观察列表的算数平均值: z = E y { y } (3) z=\mathbf{E}_y\{y\} \tag{3} z=Ey{y}(3)

  而对于 L 1 L_1 L1损失 L ( z , y ) = ∣ z − y ∣ L(z,y)=|z-y| L(z,y)=zy,公式 ( 2 ) (2) (2)则是寻找观察列表的中位数。

  训练神经网络回归是这种点估计的推广。观察经典的训练任务形式:给定一组输入-目标对 ( x i , y i ) (x_i, y_i) (xi,yi),优化神经网络函数的参数 θ \theta θ arg min ⁡ θ E ( x , y ) { L ( f θ ( x ) , y ) } (4) \argmin\limits_{\theta}\mathbf{E}(x,y)\{L(f_{\theta(x),y})\} \tag{4} θargminE(x,y){L(fθ(x)y)}(4)

  完成的训练任务可以解耦成对每个训练采样进行相同的最小化问题,简单地将下面公式 ( 5 ) (5) (5)等价于公式 ( 4 ) (4) (4) arg min ⁡ θ E x { E y ∣ x { L ( f θ ( x ) , y ) } } (5) \argmin\limits_{\theta}\mathbf{E}_x\{\mathbf{E}_{y|x}\{L(f_{\theta}(x),y)\}\} \tag{5} θargminEx{Eyx{L(fθ(x)y)}}(5)

  理论上,网络可以通过为每个输入样本单独解决点估计问题来最小化这种损失。 因此,潜在损失的属性由神经网络训练继承。(即 L 1 L1 L1寻找中位数的属性, L 2 L2 L2寻找平均数的属性)

无监督训练推理知识

  文中有提到,在超分、去噪之类的病态问题上,由于一张输入图对应的是多种可能性,使用L2损失会由于导致模糊(各种可能性的平均),所以有的工作会使用学习鉴别器函数来作为损失。但是,作者发现,L2损失带来的这种平均问题的趋势,可以带来一个想不到的优势。

  而作者的观察是,在一些特定问题的上,这些趋势能带来意想不到的好处(比如 L 2 L_2 L2寻找平均值得趋势)。直观来看, L 2 L_2 L2最小化的属性是寻找期望值。那么,如果我们用期望与目标匹配的随机数替换目标,这个估计值仍是不会改变的。所以,不管特殊分布 y s ys ys是怎么得出的,公式 ( 3 ) (3) (3)的结果都不会改变。相应的,如果输入的条件目标分布 p ( y ∣ x ) p(y|x) p(yx)也被相同期望的条件值替换,公式 ( 5 ) (5) (5)的优化网络参数 θ \theta θ也不会改变。这意味着,原则上,我们可以在网络学习内容(参数)不变的前提下,用零均值的噪声破坏训练目标。将这个与公式 ( 1 ) (1) (1)的被破坏输入相结合,就有了如下的经验风险最小化任务: arg min ⁡ θ ∑ i L ( f θ ( x ^ i , y ^ i ) ) (6) \argmin\limits_{\theta}\sum\limits_{i}L(f_{\theta}(\hat{x}_i,\hat{y}_i)) \tag{6} θargminiL(fθ(x^iy^i))(6)

  上面公式的输入和输出都是在以底层为条件的情况下受到了损坏的分布(损坏分布不必一样),未被观察到的感觉目标也能推理出来 E { y ^ i ∣ x ^ i } \mathbf{E}\{\hat{y}_i|\hat{x}_i\} E{y^ix^i}。给定无限数据,解决方案和公式 ( 1 ) (1) (1)相同。给定有限数据,方差是目标中损坏的平均方差除以训练样本的数量(见附录)。

  有趣的是,以上都不依赖于损坏的似然模型,也不依赖于底层干净图像流形的密度模型(先验)。 也就是说,我们不需要明确的 p ( n o i s y ∣ c l e a n ) p(noisy|clean) p(noisyclean) p ( c l e a n ) p(clean) p(clean),只要我们有根据它们分布的数据。

应用样例

  在图像恢复任务重,受损坏输入数据的期望是寻求恢复的干净目标。
  比如,在低光图像重,一个长时的,没噪声的曝光是短暂的,独立的,有噪声曝光的平均值。考虑到这一点,以上内容表明仅给定噪声图像对就可以学习消除光子噪声的能力,而无需潜在的昂贵或困难的长时间曝光。

  在其他损失函数上也能有相似的观察。
  比如, L 1 L_1 L1损失是恢复目标的中位数,意味着神经网络可以训练来修复具有显著离群值的内容(最高50%,因为是中位数,所以中位数得在正常范围上)。所以,也只需要成对的此类损坏图像。

论文实验

  论文实验室对上面理论的实践。先从简单的噪声分布(高斯,泊松,伯努利)开始,然后进行难度更大,难以分析的蒙特卡罗图像合成噪声实验。也有实验表明能通过仅仅使用损坏的观察中学习磁共振成像 (MRI) 中亚奈奎斯特光谱采样的图像重建。

加性高斯噪声

  作者使用合成加性高斯噪声研究损坏目标的影响。 由于噪声的均值为零,作者使用 L 2 L_2 L2 损失进行训练以恢复均值。

  使用的baseline网络“RED30”(Mao et al., 2016),该网络是有128层特征层的分层残差网络,被证明在广泛的图像恢复任务中有效,也包括高斯噪声。训练参数为:数据集为ImageNet中的50K张图像,patchSize为256,随机噪声标准差范围为 σ ∈ [ 0 , 50 ] \sigma\in[0,50] σ[0,50],噪声对每个训练样本应用。比如,网络需要在移除噪声的同时估计噪声的大小(“盲”去噪,“blind” denoising)。

  验证集为BSD300SET14KODAK。表现如下表所示:
在这里插入图片描述

分析

  这三个数据集上的表现在性质上是相似的,所以下面讨论平均值。使用干净的目标和标准管道训练,在 σ = 25 \sigma=25 σ=25时,RED30达到 31.63 ± 0.02 31.63 \pm 0.02 31.63±0.02dB。当目标图像使用噪声图时(公式 ( 6 ) (6) (6)),去噪的表现仍然很好。收敛速度也很快,如下图所示。所以,我们得出一个结论:在这项任务中,干净的目标不是必要的。这个结论也适用于不同的网络以及不同网络容量。作者进行了进一步测试,使用狭窄的U-Net替换了RED30,大概带来10倍的训练加速,也得到了相近的结果(高斯噪声实验中减少了0.2dB),附录中有网络架构和训练参数的描述。
在这里插入图片描述

收敛速度

  很显然,每个训练样本要训练的要求都是不可能的。因为一个网络没有办法成功从一个噪声实例转换成另一个噪声实例。所以,训练损失在训练中也不会减少,该损失梯度仍会保持相当大。
  那为什么更大、更嘈杂的梯度没有影响收敛速度呢?
  虽然激活梯度确实很嘈杂,但权重梯度实际上相对干净。因为高斯噪声在所有像素中都是独立且同分布的(i.i.d,independent and identically distributed),权重梯度在整个卷积网络的 2 16 2^{16} 216个像素中进行了平均。

  上图1b通过向噪声引入像素间相关性使情况变得更加困难。这种棕色加性噪声是通过不同贷款和缩放保持 σ = 25 \sigma=25 σ=25的空间高斯滤波器获得的模糊白高斯噪声。结果也如图1b所示,随着相关性的增加,权重梯度的有效平均值在减少,权重更新变得更加嘈杂(波动)。这波动让收敛变慢,但及时在极度模糊的情况下,最终画质也是相似的(在0.1db以内)。

有限数据和获取预算

  以前的研究都是通过向干净图像增加合成噪声的方式获得无限的噪声示例。我们现在在有限数据和固定捕获预算的现实场景中研究损坏与干净的训练数据。
  实验步骤如下。将一张ImageNet的图像添加 σ = 25 \sigma=25 σ=25的白色加性高斯噪声对应一个捕获单元(CU,capture unit)。假设19个CU足以进行干净捕获,那么一个噪声实现加上干净版本(19个噪声实现的平均),总共消耗20个CU。整个捕获预算则定为 2000 2000 2000CUs。这个预算是通过干净的潜伏(latents) N N N和每个干净潜伏的噪声实现 M M M得到的,即 N ∗ M = 2000 N*M=2000 NM=2000
  在传统的场景中,我们只有100个图像对( N = 100 , M = 20 N=100,M=20 N=100,M=20):一个噪声实现和对应的干净图像(是19个噪声图像的平均),对应的是上图1c的Case 1。然后,作者发现使用相同的捕获数据,但使用更多的训练对方式(应该是对数据再进行噪声吧?),即 100 ∗ 20 ∗ 19 = 38000 100 * 20 * 19=38000 1002019=38000个图像对能获得更好的结果(增加0.1以上的dB),即使 N N N仍为 100 100 100,对应的是上图1c的Case 2。最后,作者观察到,在 N = 1000 N=1000 N=1000 M = 2 M=2 M=2的设置下,即增加干净数据,但对每个数据只进行两组噪声实现,能产生更好的结果。再次增加了0.1以上的db,上图1c的Case 3.

  结论:对于加性高斯噪声,对比干净的目标,损坏的目标在两个层面上提供好处,不仅性能相同,而且更好。两个好处为:(1)可以看到相同潜在干净图像的更多损坏实现;(2)可以看到更多潜在的干净的图像,即使每个图像只有两个损坏的实现,那也是有益的。

我们得出结论,对于加性高斯噪声,损坏的目标在两个层面上比干净的目标提供好处——不仅性能相同,而且更好:两者都是 1) 看到相同潜在干净图像的更多损坏实现,以及 2) 看到更多潜在的 干净的图像,即使每个图像只有两个损坏的实现,也是有益的。

结果展示

  下面展示了一些RED30的结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

其他合成噪声

泊松噪声

  泊松噪声是图片噪声的主要来源。尽管泊松噪声是零均值,因为它是信号依赖的,所以它更难以去除。训练时,使用 L 2 L_2 L2损失,噪声强度范围为 λ ∈ [ 0 , 50 ] \lambda\in[0,50] λ[0,50]。使用干净数据目标的结果在 30.59 ± 0.02 30.59\pm0.02 30.59±0.02dB,而噪声数据目标也相当好,在 30.57 ± 0.02 30.57\pm0.02 30.57±0.02dB,也是相似的收敛速度。

  对比的方式为:先使用Anscombe 转换将泊松噪声转换成高斯噪声,然后通过BM3D去噪,再进行逆转换。得到的结果比本文方法少2dB。

  其他效应,例如暗电流和量化,由泊松噪声主导,可以设为零均值(Hasinoff 等人,2016 年),因此不会对噪声目标的训练造成任何问题。

  我们得出结论,在此应用程序中不需要无噪声训练数据。

乘性伯努利噪声

  乘性伯努利噪声,又名二项式噪声。构造一个随机掩码 m m m,其数值 1 1 1表示有效像素,数值 0 0 0表示置零/丢失像素。为了避免丢失像素也进行梯度的反向传播,所以将其排除在损失计算中:这我就不懂了,丢失的像素不是才要得到的吗? arg min ⁡ θ ∑ i ( m ⊙ ( f θ ( x ^ i ) − y ^ i ) ) 2 (7) \argmin\limits_{\theta}\sum\limits_{i}(m\odot(f_{\theta}(\hat{x}_i)-\hat{y}_i))^2 \tag{7} θargmini(m(fθ(x^i)y^i))2(7)

  损坏像素的概率被 p p p定义,在训练中, p p p的范围为 p ∈ [ 0.0 , 0.95 ] p\in[0.0,0.95] p[0.0,0.95],测试时, p = 0.5 p=0.5 p=0.5。使用干净数据,训练结果均值在 31.85 ± 0.03 31.85\pm0.03 31.85±0.03dB,噪声数据有一点提升,在 32.02 ± 0.03 32.02\pm0.03 32.02±0.03dB。可能是因为嘈杂的目标在网络输出端有效地实现了一种 dropout 形式 (Srivastava et al., 2014)。DIP要差2dB左右。DIP不是基于机器学习的解决方案,也与本文的方法非常不同,但它的特点是不需要干净样本,也不需要明确的损坏模型。本文使用了 DIP 补充材料中描述的“图像重建”设置。

文字清除

  下图3展示了盲文本清除的结果。损坏包括随机位置的大量不同数量的随机字符串,它们也彼此重叠,而且字体大小和颜色也是随机的。字体和字符串方向保持不变。
在这里插入图片描述

  该网络使用独立损坏的输入和目标对进行训练。损坏像素的概率 p p p在训练时调整范围为 p ∈ [ 0 , 0.5 ] p\in[0,0.5] p[0,0.5],在测试时 p ≈ 0.25 p\approx 0.25 p0.25

  在实验中,发现 L 2 L_2 L2损失对该任务不是正确选项。因为覆盖的文本具有与实际图像无关的颜色,并且生成的图像会错误地倾向于正确答案和平均文本颜色(中灰色)的线性组合。然而,对于任何合理数量的重叠文本(小于0.5的遮盖),一个像素往往会保留原始颜色,因此中位数是正确的统计数据。故使用 L 1 = ∣ f θ ( x ^ − y ^ ) ∣ L_1=|f_\theta(\hat{x}-\hat{y})| L1=fθ(x^y^)作为损失函数。上图表现了一个样例结果。

随机值脉冲噪声

  随机值脉冲噪声用噪声替换一些像素并保留其他像素的颜色。作者研究的不是标准的椒盐噪声(用黑色或白色随机替换像素),而是研究更难的分布,其中每个像素都替换为从概率为 p p p的均匀分布 [ 0 , 1 ] 3 [0,1]^3 [0,1]3中抽取的随机颜色,概率 1 − p 1-p 1p为保留原始颜色。像素的颜色分布是原始颜色的狄拉克分布加上均匀分布,相对权重由替换概率 p 给出。在这个事例中,均值和中值都不能产生正确结果。期望目标是一个分布模式(Dirac spike)。分布仍然是单峰的。对于近似模式搜索,我们使用定义为“L0 损失”函数的退火版本 ( f θ ( x ^ ) − y ^ + ϵ ) γ (f_\theta(\hat{x})-\hat{y}+\epsilon)^\gamma (fθ(x^)y^+ϵ)γ,其中 ϵ = 1 0 − 8 \epsilon=10^{-8} ϵ=108 γ \gamma γ在训练过程中从 2 2 2线性退火到 0 0 0。这种退火不会在本文的测试中引起任何数值问题。 附录分析了L0损失与寻模的关系。

  训练网络时,同样使用噪声输入和噪声输出,损坏像素的概率对于每个对都在 [ 0 , 0.95 ] [0,0.95] [0,0.95]中随机设置。图 4 显示了 70% 输入像素被随机化时的推理结果。使用 L2 损失进行训练会使结果严重偏向灰色,因为结果倾向于线性组合正确答案和均匀随机损坏的均值。正如理论预测的那样,只要少于 50% 的像素被随机化,L1 损失就会产生良好的结果,但超过该阈值后,它会很快开始使暗区和亮区偏向灰色(下图 5)。另一方面,即使在极度损坏(例如 90% 像素)的情况下,L0 也显示出很小的偏差,因为所有可能的像素值,正确答案(例如 10%)仍然是最常见的。
在这里插入图片描述
在这里插入图片描述

蒙塔卡罗渲染

高动态范围(HDR)

  

蒙塔卡罗渲染图像去噪

  

磁共振成像 (MRI)

  

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

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

相关文章

商务与经济统计 | 描述统计学

一.表格法和图形法 条形图 是一种描述已在一个频数,相对频数或百分数频数分布中汇总的品质数据的图形方法 饼形图 是一种常用的描绘品质数据的相对频数分布的图形方法 直方图 横轴上表示所关心的变量,纵轴上表示频数,相对频数或百分数频数…

23软考备考已开始,网络工程师知识点速记~(5)

新一轮软考备考来啦~ 为了帮助大家提高备考效率,将2023上半年软考网络工程师知识点速记分享给大家,快来跟着一起打卡学习吧! 进程的同步和互斥 计算机有了操作系统后性能大幅度提升,其根本原因就在于实现了进程的并发运行。多个…

接口多实现

一、什么是接口 接口是抽象类的延伸,可以将它看作是纯粹的对象类 二、接口模式的特性 (1)接口不可以被实例化。 (2)实现类必须实现接口的所有方法(类似于抽象类和抽象方法)。 (3&…

基于百度飞桨PaddleOCR的图片文字识别

PaddleOCR项目源码:https://github.com/PaddlePaddle/PaddleOCR 飞桨开源文字识别模型套件PaddleOCR,目标是打造丰富、领先、实用的文本识别模型/工具库。最新开源的超轻量PP-OCRv3模型大小仅为16.2M。同时支持中英文识别;支持倾斜、竖排等多…

[附源码]Python计算机毕业设计Django-中国传统手工艺销售平台

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

相似度衡量:苏剑林博客-3

本文主要是对苏剑林老师之前的博客中,对相似度相关的内容稍作整理。 Sentence-bert 是利用bert对两个句子判断相似度。 左图是训练期间的相似度计算方法,右图是推来过程中的相似度计算方法。 训练过程中使用时dense-linear方法,推理过程中…

vue 实现通过字符串关键字符动态渲染 input 输入框

vue 实现通过字符串关键字符动态渲染 input 输入框 今天做一个简单的demo,就是有一个字符串,字符串里面有标识符,前端检测到标识符之后,需要将这个标识符转换成一个 input 输入框并且进行数据输入和绑定功能。 问题描述 就比如现…

SOLIDWORKS 2023新功能揭秘!SOLIDWORKS Simulation 2023版本

SOLIDWORKS 2023新版本已经与大家见面,今天众联亿诚与大家分享SOLIDWORKS Simulation 2023新功能,让我们先一起来看看视频—— 点击观看SOLIDWORKS Simulation 2023新功能 一直以来,SOLIDWORKS Simulation以其易学易用和与设计深度集成深受广…

Docker自定义jdk镜像与上传阿里云

目录 自定义jdk镜像 制作jdk8 :v1.0镜像 alpine制作jdk镜像 alpine简介 基于Alpine制作jdk镜像 Alpine制作jre镜像 Docker镜像上传至阿里云 由于官方没有提供jdk,所以需要自定义jdk来配置java环境,以便于后期部署项目 自定义jdk镜像 制作jdk8 :v1.0…

【JavaWeb】第八章 Servlet

文章目录1、初识Servlet2、Servlet的HelloWorld3、Servlet的生命周期4、Servlet-请求的分发处理5、通过集成HttpServlet类来实现Servlet程序1、初识Servlet Servlet是JavaEE规范之一。规范就是接口。 Servlet是JavaWeb三大组件之一,三大组件分别是Servlet程序、Fi…

JAVA SCRIPT设计模式--行为型--设计模式之Iterator迭代器模式(16)

JAVA SCRIPT设计模式是本人根据GOF的设计模式写的博客记录。使用JAVA SCRIPT语言来实现主体功能,所以不可能像C,JAVA等面向对象语言一样严谨,大部分程序都附上了JAVA SCRIPT代码,代码只是实现了设计模式的主体功能,不代…

[附源码]Python计算机毕业设计Django在线影院系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,我…

[附源码]计算机毕业设计JAVA中小学微课学习系统

[附源码]计算机毕业设计JAVA中小学微课学习系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM myba…

JVM相关学习

一、了解JVM JVM就是Java虚拟机。好处: 一次编写,到处运行;自动内存管理,垃圾回收功能;数组下标越界越界检查;多态。 二、学习JVM 1.程序计数器(寄存器): 作用&#x…

成为大数据工程师需要具备什么能力?发展前景好么

数据工程工作存在于各个行业,在银行业、医疗保健业、大型科技企业、初创企业和其他行业找到工作机会。许多职位描述要求数据工程师、拥有数学或工程学位,但如果有合适的经验学位往往没那么重要。 **那么如何获得数据开发相关岗位的工作经验?…

Three.js一学就会系列:03 炫酷3D划线

系列文章目录 Three.js一学就会系列:01 第一个3D网站 Three.js一学就会系列:02 画线 文章目录系列文章目录前言一、省略部分二、使用方法创建一个dom元素创建初始化方法线条动起来效果总结前言 最近开始入坑前端3D建站,跟大家一起慢慢深入t…

磨金石教育摄影技能干货分享|曾毅——尘封的故土,难忘的乡愁

乡愁是远离家乡的游子们,内心对故土美好的执念。我曾经在新疆边境县待过一年,异域的风情的新奇,充满了我的眼睛。我一度觉得这里真不错,在这待一辈子也挺好。 后来有一次去了当地一个汉族村,刚进村子就恍然有一种回家…

C# SuperSocket 手把手教你入门 傻瓜教程---7(自定义SuperSocket内置的命令行协议)

C# SuperSocket 手把手教你入门 傻瓜教程系列教程 C# SuperSocket 手把手教你入门 傻瓜教程---1(服务器单向接收客户端发送数据) C# SuperSocket 手把手教你入门 傻瓜教程---2(服务器和客户端双向通信) C# SuperSocket 手把手教…

黑马程序员14套经典IT教程+面试宝典

很多同学对互联网比较感兴趣 ,奈何苦恼不知道如何入门。今天免费给大家分享一波,黑马程序员14套经典IT教程程序员面试宝典!涉及Java、前端、Python、大数据、软件测试、UI设计、新媒体短视频等。从厌学到学嗨,你只差一套黑马教程&…

ADS1120 备忘

ADS1120 是一个小型、低功耗、16-bit、ΔΣ 模数转换器(ADC): 内置 PGA(1~128)内置参考基准(2.048V)内置温度传感器内置 2 个已配对的可编程电流源SPI 通讯接口,使用 模式 1 &#…