Read on Omnivore
Read Original

Highlights&&Note

速度: 经典的目标检测算法使用滑动窗法依次判断所有可能的区域。本文则(采用Selective Search方法)预先提取一系列较可能是物体的候选区域,之后仅在这些候选区域上(采用CNN)提取特征,进行判断。
相较于传统算法,通过滑动窗口寻找,rcnn使用了selective search,再在可能的区域上进行CNN提取特征

RCNN算法分为4个步骤

  1. 候选区域生成: 一张图像生成1K~2K个候选区域 (采用Selective Search 方法)
  2. 特征提取: 对每个候选区域,使用深度卷积网络提取特征 (CNN)
  3. 类别判断: 特征送入每一类的SVM 分类器,判别是否属于该类
  4. 位置精修: 使用回归器精细修正候选框位置

Selective Search 主要思想:

  1. 使用一种过分割手段,将图像分割成小区域 (1k~2k 个)
  2. 查看现有小区域,按照合并规则合并可能性最高的相邻两个区域。重复直到整张图像合并成一个区域位置
  3. 输出所有曾经存在过的区域,所谓候选区域

其中合并规则如下: 优先合并以下四种区域:

  • 颜色(颜色直方图)相近的
  • 纹理(梯度直方图)相近的
  • 合并后总面积小的: 保证合并操作的尺度较为均匀,避免一个大区域陆续“吃掉”其他小区域 (例:设有区域a-b-c-d-e-f-g-h。较好的合并方式是:ab-cd-ef-gh -> abcd-efgh -> abcdefgh。 不好的合并方法是:ab-c-d-e-f-g-h ->abcd-e-f-g-h ->abcdef-gh -> abcdefgh)
  • 合并后,总面积在其BBOX中所占比例大的: 保证合并后形状规则。

阅读更多

Read on Omnivore
Read Original

Highlights&&Note

机器学习(machine learning,ML)是一类强大的可以从经验中学习的技术。 通常采用观测数据或与环境交互的形式,机器学习算法会积累更多的经验,其性能也会逐步提高。
机器学习是用来解决
任务内部关系过于复杂的情况,或者超过人类意识理解的东西,例如:图像识别
^231222a7

通常,即使我们不知道怎样明确地告诉计算机如何从输入映射到输出,大脑仍然能够自己执行认知功能。 换句话说,即使我们不知道如何编写计算机程序来识别“Alexa”这个词,大脑自己也能够识别它。 有了这一能力,我们就可以收集一个包含大量音频样本的数据集(dataset),并对包含和不包含唤醒词的样本进行标记。 利用机器学习算法,我们不需要设计一个“明确地”识别唤醒词的系统。 相反,我们只需要定义一个灵活的程序算法,其输出由许多参数(parameter)决定,然后使用数据集来确定当下的“最佳参数集”,这些参数通过某种性能度量方式来达到完成任务的最佳性能。
输入与输出的关系是模糊的
通过多参数灵活映射输入与输出
^e2164f0a

那么到底什么是参数呢? 参数可以被看作旋钮,旋钮的转动可以调整程序的行为。 任一调整参数后的程序被称为模型(model)。 通过操作参数而生成的所有不同程序(输入-输出映射)的集合称为“模型族”。 使用数据集来选择参数的元程序被称为学习算法(learning algorithm)。
^bc5cc8ed

但如果模型所有的按钮(模型参数)都被随机设置,就不太可能识别出“Alexa”“Hey Siri”或任何其他单词。 在机器学习中,学习(learning)是一个训练模型的过程。 通过这个过程,我们可以发现正确的参数集,从而使模型强制执行所需的行为。
^ef363967

训练过程通常包含如下步骤:

  1. 从一个随机初始化参数的模型开始,这个模型基本没有“智能”;
  2. 获取一些数据样本(例如,音频片段以及对应的是或否标签);
  3. 调整参数,使模型在这些样本中表现得更好;
  4. 重复第(2)步和第(3)步,直到模型在任务中的表现令人满意。

../_images/ml-loop.svg
^6403cc68

我们没有编写唤醒词识别器,而是编写了一个“学习”程序。 如果我们用一个巨大的带标签的数据集,它很可能可以“学习”识别唤醒词。
机器学习的程序是一个学习程序 ^a6d8fb02

当每个样本的特征类别数量都是相同的时候,其特征向量是固定长度的,这个长度被称为数据的维数(dimensionality)。
^d95af809

固定长度的特征向量是一个方便的属性,它可以用来量化学习大量样本。

然而,并不是所有的数据都可以用“固定长度”的向量表示。 以图像数据为例,如果它们全部来自标准显微镜设备,那么“固定长度”是可取的; 但是如果图像数据来自互联网,它们很难具有相同的分辨率或形状。 这时,将图像裁剪成标准尺寸是一种方法,但这种办法很局限,有丢失信息的风险。 此外,文本数据更不符合“固定长度”的要求。 比如,对于亚马逊等电子商务网站上的客户评论,有些文本数据很简短(比如“好极了”),有些则长篇大论。 与传统机器学习方法相比,深度学习的一个主要优势是可以处理不同长度的数据。
^8384344e

监督学习的学习过程一般可以分为三大步骤:

  1. 从已知大量数据样本中随机选取一个子集,为每个样本获取真实标签。有时,这些样本已有标签(例如,患者是否在下一年内康复?);有时,这些样本可能需要被人工标记(例如,图像分类)。这些输入和相应的标签一起构成了训练数据集;
  2. 选择有监督的学习算法,它将训练数据集作为输入,并输出一个“已完成学习的模型”;
  3. 将之前没有见过的样本特征放到这个“已完成学习的模型”中,使用模型的输出作为相应标签的预测。
阅读更多

Read on Omnivore
Read Original

Highlights&&Note

作为日本人来说,站在日本的视角,是找不到其他出路的。
因为这本就和日本无关,是朝贡体系崩坏后的结果,
这是中国的问题而不是日本的问题,
因此压根和日本无关。
东亚混乱的根源是宗主国本身的衰弱 ^d8b6d633

Content

逛2CH的,就知道日本人的意识形态。
日本人是真心觉得二战那会,日本是为了解放在白人统治下的亚洲和欧美人作战的。
其实到现在部分人还有那种心思。

这种思想你也不能说全错:因为当年亚洲尤其是东南亚就是在欧美统治下的,
且二战结束后,东南亚确实和欧洲人作战,且把欧洲人驱逐了,
问题在于,日本人实际上替代了欧美,成了新一代的殖民者,日本人认为自己这个殖民者比欧美的殖民者更友善。
然后再去看鸟山明的作品,那就很正常了,
鸟山明的意识形态,和2CH的网民没什么两样。

==作为日本人来说,站在日本的视角,是找不到其他出路的。==
==因为这本就和日本无关,是朝贡体系崩坏后的结果,==
==这是中国的问题而不是日本的问题,==
==因此压根和日本无关。==
所以日本人就算绞尽脑汁也想不出什么解决办法的。

沙漠大冒险鸟山明龙珠

阅读更多

Read on Omnivore
Read Original

Highlights&&Note

首先介绍detectron2中使用的registry机制

Trainer中初始化模型调用的接口是build_model函数,通过modeling/__init__.py可以知道它是在modeling/meta_arch/build.py中定义的。但是在阅读build.py的过程中,我们发现它使用了一个叫做Registry的东西——那么什么是Registry呢?

Registry机制来自于FaceBook计算机视觉研究组的常用函数库fvcore,其中Registry的源代码和解读可见registry。它的主要作用是提供了用字符串调用类方法的接口,具体的函数是registry中的get方法。个人感觉registry.get()非常像一个getattr方法,它能够通过字符串访问类的方法。

例如我们有一个具体的网络结构,定义在modeling/meta_arch/rcnn.py中的GeneralizedRCNN。注意在它的定义上方有一个修饰器@META_ARCH_REGISTRY.register(),意思就是把GeneralizedRCNN注册到META_ARCH_REGISTRY中。那么在modeling/meta_arch/build.py中的model = META_ARCH_REGISTRY.get(meta_arch)(cfg)中,只要我们设置meta_archGeneralizedRCNN,那么META_ARCH_REGISTRY.get(meta_arch)就调用了GeneralizedRCNN方法,也就因此初始化了模型。

  • 指定名字来调用模型
    用@ 修饰器在META_ARCH_REGISTRY中注册
    再在参数中写入名称即可实现初始化*

registry的几个要点

  • 创建一个registry,设置可能的调用的类的名字
  • 对于想加入到registry中的类,在定义的时候通过修饰器指定
  • 调用类方法的时候通过get(name)
  • 通过fvcore中的源代码,我们可以知道如何写python修饰器。

Faster-RCNN的结构主要包含如下几个部分,而这几个部分也是GeneralizedRCNN在初始化部分的输入:

  • backbone:从图片提取特征表示的卷积神经网络结构,比如说ResNet。
  • proposal_generator:从图片的特征预测“哪里可能有物体”
  • roi_head:以proposal_generator部分预测的有物体区域为基础,预测物体的类别和检测框坐标

__init__功能相似的是from_config函数,它用config文件初始化模型,通过这个函数我们知道了实际构造backbone、proposal_generator和roi_head的函数分别都是来自对应文件夹的build_xxx函数。

RCNN模型处理函数的过程,我们主要关注forward函数,主要包括如下步骤:

阅读更多

Read on Omnivore
Read Original

Highlights&&Note

因此,整个demo的核心实际上是VisualizationDemo

模型处理输入得到输出predictions=self.predictor(image)predictions就是模型(刚刚的self.predictor)输出的结果。阅读机器学习、深度学习代码最重要的就是追踪这类模型处理数据的代码,因为这类代码是理解整体计算模型的关键。

predictor.py9-12行的import部分,我们可以学习到很多架构深度学习项目的规范、设计方法,在不同的文件夹中,我们往往会通过功能将不同的模块分开包装。例如在predictor.py中体现的:

  • .data:处理数据相关的类和方法
  • .engine:对训练、预测逻辑的整体包装,类似于对整体Pipeline的定义,常见于大型项目
  • .utils:应该是utilities的简写,一般用来放置常用的工具模块,例如在这里体现出来的可视化部分

总之,对于越大型的项目来说,合理的分区、包装就越有必要,因为这可以从软件工程角度节省大量用来理解、开发、查错(Debug)的成本。在自己的很多小项目中,合理地使用类似的方法也能有效地提升项目质量。

训练代码是tools/train_net.py

if __name__ == '__main__'的部分(这里是代码运行的接口),可以看到detectron2的结构是利用launch运行了main函数中的内容。如果我们不关心分布式训练的部分(即在distributed的作用域的部分),那么main函数的逻辑相当简单:得到模型和运行的参数(在参数cfg中)。利用定义好的类Trainer,通过传入cfg参数可以定义出模型,后面的部分均通过Trainer里面的方法都可以实现,例如train()顾名思义就是做训练的,test()就是测试的,build_model()就是创建模型的。
很有意思的是,过去的detectron2没有封装invoke_main.不知道为什么要封装这么个东西

Trainer的定义中我们发现它是一个继承自engine.DefaultTrainer的子类,而我们通过上面对main函数的分析发现Trainer的主要功能其实都来自于DefaultTrainer
trainer看engine.DefaultTrianer就行

查看文件名字和每个文件上面__all__的部分可以大致猜测出它们之间相互引用的关系和每个文件主要负责的部分

defaults.py包含了我们在train_net.py中见到的DefaultTrainer,也大多是在import别人

launch.py中的launch顾名思义是让算法开始运行的代码,我们浏览一下它最主要的函数launch,根据它的参数num_machinesmachine_rank可得知它是负责分布式训练的代码,又有参数中main_func,可以知道launch不涉及detectron2的实际功能
分布式训练,不用管

我们清晰了engine部分的层次关系。具体而言,我们按照如下的顺序阅读代码

  • train_loop.py
  • hook.py
  • defaults.py

HookBaseHook的基类,其中实现了方法before_stepbefore_trainafter_stepafter_train,其主要的作用是在真正做训练之前,做好每一步的准备工作。针对不同的Trainer可以使用不同的Hook。Hook翻译过来叫做“钩子”,所以我们可以形象地理解成Hook像在训练首尾的两个钩子一样挂着负责训练的Trainer

TrainerBase中定义了多个Hook,并且在Trainerbefore_stepafter_step等函数中可以看到需要执行每一个Hook在训练之前的准备动作HookBase.before_step、训练之后的收尾动作HookBase.after_step。具体的训练过程非常正常,就是按照iteration的数量运行before_steprun_stepafter_step三个函数。
在 Python 中,hook通常是指在特定时刻自动执行的函数。

SimpleTrainer中作者实现了一种最基本的训练神经网络的流程,它是作为上一段中TrainerBase的子类出现的。它最主要的工作就是将TrainerBase中没有实现的run_step方法实现。事实上,在SimpleTrainer中实现的过程也是最通用的训练过程:

  • iter(dataloader)读取数据
  • loss_dict = self.model(data)计算每个batch的loss
  • self.optimizer.zero_gradlosses.backward()self.optimizer.step()实现训练的过程
  • 通过统一的结构_write_metrics记录、打印计算的指标。
阅读更多

linux ssh root用户登录

操作

修改/etc/ssh/sshd_config文件.此文件为ssh配置文件
找到#PermitRootLogin yes,去掉注释#.重启ssh服务就可以了

1
2
sudo vim /etc/ssh/sshd_config
sudo systemctl restart ssh

[[Omnivore/2024-06-05/SSH原理与运用(一):远程登录 - 阮一峰的网络日志|SSH原理与运用(一):远程登录 - 阮一峰的网络日志]]
[[07archive/tech/OpenClash导致的ssh登录失败|OpenClash导致的ssh登录失败]]

阅读更多

OpenClash导致的ssh登录失败

情况说明

只能内网访问设备,外网访问设备失败,报错为Connection to "my.domain.cn" closed with error: connection reset by peer

  • ipv4
  • 主路由ikuai
    • ddns已设置
    • 端口映射已开
  • 旁路由openwrt
    • 原使用PassWall,改用OpenClash代理

解决

主要看OpenClash的这个issue
openclash开启fake ip模式,服务>>openclash>>插件设置>>黑白名单 >>绕过核心的来源端口添加内网端口

阅读更多

Read on Omnivore
Read Original

Highlights&&Note

SSH之所以能够保证安全,原因在于它采用了公钥加密。

整个过程是这样的:(1)远程主机收到用户的登录请求,把自己的公钥发给用户。(2)用户使用这个公钥,将登录密码加密后,发送回来。(3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。

如果你是第一次登录对方主机,系统会出现下面的提示:

$ ssh user@host

The authenticity of host ‘host (12.18.429.21)’ can’t be established.

RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.

Are you sure you want to continue connecting (yes/no)?

这段话的意思是,无法确认host主机的真实性,只知道它的公钥指纹,问你还想继续连接吗?

所谓”公钥指纹”,是指公钥长度较长(这里采用RSA算法,长达1024位),很难比对,所以对其进行MD5计算,将它变成一个128位的指纹。上例中是98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d,再进行比较,就容易多了。

用户怎么知道远程主机的公钥指纹应该是多少?回答是没有好办法,远程主机必须在自己的网站上贴出公钥指纹,以便用户自行核对。
公钥是暴露的

每个SSH用户都有自己的known_hosts文件,此外系统也有一个这样的文件,通常是/etc/ssh/ssh_known_hosts,保存一些对所有用户都可信赖的远程主机的公钥。

Content

阅读更多

Read on Omnivore
Read Original

Highlights&&Note

革命的困境之一 近代史上的中国面临着两到三次技术革命接连掉队的问题

第一次和第二次技术革命,中国都没有跟上步伐。到了近代史的末期,以核技术和计算机为代表的第三次技术革命也开始涌现了。 反复落后于技术革命并导致落后度不断叠加,这使得中国的自救之路变得相当艰辛,甚至是越来越危险。
技术的不断发展甚至导致了,中国越革命越进步,与世界列强的差距,不减反增 ^18a87aae

被技术革命反复甩下还造成了另一个严重问题: 中国的经济和文化发展具有高度的不平衡性。

上海在20世纪上半叶已经是远东超级大都市,知识分子可以容易地接触到世界前沿思想文化,而全国绝大多数地方依然是文盲遍地的赤贫封闭农村。此种内部的严重不平衡极容易导致族群内部由于阶级,文化,经济模式等差异而被纵向撕裂。 这种撕裂既容易使占大部分人口的普罗大众对能接触到先进生产力和先进文化的少数精英感到不信任, 也容易使少数精英主动地甚至被迫地脱离普罗大众, 而真正想要扎根群众动员群众的精英则往往不得不在文化和政治理念上开历史倒车以保证自己能接地气。一个组织要想同时代表先进生产力,先进文化和最广大人民的利益是十分困难的。
精英与群众的血肉联系亦是俊男的 ^3d824fd0

革命的困境之二 中国近代以来遭受到的外部挑战是全方位的文明冲击。

清朝人用了几十年时间逐步认识到,中国在军事、经济、科技、政治各个方向上全方位落后于西方。此种文明冲击是中国古代史上未曾面对过的,也使得中国没有办法依托丰富的治乱循环,王朝更替和同化少数族群的经验来处理此次外部文明挑战。
^a60b86c7

革命的困境之三 中国革命面临十分复杂的国际政治格局。

阅读更多

Read on Omnivore
Read Original

Highlights&&Note

Detectron2 的基本思路就是利用配置文件搭积木。

  • 第一步,将模型拆分为多个模块,每个模块可以叫做一个类型的积木。
  • 第二步,构建配置文件。
  • 第三步,通过配置文件,选择对应的积木。
  • 有一个默认配置文件,即 detectron2/config/default.py 文件。
  • 示例配置文件放在 configs 文件夹中,且使用yaml形式。
  • 所有示例配置文件都是建立在默认配置文件基础上的,即所有示例配置文件中的配置其实都是不全的,缺失的配置需要到默认配置文件中寻找。
  • detectron2 的配置文件比 mmdetection 看起来简洁很多。
  • 有得必有失,虽然简洁,但在看源码的时候经常需要查看默认配置文件,也不是特别方便。
  • 示例配置文件中有一个_BASE_属性,可以将其他示例配置文件作为基础,如果有冲突则用当前配置文件的信息覆盖。

Content

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

参考 Detectron2入门教程 - 云+社区 - 腾讯云

目录

1. 概述

阅读更多