Petoi Nybble:树莓派猫奴玩家的福音

MAKER:Rongzhong Li/译:趣无尽 Cherry(转载请注明出处)

猫咪真的是一种十分神奇的生物,它毛茸茸的外表和柔软的身躯俘获了无数猫奴们的芳心。

很多人因为各种各样的现实问题不能养猫,那么今天给亲们带来的这只3D打印的机器猫可以完全满足你撸猫的愿望。

Nybble是李荣仲博士从2016年购入第一块树莓派就开始精心筹划的项目。李博士一直致力于STEM和AI研究这两个领域,从Petoi Nybble中,我们可以看到李博士已经将这两块内容巧妙的融合在一起。

Nybble利用激光切割机切割出各种木质组件,并拼装起来,然后利用各种算法进行训练,让它越来越接近真实猫的行为习惯,可趣,可萌,十分的灵动可爱。

其中,Nybble把树莓派作为大脑用来思考一些富有哲学问题:“我是谁?”“我从哪里来?”“我到哪里去?”,随后会做出一系列的指令发送到Arduino,让Arduino来完成细节的动作。

资深猫奴的他,在设计 Nybble时花费了不少心血。

早期的 Nybble,猫咪的主体是由塑料的飞机机身搭建而成的,从一开始他就把树莓派设定为大脑,用Arduino来控制所有动作。

这里有一段 Nybble 进化史视频。

现在小编带大家一起进入Nybble的世界吧!

材料清单

Nybble 套件(众筹中)

Arduino Pro Mini 328-5 V/16MHz

树莓派(Raspberry Pi)3B

USB-Mini USB 电源线

14500 3.7v 锂电池

智能充电器

特性

这只可爱的Nybble可能是世界上最轻,速度最快的机器人猫。它的运动由Arduino兼容的微控制器驱动。它是通过存储本能的“肌肉记忆”来移动。

安装在Nybble背面的树莓派,就能帮助Nybble有感知和做决定。你可以用自己喜欢的语言进行编程,只需发送简短的命令,如“走路”或“向左转”,就可以指导Nybble走动!

Nybble基于OpenCat框架,采用木质的复古的设计,纪念中国祖先传统木匠的工艺。它借用了中国传统木制品(以纪念我祖先)的智慧,使主框架无螺丝。

拼接示意图

这里有一段组装视频,李博士细致的讲解大家可以感受下:

https://v.qq.com/x/page/s07960xumgs.html

电路图

该电路是一种非常传统的主从结构。适用于DIY版本。所有自适应动作都是在ATmega328P芯片上实现。

与树莓派或其他芯片的通信

即使套件中没有树莓派,Nybble上的代码也始终听命于更高级别的命令。你亦可以通过Arduino IDE、蓝牙UART或串行连接将这些命令发送到树莓派和其他芯片。

NyBoard V0

NyBoard V0,以简化布线和留有未来的发展空间。它具有可调节输出,各种通信和控制端口以及优化布局的板载电源管理。

NyBoard设计时避免与树莓派上所有高组件安装时发生冲突。它的2×5通信插座接受树莓派上的引脚。可以为其供电,听从树莓派的指令,并且有一个用于更改I2C主设备的跳线开关。

通过附加一个树莓派或其他AI芯片,能够为Nybble添加更多天赋,让它更加智能化,学会倾听,观察和思考。

关节调谐器

为了帮助你应对挑战,我们还提供了一个漂亮的小工具,“L”调谐器,用于校准你的Nybble。只需将Nybble转换为校准模式并对齐观察窗口,输入正确的校准,Nybble将立即记住它们。

套件介绍

上图为Nybble套件。有没有很特别的?当我最终确定每个部位时,某些部件可能会发生变化,例如颜色,长度和螺钉数量。

可编程的步态和行为动作

组装好Nybble之后,入门级的计算机技能就能上传代码并将Nybble的步态调整为行走的状态。之后你将需要更高水平的技能(或学习)来感受Nybble背后的黑技术,并教会它新的技巧。其中运用了很多高中数学!

OpenCat 框架

在OpenCat发展两年半的时间中,粗略的框架变得越来越清晰。它从树莓派套件开始,引入了Arduino作为中央模式生成器,并且在需要时可以对任何扩展/升级开放。

团队在Github上开源了 OpenCat:

https://github.com/PetoiCamp/OpenCat

源代码与部分架构图在项目文件库中可以下载:

http://make.quwj.com/project/82

更多机器猫的逗趣视频

目前,该项目在 Indiegogo 众筹:

https://igg.me/at/nybble

当所有资源开源后,会再次与大家分享,希望大家喜欢这个项目!

Petoi Nybble:树莓派猫奴玩家的福音

树莓派 Zero W 的USB/以太网应用一例

来自 Archer 的投稿,感谢~

前些日子突发奇想,想用树莓派 Zero W 做成S*P*Y无线网卡来玩,用Openwrt来做,不过怎么做都不成功,于是我就换个思路,做成以太网卡如何?我就用树莓派连通我的SPI网卡,把USB-OTG接口配置成USB/以太网,SPI网卡连接路由器,USB-OTG连接电脑,来实现以太网卡功能,没想到在Raspbian系统之下能顺利这么多,一试一下就行了。

首先是连接SPI网卡,我在前面有教程详细叙述,这里就不多做赘述了。

先修改/boot/config.txt文件,在最末尾添加这两段语句

dtoverlay=dwc2 dtoverlay=enc28j60

保存退出

然后再修改/boot/cmdline.txt文件,找到 rootwait,在后面插入

modules-load=dwc2,g_ether

然后保存退出。

再用sudo raspi-config,在interfaces选项中,打开SPI接口,这样树莓派Zero的两边接口都连通了。

安装一下所需要的dhcp软件

sudo apt-get update sudo apt-get install dnsmasq isc-dhcp-common

然后修改 /etc/dhcpcd.conf文件,

sudo nano /etc/dhcpcd.conf

在文件末尾添加这两句

interface usb0 static ip_address=192.168.253.1/24

然后再修改 /etc/network/interfaces文件

sudo nano /etc/network/interfaces

添加一下段落(或者修改到跟以下段落一样)

# 表示使用localhost auto lo iface lo inet loopback # eth0 自动获取IP auto eth0 iface eth0 inet dhcp # usb0 为静态IP auto usb0 iface usb0 inet static address 192.168.253.1 netmask 255.255.255.0

修改完毕之后,重启dhcp服务

sudo service dhcpcd restart

重启dhcp失败了也不要紧,可以直接重启树莓派。

sudo reboot

重启过后,修改网段配置文件

sudo nano /etc/udhcpd.conf

start 192.168.253.100 #配置网段 end 192.168.253.150 interface usb0 # The device uDHCP listens on. remaining yes opt dns 192.168.1.1 223.5.5.5 opt subnet 255.255.255.0 opt router 192.168.253.1 # 无线lan网段 opt lease 3600 # 租期一小时

之后备份一下文件/etc/dnsmasq.conf

sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.bak

然后编辑

sudo nano /etc/dnsmasq.conf

添加一下段落的文件(或者修改到跟以下段落一样)

interface=usb0 bind-interfaces server=180.76.76.76 server=114.114.114.114 server=223.5.5.5 domain-needed bogus-priv dhcp-range=192.168.253.2,192.168.253.254,1h

然后再修改文件dhcp规则文件之一的/etc/sysctl.conf

sudo nano /etc/sysctl.conf

再末尾添加以下内容

# Uncomment the next line toenable packet forwarding for IPv4 net.ipv4.ip_forward=1

添加完毕之后,设置转发规则

sudo iptables -F sudo iptables -X sudo iptables -t nat -APOSTROUTING -o eth0 -j MASQUERADE sudo iptables -A FORWARD -i eth0 -o usb0 -m state –state RELATED,ESTABLISHED -j ACCEPT sudo iptables -A FORWARD -i usb0 -o eth0 -j ACCEPT sudo sh -c “iptables-save> /etc/iptables.ipv4.nat”

再往/etc/network/interfaces末尾添加一下内容。

sudo nano /etc/network/interfaces

添加以下语句

up iptables-restore < /etc/iptables.ipv4.nat 然后保存退出 再编辑一下文件 sudo nano /etc/network/if-pre-up.d/iptables 往里面添加以下段落 #!/bin/bash /sbin/iptables-restore < /etc/iptables.ipv4.nat 保存退出之后,设置一下权限 sudo chmod 755 /etc/network/if-pre-up.d/iptables 我们需要新建空文件/lib/dhcpcd/dhcpcd-hooks/70-ipv4-nat, sudo vi /lib/dhcpcd/dhcpcd-hooks/70-ipv4-nat 然后输入 :wq 回车退出 再设置一下转发 sudo iptables-restore < /etc/iptables.ipv4.nat 重启一下dnsmasq服务 sudo service dnsmasq start 然后重启树莓派。 到此,树莓派以太网卡就成功了。把USB-OTG接口用一根USB手机数据线,连接到电脑,SPI网卡连接到路由器,就可以上网了。 这样做是有点大炮打苍蝇的感觉,但是这两个网卡的神奇之处在于,每一次重启,USB-OTG网卡和SPI网卡的MAC地址就会变化,从硬件上就很适合做成匿名设备,假如再往里面加塞点匿名服务和抓包软件,将会是一个完美的匿名硬件设备,凭MAC地址无法被锁定。 速度也测试了一下,迅雷全速下载能到400Kb/s,碍于SPI接口的速度问题,全速时CPU使用率在60%。 这种大炮打苍蝇的网卡,我开着nload和htop,看着网速和CPU使用率,我会有点什么莫名的满足感,针友们(探针爱好者)应该能理解。 教程就到这里,希望各位能够挖掘出更多的玩法。 参考教程: https://shumeipai.nxez.com/2017/10/10/raspberry-pi-spi-netword-configuration-tutorial.html https://shumeipai.nxez.com/2018/02/20/raspberry-pi-zero-usb-ethernet-gadget-tutorial.html https://shumeipai.nxez.com/2018/03/13/raspberry-pi-double-network-cards-for-wireless-hotspot.html — 更多尝试和思考的分割线 — 树莓派实验室小编按:作者 Archer 希望在 OpenWRT 尝试把USB-OTG接口配置成USB/以太网,因此做了下面的实验。 实验目的是把树莓派Zero W的OTG接口作为网络接入口,给其他计算设备直接分配IP地址,树莓派Zero W自带的无线作为无线接入点,为树莓派Zero W提供网络。 网络数据路线是: 外部无线网络 -> 树莓派Zero W 无线芯片(WLAN接口)-> 树莓派USB-OTG网口(LAN接口)-> 目标电脑的USB接口

这次试验最好有一根可靠的USB-TTL线,不然会痛不欲生:)

系统版本最好使用 OpenWRT 18.06,因为在 OpenWRT 17.04 上,根本不会显示gadget网卡。

OTG 作为USB网口,需要有自带的 USB-gadget-eth 驱动,因此会需要下列软件包:

kmod-usb-core kmod-usb-gadget kmod-usb-gadget-eth kmod-usb-lib-composite kmod-usb-dwc2 kmod-usbip kmod-usbip-client kmod-usbip-server kmod-fs-configfs kmod-nls-base

如果你是编译玩家,在编译系统时,把上述软件包选上,还要注意不要选到任何跟 kmod-usb-net 有关的host模式驱动包。使用官方系统的,可以在烧录完官方镜像后,在其他Linux计算机的辅助下,把所有包放在root文件夹之下,然后opkg逐个安装:

uci set wireless.radio0.disabled=0 uci commit reboot

执行完这三条指令之后,树莓派就会开启无线,你会执行得轻松一点。

修改 /boot/config.txt,往文本末尾加一行:

dtoverlay=dwc2

再修改/etc/rc.local,在exit0前加一行:

modprobe g_ether

下次开机,就会自动加载gadget-eth网卡驱动,然后把ZW的OTG口接上安卓手机数据线连到电脑,你的电脑就能感知到RNDIS设备了。

接下来只要开着网页,把usb0接口添加到lan界面,就可以了。

然后问题来了,usb0接口没有分配到正确的IP地址。可是软件层面的问题,如果你有办法通过配置解决这个问题,欢迎与我联系(QQ 854715850)~

用树莓派制造一台“口袋电视”

MAKER:MisterM/译:趣无尽 Cherry(转载请注明出处)

本期向大家介绍一个废旧利用的案例,如果家里有搁置已久的小型电视机,那就赶紧动手起来吧!

这个项目将给大家展示如何将一个废旧的便携式液晶电视低成本转换为复古炫酷的树莓派显示器。

该项目将完整的展示将97年版的卡西欧EV-510转换为树莓派 Zero W为主体的便携式闭路电视显示器的所有过程,希望能让你受到启发并创作出其他更好的版本!

在不影响原本的电视电路的情况下,将树莓派固定在电池盖下,可以播放本地网络视频,由USB移动电源供电。

我非常喜欢这种口袋型的液晶电视,二手的造价更便宜。由于模拟电视频道被关闭,它们几乎没有发挥什么作用。但是如有你有一根3.5mm音频/视频输入的线就可以化腐朽为神奇,你可以用树莓派给它带来新生。

整个项目的完整视频如下:

请按照视频上的流程来操作,另每个步骤中都会有视频讲解。

材料清单

树莓派(Raspberry Pi)×1

Casio EV-510×1

3.5mm 音频/视频输入线×1

mini USB电缆×1

烙铁×1

螺丝×若干

项目可行性验证

在对旧电视进行任何拆解之前,首先要进行测试设置,以确保这台旧电视可以与树莓派相匹配。

1、在树莓派 Zero上使用omxplayer对视频流进行设置(稍后对此进行编码)。

2、尝试使用不同的电缆组合将树莓派的模拟视频输出的跳线连接到电视的3.5mm音频/视频输入。

经过一番测试和调节后,最终获得清晰的画面(如果你的画面非常糟糕,可能是电缆接线的问题!)。最终我获得了本地IP摄像头的清晰画面。

3、测试同时为树莓派和电视供电的同一USB接口,这将非常的有用。 我计划使用USB移动电源,因此需要使用单根电源线。

当一切准备就绪,就可进行下一项繁琐的工序——拆解电视。

拆解和剔除多余部件

拆解需要注意事项:

在不破坏机器本身的情况下,将电视电路从壳子中取出。

仔细检查树莓派是否匹配。

拆解操作在完整视频中的2分27秒处开始。

拆解电视机

过程从易到难,你需要耐心和细心。

1、首先将固定电视机的四个小螺钉卸下,它们很容易就分开。

2、将所有电视的电路从机箱中移除,这个过程比较棘手。因为如果剪错整个项目就结束了。

3、液晶面板用一条小的带状电缆连接到电路上,要小心的移除。移除成功后,我就能够将电路板分开一点,并为螺丝留出空间以便固定液晶面板。

剔除多余部件

剔除电池槽口,为安装树莓派提供充足的空间。然后检查是否适合刚刚测试过的树莓派 Zero。但是,这里有一个标准的40排针插座和一个按钮垫片,它太占空间。因此,我决定换一款新的树莓派 Zero,不要排针插座,尝试后还是差一点。最后我移除树莓派的相机连接器,尺寸就严丝合缝了。

剪线操作在完整视频中的9分23秒处开始。

树莓派焊接

在这个部分,我将尽可能多地节省空间,以便重新组装完所有原装电子设备后仍能可以安装树莓派,因此我决定使用通用I/O端口供电而不是使用Micro USB线。

请预先了解供电方面的风险,然后继续。

1、将红线焊接到5v(针脚2),将黑线焊接到GND(针脚6),因为这个简单的构建不需要通用I/O端口。

2、我从电视连接直角40排针插座的末端剪断了四个连接器部件,并将其焊接到电路板上。项目只需要两个连接器,但将四个连接器放在一起可以提高稳定性。

使用直角插座的好处在于连接电视的线可以很好的、平坦的穿过树莓派的顶部而不被粘住。

3、我将一对母跳线电缆的末端连接到一根精简的3.5毫米音频线上,以便将树莓派和电视相连。

这些电缆的内部接线可能会有所不同,如果你也这样做的话,你可能需要一些试验和错误的尝试。

硬件焊接操作在完整视频中的11分54秒处开始。

软件部分

焊接不太费力,只有六个接头。现在继续设置树莓派软件。

我重新安装Raspbian,确保安装所有数据是最新版本,然后进行以下更改:

1、启用SSH。由于树莓派无头运行,我启用了SSH,因此我可以远程登录,例如更改视频流的URL。可以在参数选择>树莓派设置>界面中更改此设置。

2、将输出设置为PAL。我不是100%确定这是必需的,但我编辑了config.txt文件。

sudo nano /boot/config.txt

并取消备注该行:

sdtv_mode = 2

3、完成这些更改后,我需要测试确保树莓派能够显示它。我的相机流媒体网址是http://192.168.0.59:8081/, 所以我打开了一个终端并输入:

omxplayer –live http://192.168.0.59:8081

令我惊喜的是,相机的实时视图直接出现在屏幕上!

我使用的相机是另一个树莓派 Zero,由锂电池驱动并运行MotionEye OS,我已经将其设置为4:3分辨率,这样设置刚好符合电视的大小。实时命令部分可以帮助它在没有缓冲的情况下播放,并且它的效果非常好。

4、要在启动时加载视频流,编辑以下文件。

nano ~/.config/lxsession/LXDE-pi/autostart

并在列表底部添加以下内容:

@omxplayer –live http://192.168.0.59:8081

5、重新启动后,一旦树莓派桌面加载,视频流就会立即加载。

编码完成!

软件和编程操作在完整视频中的15分22秒处开始。

组装所有部件

在组装之前,首先测试了新编程在树莓派是否正常工作。然后在开始组装工作。

1、将树莓派和电视的电源输入焊接到USB电缆。

2、仔细地将线弯曲在壳内,以便让树莓派在电路板上安装的正确。

3、在拆卸过程非常的简单,但要小心的使用螺丝,然后将树莓派用热熔胶粘贴在壳内(因为没有多余的空间,这次我没有使用螺丝),再将外壳盖上。

4、慢慢的挤压外壳,最后用四个螺丝固定它。

5、再次测试,看到树莓派标志后如果启动顺利的话,就可以松一口气!

6、用电缆扎带将USB电缆固定到电视背面,用热熔胶将一个便捷USB电源粘贴到机箱背面,代替支架。

装配操作在完整视频中的23分7秒处开始。

更多的选择

这是一个有趣的小构建,它不需要花费很长时间,编码也不太复杂,项目效果也非常不错。

这个实用的项目,也不用太多的改变物体的外观。

你可以使用与树莓派匹配的液晶显示器来轻松实现这个项目。

我有几台如图所示的电视,我正在考虑添加其他的构建!

1、添加Python脚本并使用按钮在不同的URL之间切换。

2、使用不带WiFi的树莓派 Zero,并让它循环播放本地存储的视频。

3、添加一个IR接收器,加载OSMC并制作一个可以远程控制的小型Kodi盒子

4、添加一个Adafruit Joy Bonne并制作一个迷你手动RetroPie控制器 我已经进行了一些测试,它运转的很好,非常适合。理想状态下,你还需要安装装USB声卡。

现在树莓派TV HAT已经发布,你甚至可以将网络上另一个树莓派的实时数字电视信号流式传输到这个小卡西欧,让它完整的循环并使用它的原始功能。我的TV HAT几天前刚刚到了,这可能是我尝试的第一件事。见完整视频中的29分49秒处。

希望你喜欢这个项目!

用树莓派制造一台“口袋电视”

Tengine 推断引擎:树莓派也能玩转深度学习

来自 Hey~YaHei! 的投稿,感谢~

一直以来,树莓派以其良好的社区生态,广受嵌入式爱好者、创客欢迎。在一些相关的社区上(比如树莓派实验室),我们可以看到非常丰富的应用示例及其教程。但在树莓派上的深度学习应用并不常见,这主要是受到树莓派计算力的限制,比如之前看到过有人把yolov2原原本本生硬地部署到树莓派上,结果每一帧检测耗时高达6分钟!!作一帧目标检测花费6分钟这实在是无法忍受的!

如果是用yolov2-tiny的话会快很多,但耗时依旧接近40秒,参考树莓派3B上测试YOLO效果 | CSDN

那树莓派只能跟深度学习无缘了么?那可未必!

Tengine

OADI/Tengine | github

Tengine 是OPEN AI LAB为嵌入式设备开发的一个轻量级、高性能并且模块化的引擎。

Tengine在嵌入式设备上支持CPU,GPU,DLA/NPU,DSP异构计算的计算框架,实现异构计算的调度器,基于ARM平台的高效的计算库实现,针对特定硬件平台的性能优化,动态规划计算图的内存使用,提供对于网络远端AI计算能力的访问支持,支持多级别并行,整个系统模块可拆卸,基于事件驱动的计算模型,吸取已有AI计算框架的优点,设计全新的计算图表示。

编译安装开源版Tengine

安装相关工具

sudo apt-get instal git cmake

git 是一个版本控制系统,稍后将用来从 github 网站上下载Tengine的源码

是一个版本控制系统,稍后将用来从 github 网站上下载Tengine的源码 cmake 是一个编译工具,用来产生make过程中所需要的Makefile文件

安装支持库

sudo apt-get install libprotobuf-dev protobuf-compiler libboost-all-dev libgoogle-glog-dev libopencv-dev libopenblas-dev

protobuf 是一种轻便高效的数据存储格式,这是caffe各种配置文件所使用的数据格式

是一种轻便高效的数据存储格式,这是caffe各种配置文件所使用的数据格式 boost 是一个c++的扩展程序库,稍后Tengine的编译依赖于该库

是一个c++的扩展程序库,稍后Tengine的编译依赖于该库 google-glog 是一个google提供的日志系统的程序库

是一个google提供的日志系统的程序库 opencv 是一个开源的计算机视觉库

是一个开源的计算机视觉库 openblas 是一个开源的基础线性代数子程序库

下载&编译

从github上下载最新的开源版Tengine源码 git clone https://github.com/OAID/Tengine.git 切换工作目录到Tengine cd Tengine 准备好配置文件

Tengine目录下提供了配置模板 makefile.config.example 文件 cp makefile.config.example makefile.config 修改配置文件 makefile.config

由于开源版的Tengine不支持针对armv7的优化,所以需要用openblas替代实现;

将 CONFIG_ARCH_ARM64=y 这一行注释掉(行首加井号 # )以关闭ARM64架构的优化实现;

解除 CONFIG_ARCH_BLAS=y 这一行解除注释(删除行首的井号 # )以开启BLAS计算库的实现方式

编译并安装 make -j4 make install 这里的 -j4 表示开启四个线程进行编译

测试

下载mobilenet-ssd模型并放置在 Tengine/models 目录下

下载链接:https://pan.baidu.com/s/1jzPADdCAah4y8NMk3P9Exg 将工作目录切换到mobilenet-ssd示例程序的目录下 cd ~/Tengine/examples/mobilenet_ssd 编译示例程序 cmake –DTENGINE_DIR=/home/pi/Tengine . make 这里 -DTENGINE_DIR 用于为cmake指定环境变量TENGINE_DIR,该变量可以在CMakeLists.txt文件中找到 运行示例程序 ./MSSD 可以看到对一张照片进行目标检测,总共耗时1148.32ms

树莓派专用教育版Tengine

最近 Open AI Lab公司 和 浙江大学生物医学工程与仪器科学学院 在嵌入式人工智能领域上开展了教学合作,公司为学院提供了速度更快的针对armv7优化的Tengine版本用于教学用途(已上传到 Github),接下来让我们看看这个树莓派专用教育版的Tengine到底有多快吧!

用树莓派专用教育版Tengine的动态链接库覆盖掉原先的开源版

动态链接库路径为: Tengine/install/lib/libtengine.so

编译时,make会在build目录下产生libtengine.so动态链接库,而make instll将动态链接库、头文件等拷贝到install目录下

重新运行mobilenet-ssd的示例程序

可以看到,单帧耗时从1148.32ms下降为286.136ms,速度有了非常明显的提升!

小试牛刀

用上高性能的树莓派专用教育版Tengine,看看mobilenet-ssd在树莓派上能表现如何——

为了方便,视频流直接从mp4文件读取,原始视频如下:

从 hey-yahei/my_blog/RasPi-Tengine/mobilenet-ssd | github 上下载源码,并放置在 Tengine/example 目录下 检查 CMakeLists.txt 文件中TENGINE_DIR变量是否正确指向Tengine路径 执行 cmake . 生成Makefile 执行 make 编译程序 执行 ./MSSD 运行程序

实际效果如下:

由于一部分cpu资源被用于视频的解码工作(对于支持硬解码的平台来说不存在这个问题),可以看到单帧耗时有所下降(400ms-700ms),但对于多数应用场景来说这个帧率是绰绰有余的。

本文开头我们说道,直接在树莓派上配置darknet部署的yolo网络,yolov2单帧耗时接近6分钟,yolov2-tiny单帧耗时接近40秒;而在树莓派上配置Tengine部署的yolov2网络,在blas实现下单帧耗时不到8秒(参考利用Tengine在树莓派上跑深度学习网络 | songrbb),在针对armv7优化实现的教育版下单帧耗时甚至不到2秒!

树莓派UPS:用充电宝改造的不间断电源

MAKER:pgrecian/译:趣无尽 Cherry(转载请注明出处)

树莓派功耗低,可以用手机用的充电宝来提供电能。一直想用充电宝给树莓派供电来实现类似UPS(不间断电源)的功能,让树莓派上运行的程序不间断运行,避免异常掉电也能很好地保护SD卡。可偏偏市面上支持边充电边放电的移动电源方案很贵,而且比较难找。

查阅了一些资料也表明即便有的移动电源支持边冲电边放电,但会大量发热不仅不够安全,而且这么用还会严重缩短电源寿命。因此,需要设计一个方案,低成本、安全可靠的实现上述功能。

下面这款自制的UPS(不间断电源)从主电源上拔下时可为树莓派供电,直到再次插入时进入充电状态,并能在充电的同时持续为树莓派供电。这样你的树莓派就可以实现永不断电啦~

巧妙地用两个普通的小型的移动电源进行一番改装,就可以达成目标!(注意,通电测试前请务必确认好连线正确,注意安全)

材料清单

移动电源×2

5cm的绝缘电线×2

绝缘胶带(或收缩包装管)×1

金属撬具×1

小刀×1

烙铁×1

焊料×若干

拆开电源外壳并拆除电源电路

1、选择一块移动电源,将电池壳撬开。里面是锂电池和电路。

2、小心地将电源和电路板取出。

这个电池将作为备用电池。为下一个步骤做好准备。

电路原理说明

本项目电路采用的是降压-升压转换器。它可以将电池的电压从3.8V升压到5V给USB接口供电,或从micro USB接口取5V电压,并将其降低到电池充电所需的电压。这是降压的转换。

它不能同时做到这两点。但如果你有两个就可以!

我们要将两个电路连接到电池上,一个用于输入,另一个用于输出。

使用收缩管或胶带进行连接

a.如果你使用的是收缩管,请让其连接到电路的电线上。

b.如果你使用的是胶带,可以稍后再添加。

目的是为了防止电线的末端的接触和电池的短路。只将电路放回盒子里,电池稍后使用。

将所有部件组装到一起

1、如图所示,将橙色延长线焊接到红线连接电路的位置,同时将黑色延长线焊接到黑线连接到电路的位置。

这是该项目中最难的部分,务必提醒一下的是将焊料放在延长线末端,使用烙铁将它和电路线连接到电路板上。你也可以将电池拿出来并直接连接上去,更方便焊接。

2、将每根延长线的一端焊接到从电池上拆下的电路上。

如图所示,将橙色延长线焊接到红色电路线并将黑色延伸线焊接到黑色电路线。

3、使用收缩管与将两个线头接上,也可以使用胶带或热胶将裸露出来的金属绝缘。

我发现那个不带电池的橙色电池盒的电路太松了。我连接了两个USB引线,一个连接到输出(标准USB),另一个连接到输入(micro USB)并将电路粘贴到合适的位置。我使用一团卷起来的纸让位置更合适。

4、最后用胶带将两个移动电源粘合在一起,这个项目就完成了。

你可以任意使用里面的一块作为输入或输出,但每块只能使用一个功能。

有朋友或许认为当电池充满电时充电必须停止,否则依然不安全。 第二个转换器从电池吸收电流,而第一个转换器不停止充电可能产生危险。应该需要像 MOSFET 这样的结构将负载的电量从电池切换到5V输入,而不是另外的转换器。

但作者认为这个项目还是很安全的。当电池充电的电路检测到电池电压足够高时会停止充电,你也可以可以使用 MOSFET 来代替第二电路,这样效率更高。 :)

欢迎各位探讨指教~

http://make.quwj.com/project/84

树莓派 HiFi DAC v1.1 扩展板开始发售

我们在2016年底推出的树莓派 HiFi 声卡 HiFi DAC v1.0 版在最近一年多来因其良好的易用性和性价比受到了树莓派玩家和音乐发烧友的认可。近期我们综合了树莓派软硬件的更新,以及用户的反馈,对这款产品做了改进。今天开始发售 HiFi DAC v1.1 版。本次调整主要有:

采用组合式的 GPIO 排针插座设计,可选长针、短针自由拆装。可根据需要使用长针排针插座,引出树莓派的 GPIO 引脚,叠加安装其他扩展板或使用杜邦线扩展功能。

区分标准版和带莲花插座版。标准版配备3.5mm耳机插座且预留RCA双端子焊点,更省空间,且配合长针排针插座可以直接叠加其他功能兼容的树莓派扩展板;带莲花插座版同时配备3.5mm耳机插座和RCA双端子,适合需要兼顾耳机和音箱的使用场景。

推荐使用手机端替代遥控器,默认不焊接红外线接收头(但有预留对应的焊点)。

PCB 美化,更加简洁精致。

这是一个针对音乐爱好者的产品,集成了 TI 公司专业的音频解码芯片 PCM5122,采用 I2S 接口标准整合了一套基于树莓派的完善的音频硬件解码系统。并支持 Volumio、RuneAudio、OSMC 等功能强大的播放软件,是快速搭建树莓派 HiFi 系统的不二之选!

HiFi DAC 适用于树莓派1代A+、B+,树莓派2B,树莓派3B、B+,树莓派Zero、Zero W,以及后续对该标准兼容的树莓派系列硬件。

特色

采用 TI 公司专业音频解码芯片 PCM5122,支持高达32bit/384kHz的采样率,动态范围112dB,失真度-93db。采用超低噪音稳压电源设计并通过磁珠共地互不干扰,摆脱电流声。

3.5mm耳机插座和预留的RCA双端子焊点,可适用于音箱功放和耳放等多种场景。在树莓派上直接插上扩展板就能使用,并采用I2S接口直接解码数字转模拟,非USB接口DAC方式。

DAC解码状态指示灯,解码工作时亮,停止或者不工作时灭,更好的了解DAC的工作情况。

组合式的 GPIO 排针插座设计,可选长针、短针自由拆装。可根据需要使用长针排针插座,引出树莓派的 GPIO 引脚,叠加安装其他扩展板或使用杜邦线扩展功能。

原装进口元件用料,保证每件产品的使用效果和寿命。

完美兼容树莓派官方PI HAT尺寸,电路板采用高品质沉金工艺,优化的布线设计更好保证信号的阻抗延续性,减少信号反射和折射。

预留红外线接收器功能设计,可自行添加红外遥控支持,控制音量、播放操作等。

组合式的长短排针插座设计,可选长针、短针自由拆装。可根据需要使用长针排针插座,引出树莓派的 GPIO 引脚,叠加安装其他扩展板或使用杜邦线扩展功能。分别安装效果如图。

软件特色

支持 Volumio、RuneAudio、OSMC 等功能强大的播放软件,在软件的配合下可以实现:FLAC, WAV, MP3, AAC, ALAC, PLS 等音频格式,支持无损格式。

Samba、NFS、局域网共享、U盘、移动硬盘等音乐库直接读取音频播放。

网络音频电台播放。

Airplay 音频播放支持。

DLNA Indexing 支持。

Webui 网页播放器,可通过PC、Pad、手机或APP链接至播放器并控制播放。

强大的配置页面,可以设定无线网络连接、播放列表等配置。

详细介绍请戳:

树莓派 HiFi DAC 扩展板

Volumio 安装使用说明:

树莓派 HiFi DAC 扩展板 Volumio 安装使用教程

资源下载:

树莓派 HiFi DAC 扩展板资源下载

在线产品说明书:

https://shumeipai.nxez.com/downloads/hifidac-instructions-v1.1.pdf

购买与开学活动

购买请点这里。

新的学期已经开启,我们为在校师生特别准备了购板优惠+礼品双重回馈。在2018年9月30日之前购买 HiFi DAC 扩展板,凭有效学生证或教师证可享受9折优惠,同时可获得 GPIO 参考卡片(黑金款) 一个 + NXEZ 五周年限量纪念版书签一张。(每个淘宝帐号仅享有一件的折扣优惠,且对该型号产品仅限使用一次)。

注:

1.证件验证方式请咨询淘宝店铺卖家。订单收货地址须与证件中学校名称对应,收货人须与持证人名字对应。(中国大陆以外地区可使用转运仓地址)

2.活动的参与仅限订单完成支付之前申请,由卖家修改价格。订单支付之后不再接受优惠申请。

3.具体的优惠和操作方式的解释请以店铺卖家说明为准。

在树莓派上安装 Mosquitto 实现 MQTT

MQTT是IBM开发的一个即时通讯协议。MQTT是面向M2M和物联网的连接协议,采用轻量级发布和订阅消息传输机制。Mosquitto是一款实现了 MQTT v3.1 协议的开源消息代理软件,提供轻量级的,支持发布/订阅的的消息推送模式,使设备对设备之间的短消息通信简单易用。

若初次接触MQTT协议,可先理解以下概念:

MQTT协议特点——相比于RESTful架构的物联网系统,MQTT协议借助消息推送功能,可以更好地实现远程控制。

MQTT协议角色——在RESTful架构的物联网系统,包含两个角色客户端和服务器端,而在MQTT协议中包括发布者,代理器(服务器)和订阅者。

MQTT协议消息——MQTT中的消息可理解为发布者和订阅者交换的内容(负载),这些消息包含具体的内容,可以被订阅者使用。

MQTT协议主题——MQTT中的主题可理解为相同类型或相似类型的消息集合。

本文说明如何在树莓派上安装Mosquitto。本文通过两个简单的例子说明树莓派中如何使用MQTT协议实现消息订阅,这些例子包括Mosquitto_sub指令实现消息订阅和paho-python扩展库实现GPIO端口的远程控制。本文中使用了两个工具——Mosquitto paho-python,其中Mosquitto是一款实现了 MQTT v3.1 协议的开源消息代理软件,提供轻量级的,支持发布/订阅的的消息推送模式,使设备对设备之间的消息通信简单易用;另外,paho-python是一个符合MQTT v3.1协议的客户端,paho-python可连接MQTT代理服务器、发布消息、订阅消息和获得推送消息。

1 在树莓派上安装Mosquitto

在树莓派上安装Mosquitto和其他平台类似,如果在树莓派平台直接编译时间可能会稍长些。Mosquitto源代包不大,所以编译时间尚可忍受。

1.1 安装

截止2014年9月,最新版本为mosquitto-1.3.4。在树莓派中新建一个目录,例如software。

# 下载源代码包 wget http://mosquitto.org/files/source/mosquitto-1.3.4.tar.gz # 解压 tar zxfv mosquitto-1.3.4.tar.gz # 进入目录 cd mosquitto-1.3.4 # 编译 make # 安装 sudo make install

1.2 安装注意点

编译找不到openssl/ssl.h

解决方法:安装openssl

sudo apt-get install libssl-dev

编译过程找不到ares.h

解决方法:修改config.mk中的WITH_SRV:=yes,改为WITH_SRV:=yes

使用过程中找不到libmosquitto.so.1

error while loading shared libraries: libmosquitto.so.1: cannot open shared object file: No such file or directory

解决方法:修改libmosquitto.so位置

# 创建链接 sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1 # 更新动态链接库 sudo ldconfig

make: g++:命令未找到

解决方法:安装g++编译器

sudo apt-get install g++

2 简单的例子

设计一个简单的测试案例,在PC机上运行MQTT代理服务器,而树莓派订阅主题为gpio的消息,PC机发布同主题消息,消息的内容为JSON数据包,数据包格式为{“index”:17,“value”:0},index代表树莓派GPIO的编号,value代表打开或关闭状态。

本例中PC机IP地址为 192.168.1.110,树莓派的IP地址为192.168.1.106

2.1 在PC机中开启MQTT服务

mosquitto -v

2.2 在树莓派中订阅消息

mosquitto_sub -v -t gpio -h 192.168.1.110

-h 指定MQTT代理服务器主机,指向PC机IP地址192.168.1.110

2.3 在PC机中发布消息

mosquitto_pub -t gpio -h 192.168.1.110 -m “{\”pin\”:17,\”value\”:0}”

-h 指定MQTT代理服务器主机,指向PC机IP地址192.168.1.110

2.4 消息被推送到树莓派中

最后在树莓派中输出以下内容:

gpio {“index”:17,”value”:0}

在PC机MQTT服务器控制台中输出

1410600001: mosquitto version 1.3.4 (build date 2014-09-13 15:55:06+0800) starting 1410600001: Using default config. 1410600001: Opening ipv4 listen socket on port 1883. 1410600001: Opening ipv6 listen socket on port 1883. 1410600062: New connection from 192.168.1.106 on port 1883. 1410600062: New client connected from 192.168.1.106 as mosqsub/3063-raspberryp (c1, k60). 1410600062: Sending CONNACK to mosqsub/3063-raspberryp (0) 1410600062: Received SUBSCRIBE from mosqsub/3063-raspberryp 1410600062: gpio (QoS 0) 1410600062: mosqsub/3063-raspberryp 0 gpio 1410600062: Sending SUBACK to mosqsub/3063-raspberryp 1410600122: Received PINGREQ from mosqsub/3063-raspberryp 1410600122: Sending PINGRESP to mosqsub/3063-raspberryp 1410600152: New connection from 192.168.1.110 on port 1883. 1410600152: New client connected from 192.168.1.110 as mosqpub/9793-EasyARM (c1, k60). 1410600152: Sending CONNACK to mosqpub/9793-EasyARM (0) 1410600152: Received PUBLISH from mosqpub/9793-EasyARM (d0, q0, r0, m0, ‘gpio’, … (22 bytes)) 1410600152: Sending PUBLISH to mosqsub/3063-raspberryp (d0, q0, r0, m0, ‘gpio’, … (22 bytes)) 1410600152: Received DISCONNECT from mosqpub/9793-EasyARM 1410600182: Received PINGREQ from mosqsub/3063-raspberryp 1410600182: Sending PINGRESP to mosqsub/3063-raspberryp

3 使用MQTT远程控制GPIO

下面借助python-gpio扩展库,通过消息推送的方式实现GPIO端口的远程控制。

3.1 安装paho-mqtt

使用pip工具安装paho-mqtt,输入以下指令即可:

sudo pip install paho-mqtt

3.2 树莓派订阅代码 simple.py

# -*- coding: utf-8 -*- import paho.mqtt.client as mqtt import RPi.GPIO as GPIO import json # BCM GPIO编号 pins = [17,18,27,22,23,24,25,4] def gpio_setup(): # 采用BCM编号 GPIO.setmode(GPIO.BCM) # 设置所有GPIO为输出状态,且输出低电平 for pin in pins: GPIO.setup(pin, GPIO.OUT) GPIO.output(pin, GPIO.LOW) def gpio_destroy(): for pin in pins: GPIO.output(pin, GPIO.LOW) GPIO.setup(pin, GPIO.IN) # 连接成功回调函数 def on_connect(client, userdata, flags, rc): print(“Connected with result code ” + str(rc)) # 连接完成之后订阅gpio主题 client.subscribe(“gpio”) # 消息推送回调函数 def on_message(client, userdata, msg): print(msg.topic+” “+str(msg.payload)) # 获得负载中的pin 和 value gpio = json.loads(str(msg.payload)) if gpio[‘pin’] in pins: if gpio[‘value’] == 0: GPIO.output(gpio[‘pin’], GPIO.LOW) else: GPIO.output(gpio[‘pin’], GPIO.HIGH) if __name__ == ‘__main__’: client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message gpio_setup() try: # 请根据实际情况改变MQTT代理服务器的IP地址 client.connect(“192.168.1.110”, 1883, 60) client.loop_forever() except KeyboardInterrupt: client.disconnect() gpio_destroy()

3.3 启动服务并发布消息

在PC机中启动MQTT代理服务

mosquitto -v

在树莓派中运行脚本

sudo python simple.py

在PC机中发布消息

# 打开GPIO17 mosquitto_pub -h 192.168.1.110 -t gpio -m “{\”pin\”:17,\”value\”:1}” # 关闭GPIO17 mosquitto_pub -h 192.168.1.110 -t gpio -m “{\”pin\”:17,\”value\”:0}”

运行结果

树莓派GPIO17根据PC机推送的消息点亮或熄灭。

4 总结

本文说明了如何在树莓派中使用MQTT客户端,通过paho-mqtt实现GPIO的远程控制。本例在局域网中运行并能不能体现出MQTT协议在远程控制中的优越性。后期还将花更多的时间实践和分析MQTT协议。

转自:https://blog.csdn.net/xukai871105/article/details/39255089

相关资料:

1、https://blog.csdn.net/xukai871105/article/details/39252653

2、http://blog.csdn.net/shagoo/article/details/7910598

3、https://www.jianshu.com/p/f8d824afbe3d

树莓派 Linux 系统命令行快捷键

刚入门树莓派时,在 Linux 下使用命令操作的时候,光标的移动令人头痛。命令输入完了,执行之后发现缺少权限,然后不得不移动光标到行首加 sudo,而命令又极长……当我学会了命令行相关的快捷键之后,不仅效率提高了,更让我喜欢上了命令行这种操作方式。

常用

Ctrl+左右键:在单词之间跳转

Ctrl+a:跳到本行的行首

Ctrl+e:跳到页尾

Ctrl+u:删除当前光标前面的文字 (还有剪切功能)

Ctrl+k:删除当前光标后面的文字(还有剪切功能)

Ctrl+L:进行清屏操作

Ctrl+y:粘贴Ctrl+u或ctrl+k剪切的内容

Ctrl+w:删除光标前面的单词的字符

Alt – d :由光标位置开始,往右删除单词。往行尾删

说明

Ctrl – k: 先按住 Ctrl 键,然后再按 k 键;

Alt – k: 先按住 Alt 键,然后再按 k 键;

M – k:先单击 Esc 键,然后再按 k 键。

移动光标

Ctrl – a :移到行首

Ctrl – e :移到行尾

Ctrl – b :往回(左)移动一个字符

Ctrl – f :往后(右)移动一个字符

Alt – b :往回(左)移动一个单词

Alt – f :往后(右)移动一个单词

Ctrl – xx :在命令行尾和光标之间移动

M-b :往回(左)移动一个单词

M-f :往后(右)移动一个单词

编辑命令

Ctrl – h :删除光标左方位置的字符

Ctrl – d :删除光标右方位置的字符(注意:当前命令行没有任何字符时,会注销系统或结束终端)

Ctrl – w :由光标位置开始,往左删除单词。往行首删

Alt – d :由光标位置开始,往右删除单词。往行尾删

M – d :由光标位置开始,删除单词,直到该单词结束。

Ctrl – k :由光标所在位置开始,删除右方所有的字符,直到该行结束。

Ctrl – u :由光标所在位置开始,删除左方所有的字符,直到该行开始。

Ctrl – y :粘贴之前删除的内容到光标后。

ctrl – t :交换光标处和之前两个字符的位置。

Alt + . :使用上一条命令的最后一个参数。

Ctrl – _ :回复之前的状态。撤销操作。

Ctrl -a + Ctrl -k 或 Ctrl -e + Ctrl -u 或 Ctrl -k + Ctrl -u 组合可删除整行。

Bang(!)命令

!! :执行上一条命令。

^foo^bar :把上一条命令里的foo替换为bar,并执行。

!wget :执行最近的以wget开头的命令。

!wget:p :仅打印最近的以wget开头的命令,不执行。

!$ :上一条命令的最后一个参数, 与 Alt – . 和 $_ 相同。

和 相同。 !* :上一条命令的所有参数

!*:p :打印上一条命令是所有参数,也即 !* 的内容。

的内容。 ^abc :删除上一条命令中的abc。

^foo^bar :将上一条命令中的 foo 替换为 bar

^foo^bar^ :将上一条命令中的 foo 替换为 bar

!-n :执行前n条命令,执行上一条命令: !-1 , 执行前5条命令的格式是: !-5

查找历史命令

Ctrl – p :显示当前命令的上一条历史命令

Ctrl – n :显示当前命令的下一条历史命令

Ctrl – r :搜索历史命令,随着输入会显示历史命令中的一条匹配命令,Enter键执行匹配命令;ESC键在命令行显示而不执行匹配命令。

Ctrl – g :从历史搜索模式(Ctrl – r)退出。

控制命令

Ctrl – l :清除屏幕,然后,在最上面重新显示目前光标所在的这一行的内容。

Ctrl – o :执行当前命令,并选择上一条命令。

Ctrl – s :阻止屏幕输出

Ctrl – q :允许屏幕输出

Ctrl – c :终止命令

Ctrl – z :挂起命令

重复执行操作动作

在树莓派上轻松实现深度学习目标检测

这个现实世界造成了很多挑战,比如数据有限、只有微型的计算机硬件(像手机、树莓派)所造成的无法运行复杂深度学习模型等。这篇文章演示了如何使用树莓派来进行目标检测。就像路上行驶的汽车,冰箱里的橘子,文件上的签名和太空中的特斯拉。

免责声明:我正在建设 nanonets.com 来帮助使用很少的数据和没有计算机硬件的情况下构建机器学习模型。

如果你很迫切,请直接下拉到这篇文章的底部进入Github的仓库。

为什么是目标检测?为什么是树莓派?

树莓派是一款灵活的计算机硬件,它以1500万台的销量已经吸引了一代消费者的心,并且黑客们也在树莓派上构建了很多很酷的项目。考虑到深度学习和树莓派相机的的流行,我们认为如果能在树莓派上使用深度学习来检测任意的物体那就非常棒了。

现在你可以检测到你的自拍照里的照片炸弹,有人进入到Harambe的笼子里,哪里有辣椒酱或者亚马逊的快递员进入到你的房子里。

什么是目标检测?

2000万年的进化使得人类的视觉系统有了相当高的进化。人脑有30%的神经元负责处理视觉信息(相对比只有8%处理触觉和3%处理听觉)。与机器相比,人类有两个主要的优势。一是立体视觉,二是训练数据集的供应几乎是无限的(一个五岁的婴儿可以大约在30fps的采样间隔获得2.7B的图像数据)。

为了模仿人类水平的表现,科学家将视觉感知任务分解为四个不同的类别。

1.分类,为图像指定一个标签。

2.定位,对特定的标签指定一个边框。

3.物体检测,在图像中绘制多个边框。

4.图像分割,得到物体在图像中的精确位置区域。

物体检测对于很多应用已经足够好(图像分割是更精确的结果,它受到了创建训练数据复杂性的影响。相比于画边框它通常花费人类标注者12倍的时间去分割图像。)此外,在检测物体之后,可以将物体在边框中单独分割出来。

使用物体检测:

目标检测具有重要的现实意义,已经在各行各业得到了广泛应用。下面列举了一些例子:

我怎样使用物体检测解决自己的问题?

物体检测可以用于解决各种各样的问题。这些是一个概括的分类:

1.物体是不是出现在我的图像中?比如在我的房子有一个入侵者。

2.在图像中的一个物体在哪个位置?比如一个汽车试图在世界各地导航时,知道物体的位置就很重要。

3.图像中有多少个物体?物体检测是计算物体数目最有效的方法之一。比如仓库的货架上有多少个盒子。

4.图像中有哪些不同类型的物体?比如动物园的哪些区域有哪些动物?

5.物体的尺寸有多大?特别是使用静态的相机,很容易计算出物体的大小。比如芒果的大小是多少。

6.物体之间是如何相互作用的?比如在足球场上的队形是如何影响比赛结果的?

7.物体在不同时间的位置(跟踪一个物体)?比如跟踪一个像火车一样的物体并且计算它的速度。

在20行代码内完成物体检测

YOLO算法的可视化

有多种用于物体检测的模型或结构。每一个都在速度、尺寸和精确度之间权衡。我们选择了最流行的一个:YOLO(You only look once),并且展示它如何以20行代码(忽略注释)进行工作。

注意:这是伪代码,不是一个可直接工作的实例。它有一个非常标准的CNN构成的黑箱,如下图所示:

你可以阅读(YOLO)全文:

https://pjreddie.com/media/files/papers/yolo_1.pdf

YOLO中使用卷积神经网络的体系结构代码小于20行,如下:

#this is an Image of size 140×140. We will assume it to be black and white (ie only one channel, it would have been 140x140x3 for rgb) image = readImage() #We will break the Image into 7 coloumns and 7 rows and process each of the 49 different parts independently NoOfCells = 7 #we will try and predict if an image is a dog, cat, cow or wolf. Therfore the number of classes is 4 NoOfClasses = 4 threshold = 0.7 #step will be the size of step to take when moving across the image. Since the image has 7 cells step will be 140/7 = 20 step = height(image)/NoOfCells #stores the class for each of the 49 cells, each cell will have 4 values which correspond to the probability of a cell being 1 of the 4 classes #prediction_class_array[i,j] is a vector of size 4 which would look like [0.5 #cat, 0.3 #dog, 0.1 #wolf, 0.2 #cow] prediction_class_array = new_array(size(NoOfCells,NoOfCells,NoOfClasses)) #stores 2 bounding box suggestions for each of the 49 cells, each cell will have 2 bounding boxes, with each bounding box having x, y, w ,h and c predictions. (x,y) are the coordinates of the center of the box, (w,h) are it’s height and width and c is it’s confidence predictions_bounding_box_array = new_array(size(NoOfCells,NoOfCells,NoOfCells,NoOfCells)) #it’s a blank array in which we will add the final list of predictions final_predictions = [] #minimum confidence level we require to make a prediction threshold = 0.7 for (i<0; i predictions_bounding_box_array[i,j,1, 4] else 1] # we will get the class which has the highest probability, for [0.5 #cat, 0.3 #dog, 0.1 #wolf, 0.2 #cow], 0.5 is the highest probability corresponding to cat which is at position 0. So index_of_max_value will return 0 predicted_class = index_of_max_value(prediction_class_array[i,j]) #we will check if the prediction is above a certain threshold (could be something like 0.7) if predictions_bounding_box_array[i,j,best_bounding_box, 4] * max_value(prediction_class_array[i,j]) > threshold: #the prediction is an array which has the x,y coordinate of the box, the height and the width prediction = [predictions_bounding_box_array[i,j,best_bounding_box, 0:4], predicted_class] final_predictions.append(prediction) print final_predictions

如何建立目标检测的深度学习模型?

深度学习的工作流程有6个基本步骤,分为了三个部分:

1.收集训练集

2.训练模型

3.预测新图像

第1阶段 — 收集训练数据

步骤1. 收集图像(每个对象至少100张)

对于这个任务,你或许需要为每个对象收集100张图像。尽量捕捉与将用于决策的数据关联性更强的图像。

步骤2. 注释(手动在图像上绘制边框)

在图像上绘制边界框。 您可以使用 labelImg 之类的工具。 你通常需要一些人来为你的图像注释。 这是一项相当耗时的任务。

第二阶段——在一个有GPU的机器上训练模型

步骤3. 为迁移学习找到一个预训练好的模型:

关于这些你可以阅读更多内容medium.com/nanonets/nanonets-how-to-use-deep-learning-when-you-have-limited-data-f68c0b512cab。为了减少训练所需的数据量,你需要一个预训练好的模型。如果没有它,你可能多需要10万张图像来训练模型。

你可以点击这里找到很多预训练好的模型。

步骤4. 在GPU上进行训练(像AWS/GCP之类的云服务或者你自己的具有GPU机器):

Docker Image

训练模型的过程是很难进行简化的,我们创建了docker image来使模型更容易训练。

你可以运行以下代码开始训练模型:

sudo nvidia-docker run -p 8000:8000 -v `pwd`:data docker.nanonets.com/pi_training -m train -a ssd_mobilenet_v1_coco -e ssd_mobilenet_v1_coco_0 -p ‘{“batch_size”:8,”learning_rate”:0.003}’

有关如何使用的详细信息,请参阅此链接。

docker image具有一个run.sh脚本,可以用以下参数来调用它:

run.sh [-m mode] [-a architecture] [-h help] [-e experiment_id] [-c checkpoint] [-p hyperparameters] -h display this help and exit -m mode: should be either `train` or `export` -p key value pairs of hyperparameters as json string -e experiment id. Used as path inside data folder to run current experiment -c applicable when mode is export, used to specify checkpoint to use for export

你可以在以下网站找到更多详细信息:

NanoNets/RaspberryPi-ObjectDetection-TensorFlow

为了训练模型你需要选择正确的超参数。

寻找正确的超参数

“深度学习”的技巧就是计算出使模型最准确时最好的参数。与此相关的在一定程度上像是黑魔法,但是还有一些理论。这是找到正确参数很好的资源。

量化模型(使模型更小以适应于像树莓派和手机这样的小设备)

像手机和树莓派这样的小设备有很小的内存和计算能力。

通过对权重的很多微调来完成神经网络的训练,而且这项工作需要这些小的增量通常要达到浮点精度(尽管这里也在努力研究使用量化模型表示)。

采用一个预训练好的模型和运行推理是非常不同的。深度的神经网络一个非常神奇的优点就是往往能够更好的处理输入中的高噪声。

为什么要量化?

神经网络模型会占用磁盘的大量空间,例如最初的AlexNet模型以浮点格式超过200MB,占用的空间大小几乎都是由连接神经元的权重决定的,因为在一个简单模型中通常有超过数百万个权重。

神经网络的节点和权重最初是存储为32位的浮点数。量化模型最简单的一个做法就是通过存储每一层最小和最大的值来压缩文件的大小,接着压缩每一个浮点数为8位整型。这样文件的大小就减少了75%。

量化模型的代码:

curl -L “https://storage.googleapis.com/download.tensorflow.org/models/inception_v3_2016_08_28_frozen.pb.tar.gz” | tar -C tensorflow/examples/label_image/data -xz bazel build tensorflow/tools/graph_transforms:transform_graph bazel-bin/tensorflow/tools/graph_transforms/transform_graph \ –in_graph=tensorflow/examples/label_image/data/inception_v3_2016_08_28_frozen.pb \ –out_graph=/tmp/quantized_graph.pb \ –inputs=input \ –outputs=InceptionV3/Predictions/Reshape_1 \ –transforms=’add_default_attributes strip_unused_nodes(type=float, shape=”1,299,299,3″) remove_nodes(op=Identity, op=CheckNumerics) fold_constants(ignore_errors=true) fold_batch_norms fold_old_batch_norms quantize_weights quantize_nodes strip_unused_nodes sort_by_execution_order

注意:我们的 docker image 内置量化。

第三阶段:使用树莓派对新图像进行预测

步骤5:通过相机捕捉新图像

你需要树莓派的相机开启和工作,接着捕获一张新图像。

关于怎样安装的说明请点击这里

import picamera, os from PIL import Image, ImageDraw camera = picamera.PiCamera() camera.capture(‘image1.jpg’) os.system(“xdg-open image1.jpg”)

捕获新图像的代码

步骤6:预测一张新图像

下载模型

一旦你完成了模型的训练,你就可以把它下载到你的树莓派上了。导入模型运行以下代码:

sudo nvidia-docker run -v `pwd`:data docker.nanonets.com/pi_training -m export -a ssd_mobilenet_v1_coco -e ssd_mobilenet_v1_coco_0 -c /data/0/model.ckpt-8998

接着将模型下载到树莓派上。

在树莓派上安装TensorFlow

根据设备的不同,你可能需要更改一些安装方式。

sudo apt-get install libblas-dev liblapack-dev python-dev libatlas-base-dev gfortran python-setuptools libjpeg-dev sudo pip install Pillow sudo pip install http://ci.tensorflow.org/view/Nightly/job/nightly git clone https://github.com/tensorflow/models.git sudo apt-get install -y protobuf-compiler cd models/research/ protoc object_detection/protos/*.proto –python_out=. export PYTHONPATH=$PYTHONPATH:/home/pi/models/research:/home/pi/models/research/slim

运行预测新图像的模型

python ObjectDetectionPredict.py –model data/0/quantized_graph.pb –labels data/label_map.pbtxt –images /data/image1.jpg /data/image2.jpg

在树莓派上的性能基准

树莓派受限于内存和计算力(与树莓派GPU兼容的TensorFlow版本仍然不可用)。因此,衡量每个模型在对新图片进行预测花费的时间很重要。

在树莓派上运行的不同的物体检测模型的基准

使用NanoNets的工作流程:

我们对于NanoNets的一个目标就是使我们的工作能够很容易的与深度学习结合。物体检测是我们重点关注的一个领域,并且我们制定了一个工作流程可以解决一些实现深度学习模型的挑战。

NanoNets怎样使过程更简单?

1.不需要注释

我们已经删除了注释图像的需要,我们有专业的注释员可以为你注释图像。

2.自动进行最优模型和超参数的选择

我们为你自动的训练最好的模型,通过运行一连串具有不同参数的模型然后为你的数据挑选最好的那个。

3.不需要昂贵的硬件和GPUs

NanoNets完全在云端运行,不需要占用你的任何硬件。这样就会更容易去使用。

4.对于像树莓派这样的移动设备非常棒

因为像树莓派和手机这样的设备不适用于运行复杂的计算任务,所以可以将你的工作负载外包给我们的云,然后为你完成所有的计算。

这里是一个简单的片段使用NanoNets API进行图像的预测

import picamera, json, requests, os, random from time import sleep from PIL import Image, ImageDraw #capture an image camera = picamera.PiCamera() camera.capture(‘image1.jpg’) print(‘caputred image’) #make a prediction on the image url = ‘https://app.nanonets.com/api/v2/ObjectDetection/LabelFile/’ data = {‘file’: open(‘image1.jpg’, ‘rb’), \ ‘modelId’: (”, ‘YOUR_MODEL_ID’)} response = requests.post(url, auth=requests.auth.HTTPBasicAuth(‘YOUR_API_KEY’, ”), files=data) print(response.text) #draw boxes on the image response = json.loads(response.text) im = Image.open(“image1.jpg”) draw = ImageDraw.Draw(im, mode=”RGBA”) prediction = response[“result”][0][“prediction”] for i in prediction: draw.rectangle((i[“xmin”],i[“ymin”], i[“xmax”],i[“ymax”]), fill=(random.randint(1, 255),random.randint(1, 255),random.randint(1, 255),127)) im.save(“image2.jpg”) os.system(“xdg-open image2.jpg”)

使用NanoNets进行图像预测的代码

建立你自己的NanoNet

你可以尝试建立你自己的模型:

1.使用一个GUI(也自动的注释图像):

https://nanonets.com/objectdetection/

2.使用我们的API:

https://github.com/NanoNets/object-detection-sample-python

步骤1:克隆这个仓库

git clone cd object-detection-sample-python sudo pip install requests

步骤2:获取你免费的API钥匙

从这里得到你免费的API钥匙 http://app.nanonets.com/user/api_key

步骤3:设置API钥匙作为一个环境变量

export NANONETS_API_KEY=YOUR_API_KEY_GOES_HERE

步骤4:创建一个新模型

python ./code/create-model.py

注意:这里生成你下一步需要的MODEL_ID

步骤5:增加模型ID为环境变量

export NANONETS_MODEL_ID=YOUR_MODEL_ID

步骤6:上传训练数据

收集你需要检测的物体的图像。你可以通过我们的网站UI(https://app.nanonets.com/ObjectAnnotation/?appId=YOUR_MODEL_ID)

标注它们任何一个或者使用像 labelImg 这样的开源工具。一旦你在文件夹。

准备好数据,images(图像文件)、annotations (图像文件的标注),开始上传数据集。

python ./code/upload-training.py

步骤7:训练模型

一旦图像上传完成就开始训练模型

python ./code/train-model.py

步骤8:获取模型状态

这个模型大约要花2个小时进行训练,一旦模型开始训练,你将收到一封电子邮件,同时可以查看模型的状态。

watch -n 100 python ./code/model-state.py

步骤9:做预测

一旦模型训练完毕,你就可以使用模型进行预测

python ./code/prediction.py PATH_TO_YOUR_IMAGE.jpg

代码(Github仓库)

训练模型的GitHub仓库:

Tensorflow Code for model Training and Quantization

NanoNets Code for model Training

使用树莓派进行预测的GitHub仓库(以检测新目标为例):

Tensorflow Code for making Predictions on the Raspberry Pi

NanoNets Code for making Predictions on the Raspberry Pi

带标注的数据集:

Cars on Indian Roads sees, dataset for extracting vehicles from Images of Indian Roads

Coco Dataset

via

发起:酱番梨 校对:老赵 审核:老赵

参与翻译(2人):小哥哥、狒狒

基于树莓派的数据采集方案MCC 118上手体验

数据采集(DAQ)在工业领域使用广泛,主要用于测量电压、电流、温度、压力或声音等物理现象。一直以来,数据采集系统是结合基于计算机或者其他专用测试平台的测量软硬件产品来实现的。近日,树莓派实验室小编得到了一块基于树莓派的数据采集扩展板——MCC 118 HAT。这款扩展板是专业数据采集方案提供商 Measurement Computing 为树莓派量身打造的产品。

开箱

先看看扩展板外观,一睹为快。

拆箱物件如图,MCC 118 HAT 一块,附带了固定螺丝、带长针的排座和一张简单的使用说明卡片。

可以看到模块上面密密麻麻布满了各种元件和转换芯片,配有CH0~CH7输入端子,也就是8通道的模拟电压输入。

这个排针可以确保将树莓派的 GPIO 引出,这样可以级联多块 MCC 118 HAT,也可以用来接其他的扩展板用。安装效果如下图:

最后看看板子背面,非常干净。

产品官方介绍

官方介绍如下:MCC 118数据采集模块(HAT)提供8通道模拟电压输入,基于树莓派的数据采集/数据记录系统。每张MCC 118最大采样率为100kS/s,可以进行单电压点和电压波形采集。最多可在单块树莓派上叠加8个MCC 118模块——提供64通道的数据采集,最大总采样率可达320kS/s。

适用于 40Pin GPIO 的树莓派。

测量量程、精度和环境等参数也是在实际使用时需要关心的。

模拟DC电压:

范围: ±10 V

增益误差 (读取值% ): 最大 0.098

偏移误差: 最大 11 mV

满量程绝对精度: 20.8 mV

增益温度系数(% 读数/°C): 0.016

偏移温度 系数(mV/°C): 0.87

噪音表现:

对于峰峰值噪声分布,输入通道连接至AGND,并以最大吞吐量获取12,000个样本。

范围: ±10 V

计数: 5

LSBrms: 0.76

使用环境:

工作温度: 0 °C to 55 °C

储存温度: -40 ˚C to 85 °C

相对湿度: 0% to 90% 非冷凝

部署软件环境

一开始小编还以为这个专业设备的软件环境搭建起来可能会比较复杂,比较意外的是通过产品附带的一张卡片上面的网址,找到了一套完整的软件部署教程。亲测兼容性良好,主要步骤如下。

测试环境:

树莓派 3B+

16G microSD 卡

5V / 2500mA 电源适配器

Raspbain stretch 2018-06-27 操作系统

Python 2.7 环境

准备好树莓派,如何给树莓派安装操作系统可以参考这里。

首先在给树莓派上电之前,安插好 DAQ HAT 扩展板,然后上电开机。在终端输入下面的操作指令来部署软件环境,笔者使用的是 SSH 方式登陆到树莓派进行操作的。

更新软件包列表:

sudo apt-get update

安装 Git(如果没有安装过的话):

sudo apt-get install git

下载 daqhats 库到用户根目录:

cd ~ git clone https://github.com/mccdaq/daqhats.git

安装共享库、工具等。安装向导会确认是否要安装 Python 2 和 Python 3 的支持。

cd ~/daqhats

sudo ./install.sh

现在你就可以运行 ~/daqhats/examples 目录下的程序范例了。

daqhats 库是基于 C/C++ 和 Python 开发的,下面以一段基础的 Python 范例代码来展示如何读取 MCC 118 的输入电压并现实通道数值。

#!/usr/bin/env python # # MCC 118 example program # Read and display analog input values # import sys import daqhats as hats # 获取 MCC HAT 扩展板列表 list = hats.hat_list(filter_by_id = hats.HatIDs.ANY) if not list: print(“No boards found”) sys.exit() # 读取并现实所有的采样通道 for entry in list: if entry.id == hats.HatIDs.MCC_118: print(“Board {}: MCC 118”.format(entry.address)) board = hats.mcc118(entry.address) for channel in range(board.info().NUM_AI_CHANNELS): value = board.a_in_read(channel) print(“Ch {0}: {1:.3f}”.format(channel, value))

使用范例快速用起来

在环境部署文档之后,我们看到了基于 C 和 Python 的 SDK 以及几种典型数据采集应用范例的源代码。可见,MCC 所提供的并不仅仅是一款树莓派的数据采集模块,而是从软件到硬件的数据采集方案。

下面我们以 Python 的 SDK 和范例为例,来介绍如何快速体验和应用这款基于树莓派的数据采集模块。

首先我们结合 MCC 118 的结构框图,对照 MCC 118 外观来确定如何为模块输入需要采集的信号源。

很明显,只需要将外部传感器的信号源通过 CH0~CH7 中的任何端子接入到 MCC 118,MCC 的 GND 与外部传感器的 GND 共地即可。

软件方面,我们依次来介绍并测试 SDK 中预先准备的范例。

范例功能介绍

single_value_read: 循环读取并显示每一个被选中的采样通道的单个数据值。

finite_scan: 从指定的通道采集模拟输入输入数据块,显示每个通道的最后一个采样数据。

finite_scan_with_trigger: 等待一个外部触发信号,然后采集用户指定通道的模拟输入数据块。显示每个通道的最后一个采样数据。

continuous_scan: 从指定通道联系采集模拟输入数据块,直到扫描停止。显示每个通道的最后一个采样数据。当每个通道采集到指定数量的数据样本之后,或按下回车键时停止采集。

multi_hat_synchronous_scan: 通过外部时钟和外部触发信号从最多 8 块 MCC 118 HAT 上同步采集数据。其中的一个 MCC 118 HAT(主设备)用于调整同步采集。

Python Web 服务范例介绍

在范例目录下的 web_server 目录中,包含一个 名为 web_server.py 的 Python 程序。其功能是启动一个 Web 服务用语显示从 MCC 118 HAT 实时采集到的数据。我们可以通过在浏览器中访问这个 Web 页面来观察数据图形。

由于这个服务有一些组建依赖,因此在部署的时候需要用下面的命令安装依赖项。

pip install -Iv dash==0.30.0 dash-renderer==0.15.0 dash-html-components==0.13.2 dash-core-components==0.38.0

启动服务:

cd ~/daqhats/examples/python/mcc118/web_server ./web_server.py

接下来就可以在浏览器中打开 http://:8080 访问了。将其中的 替换成树莓派的 IP 地址或主机名。

要想停止 Web 服务,可以回到命令行界面按下 Ctrl+C 中止。

为了初步测试功能,我们打算用它来测试一下音频模拟信号采样。拿树莓派 HiFi DAC 扩展板的模拟输出端作为 MCC 118 HAT 的数据采集源。

音频模拟信号接到 MCC 118 HAT 的通道 1 上。

运行 single_value_read.py 程序可以看到实时的采样数据。

运行 finite_scan.py 等程序范例类似。

下面启动 web_server 下的范例,然后浏览器打开 http://:8080 访问 WEBUI。可以看到在没有信号输入的时候,波形图如下:

而接入信号源之后,再启动采样,波形会变得更平稳:

当开始播放音乐时,波形会随着音乐而动态改变:

测试效果视频(发布时直接插入到正文):

总的来说,基本的范例已经包括了比较丰富的应用场景,在此基础之上开发出符合自身需求的 DAQ 系统很容易上手。

更多详细信息参考官方说明:

https://www.mccdaq.com/PDFs/Manuals/DAQ-HAT/overview.html

有关 DAQ HAT Python 库的详细用法可以参考开发文档:

https://www.mccdaq.com/PDFs/Manuals/DAQ-HAT/python.html

评价综述

从测试来看,由于具备了简单明了的安装步骤,这个方案上手应该说是很容易的,真正做到了低门槛搭建专业数据采集系统。

性能方面,在 Python 库的测试中,单一通道采集的样本数量可以达到将近每秒10000个样本。足以应对各类场景的数据采集需求。相信使用 C 库来实现的话,将能获得更高效率的采样需求。

对于扩展更多路数的信号源,MCC 118 在设计上给予了高延展性的设计实现。巧妙的设计了可多层叠加的硬件接口,配合 EEPROM 固化 HAT 的叠加配置,实现了多大 8 倍(即最多64通道)的数据采集能力,最大总采样率可达320kS/s。

笔者同时做了一番搜寻,基于树莓派来实现工业测量的产品方案,目前仅 MCC 118 这一套。对于有兴趣在工业测量领域使用树莓派的朋友来说,这是一个不错的选择。

相关视频:

基于树莓派的电压采集模块MCC 118网络服务器范例

https://url.cn/utoHpkH2?sf=uri

基于树莓派的电压采集模块MCC 118数据记录仪例程

https://url.cn/VxXgwhEx?sf=uri

目前 MCC 118 扩展板可通过 Measurement Computing 公司官网购买获得 http://china.mccdaq.com。

有关本产品的相关问题和支持可以在 https://talk.quwj.com/topic/916 讨论,可获得 MCC 工程师专业的解答和技术支持。

用树莓派制作一款自动浇灌系统

MAKER:Bobby Leonard/译:趣无尽 Cherry

如果你家里有养个花花草草什么的,可能会遇到小长假出去浪没有办法给花草浇水的困扰。下面介绍的这个自动灌溉系统不仅可以解决这个问题,你还可以将这些技术举一反三,用来DIY其他类似的自动化设备。

下面这个自动灌溉系统基于 Python 实现,可以通过无线网络采集传感器数据、记录数据并写入 Google Sheet,从天气网站 Darksky 获取降水预测并决定是否需要启动水泵进行灌溉,还能将数据推送到手机上。所有代码都在项目文件库中。

http://make.quwj.com/project/78

文中的 MicroPython 设备指代的是支持运行 Python 代码的一类微型设备,例如 WemosD1 mini、NodeMCU 等。它们负责从传感器采集数据和控制继电器,通过 HTTP 请求访问搭建在树莓派上的 Flask 服务器。

材料清单

硬件:

Raspberry Pi(树莓派)3B ×1

NodeMCU ESP8266 开发板 ×1

Everything ESP Wemos D1 Mini×1

DFRobot电容式土壤湿度传感器×1

超声波传感器 – HC-SR04(通用)×1

继电器模块(通用)×1

电阻1k欧姆×1

DHT11温湿度传感器×1

光敏电阻×1

跳线(通用)×1

面包板(通用)×1

Android设备×1

软件:

Slack

Google Sheet

Darksky Weather API

工作原理

1、使用MicroPython设备读取传感器数据的示例。

2、使用树莓派运行的Python对传感器数据作出有用的分析。

代码示例包括:测量水位的距离,控制继电器(泵),土壤湿度(电容土壤湿度),温度和湿度(DHT11)以及使用光敏电阻的光照水平。

树莓派上运行的代码(文件库中提供下载)显示了如何发送推送通知,数据如何写入Google Sheet,从Darksky获取天气预报的数据以及如何使用Web的应用程序HTTP来监控MicroPython设备并与之交换数据。

3、构建一个代码框架,以便将来可以快速轻松地修改MicroPython项目。将MicroPython设置为子关系,Flask为主体,使其能够实现复杂的功能。此框架包括用于子项的标准boot.py(连接到WiFi,使用NTP设置时间)以及需要添加到主体Web应用程序以允许新设备连接的定义列表。

特性

MicroPython节点能够使用HTTP请求在它们之间传输信息,例如:一个扩展板获取了土壤湿度并向服务器报告,然后另一个扩展板请求该信息并读取它来决定是否运行泵。

关于节水问题,水泵控制器也能够从树莓派请求天气预报。当树莓派收到此请求时,它会请求Darksky获取接下来24小时的降水概率。水泵控制器再次使用该信息来决定是否运行泵,即如果在明天的浇水循环之前下雨,则不需要水泵运行。

我使用的是一个小型USB水族箱泵。它是一个潜水泵,如果它不在水里就会烧坏。为了防止这种情况,我将hcsr04超声波传感器放在水箱顶部,以测量到水顶的距离。如果水泵在低水位运行,MicroPython板将请求树莓派,然后树莓派将使用Slack向我的手机发送通知。

该项目是我以前项目的扩展,与该项目一样,所有传感器数据都保存到Google Sheet中,每个板子都有单独的工作表。

笔记

我编写的代码是支持连续运行的,例如,如果网络超时并导致异常停止电路板,电路板将会一直保持深度睡眠并重置直到它可以运行。这很好,但它让你无法在REPL中输入命令,并且更改扩展板上文件的唯一方法似乎是删除闪存并再次安装MicroPython,然后加载到编辑文件。

你需要将MicroPython文件中包含的IP地址更改为运行Flask服务器的任何机器的IP地址。

要使用Google Sheet,你需要按照以下说明操作:

https://gspread.readthedocs.io/en/latest/oauth2.html

要获取Darksky API密钥,请转到下面的链接并注册:

https://darksky.net/dev

要设置Slack,请访问此网站并注册,然后在手机上安装:

https://slack.com

MAKE 资源

1、NodeMCU DHT11温湿度传感器、光线传感器接线图。

2、土壤湿度传感器接线图。

3、WemosD1 水泵控制器系统接线图

代码资源

树莓派上运行的代码在项目文件库中可以下载。

http://make.quwj.com/project/78

rpi3pythonserver_py.py

树莓派上的 Flask 服务,运行于 Python3 环境下。

main_py_WemosD1.py

WemosD1 mini 上的水泵控制程序,用来控制继电器和 hcsr04 超声波传感器。

main_py_nodemcu_soil.py

NodeMCU上的土壤传感器驱动程序。

main_py_nodemcu_dht11.py

NodeMCU 上的温湿度传感器驱动程序。

用树莓派制作一款自动浇灌系统

via

用树莓派制造马桶状况监视器

MAKER: Md. Khairul Alam/译:趣无尽 Cherry(转载请注明出处)

你是否在公共卫生间碰到过用完之后没有冲过的马桶?是的,总有些人忘了冲马桶,或者他们根本就不在乎,或者有时候是马桶冲水还坏掉了……遇到躺着大条的马桶,是极其难忘的人生经历。

这个项目是制作一个马桶状况跟踪器,它可以准确的告诉你马桶是否干净,是否可以如厕。

试想一下,我们能否监控马桶呢?使用相机是一个简单的解决方案!但你不能把相机放在厕所里面。那么,使用Walabot是一个很好地选择。 Walabot是一款可编程的3D成像传感器,可以使用射频技术观察物体,并且无需任何光学图像即可实现高度复杂的感应功能!

材料清单

硬件:Walabot×1

树莓派3B×1

软件:MQTT

Ubidots

MIT App Inventor

HTTP

Walabot 的工作原理

Walabot 是什么黑科技?看这个视频感受下。

Walabot通过多个天线来发送,接收和记录信号,从来感知环境。分析多个发射接收天线的宽带记录以重建环境的三维图像。

Walabot让3D成像成为可性,它替代了无法使用相机的区域,例如浴室、试验室或卧室。

我使用Walabot去识别马桶是否清洁干净。它的工作原理非常简单。将Walabot安放在马桶顶部(通常在厕所的顶部)。在初始化阶段,Walabot将扫描干净的马桶。初始化后,它定期扫描马桶(1分钟或更短)并检测初始化期间不存在的任何物体。由于在初始化期间马桶是干净的,Walabot可以很容易地检测到马桶上的任何新的物体(例如粪便)。为了获得更好的结果,必须正确设置Walabot参数。Walabot还可以测量它检测到的物体距离。因此,根据测量物体的距离,也可以知道这间厕所是否可以进入。

厕所是否有人使用

马桶是否干净

以上两个数字显示了如厕使用度和清洁度。

整个系统的运作

完整的厕所跟踪系统需要一些重要的部分。

1、将Walabot连接到树莓派3。

2、Walabot定期扫描任何新的对象,树莓派从Walabot上收集该信息,使用MQTT协议将信息发送到Ubidots云服务器。

3、启用MQTT通信,将pyhton paho MQTT客户端安装在树莓派中。

4、使用MIT App Inventor开发了一个Android应用程序,可以监控厕所的状态。

5、Android应用程序使用HTTP协议从Ubidots云接收信息。

请参阅下面完整的系统框架图。

系统框架图

安装步骤:

1、将Walabot SDK安装到树莓派。

按照Sparkfun.com的入门指南进行操作。

2、将paho mqtt客户端安装到树莓派。

使用树莓派终端命令:

sudo pip install paho-mqtt

3、在Ubidots.com中创建一个帐户并记下设备令牌。

ID

4、将ubidots API安装到树莓派。

在pi终端中输入以下命令:

sudo pip install ubidots

记下你的ubidots API密钥:

5、为树莓派开发 Python 程序。

为了找到合适的配置参数(R,pi,theta),我使用Windows的Walabot SDK开发包测试不同方位的不同对象的Walabot。我选择的值在python代码中提到。我将阈值调小用于检测小的物体。

minInCm, maxInCm, resInCm = 30, 300, 3 minIndegrees, maxIndegrees, resIndegrees = -15, 15, 5 minPhiInDegrees, maxPhiInDegrees, resPhiInDegrees = -30, 30, 5 threshold = 2

用Windows SDK测试

使用开发python程序和Android应用程序之后,我手动测试系统以便了解整个系统是否正常工作。(python程序和android源代码附加在代码部分)。在最后的代码中,我更新了R值。对于测试设置,它在测试边缘设置的很小。

这是程序中实现的逻辑关系,用于识别厕所中是否有人,厕所是否干净。

这是代码片段:

if targets: for i, target in enumerate(targets): print(target.zPosCm) if target.zPosCm>100 and target.zPosCm<180: print("Toilet is engaged.") engage_variable.save_value({'value':1}) elif target.zPosCm>200 and target.zPosCm<210: print("Toilet is not engaged, not clean.") engage_variable.save_value({'value':0}) clean_variable.save_value({'value':1}) else: print("Toilet is not engaged and clean.") engage_variable.save_value({'value':0}) clean_variable.save_value({'value':0}) break else: print('Not engaged and clean') clean_variable.save_value({'value':0}) engage_variable.save_value({'value':0}) 6、在MIT App Inventor中开发Android应用程序 源代码文件附在代码部分中。 Android的App Inventor是一个开源Web应用程序,最初由Google提供,现在由麻省理工学院(MIT)维护。 它允许新手进行计算机编程,可以为Android操作系统(OS)创建软件应用程序。它使用图形界面,非常类似于Scratch和StarLogo TNGuser interface,允许用户drag-and-drop可视对象以便创建在Android设备上运行的应用程序。 如果你是App Inventor的新手,请按照这些初学者教程进行操作。 如果你想使用附加的资源,你可以修改htttp网址。 更换 URL: http://things.ubidots.com/api/v1.6/datasources/YOUR_OWN_DEVICE_ID/variables/?token=YOUR_OWN_TOKEN 只需将你的设备ID替换掉YOUR_OWN_DEVICE_ID,将你的ubidot令牌替换掉YOUR_OWN_TOKEN即可。然后将build.apk文件并将其安装到你的手机。 新建apk文件 令牌和设备ID取自用户并存储在设备存储器中以供下次使用。 使用数据库 Android app可在Google Play商店中找到。你可以将其从Play商店安装到你的智能手机。 链接为: https://play.google.com/store/apps/details?id=appinventor.ai_khairul_uapstu.toilet 部分演示图 应用程序的屏幕截图 框架图 框架图显示整个系统的工作情况。 数据库配置 使用App Inventor进行应用程序开发 Android应用程序(.apk文件) 请在文件库下载apk文件 http://make.quwj.com/project/77 Android源代码文件(MIT App Inventor) 请在文件库下载Android源代码文件 http://make.quwj.com/project/77 代码 树莓派的Python代码。在项目文件库中可以下载。 http://make.quwj.com/project/77

基于源代码为树莓派设备构建 TensorFlow

本指南为运行 Raspbian 9.0 操作系统的 Raspberry Pi 嵌入式设备构建 TensorFlow。虽然这些说明可能也适用于其他系列的 Raspberry Pi 设备,但它仅针对此文中涉及的配置进行了测试和支持。

我们建议采用交叉编译的方式构建 TensorFlow Raspbian 软件包。交叉编译使用不同的平台来构建软件包。也就是说,我们并没有在配备有限 RAM 和相对较慢处理器的 Raspberry Pi 设备上构建 TensorFlow,而是使用性能更加强大的主机进行构建。

主机设置

安装 Docker

为简化依赖关系管理,我们使用 Docker 创建虚拟 Linux 开发环境。通过执行以下命令验证 Docker 是否安装:docker run –rm hello-world

下载 TensorFlow 源代码

使用 Git 克隆 TensorFlow:

git clone https://github.com/tensorflow/tensorflow.git cd tensorflow

默认为 master 分支。您还可以签出要构建的 release 分支:

git checkout branch_name # r1.9, r1.10, etc.

基于源代码构建

交叉编译 TensorFlow 源代码,从而构建一个基于 ARMv7 NEON 指令的 Python pip 包, 该指令适用于 Raspberry Pi 2 和 3 设备。构建脚本启动 Docker 容器以进行编译。基于 Python 3 和 Python 2.7 的代码如下所示:

Python 3

CI_DOCKER_EXTRA_PARAMS=”-e CI_BUILD_PYTHON=python3 -e CROSSTOOL_PYTHON_INCLUDE_PATH=/usr/include/python3.4″ \ tensorflow/tools/ci_build/ci_build.sh PI-PYTHON3 \ tensorflow/tools/ci_build/pi/build_raspberry_pi.sh Python 2.7 tensorflow/tools/ci_build/ci_build.sh PI \ tensorflow/tools/ci_build/pi/build_raspberry_pi.sh

为了构建支持所有 Raspberry Pi 设备的包,如下所示:

tensorflow/tools/ci_build/ci_build.sh PI \ tensorflow/tools/ci_build/pi/build_raspberry_pi.sh PI_ONE

构建完成后(约30分钟),将在 output-artifacts 目录中创建一个包文件。将此文件复制到 Raspberry Pi 并通过 pip 进行安装:

pip install tensorflow-version-cp34-none-linux_armv7l.whl

via Google TensorFlow

谷歌发布 Edge TPU 开发套件,类似树莓派

谷歌宣布推出用于边缘计算的Edge TPU,作为Cloud TPU的补充,目前Edge TPU仅用于推理,专为在边缘运行TensorFlow Lite ML模型而设计。除了自用,谷歌Edge TPU也将提供给其他厂商使用,进一步把开发者锁定在谷歌生态系统,或对整个智能云计算市场带来巨大冲击!

谷歌又出重磅消息!在谷歌云年度大会的第二天,谷歌宣布Edge TPU——TPU的轻量级版本,用于边缘计算。

这就意味着,谷歌不仅为在自己的数据中心开发人工智能芯片,还打算在将其设计的Edge TPU用在其他公司生产的产品中。

两年前谷歌推出了第一代TPU,当时只能做推理。去年,谷歌推出了既能做训练也能做推理的TPU 2.0,这款谷歌自研芯片当做GPU的强劲对手,威胁英伟达的市场份额。今天5月,谷歌在I/O大会上发布了TPU 3.0,性能进一步提升。无论市场情况如何,谷歌都在内部都更多地使用TPU,而不是依赖英伟达等供应商提供的硬件。

但是,谷歌曾多次表示不会对外销售TPU,而是将TPU与谷歌云Google Cloud Platform(GCP)和TensorFlow绑定,让使用GCP和TF的用户享受TPU带来的计算优势。

现在,Edge TPU则不同了。据CNBC报道,消费电子制造商LG正在一个显示器玻璃检测系统中测试谷歌Edge TPU,以更快地发现制造缺陷。据LG CNS集团CTO Shingyoon Hyun 表示,检测精度从原来的约50%提高到了99.9%。

可以想见,未来谷歌Edge TPU在物联网以及智能终端设备中的巨大使用空间,以及对物联网芯片市场的冲击。

将机器学习带到边缘,省钱!省时!

今天谷歌宣布推出两款旨在帮助客户大规模开发和部署智能连接设备的新产品:Edge TPU,一款新的硬件芯片,以及Cloud IoT Edge,一款将Google Cloud强大的AI功能扩展到网关和连接设备的软件栈。用户可以在云上构建和训练ML模型,然后通过Edge TPU硬件加速器在Cloud IoT Edge设备上运行这些模型。

Edge TPU是谷歌的专用ASIC芯片,专为在边缘运行TensorFlow Lite ML模型而设计。在设计Edge TPU时,我们非常注重在很小的占用空间内优化“每瓦性能”和“每美元性能”。

Edge TPU的设计旨在补充谷歌云TPU,因此,你可以在云中加速ML的训练,然后在边缘进行快速的ML推理。你的传感器不仅仅是数据采集——它们还能够做出本地的、实时的、智能的决策。

Edge TPU芯片的尺寸,与一美元硬币对比

根据谷歌博客的介绍,Edge TPU 的特点如下:

边缘上的AI

如今,从消费者到企业应用程序,AI无处不在。随着连接设备的爆炸式增长,再加上对隐私/机密性、低延迟和带宽限制的需求,在云中训练的AI模型越来越需要在边缘上运行。Edge TPU是谷歌为在边缘运行AI而设计的专用ASIC。它在很小的物理占用和很低功耗的限制下提供高性能,使得在边缘部署高精度的AI成为可能。

端到端的AI基础设施

Edge TPU是Cloud TPU和Google Cloud服务的补充,提供end-to-end、cloud-to-edge、硬件+软件的基础设施,以便于基于AI的解决方案的部署。

很小的物理占用和低功耗下实现高性能

由于其高性能、物理占用面积小、功耗低,Edge TPU可以在边缘广泛部署高质量的AI。

AI硬件、软件和算法的协同设计

Edge TPU不仅仅是一个硬件解决方案,它结合了定制硬件、开放软件和最先进的AI算法,为边缘提供高质量、易于部署的AI解决方案。

广泛的应用

Edge TPU有非常多的工业用例,例如预测性维护、异常检测、机器视觉、机器人、语音识别等等。在制造业、内部部署、医疗、零售、智能空间、交通等领域有广泛应用。

Edge TPU和Cloud TPU的对比:目前Edge仅用于推理

Edge TPU支持在边缘部署高质量的ML推理。它增强了谷歌的Cloud TPU和Cloud IoT,以提供端到端(云到端、硬件+软件)的基础设施,以促进客户基于AI的解决方案的部署。除了开放源码的TensorFlow Lite编程环境之外,Edge TPU最初将部署多个Google AI模型,并结合谷歌在AI和硬件方面的专业知识。

Edge TPU补充了CPU、GPU和其他ASIC解决方案,用于在Edge上运行AI,这将由Cloud IoT Edge支持。

Edge TPU 和 Cloud TPU的对比

Edge TPU可用于ML推理,不适用于训练;Cloud TPU可用于ML训练和推理

软件和服务方面,Edge TPU适用于Cloud IoT Edge和Android Things;Cloud TPU的可用软件包括Cloud ML Engine,Kubernetes Engine,Google Compute Engine,以及Cloud IoT Core

ML框架:Edge TPU可使用TensorFlow Lite, NN API;Cloud TPU可使用TensorFlow, scikit-learn, XGBoost, Keras

硬件加速器:Edge TPU包括Edge TPU, GPU, CPU;Cloud TPU包括Cloud TPU, GPU 和CPU

Edge TPU的特性

Edge TPU使用户能够以高效的方式,在高分辨率视频上以每秒30帧的速度,在每帧上同时执行多个最先进的AI模型。

推出配套软件 Cloud IoT Edge

Cloud IoT Edge是将Google Cloud强大的数据处理和机器学习功能扩展到网关、摄像头和终端设备的软件,使物联网应用更智能、更安全、更可靠。它允许你在Edge TPU或基于GPU和CPU的加速器上执行在Google Cloud中训练了的ML模型。

Cloud IoT Edge可以在Android Things或基于Linux OS的设备上运行,其关键组件包括:

网关类设备runtime(至少有一个CPU),用于边缘数据的本地存储、转换和处理,以及从数据中获取智能,同时与云IoT平台的其余部分无缝互操作。

Edge IoT Core runtime,能更安全地将边缘设备连接到云,支持软件和固件更新,并通过Cloud IoT Core管理数据交换。

基于TensorFlow Lite的Edge ML runtime,使用预先训练过的模型执行本地ML推理,显著减少延迟并增加边缘设备的多功能性。由于Edge ML运行时与TensorFlow Lite接口,因此它可以在网关类设备中的CPU,GPU或Edge TPU上执行ML推理,或者在终端设备(如摄像头)中执行ML推理。

推出Edge TPU开发套件,进一步将开发者锁定在谷歌生态系统

为了使用Edge TPU快速启动开发和测试,我们构建了一个开发套件(Edge TPU development kit)。这个套件包括一个模块化系统(SOM),集合了谷歌的Edge TPU,一个NXP的CPU, Wi-Fi,和Microchip的安全元件。开发套件将在今年10月对开发者开放,也可以注册申请提前访问。

Edge TPU开发套件:SOM(上)和底板(下)

颠覆云计算,狙击亚马逊和微软

谷歌进军定制芯片已经被证明可行。用于谷歌数据中心的TPU本身就是一个很好的例子。

Edge TPU的计算密集度低于训练模型,无需连接到一堆功能强大的计算机即可运行计算,因此应用程序可以更快、更可靠地运行。

如上所述,Edge TPU可以充当传感器或网关设备中的标准芯片或微控制器。谷歌已经开发了一套套件,包括Edge TPU,NXP芯片和Wi-Fi连接,供开发人员试用。

今年2月份加入谷歌实习(entrepreneur in residence)的三星前CTO Injong Rhee 表示,谷歌制作Edge TPU并非为了与传统的芯片商进行竞争。“这对所有芯片供应商和设备制造商都非常有利。” Rhee 告诉CNBC记者。

Rhee 表示,Edge TPU可能会“颠覆云计算的竞争”,因为现在某些计算只用发生在本地。他说,就成本和能源使用而言,谷歌芯片在某些类型的计算方面比传统芯片更加高效。

至于谷歌是否会研发一款更强大,可以用于训练的Edge TPU时,Rhee 则表示不予置评。

谷歌正在与Arm,Harting,日立数据系统(Hitachi Vantara),新汉(Nexcom),诺基亚和恩智浦等制造商合作。

谷歌将在一款类似 Raspberry Pi 的套件上推出Edge TPU,在简化版的TensorFlow AI软件上运行。这一操作将使得那些已经使用TensorFlow作为其主要机器学习框架的开发者,更快更高效地使用Edge TPU,提供全栈式硬件,进一步将其锁定在谷歌云的生态系统中。

谷歌并不是唯一为所谓的物联网提供服务的云服务提供商。今年早些时候,微软宣布推出面向物联网的芯片设计。微软的Azure是除了亚马逊AWS之外第二大云的服务商。

至于占据市场主要份额的亚马逊AWS,凭借其智能音箱Echo/Alexa,已经在智能终端领域占据了不小的市场。

虽然硅谷早有传言,但Edge TPU的推出无疑是谷歌迈进从硬件到用户体验一张套服务的切实一步。

就目前而言,谷歌Edge TPU或许还尚不具备颠覆硬件计算市场的能力,但谷歌将自研Edge TPU用于其他厂商设备这一举措,显然有一统生态系统的野心。

但无论如何,消费者的体验将会随着越来越强大的智能计算得到进一步提高。

参考资料

1、CNBC报道:https://www.cnbc.com/2018/07/23/google-cloud-team-builds-ai-chips-for-internet-of-things-devices.html

2、谷歌博客:https://www.blog.google/products/google-cloud/bringing-intelligence-to-the-edge-with-cloud-iot/

via http://www.sohu.com/a/243422493_473283

TensorFlow 1.9 官方现已支持树莓派!

树莓派实验室按:TensorFlow 是谷歌研发的第二代人工智能学习系统,可被用于语音识别或图像识别等多项机器学习和深度学习领域。今天,TensorFlow 官方宣称开始支持树莓派平台,这意味着树莓派设备在人工智能方向的应用和学习上变得更加容易。

TensorFlow 在 2015 年首次发布之时,我们希望它成为一个任何人都可以使用的开源的机器学习框架。为此,我们将它扩展到了 Linux、MacOS、Windows、iOS 以及 Android 平台。而今,在树莓派基金会的协力下,我们宣布最新的 TensorFlow 1.9 版本将可以通过树莓派预装的 Python pip 包系统安装!如果你使用的是 Raspbian 9 (stretch),你可以在终端运行下面的命令进行安装:

sudo apt install libatlas-base-dev pip3 install tensorflow

然后在终端运行 python3 ,像在其他平台使用 TensorFlow 一样使用它就好了。下面是一个 hello world 的例子:

# Python import tensorflow as tf tf.enable_eager_execution() hello = tf.constant(‘Hello, TensorFlow!’) print(hello)

如果系统输出你下面的内容,说明已经可以开始使用了!

Hello, TensorFlow!

这里有 更多安装方面的细节在 TensorFlow 官网(需自备梯子)。

我们对此感到很兴奋,因为树莓派被许多创意开发者使用,并且广泛用于编程教育。因此使 TensorFlow 更易于安装将有助于向新用户开放机器学习这一技术方向。

Raspberry Pi 项目的创始人 Eben Upton 说:“现代计算机教育涵盖基础和前瞻性主题至关重要。考虑到这一点,我们很高兴能与 Google 合作推出基于树莓派的 TensorFlow 机器学习平台。我们期待看到有趣的应用程序!”

via