标注数据集

环境配置

  • 安装python3
  • 安装pyqt5
    pip install pyqt
  • 安装labelImg
    • 最简单的方式是通过pip安装
pip install labelImg

使用方法

  • 文件夹结构
    file dir.png

  • 打开软件

    #命令行
    labelImg
    #打开后不要关闭命令行窗口!且通过命令行窗口可以看到软件得输出信息

    打开软件.png

  • 点击Open Dir按钮打开图片文件夹(选择存放数据集图片的文件夹,例如上图的dst_pic)
    open dir.png

  • 软件右下角为图片列表
    file list.png

  • 软件中间为目前处理的图片

  • 软件右上角为标注的物体类别和信息

  • 点击Change Save Dir按钮更改保存的目标文件夹(例如上图的lab)
    change save dir.png

  • 确保打开自动保存模式(Auto Save mode)(否则需要每张图片都得点击一下保存)
    auto save.png

    • 确保前面有个小勾勾
      auto save yes.png
  • (重要)确保将保存格式从VOC改为YOLO(按钮在软件左边)(显示YOLO即正确设置)
    voc.png

    • 确保显示YOLO
      yolo.png
  • 点击“创建矩形框(Create\nRectBox)”按钮开始标注(快捷键 W)(细节要求请看文章底部的注意事项)
    create.png
    tanchu.png

  • 画框之后需要选择该框对应的目标类别

    • 第一次需要手动输入类别
      blue.png
    • 分为blue和red两种目标
      xuanze.png
    • 手动输入后不需要再次输入,可以直接点选(当然你也可以重新输入,如果你觉得好玩的话?)
  • 标注完所有目标后点击Next Image进行下一张图片的标注工作
    next pic.png

    • 假如你没有选择自动保存模式,就需要先点击Save保存标注信息后再进行下一张图片的标注

小技巧

  • 对于小目标,可以放大图片进行仔细标注(快捷键ctrl+鼠标滚轮(鼠标位置为放大中心))

  • 选择框框的角可以对画出的框框进行调整
    jiqiao1.png

  • 可以删除画错或者选错类别的框框,只需要选中框框按键盘的delete或者点击左边的delete按钮

注意事项

  • 不要点击Duplicate\nRectBox按钮,因为该按钮有bug,可能会造成软件闪退

  • 软件关闭后,只要不改变保存位置,以及保存的文件,等再次打开软件并选择该图片文件夹即可恢复之前的标注

  • 画的框框注意以下事项

    • 框框边缘尽量对齐目标边缘,不多不少,越齐越好(阴影等不需要包含)。
      buduobushao.png
    • 对于被遮挡一部分的目标,框框需要包含被遮挡部分(参考下图)(至于框框要画多大,就需要集中注意力,凭经验想象你会发现突然身心平静,随后感觉一股神秘力量涌入身体,并发现自己能看到目标被隐藏的部分)
    • (遮挡过多的不需要标注(判断依据是,仅仅依靠图片中的像素能否判断这是目标物,不能依靠经验等因素影响判断)(否则容易训练出人工智障(除非数据集非常庞大))
      遮挡.png
    • 对于两个有重合的目标也都需要标注(除非重合部分太多,大于80%?就只标注前景目标即可)
  • 保存的结果是这样的
    res.png
    res1.png

复现YOLOv2-Tiny

YOLOv2-Tiny(修改过)纯tensorflow2实现,支持自定义数据集。

背景

由于最近用到K210单片机,其自带KPU可以加速卷积神经网络的运行,但是由于成本限制,片内RAM不大,对于大型的目标检测网络简直是噩梦。Github上有开源的yolo-for-k210,但是基于tensorflow-1.3实现的,所以我用tensorflow-2.3复现了yolov2-tiny。

此复现在yunyang1994对yolov3的tensorflow2基础上进行。

最终目的是可以使用K210官方工具NNCASE进行量化并转化成K210支持的Kmodel格式。(由于K210支持的op太少,很多用到的tflite的操作不支持,所以此目标暂时未达成)

准备工作

版本

  • python-3.7
  • Tensorflow-2.3.0-rc0

硬件

  • Tesla P100(借用学校服务器,当然也可以用cpu训练)
  • CUDA-10.1 cuDNN-7.6

为什么是YOLOv2-Tiny

  1. YOLOv2没有多尺度变换,网络结构比较简单,模型较小

  2. k210的sipeed-mirco python固件提供运行yolov2的接口,可以方便快速进行部署。

网络结构

官方网络结构cfg

不做修改的话对于k210来说还是太大。

组装了一台穿越机

背景

每次看到穿越机的视频都觉得好帅,飞机好看,一些旅拍博主的穿越机镜头也很震撼。
搞得我也想飞飞机了。
东凑凑西凑凑,凑了两个月(钱)终于组装了人生第一架穿越机。

材料

  • 飞控:F4V3S(一开始用F3,但是被我焊坏了,焊功有待提高)
  • 电机:RS2205 2300KV
  • 接收机:A8S(一开始用的ia6b太大了,很丑)
  • 摄像头:FOXEER FPV CAMERA
  • 图传:PandaRC VT5805 5.8GHz(换了FOXEER棒棒糖天线)
  • 遥控:富斯FS-I6X 2.4GHz(换枫叶八木定向征程天线)
    (改装的都是飞了两次之后改的)

组装


第一次组装时的旧接收机



之前的飞控供电线太长太细(虽然功率很低),换成了更好看的电机线

IBUS遥控器控制Arduino智能小车

背景

我的第一个Arduino项目
自从上一次更新博客到现在已经过去两个月了。实在无暇顾及博客更新。期末考试结束后开始继续学习深度学习,整理好部署方法,还要为生活“奔波”了几天。总算到了学校的4+学期。我选择了制作Arduino小车的课程,虽然第一次接触Arduino,但是感觉课程内容有一丢丢简单,所以我抱玩的心态试了试用最近在玩的穿越机的航模遥控控制小车,应该会很有趣呢


如果有同学也选了这门课程同时想尝试点不一样的,可以试试有趣的遥控车。

准备工作

  • 一个IBUS协议的遥控(我的是最便宜的入门控FS-I6X)
  • IbusBM库(可以从Arduino IDE中的官方源下载安装)
  • 支持IBUS协议的接收机(我的是IA6B)
  • 课程配套的Arduino和小车

分析工作

  • IBUS协议依赖串口通信,小车刚好引出一个串口给蓝牙模块用,刚好可以使用该接口连接接收机。
  • 航模遥控将每个摇杆分为两个通道对应摇杆的两个方向,且一个切换开关对应一个通道,我的遥控器是十通道的,这个IBUS接收机最高支持18通道
  • 小车使用L298N电机驱动,同侧前后电机并联——可以实现通过4个IO口控制小车4个轮子的前进和后退。难点在于4个IO口中有两个不能输出PWM调制信号,其分别控制一侧轮子前进或后退,我们需要解决使用这些IO口进行小车的调速。可以选择牺牲后轮调速将一个PWM口于一个普通数字IO口调换。而我选择通过多线程的方式实现了4个轮的前进后退都可以调速。
  • 使用多线程后,事情好办多了。只需要建立一个新线程用于接收处理遥控器每个通道的值就好了。

实现功能

功能有:1. 摇杆控制前进后退(可调速);2. 摇杆控制前进后退时转向,或原地转(可调速);3. 转向灯(含声音);4. 火警报警声;5. 仿汽车按喇叭鸣笛功能;6. 录制动作(含所有动作及声光功能);7. 播放动作。

  • 控制前进后退转向:通过一个通道模拟汽车换挡实现前进后退切换。通过两个通道的值一起决定左右轮转速,左右轮调速线程根据该转速值调节车轮转速。
  • 通过一个通道控制转向灯,可在转向时手动触发。该通道摇杆会自动回弹,所以转向结束后只需放开摇杆即可自动取消转向灯。
  • 通过一个通道切换报警声和鸣笛声,鸣笛声仿照汽车鸣笛(按下鸣笛松开停止)。
  • 录制动作:通过一个通道控制录制或播放,录制过程可随时中断,也可在遥控过程随时开始录制。录制的实现方法是:以150ms的周期记录左右轮速度值以及声光操作标志变量,保存到EEPROM中,每个值以1字节存储(无符号整型,刚好可以满足需求),EEPROM大小为1KB,所以可以记录51秒,满足课程动作设计要求
  • 播放动作:以150ms周期从EEPROM中一次取出3个操作值(左右轮速度值以及声光操作标志变量)执行。可随时中断播放遥控接管小车。
  • 在小车中加上摄像头和图传模块,可以实现远程遥控小车非目视行驶。
    图传

代码

Github

硬件

12V
竖着的开发板是sipeed的k210用来做目标检测辅助智能跟随的(课程过半老师另外要求我做的)
硬件接线

尝试呈现深度学习–计算机视觉的基础知识

期末考试

好久没有更新博客。
现在终于结束期末考试了,原本这学期应该有更多时间才对,但是因为转专业要补修大一点的课程。
不过在放假初忙活杂事后,有时间做自己的事了。
疫情期间接触了深度学习,正好写以博客来帮助自己巩固一下相关知识。那就尝试有趣地用自己的话复述一下相关内容吧(以卷积深度神经网络为例)

目标

接触目标检测源于我想利用摄像头做一个无源室内定位系统(原理是利用定焦摄像头根据画面中的物体大小判断物体到摄像头的距离),以辅助智能家居中枢决策。尽管后来觉得单以目标检测来实现不太现实,其中有许多问题如人体侧面正面投影面积差别大,每个人高矮胖瘦不一等等。不过结合单目深度估算网络也许会好很多(隐私问题我觉得可以解决,况且不一定局限于家庭使用嘛)。
其次,我参加了学校的赛车工作室,在里面负责无人驾驶赛车的视觉部分。有记录学习过程的想法。

机器学习

机器学习(Machine Learning),是使计算机具有智能的方法(从名字应该能看出来就是让机器学习的意思?)。
人工神经网络(Artificial Neural Network)是一种机器学习算法,其模仿生物神经网络(Biological Neural Networks)以让计算机实现“智能”(我一直坚信人类无法想象出自己没“见过”的“东西”)。
而很多层神经网络的叠加,就组成了多层神经网络,起个名字大概便是深度神经网络(Deep Neural Network)了吧,利用深度神经网络进行机器学习,我们称为深度学习(Deep Learning),其具有黑盒特性,我们无法理解里面发生了什么,也就是说图像经过多层卷积后在某一层的值代表什么我们是不能理解的,或者说不是我们会使用的一个量化指标。但是输出的结果是我们需要且可以理解的。


网络

  • backbone:直译为“骨干网络”,它是一段网络结构,通常是多层卷积操作,在计算机视觉中用于提取图像的特征,具有一定通用性。如Darknet-19(YOLOV2) Darknet-53(YOLOV3)等

  • 激活函数:将上一层的输出加入非线性转换,如果没有激活函数,厚重的深度网络最终也只会是线性函数,有了激活函数,才赋予深度网络非线性特性,这才能让深度网络拟合非常复杂的函数。简单来说就是没有激活函数,网络相当于y=ax+b。如:Sigmoid ReLU等

  • 批标准化:训练网络时,如果不对其进行标准化操作,数据经过激活函数后会绝大部分变得饱和,因为激活函数是有有效范围的,超过范围的趋近1或-1(具体看激活函数)了解更多

  • 正则化:正则化可以简单理解为让损失值不仅仅取决于拟合地好坏,也被方程的系数影响。即让最终拟合的函数不要太复杂,从而提高泛化能力,避免过拟合。了解更多

  • 卷积

    • 也称为过滤器(filter),用更小的矩阵如(5*5*3)与更大的输入数据(如416*416*3)相乘并将3层结果算术求和等到得到1*1*1的结果。然后按指定步长后移动卷积核,继续上述操作。直到遍历完全部输入数据。卷积核的深度一般和输入数据的深度一致。了解更多

    • padding:如果卷积步长不为1或不为卷积核大小的整数倍,则卷积无法覆盖整个输入矩阵,可以使用padding扩充输入矩阵的长宽。

    • feather map:卷积的结果,称为特征图。


正向传播

  • 数据输入网络计算并输出,可以理解为推理过程。

  • 损失(loss):训练过程中,训练数据经过正向传递后的结果与正确样本经过损失算法(如交叉熵等)计算出的度量与正确结果差距的值。


反向传播

  • 反向传播的思想其实就是,对于每一个训练实例,将它传入神经网络,计算它的输出;然后测量网络的输出误差(即期望输出和实际输出之间的差异),并计算出上一个隐藏层中各神经元为该输出结果贡献了多少的误差;反复一直从后一层计算到前一层,直到算法到达初始的输入层为止。此反向传递过程有效地测量网络中所有连接权重的误差梯度,最后通过在每一个隐藏层中应用梯度下降算法来优化该层的参数(反向传播算法的名称也因此而来),可以理解为优化网络过程。

  • 梯度:梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。梯度下降算法的工作方式就是重复计算损失函数梯度,然后使变量沿着相反的方向移动,这样就可以让网络优化到损失最小。

    了解更多

  • 学习率:参数延梯度方向的反方向更新的步伐大小

  • 优化器:最优化的过程依赖的算法称为优化器,核心是梯度下降算法和学习率。

Windows 10 安装tensorflow-gpu、CUDA及cuDNN

背景

安装CUDA是很多人学习深度学习的第一道坎,相较于已经装了开源显卡驱动的Ubuntu,在Windows下安装CUDA容易许多(但是Linux在工作平台平台上安装却又异常轻松)。
参考官网教程:https://www.tensorflow.org/install/gpu

版本

驱动版本,CUDA版本以及tensorflow版本需要一一对应。
5.1
可见tensorflow-gpu (2.1或更新)支持CUDA 10.1

下载CUDA

CUDA版本选择:https://developer.nvidia.com/cuda-toolkit-archive
5.2
某些情况可以下载local包获得更好的安装体验
下载network包则会在安装时自动下载所需文件

更新GPU驱动

CUDA 10.1 需要GPU驱动版本为 418.x 或更高版本 https://www.nvidia.com/Download/index.aspx

下载cuDNN

cuDNN版本要根据CUDA版本选择https://developer.nvidia.com/cudnn
选择Download cuDNN

注册或登录英伟达开发者账号

查看并勾选协议条款

选择for CUDA 10.1版本的cuDNN

接着"cuDNN Library for Windows 10"

安装

安装更新显卡驱动

打开驱动安装包安装

安装CUDA

运行安装程序

选择“自定义”
5.3
只需选择安装这四个,其他看自己需求。
5.4
安装位置一般默认就好,安装位置要记好,后面需要。
5.5

安装cuDNN

cuDNN是英伟达提供的计算机视觉的加速库。
解压下载的cuDNN压缩包,然后将解压出来的cuda文件夹下的所有文件移动到安装目录下。
参考上面的截图,例如我的目录为"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1"

设置环境变量

此步参考qilixuening

还要给系统设置环境变量,否则有些程序会找不到CUDA。
右键此电脑-属性-高级-环境变量
5.6
5.7
点击“新建”
5.8

#以下位置为默认安装位置,之前安装CUDA时候记下的安装位置在这里需要
#新建一条加入一条,等号左右对应着变量和值
CUDA_SDK_PATH = C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.1
CUDA_LIB_PATH = %CUDA_PATH%\lib\x64
CUDA_BIN_PATH = %CUDA_PATH%\bin
CUDA_SDK_BIN_PATH = %CUDA_SDK_PATH%\bin\win64
CUDA_SDK_LIB_PATH = %CUDA_SDK_PATH%\common\lib\x64

然后单击Path-编辑
5.9
找到编辑文本
5.10

#复制进去
%CUDA_LIB_PATH%;%CUDA_BIN_PATH%;%CUDA_SDK_LIB_PATH%;%CUDA_SDK_BIN_PATH%;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\lib\x64;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin;C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.1\common\lib\x64;C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.1\bin\win64;
#没有回车,一整行

最后点击确认
结果如图
5.11

(以上实测不做似乎也没问题,也许是因为我不够见多识广)

测试

此步参考qilixuening

Win+R运行cmd,cd到 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\demo_suite(默认安装路径)然后执行bandwidthTest.exe和deviceQuery.exe

两个程序的执行结果都出现"Result=PASS"即可。

安装tensorflow-gpu

可以选择用Anaconda安装

也可以选择pip安装

pip3 install tensorflow-gpu

pip安装可以将pip源换位国内源以获得更好的体验
具体参考

PIP换源

背景

PYPI的服务器在国外,如果没有梯子,下载速度会很佛系,而且极不稳定,随时可能断开,然后要重新下载,像pip安装tensorflow这种大轮子,没有梯子又不换国内源会很难受。

国内可用源:
清华大学:https://pypi.tuna.tsinghua.edu.cn/simple
豆瓣:http://pypi.douban.com/simple/
阿里:http://mirrors.aliyun.com/pypi/simple/
华中理工大学:http://pypi.hustunique.com/simple/
山东理工大学:http://pypi.sdutlinux.org/simple/
中国科学技术大学:http://pypi.mirrors.ustc.edu.cn/simple/

Linux

#创建文件夹
mkdir ~/.php
nano ~/.pip/pip.conf
#加入这些内容
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple #换为选用的源

Windows

直接在C:/Users/[用户名]目录中创建一个pip目录,新建一个txt文件名改为pip.ini,加入和Linux一样的内容。

临时换源

只需要加上-i参数

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple tensorflow-gpu

但是某些源需要设置为信任域,pip会有相应提示。

用树莓派实现远程开机及共享网络

背景

疫情期间无法办理退宿,所以还得交电费和住宿费。既然如此,那就把台式电脑放在宿舍吧,毕竟训练模型时,长时间高负载的980ti功率200瓦(穷酸蛤蟆)。

电脑一直待机也不环保,有什么办法可以远程开关机呢?

答案是:WOL--Wake On Lan(网络唤醒)。

方案1:向日葵开机棒

描述:向日葵开机棒:购买向日葵开机棒,连接网络,绑定主机,开机棒会连接向日葵服务器,用户通过客户端给向日葵服务器发送开机指令,可以打开局域网内多台主机或网络中的一台主机

由于局域网开机不足以满足需求,而且学校网络需要定时认证才能连接外网。所以此方案被不可用。

方案2:人肉开机

描述:每当有开机需求的时候,发微信给舍友让他帮你开机。

可能需要很多奶茶钱,Emmm,还是换一个方案吧。

方案3:自制开机棒

描述:正好有个闲置的树莓派3,自己造轮子吧。

材料

  • 公网IP或有公网IP的云服务器(对了,DDNS-动态域名解析对我来说不可行,当然如果可以的话,DDNS还是便宜好使的呢)
  • 树莓派或任何低功耗Linux主机(长时间开机)

WOL

首先,主板要支持WOL。现在的新主板一般都支持,开启WOL的方法不同品牌有些许不同,但是一般默认开启,否则进入BIOS开启吧。具体方法可以上网查该品牌的主板的开启方法。

网卡驱动

网卡驱动也要设置。

打开设备管理器-双击有线网卡设备-高级-WOL相关设置调成enable


如果发现没有相关设置,但确定网卡支持WOL,记得更新下驱动!
我在这里折腾了很久,结果把网卡驱动升级到最新就解决了。
原本我天真的以为windows update更新的驱动是最新的。
要到网卡官网下载最新驱动哦

发送唤醒包

原理参考:https://www.jianshu.com/p/15012027cbbb

需要准备:

  • 接受唤醒包的网卡MAC地址
  • IP地址(子网定向广播地址或有限广播地址(255.255.255.255))
#!/usr/bin/env python3
# coding:utf-8
import socket
import binascii
import re
#填入MAC地址和广播IP地址
def wakeup(mac='B4-2E-99-D5-A3-D4',ip='192.168.1.255'):
    #利用正则判断MAC地址是否合法
    if re.match(r"([0-9a-fA-F]{2}(-|:){0,1}){5}([a-fA-F0-9]{2})",mac) and (len(mac) == 12 or len(mac) == 17):
        #去掉MAC地址里的:和-
        mac = mac.replace('-','').replace(':','').upper()
        #端口号一般为9或7
        IP,port=ip,9
        s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
        s.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)
        #转换编码,唤醒数据包为FFFFFFFFFFFF+MAC地址重复16次
        send_data=binascii.unhexlify('FF' * 6 + mac.upper() * 20)
        s.sendto(send_data,(IP,port))
        s.close()
        print("向"+mac+"发送唤醒包成功!")
    else:
        print("MAC address ERROR")
wakeup()

代码参考:https://www.jianshu.com/p/a80c0d808aed

也可以使用etherwake等软件发送唤醒包。

局域网测试

可以使用这个WOL软件,官网:https://wol.aquilatech.com/

点击封包监控诊断工具监听唤醒包

发送唤醒包后,软件出现监听到的信息即发送接收成功。
最后试一试关机唤醒吧。
(某种情况需要关掉Windows设置-电源管理下的快速启动,否则只能睡眠唤醒)

端口转发

具体参考
设置端口转发后可以从外网登录树莓派,然后运行开机脚本。

网络认证

定时发送认证账号密码以及设备的IP(动态获取)和MAC地址向认证服务器发送认证请求

定时可以通过树莓派自带的crontab
具体设置方法网上很多教程
比较重要的是如果不知道自己设置的时间对不对,可以到这个网站检验。https://tool.lu/crontab

共享网络

具体操作

树莓派通过有线连接共享网络

背景

由于学校网络需要认证,且因为远程控制软件需要在登录账户前连接上互联网,在尝试设置计划任务后发现,计划任务不好使,而且触发条件模糊,触发失败也很难搞。
所以想到了树莓派定时认证网络,即保持网络连接,然后主机通过树莓派连网
网上的教程一般都是树莓派模拟AP,树莓派网线连接外网,然后通过WIFI共享网络。
但是这显然不符合我的需求,WOL唤醒需要物理网线连接。
我们需要WIFI连接外网,网线共享网络,网上资料很少,这里参考了
知乎-Watchtower的文章。

准备

  • 树莓派
  • wifi网络
  • 物理网线
  • 需要有线上网的电脑

打开网卡转发功能

sudo nano /etc/sysctl.conf

#注释去掉
net.ipv4.ip_forward=1

#使配置生效
sudo sysctl -p

设置防火墙

原文说此配置貌似没用,也许是原文作者的派之前设置过
亲测需要设置防火墙,否则不能上网
而且原文的设置方法在重启后会失效,所以这里需要配合iptables-persistent工具持久化iptables规则,参考:https://cloud.tencent.com/developer/article/1374920

以下是防火墙配置,启用NAT,在wlan0接口上启用IP伪装:

sudo iptables -F
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

sudo /etc/init.d/iptables-persistent save
sudo /etc/init.d/iptables-persistent reload

配置静态IP

sudo nano /etc/dhcpcd.conf
#在最后的位置,添加
#指定接口 eth0
interface eth0
#指定静态IP(按照自己喜好),/24表示子网掩码为 255.255.255.0
static ip_address=192.168.1.1/24

连接好主机后,设置主机网络

打开控制面板的网络连接(即网络适配器)

右键有线连接-属性-双击Internet协议版本4
6.1
默认网关填树莓派IP,DNS填一个DNS服务器百度谷歌都可以。
6.2

网上冲浪

一番操作后,应该可以愉快地网上冲浪了。

树莓派远程监控

背景

原本校外住宿的我因为疫情被迫回学校住宿,但是家里的猫没人看管。所以用手头上的树莓派和红外摄像头做了一个监控,远程照看猫猫,以防发生突发情况的时候没人发现。

材料准备

  • 1个红外夜视摄像头
  • 1个树莓派或其他可以接摄像头的Linux计算机
  • 一个具有公网IP的云服务器或个人计算机

局域网监控

原本打算自建一个简单的网页,但是搜索发现有现成软件(何必重复造轮子呢,造得还没别人好?)。

下载安装motion

sudo apt-get install motion -y
sudo nano /etc/motion/motion.conf #修改配置文件

#配置文件中需要修改的地方主要有:
#nano编辑器可以用'^w'查找
#守护进程:deamon off 改成 on
deamon on
#设置分辨率(根据网络带宽调节)
width 640
height 480
#设置帧率(根据网络带宽调节)
framerate 30
#串流端口
stream_port 8081
#串流最大吞吐量
stream_maxrate 100
#关闭仅本地连接限制
stream_localhost off

#为了让motion一直后台运行,打开motion的守护进程:
sudo nano /etc/default/motion
#no修改成yes:
start_motion_daemon=yes

可以多次修改以确定一个合适的值,记住每次修改保存后需要重启motion

测试局域网内可用性

sudo service motion start
sudo motion

浏览器输入 [树莓派IP]:8081
看见网上有人提问访问8081端口无法访问,注意配置文件中stream_live的端口号,并检查防火墙

端口转发

局域网可以访问,如何让外网也可访问呢?
简单的办法是我们可以让拥有公网IP的服务器做端口转发。

具体操作