为树莓派CM系列模块的 eMMC 烧录系统

前言

前段时间树莓派(Raspberry Pi)发布了一款新的计算模块 Compute Module 3 (CM3) ,是自 2014 年初代 CM1 后首次更新。CM3 计算模块有两个版本,一个是“标准”的 CM3,另一个则是 CM3 Lite,价格分别为 30 美元和 25 美元,CM3配备了 1.2GHz 的 BCM2837 处理器,1GB RAM 和 4G eMMC 闪存。相比之下,CM3 Lite(CM3L)没有内置闪存,反倒是提供了 SD 卡接口,用户可按需选择 eMMC 或是 SD 卡,这个功能更新满足了不少老用户对闪存扩容的需求。CM3和 CM1 相比,CM3 的 CPU 性能是原来的 10 倍,内存比翻了 1 倍。而且也会和 Raspberry Pi 3 一样,支持 Win 10 的物联网系统(Windows10 IoT Core)。

最近越来越多的玩家购买了CM模块和底板,但是苦于一直不能上手,原因是不会给CM模块烧录系统,网上也少有相关的教程,从今天U大就指导你如果玩转树莓派CM系列。

教程

1.首先需要准备好CM模块(CM1/CM3/CM3L)

2.准备好CM模块底板

 

3.下载解压win系统需要的驱动和并安装boot工具(bcm270x-boot-driverCM-Boot-Installer

4.将CM模块插上底板,将左上角的跳线帽跳至EN USB BOOT,然后连接USB SLAVE和PC,最后再连接POWER IN电源给底板供电

5.WIN系统会提示安装驱动,可以取消自动更新驱动,变成手动更新驱动(bcm270x-boot-driver),直到驱动安装正常如下图

 

 

 

 

6.运行安装好的boot工具RPiBoot.exe, 这时候CM模块的eMMC就会模拟成内存卡,出现在系统目录下

7.按照通常的TF卡烧录系统的方法,就可以给CM模块的eMMC烧录系统了(TF卡烧录系统方法

注意:目前CM模块的eMMC只有4G,而官方提供的系统大多都超过4G,烧写时可能会中断并提示空间不够,所以玩家在烧录CM系统时请选择适合4G以下的镜像。

原文

本文来自:树莓派实验室

编程学习掌机 Pip

“码农”身价水涨船高,越来越多的父母重视到这一点。这也是为什么机器人玩具热销的原因之一。这款名为“点子”的小设备能让孩子们玩真正的数字创造。

“Pip”是由英国科技创业公司Curious Chip开发的一种掌上游戏设备,目前正在众筹。Pip可以帮助孩子们掌握编程的基本知识,并尝试自己编写游戏和应用程序。

 

虽然说主要针对儿童,实际上,它的设计适合所有年龄和所有技术水平的极客。

它基于树莓派构建,内置触摸屏,还集成了扬声器、麦克风、运动传感器,以及附送8个多色可发光二极管。如果觉得屏幕太小,它还支持外接显示器或电视。左右两侧有可拆卸的手柄,可外接手柄实现双人游戏,仅看这几点,扩展性可以说是比较强了。

 

Pip内置了贪吃蛇、小蜜蜂、吃豆人和我的世界,通过玩这些经典的游戏来入门,在熟悉了互动操作之后,可以跟着Pip的互动教程来解构游戏或应用的编程设计。目前支持Javascript、Python、Lua、PHP和HTML/CSS等多种编程语言。

 

每次取得一个小小的学习成就,设备就会发出一些好玩的提示,比如LED灯泡闪烁,或是个人照片出现在游戏里等等。

 

这些教程的范围从简单到高级逐步过度,例如:孩子可以从学习如何使LED闪烁开始,再到使用不同的编程语言控制各种智能传感器。

例如:接入温度传感器,让孩子观察植物;接入距离传感器,并为已有的乐高玩具添加电机和灯效,让原本不会动的玩具动起来……

 

丰富的配套软件和硬件,使得Pip能玩出令人目不暇接的花样。它的众筹早鸟价150英镑起(约合人民币1330元),2018年8月交货。(编译:老魏)

本文转自:新浪科技

 

开源Android Auto车载抬头显示器–OpenAuto

用户已经可以非常轻松地在树莓派上安装Android Auto系统,而更重要的是具备无限潜力。XDA论坛大神f1x就成功DIY了开源Android Auto车载抬头显示器–OpenAuto,搭载了树莓派3开发主板并配置了一个显示器,使用了8GB的MicroSD卡进行扩展,并在GitHub上分享了专用的软件设置。

OpenAuto基于Google Auto制作的内容,并且转换成开发者/DIY社区能够使用的软件。罗列在GitHub上指令并不适用于所有人,但对于那些玩过树莓派且有一点使用经验的人来说,整个安装过程相对简单。

 

OpenAuto具备如下功能:

● 480p, 720p或者支持30/60 FPS的1080P分辨率

● 树莓派3硬件加速支持解码视频流(视频流高达60fps的1080P)

● 所有音频频道(媒体、系统和语音)的音频播放

● 为语音命令的语音输入

● 触控屏和按钮输入

● 蓝牙

● 设备热插播之后的自动启动

● 友好的设置界面

更多内容可以查看GitHub上的相关项目

https://github.com/f1xpl/openauto

本文转自:cnbeta

 

树莓派 Zero USB/以太网方式连接配置教程(macOS平台)

树莓派 Zero 之所以成为一款非常棒的单板计算机并不全因为它小巧的尺寸和便宜的价格,还得益于它便捷、易用的特性。在加装了 Zero Quick Plug 或 microUSB/USB 转换头之后,将树莓派 Zero 和电脑连接起来。树莓派 Zero 即可配置成 USB/以太网设备,这时仅需要一个 USB 接口就实现给树莓派供电的同时将它接入因特网。不再需要携带额外的电源适配器、 USB HUB和无线网卡。可以说这是迄今为止连接树莓派最简单、方便的方式!
对于 Raspbian 2016-10-5 之后的系统镜像,你只需要在系统 SD 卡上修改几处配置文件即可将树莓派配置成一个 USB/以太网设备。

配置 CONFIG.TXT 和 CMDLINE.TXT 文件

请确认你刷入的系统镜像是 2016-10-5 之后的版本。将刷好系统的 SD 卡在电脑上打开,进入 SD 卡根目录并打开 config.txt 文件。在文件末尾添加一行 dtoverlay=dwc2。

保存并关闭 config.txt 文件。

再打开 cmdline.txt 文件,请确认你的编辑器已关闭“自动换行”。编辑这个文件的时候不需要插入任何换行符,所有字符都在同一行。找到 rootwait,在后面插入 modules-load=dwc2,g_ether。

保存并关闭 cmdline.txt 文件。

最后在根目录创建一个名为 ssh 的文件或目录。

好了,可以从电脑上弹出 SD 卡了。把 SD 卡插入树莓派 Zero,用 Zero Quick Plug 或 microUSB/USB 转换头将树莓派 Zero 和电脑连接起来。

图中用到的这款连接部件是树莓派 Zero 多功能 USB 插头(Zero Quick Plug),详见下图。

这时系统会自动识别到树莓派。

等待树莓派启动可能需要半分钟,然后就可以在网络列表中看到了设备已分配好 IP 地址。

现在,就可以尝试通过 SSH 连接树莓派的地址 raspberrypi.local 了。

如果你用的是 Raspbian 桌面版,你可以安装一个 RDP(远程桌面协议)客户端然后在电脑上通过远程桌面( “Remote Desktop Connection for Mac” )客户端连接到树莓派,连接地址同样是 raspberrypi.local。(具体方法可参考

另有 Windows 平台下使用这一功能的教程,移步这里阅读

本文来自:树莓派实验室

 

国外开发者尝试在树莓派3上运行Windows 10桌面版

 

虽然在树莓派上用户已经可以安装Windows 10 IoT Core系统,不过得益于近期启动的Windows 10 on ARM平台,荷兰开发者Bas Timmer(推特账号@NTAuthority)近日在树莓派3(Broadcom BCM2837 ARMv8处理器)上成功安装完整版Windows 10系统。

Windows 10 on ARM是微软近期公布、最值得关注的项目,允许在高通骁龙处理器上运行完整版Windows 10系统,并且具备超高续航的优点。

虽然已经成功移植,并且能够运行传统Win32应用程序,但是也存在很多不足。Timmer表示目前系统只能调用1个CPU核心,其他核心会跳出“未支持的处理器”。

 

 

本文来自:

国外开发者尝试在树莓派3上运行Windows 10桌面版

 

DietPi 6.0 发布,适用于树莓派

DietPi 是一个基于 Debian 的 Linux 发行版。它主要为 Raspberry Pi 树莓派等单板设备开发,但也可运行于包含 x86 及 Odroid 机器在内的其它架构中。其 1 月 28 日发布的最新版本 DietPi 基于 Debian Stretch (除了 Odroid 的之外)。

在这一版本中:所有镜像已被重新创建;已有的安装( v159 及以下)无法被升级且不再被支持;用户需安装最新的 v6.0 镜像以继续获得支持; 基于 ARMbian 的镜像目前包含主线内核 4.13+  。  Native PC (EFI) 现在是一个 ISO ,配备了 clonezilla ;通过 Rufus write 简化了安装。

详细内容或其它变化见于其发布通告

DietPI 拥有如下特性:

  • 轻量:镜像文件大小最低为 400 MB 左右,比 Raspbian Lite 轻 3 倍;
  • 优化了 CPU 及内存资源的使用,确保用户的单板设备的稳定运行;
  • 简单的界面:使用轻量级的 Whiptail 菜单,让用户花费更少的时间于命令行;
  • DietPi-Software 快速简便得安装经过优化的常见软件;
  • DietPi-Config: 个性化配置设备的软硬件;
  • DietPi-Backup: 快速简便地备份及恢复 DietPi 系统;
  • 用户可以选择日志程度,使用 DietPi-Ramlog 或 rsyslog 及 rotate 以记录重要事件并获得性能提升;
  • DietPi-Process 工具:控制软件的优先级( nice 、 affinity 及策略调度);
  • DietPi-Update 系统: DietPi 自动检查、提示可用更新并可以快速应用更新;
  • DietPi-Automation :允许用户在启动之前简单地配置好 dietpi.txt 以完全自动化 DietPi 的安装而无需用户输入。

DietPi 支持 RaspberryPi 、 NanoPi 、 OrangePi 等常见单板设备并提供了详细的教程文档

封面图片原由 mrneilypops 载于 deviantart.com 。

本文来自 cnBeta,部分文字转录或衍生自 DistroWatch.com 的对应页面与 DietPi 官网

DIY一个自拍相机:树莓派 3 +触摸屏显示器

一个使用树莓派 3加触摸屏显示器 、镜头和SenseHAT的有趣项目

使用树莓派,创建一个桌面“自拍”相机。不需要焊接或定制任何电子零件。应用程序也是超级简单。

硬件

整个项目使用了下列的零件:

  • 树莓派3型号B
  • 树莓派触摸屏
  • 树莓派相机
  • SenseHAT
  • 电源
  • 32GB Micro SD 卡

另外还配搭了定制激光切割和折叠亚克力盒。即使你没有激光切割机和亚克力文件夹,也可以使用其他的外壳替代。

O/S及相关

把Raspbian Jessie Lite写入一张Micro SD卡中,然后将主机名由简单的raspberrypi更改为其他名称,编辑根文件系统etc/hostname和etc/hosts文件就可以。这样在网络上会更容易找到主机。

openssh服务器现在默认为禁用,因为我更喜欢通过SSH进行登录,这可以通过在boot partition中创建一个名为ssh的空文件来启用它。

触摸屏技术上是上下倒转安装的,所以要将显示器旋转到正确的方向,有必要编辑config.txt – 也在启动分区,并添加行:

lcd_rotate=2

接下来将Micro SD卡插入Raspberry Pi并接通电源。之后,我建议按照惯例做法,通过登录并输入以下内容更新O / S:

$ sudo apt get update 

$ sudo apt-get dist-upgrade

请注意,由于我们已将主机名更改为selfiecam,因此可以从另一台Linux计算机使用以下命令登录到Pi:

$ ssh pi@selfiecam.local

由于我们想使用SenseHAT,相机和帧缓冲区,一些有用的Python软件也通过安装:

$ sudo apt-get install sense-hat python-picamera python-pygame

最后,需要启用相机和重新启动,这可以透过raspi-config完成:

$ sudo raspi-config

软件

首先,我们需要导入一些库,其中包括上面提到的。

import os
import time
import pygame
from picamera import PiCamera
from sense_hat import SenseHat

我们需要初始化Pygame,它将用来显示图像到帧缓冲区中(显示器)。

pygame.init()
screen = pygame.display.set_mode([800,480])

接下来我们设置摄像机,由于它的物理位置被水平翻转,我们需要通过软件翻转它。

camera = PiCamera()
camera.resolution = (800, 480)
camera.hflip = True

之后配置SenseHAT。

sense = SenseHat()
sense.set_rotation(0)

接下来我们将会定义一个函数,把其中一个文件作为参数,然后使用Pygame来绘制屏幕变成黑色,然后再显示它包含的图像。

def displayImage(file):

image = pygame.image.load(file)
imagerect = image.get_rect()

screen.fill([0, 0, 0])
screen.blit(image, imagerect)
pygame.display.flip()

然后我们定义一个功能,启用视频预览,在SenseHAT LED矩阵上显示3-2-1-0倒计时,截取静止图像前,停止预览,显示图像,並清除LED矩阵。映像文件名中应包含日期和时间。

def getSelfie(): # Start camera video preview

camera.start_preview()    # Commence countdown
sense.show_letter("3", text_colour=[255, 0, 0])    time.sleep(1)
sense.show_letter("2", text_colour=[255, 255, 0])    time.sleep(1)
sense.show_letter("1", text_colour=[0, 255, 0])    time.sleep(1)
sense.show_letter("0", text_colour=[0, 0, 255])    # Capture image and stop preview
filename = time.strftime("/selfies/%Y-%m-%d-%H-%M-%S.jpg")
camera.capture(filename)
camera.stop_preview()    # Display image and clear SenseHAT display
displayImage(filename)
sense.clear()

请注意,LED矩阵上显示的数字颜色是不同的:3 =红色,2 =黄色,1 =绿色,0 =蓝色。

到目前为止,我们只是导入了不同的库和定义函数。接下来,我们将使用displayImage()這个函数在启动时更新触摸屏显示欢迎图像。

displayImage(“/usr/local/share/images/Welcome.png”)

最后,我们进入程序的主循环。在这里,我们等待来自SenseHAT操纵杆的动作。如果这被按住,我们需要等待它被释放后使用getSelfie()函数。如果它被一直保持在左边,我们直接关机。我们可以忽略其他相关动作。

while True: # Wait for and process joystick events 
    event = sense.stick.wait_for_event(emptybuffer=True) 
    if event.direction == "middle" and event.action == "released": 
        getSelfie() 
    elif event.direction == "left" and event.action == "held": 
        os.system("/sbin/shutdown -h now") 
    else:
        pass

运行

/etc/rc.local文件在启动时运行,在这文件添加一行代码防止屏幕自动关闭,接着一秒后会启动自拍照相机应用程序。

sudo sh -c “TERM=linux setterm -blank 0 >/dev/tty0” /usr/local/bin/selfie.py &

重新启动后,我们会看到我们设定的欢迎图像。按下操纵杆时,会显示实时视频预览,并开始倒數计时。

在倒数到零时将会拍照,并停止视频预览,图像会显示在屏幕上。

最后图像可以从SD卡中复制出来。

如果你想自己做这个项目,可以在GitHub上找到Python脚本和亞克力外壳的设计文件。

本文来自:ednchina

在树莓派上用 Syncthing 自建私有云盘

自建的私有云网盘软件很多,比如 Seafile、ownCloud 等,功能很实用,而 Syncthing 最大的特色是采用了与 Resilio Sync (BitTorrent Sync) 类似的 P2P 分布式技术,无需中心服务器,即可让多台设备互相实时同步文件,用过 Resilio Sync 的朋友都明白这种同步方式的优势了。它们两者的实现方式很相似,区别是 Resilio 属于商业软件,需付费使用,在国内已慢慢变得访问(被)困难(墙),而 Syncthing 不仅完全免费且开源,相比 Resilio 还增加了“文件版本控制”、“单向同步”等堪称杀手级的功能特性。

Syncthing 功能上非常接近于 Resilio Sync / BT Sync,不过说它是一款用于搭建网盘的服务器软件或者云存储服务应用似乎并不十分恰当,相较于 Seafile、NextCloud 等服务器工具,Syncthing 实际上更像是一款文件/文件夹同步工具。你可以非常轻松简单地让同一路由器下的多台 PC 电脑、NAS 设备实现局域网互相同步,也可以在 VPS 服务器或 24 小时不关机且有公网 IP 的电脑上安装和配置 Syncthing,让其成为真正意义上的云同步网盘。

更难得的是 Syncthing 开源且免费,跨平台支持 Windows,Mac,Linux,Android。(稍有些遗憾的是目前暂不支持iOS平台)当然也支持树莓派平台,下面应读者要求,树莓派实验室为大家介绍如何在树莓派上安装 Syncthing!(VPS 等 Linux 平台上安装方法类同,也可以参考本文)

获取软件包

#进入用户所在目录
cd ~
#下载软件包,如果发现不能顺畅下载,那可能是墙的锅,手动下载了再通过 SFTP 上传到 /home/pi 目录下也可以
wget https://github.com/syncthing/syncthing/releases/download/v0.14.42/syncthing-linux-arm-v0.14.42.tar.gz
#解压
tar -zxvf syncthing-linux-arm-v0.14.42.tar.gz

注:Syncthing 的版本迭代比较频繁,你可以在这个页面获取最新的安装包。页面中文件名为 syncthing-linux-arm-版本号.tar.gz 的就是树莓派可用的版本。

部署、测试

解压之后当前目录下多了一个名为 syncthing-linux-arm-v0.14.42 的目录。

#强迫症表示要重命名缩短一下:
mv syncthing-linux-arm-v0.14.42 syncthing
#进入 syncthing 目录
cd syncthing
#给主程序加上执行权限
chmod +x syncthing

~/syncthing/syncthing

结果输出一些程序初始化信息,包括网络监听端口、WebUI(操作界面) URL 等,表示部署成功。先不要急着访问 WebUI,因为还需要少量配置。先 Ctrl+C 中止程序。

配置

运行下面的命令编辑 Syncthing 的配置文件:

sudo nano /home/pi/.config/syncthing/config.xml

找到下面的内容

<gui enabled="true" tls="false">
<address>127.0.0.1:8384</address>
<apikey>XXXXXX</apikey>
</gui>

将 127.0.0.1:8384 修改为 0.0.0.0:8384 以便让其他终端可以访问到 Syncthing 的 WebUI。

下面再次运行主程序

~/syncthing/syncthing

不要中断程序,尝试用电脑或者手机的浏览器访问 Syncthing 的 WebUI,地址为
http://树莓派的IP地址:8384

打开之后,会让你设置用户名和密码。下面再大致了解下几个关键的界面:

 

 

到这一步就已经可以投入使用了!
但是使用这个命令运行 Syncthing,程序需要一直在前台运行。为了让它在后台默默执行可以这样

~/syncthing/syncthing &

如果你希望让 Syncthing 可以自动开机运行,可以继续往下阅读。

设置开机自动运行

在 /etc/init.d 目录下建立启动文件

sudo nano /etc/init.d/syncthing

输入以下内容:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          Syncthing
# Required-Start:    $local_fs $remote_fs $network
# Required-Stop:     $local_fs $remote_fs $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Syncthing
# Description:       Syncthing is for backups
### END INIT INFO
  
# Documentation available at
# http://refspecs.linuxfoundation.org/LSB_3.1.0/LSB-Core-generic/LSB-Core-generic/iniscrptfunc.html
# Debian provides some extra functions though
. /lib/lsb/init-functions
  
DAEMON_NAME="syncthing"
DAEMON_USER=pi
DAEMON_PATH="/home/pi/syncthing/syncthing"
DAEMON_OPTS=""
DAEMON_PWD="${PWD}"
DAEMON_DESC=$(get_lsb_header_val $0 "Short-Description")
DAEMON_PID="/var/run/${DAEMON_NAME}.pid"
DAEMON_NICE=0
DAEMON_LOG='/var/log/syncthing'
  
[ -r "/etc/default/${DAEMON_NAME}" ] && . "/etc/default/${DAEMON_NAME}"
  
do_start() {
  local result
  
    pidofproc -p "${DAEMON_PID}" "${DAEMON_PATH}" > /dev/null
    if [ $? -eq 0 ]; then
        log_warning_msg "${DAEMON_NAME} is already started"
        result=0
    else
        log_daemon_msg "Starting ${DAEMON_DESC}" "${DAEMON_NAME}"
        touch "${DAEMON_LOG}"
        chown $DAEMON_USER "${DAEMON_LOG}"
        chmod u+rw "${DAEMON_LOG}"
        if [ -z "${DAEMON_USER}" ]; then
            start-stop-daemon --start --quiet --oknodo --background \
                --nicelevel $DAEMON_NICE \
                --chdir "${DAEMON_PWD}" \
                --pidfile "${DAEMON_PID}" --make-pidfile \
                --exec "${DAEMON_PATH}" -- $DAEMON_OPTS
            result=$?
        else
            start-stop-daemon --start --quiet --oknodo --background \
                --nicelevel $DAEMON_NICE \
                --chdir "${DAEMON_PWD}" \
                --pidfile "${DAEMON_PID}" --make-pidfile \
                --chuid "${DAEMON_USER}" \
                --exec "${DAEMON_PATH}" -- $DAEMON_OPTS
            result=$?
        fi
        log_end_msg $result
    fi
    return $result
}
  
do_stop() {
    local result
  
    pidofproc -p "${DAEMON_PID}" "${DAEMON_PATH}" > /dev/null
    if [ $? -ne 0 ]; then
        log_warning_msg "${DAEMON_NAME} is not started"
        result=0
    else
        log_daemon_msg "Stopping ${DAEMON_DESC}" "${DAEMON_NAME}"
        killproc -p "${DAEMON_PID}" "${DAEMON_PATH}"
        result=$?
        log_end_msg $result
        rm "${DAEMON_PID}"
    fi
    return $result
}
  
do_restart() {
    local result
    do_stop
    result=$?
    if [ $result = 0 ]; then
        do_start
        result=$?
    fi
    return $result
}
  
do_status() {
    local result
    status_of_proc -p "${DAEMON_PID}" "${DAEMON_PATH}" "${DAEMON_NAME}"
    result=$?
    return $result
}
  
do_usage() {
    echo $"Usage: $0 {start | stop | restart | status}"
    exit 1
}
  
case "$1" in
start)   do_start;   exit $? ;;
stop)    do_stop;    exit $? ;;
restart) do_restart; exit $? ;;
status)  do_status;  exit $? ;;
*)       do_usage;   exit  1 ;;
esac

保存之后运行

#加可执行权限
sudo chmod +x /etc/init.d/syncthing
#添加默认启动
sudo update-rc.d syncthing defaults

之后你还可以通过这四个命令管理 Syncthing,顾名思义。

sudo service syncthing start
sudo service syncthing stop
sudo service syncthing restart
sudo service syncthing status

如后面你要开机自动运行可以使用

sudo update-rc.d syncthing remove

与 BTSync 的比较

Syncthing 与 BTSync 有着相似的功能,均很强大。
1.Syncthing 与 BTSync 相比,Syncthing 是开源的,MIT协议。可免费用于商业用途,而 BTSync 相反。
2.Syncthing 的方式更侧重个人资料的同步,BTSync 还可以在同步的基础上进行分享。
3.Syncthing 暂无 iOS 版本。

各种平台的客户端可以在官网免费获取:
https://syncthing.net/
(Windows 版的 Syncthing 官方还提供了一个图形界面版的“SyncTrayzor”工具)

GitHub:
https://github.com/syncthing/syncthing

有价值的参考:
在安卓设备上使用 Syncthing
正文的脚本出处

本文来自:树莓派实验室

 

 

 

 

树莓派Zero WH SBCs现在提供专业焊接头

树莓派基金会(Raspberry Pi Foundation)今天宣布推出一款带有预焊接头的微型Raspberry Pi Zero W单板电脑的新变种 – Raspberry Pi Zero WH,这是第三款Raspberry Pi Zero型号,它提供了与Raspberry Pi Zero W相同的功能,并且有专业的焊接头,方便那些不知道如何在Raspberry Pi Zero W上添加焊接头的用户,也方便于通过Raspberry Pi Zero进行小项目的用户。

据Raspberry Pi基金会介绍,Raspberry Pi Zero WH可以帮助用户在PC或Mac上充分利用Debian GNU / Linux 9“Stretch”操作系统的GPIO扩展工具,让他们从一个U盘启动Rasbian或使用Linux电脑。

GPIO扩展器工具可让用户快速而简单地访问物理计算,而无需完整的树莓派设置,也无需配置任何SD卡。除了利用GPIO扩展器工具外,Raspberry Pi Zero WH的预焊接头非常适合任何原型工作。

 

 

来自 cnBeta

 

树莓派+YOLO打造人工智能相机

不久之前,亚马逊刚刚推出了DeepLens。这是一款专门面向开发人员的全球首个支持深度学习的摄像机,它所使用的机器学习算法不仅可以检测物体活动和面部表情,而且还可以检测类似弹吉他等复杂的活动。虽然DeepLens还未正式上市,但智能摄像机的概念已经诞生了。

今天,我们将自己动手打造出一款基于深度学习的照相机,当小鸟出现在摄像头画面中时,它将能检测到小鸟并自动进行拍照。最终成品所拍摄的画面如下所示:

相机不傻,它可以很机智

我们不打算将一个深度学习模块整合到相机中,相反,我们准备将树莓派“挂钩”到摄像头上,然后通过WiFi来发送照片。本着“一切从简”(穷)为核心出发,我们今天只打算搞一个跟DeepLens类似的概念原型,感兴趣的同学可以自己动手尝试一下。

接下来,我们将使用Python编写一个Web服务器,树莓派将使用这个Web服务器来向计算机发送照片,或进行行为推断和图像检测。

我们这里所使用的计算机其处理能力会更强,它会使用一种名叫YOLO的神经网络架构来检测输入的图像画面,并判断小鸟是否出现在了摄像头画面内。

我们得先从YOLO架构开始,因为它是目前速度最快的检测模型之一。该模型专门给Tensorflow(谷歌基于DistBelief进行研发的第二代人工智能学习系统)留了一个接口,所以我们可以轻松地在不同的平台上安装和运行这个模型。友情提示,如果你使用的是我们本文所使用的迷你模型,你还可以用CPU来进行检测,而不只是依赖于价格昂贵的GPU。

接下来回到我们的概念原型上… 如果像框内检测到了小鸟,那我们就保存图片并进行下一步分析。

检测与拍照

正如我们所说的,DeepLens的拍照功能是整合在计算机里的,所以它可以直接使用板载计算能力来进行基准检测,并确定图像是否符合我们的标准。

但是像树莓派这样的东西,我们其实并不需要使用它的计算能力来进行实时计算。因此,我们准备使用另一台计算机来推断出现在图像中的内容。

我使用的是一台简单的Linux计算机,它带有一个摄像头以及WiFi无线网卡(树莓派3+摄像头),而这个简单的设备将作为我的深度学习机器并进行图像推断。对我来说,这是目前最理想的解决方案了,这不仅大大缩减了我的成本,而且还可以让我在台式机上完成所有的计算。

当然了,如果你不想使用树莓派视频照相机的话,你也可以选择在树莓派上安装OpenCV 3来作为方案B,具体的安装方法请参考【这份文档】。友情提示,安装过程可谓是非常的麻烦!

接下来,我们需要使用Flask来搭建Web服务器,这样我们就可以从摄像头那里获取图像了。这里我使用了MiguelGrinberg所开发的网络摄像头服务器代码(Flask视频流框架),并创建了一个简单的jpg终端:

#!/usr/bin/envpython
from import lib import import_module
import os
from flask import Flask, render_template, Response
 
#uncomment below to use Raspberry Pi camera instead
#from camera_pi import Camera
 
#comment this out if you're not using USB webcam
from camera_opencv import Camera
 
app =Flask(__name__)
 
@app.route('/')
def index():
 return "hello world!"
 
def gen2(camera):
 """Returns a single imageframe"""
 frame = camera.get_frame()
 yield frame
 
@app.route('/image.jpg')
def image():
 """Returns a single currentimage for the webcam"""
 return Response(gen2(Camera()),mimetype='image/jpeg')
 
if __name__ == '__main__':
app.run(host='0.0.0.0', threaded=True)

如果你使用的是树莓派视频照相机,请确保没有注释掉上述代码中from camera_pi那一行,然后注释掉from camera_opencv那一行。

你可以直接使用命令python3 app.py或gunicorn来运行服务器,这跟Miguel在文档中写的方法是一样的。如果我们使用了多台计算机来进行图像推断的话,我们还可以利用Miguel所开发的摄像头管理方案来管理摄像头以及计算线程。

当我们启动了树莓派之后,首先需要根据IP地址来判断服务器是否正常工作,然后尝试通过Web浏览器来访问服务器。

URL地址格式类似如下:
http://192.168.1.4:5000/image.jpg

在树莓派中加载Web页面及图像来确定服务器是否正常工作:

图像导入及推断

既然我们已经设置好了终端来加载摄像头当前的图像内容,我们就可以构建一个脚本来捕捉图像并推断图像中的内容了。

这里我们需要用到request库(一个优秀的Python库,用于从URL地址获取文件资源)以及Darkflow(YOLO模型基于Tensorflow的实现)。

不幸的是,我们没办法使用pip之类的方法来安装Darkflow,所以我们需要克隆整个代码库,然后自己动手完成项目的构建和安装。安装好Darkflow项目之后,我们还需要下载一个YOLO模型。

因为我使用的是速度比较慢的计算机和板载CPU(而不是速度较快的GPU),所以我选择使用YOLO v2迷你网络。当然了,它的功能肯定没有完整的YOLO v2模型的推断准确性高啦!

配置完成之后,我们还需要在计算机中安装Pillow、numpy和OpenCV。最后,我们就可以彻底完成我们的代码,并进行图像检测了。

最终的代码如下所示:

from darkflow.net.build import TFNet
import cv2
 
from io import BytesIO
import time
import requests
from PIL import Image
import numpy as np
 
options= {"model": "cfg/tiny-yolo-voc.cfg", "load":"bin/tiny-yolo-voc.weights", "threshold": 0.1}
 
tfnet= TFNet(options)
 
birdsSeen= 0
def handleBird():
 pass
 
whileTrue:
 r =requests.get('http://192.168.1.11:5000/image.jpg') # a bird yo
 curr_img = Image.open(BytesIO(r.content))
 curr_img_cv2 =cv2.cvtColor(np.array(curr_img), cv2.COLOR_RGB2BGR)
 
 result = tfnet.return_predict(curr_img_cv2)
 print(result)
 for detection in result:
 if detection['label'] == 'bird':
 print("bird detected")
 birdsSeen += 1
 curr_img.save('birds/%i.jpg' %birdsSeen)
 print('running again')
time.sleep(4)

此时,我们不仅可以在命令控制台中查看到树莓派所检测到的内容,而且我们还可以直接在硬盘中查看保存下来的小鸟照片。接下来,我们就可以使用YOLO来标记图片中的小鸟了。

假阳性跟假阴性之间的平衡

我们在代码的options字典中设置了一个threshold键,这个阈值代表的是我们用于检测图像的某种成功率。在测试过程中,我们将其设为了0.1,但是如此低的阈值会给我们带来是更高的假阳性以及误报率。更糟的是,我们所使用的迷你YOLO模型准确率跟完整的YOLO模型相比,差得太多了,但这也是需要考虑的一个平衡因素。

降低阈值意味着我们可以得到更多的模型输出(照片),在我的测试环境中,我阈值设置的比较低,因为我想得到更多的小鸟照片,不过大家可以根据自己的需要来调整阈值参数。

代码开源

跟之前一样,我已经将所有的代码上传到GitHub上了,感兴趣的同学可以自行下载安装【GitHub传送门】。

* 参考来源:makeartwithpython,FB 小编 Alpha_h4ck 编译,转自 FreeBuf.COM

本文来自:树莓派实验室