Author Archives: lcpcsky

树莓派开启Wi-Fi热点

By | January 22, 2022

如果你需要在外场通过Wi-Fi连接树莓派,但又没有路由器的Wi-Fi信号,这种情况可以把树莓派配置成AP,发射一个Wi-Fi热点。 注意:本文不涉及通过Wi-Fi热点上网 好了,现在应该可以搜索到一个叫raspberry的Wi-Fi信号了,树莓派的IP地址是:192.168.80.1

训练一个跑在嵌入式环境的YOLOv4模型检测人,猫,狗

By | May 31, 2020

2020年4月,Alexey Bochkovskiy在他的Github放出了YOLO检测模型的第四个版本:YOLOv4,比YOLOv3计算量变化不大的前提下,大幅提升了算法效果,在MS COCO数据集上mAP@0.5从33%提升到43.5%。 官方提供训练好的权重文件大小为246MB,提供了80类物体的检测,在PC上通过CPU运行608×608尺寸推理的耗时则达到了2秒多,要在嵌入式环境运行完全无法达到实时性能要求。如果我们只关心某几类物体,能否进行一些优化呢? 我挑选了三类目标:人、猫、狗进行实验。在MS COCO 2017数据集上训练一个可以在VisionSeed(1T FP16算力)上实时运行的YOLOv4-nano模型。 MS COCO 2017包含80类不同的目标框标注,训练集和验证集图片数量如下: 123456+——-+——–+——–+——+——+—–+ |       |  all   | person | cat  | dog  | … | +——-+——–+——–+——+——+—–+ | train | 118287 |  64115 | 4114 | 4385 | … | | val   |   5000 |   2693 |  184 |  177… Read More »

Category: AI

在Ubuntu 18.04上安装深度学习训练环境

By | May 5, 2020

0x00:前传 去年底又入了一台DELL,这次是因为需要GPU训模型,正好Nvidia出了基于Turing核心的GTX-1660Ti用于笔记本,比2060少了Tensor Core,但显存一样是6G,想想Tensor Core的意义在于FP16加速训练,但半精度训练配置比较繁琐,暂时不折腾也罢,于是6799入了这台Dell-G3-3590游戏本,被我装上Ubuntu训模型,训练速度比CPU快了20~30倍,大概有V100单卡的50%,而价格只及V100的1/10,非常适合用来学习。 第一次折腾CUDA,实现了CUDA9和CUDA10共存,能同时支持下面两个环境,把安装过程记录一下。 tensorflow-gpu 1.9:CUDA9 + cuDNN 7.0 darknet:CUDA10 + cuDNN 7.5 0x01:理论 CUDA分为两个部分,内核态的驱动(.ko)和用户态的动态链接库(.so)。CUDA的内核态驱动是高版本兼容低版本。而一般说的CUDA9或者CUDA10是指用户态动态链接库的版本,跨版本不兼容,因此,理论上只需要安装一个高版本的内核态驱动,然后通过将CUDA的用户态库安装到不同目录中来达到多版本共存目的。 内核态的驱动版本号一般是3xx.mm或4xx.mm,例如,现在最新的是440.64,在Ubuntu下,由nvidia-driver-4xx和它的依赖包提供。 用户态的动态链接库,其实是一系列的功能库组成的集合,例如cudart, cublas, curand, cufft等,由cuda-libraries-10-0和它的依赖包提供。 还有一个部分,是CUDA内核函数编译器(此内核并非操作系统内核,应该是源于filer的kernel概念,这里指运行在GPU中的算子),由cuda-compiler-10-0和它的依赖包提供。如果需要运行自定义的CUDA kernel函数,就需要安装这个包,例如编译darknet就需要它。 0x02:现状 Ubuntu有两个源提供CUDA驱动和库,一个是Ubuntu的官方源,另一个是Nvidia提供的源。Nvidia源比较新,并且提供了CUDA各个版本共存的机制,所以经过一番尝试后,最终选择了Nvidia源。 0x03:安装CUDA内核态的驱动和CUDA10 在新立得包管理器(synaptic)中,打开“设置”->“软件库”->“其他软件”,点击“添加”,分别添加下面两个Nvidia源,然后关闭并自动刷新: 12deb http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64 / deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64 / 如果是手动编辑/etc/apt/source.list并遇到如下错误: 1W: GPG error: https://developer.download.nvidia.cn/compute/machine-learning/repos/ubuntu1804/x86_64  Release: The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY F60F4B3D7FA2AF80 可通过命令自动添加证书:… Read More »

Category: AI

TensorFlow中Batch Normalization的两个大坑

By | October 5, 2019

尝试用Inception和MobileNet训练一个二分类模型,折腾了几天,发现MobileNet很难收敛,而Inception训练虽然收敛,但测试时结果却很糟糕。 最后排查下来,只要在测试时把is_training设为True,看起来就正常了,但只要is_training是False,结果就不对。 很容易就排查到了一个问题,从零构建的代码使用如下的方式创建优化器(实际上是错误的): 1    self.train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(self.loss, global_step=self.global_steps) Inception和MobileNet使用的Batch Normalization层需要在训练时统计mini batch的均值和方差并进行滑动更新;在推理时是不进行统计和更新的,而是使用训练时统计好的值。这就要求训练时要进行额外的操作,正确的写法是这样: 123    extra_update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)     with tf.control_dependencies(extra_update_ops):         self.train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(self.loss, global_step=self.global_steps) 让人意外的是,改正了这个问题后,测试不收敛的问题还是一直萦绕着,虽然多个链接都说按照上面修改后,is_training为False就没问题了[1] [2],但我面临的情况并非如此。 现在的现象仍然是:训练逐渐趋于收敛(accuracy > 0.99),但测试时却是非常奇怪的结果(accuracy 约等于 0.5),而且对任何输入图片,都输出固定的结果,比如[0.503, 0.497] 左图:训练收敛 右图:测试不收敛 在slim.mobilenet源码中,is_training只出现了4次,除影响bn层外,还影响了dropout层,通过对照实验很快排除了dropout层,问题锁定在了bn层。bn层有很多参数,其中一个decay参数是控制统计滑动平均的保留率,在mobilenet和inception的实现中,对应于batch_norm_decay,它的默认值为0.9997,逼近速度非常慢,如果我们训练集很小,训练次数也只很少(几千次)的话,均值和方差几乎没有得到更新!奇怪的是,只有很少的文章提到了这个问题[3] 12    with slim.arg_scope(mobilenet_v1.mobilenet_v1_arg_scope(batch_norm_decay=0.95)):         self.prediction, ep = mobilenet_v1.mobilenet_v1(xs_reshaped, num_class, dropout_keep_prob=self.keep_prob, is_training=self.is_trainning,… Read More »

Category: AI

在Ubuntu上使用macOS的快捷键

By | January 27, 2018

因为常用机一台Mac,一台Linux,都频繁使用,两个系统不同的快捷键已经让人精神分裂了! macOS几乎所有的快捷键都基于command键,全选(cmd+a)、复制(cmd+c)、粘贴(cmd+v)、开关标签页(cmd+t/w)、切换窗口(cmd+tab)、保存(cmd+s)、撤销(cmd+z)、重做(cmd+shift+z)、查找(cmd+f) 而Linux几乎沿用了Windows的习惯,混合使用ctrl和alt,现在甚至fn都用上了(fn+left=home, fn+right=end),忽然感慨macOS设计的优美,频繁使用的快捷键都是加cmd,不用考虑到底是按alt, ctrl还是fn。 终于找到两个神器——gnome-tweak-tool和AutoKey,可以重新映射全局快捷键 12apt-get install autokey-gtk sudo apt-get install gnome-tweak-tool 基本思路是:把alt和ctrl对调,用键位和cmd类似的alt来实现macOS上cmd的功能,再逐一解决各种小问题: 通过AutoKey实现home、end等功能: 设置窗口切换快捷键(Ubuntu 16.04): 设置窗口切换快捷键(Ubuntu 18.04):系统设置->设备->键盘->切换应用程序:Ctrl-Tab done!

2017年的新电脑(Dell Vostro 5370)上安装Ubuntu 16.04

By | December 16, 2017

我只是想要一台轻便、稳定、好用的Linux笔记本,没想到却被PC行业的各种“新”设计折腾的半死…… 改分区,为Linux腾空间 我一开始被BitLocker整懵了,Ubuntu的安装工具完全无力招架加密分区,后来发现Win10自己也可以改变分区大小,不需要任何第三方工具,就在磁盘管理里,对C盘右键,有“压缩”选项,这名字起的还真够歧义,但就是他了!因为开了BitLocker,压缩选项是灰的,关掉BitLocker就好了!这方面Win10做的还不错,可以动态关闭BitLocker,可以动态调整分区大小。 UEFI 一开始因为在Win10下面用Universal USB Installer 123制作的安装U盘,必须在BIOS里把UEFI和Securt Boot关掉才能引导,这样安装后也还是Legacy模式,和原来Win10的UEFI模式不能和谐共存,折腾疯了之后,才发现根本【不用关闭UEFI和Securt Boot】!正常情况下就应该能在UEFI启动设置那里看到Ubuntu的安装U盘,并顺利启动,如果没有看到,只有一个可能,就是安装U盘制作方式不对,目前试过的方法,只有把iso文件直接写入U盘的方式才可以,就是在一台Linux机器用dd命令写入: 12sudo umount /dev/sdb sudo dd if=ubuntu.iso of=/dev/sdb bs=1M(一定先确定好sdb是你的U盘哦,要不然你sdb的数据可就没了!) Touchpad(ClickPad单按键全面板) 真的没有见过这么脑残的触摸板设计,手指放在按钮区域竟然会被识别成触摸!我习惯拇指一直搭在左键上,再用食指触摸当指针,可是这个触摸板这样操作是不行的,会被理解成双指操作,真的非常非常脑残!由于不是Synaptics的触摸板,没有找到软件解决方案,只能在左键上垫了一层东西,隔绝了触摸识别。然后问题又来了,由于触摸板只有一个实体按键,区分左右键是通过看按下去的时候手指的触摸区域来做到的,垫了一层东西后,没有识别到手指,触摸板就不知道到底是左键还是右键了,按下去没反应,折腾一晚上,才发现这个变通的方法:关闭ClickPad模式(唯一的实体按键直接当作左键处理,不做触摸区域识别,因此也就没有了实体右键,不过右键用的不多,双指轻触手势作右键也还凑合) 编辑配置文件: 1sudo vi /usr/share/X11/xorg.conf.d/70-synaptics.conf 增加一节,增加Option “ClickPad” “0”,以便允许没有触摸点击用作左键单击 12345678Section "InputClass"         Identifier "clickpad buttons"         MatchDriver "synaptics"         Option "ClickPad" "0"         Option "VertScrollDelta"… Read More »

Hosts a HP printer on my WIFI router(OpenWRT)

By | April 21, 2014

Warning: this article may out of date, I found another way to setup a socket printer officially supported by OpenWRT: p910nd Printing through network is very convenient since everyone in the office can share the printer. We have a strong WIFI router running OpenWRT, and I found that the CUPS system was included in the… Read More »

TopCoder SRM 588 DIV 2 maxSongs

By | September 3, 2013

TopCoder SRM 588 DIV 2 500 maxSongs Failed to pass system tests during the competition through simple greedy strategy. I thought it can be solved by DP, but had no clear way to go. After the competition, I finally found out that the result must be a subset of the vector sorted by tone! So, we can… Read More »