目录
一、引言
二、准备工作
三、数据集准备
四、安装 OpenVINO toolkit
五、编译和测试
六、配置摄像头(可选)
七、总结
一、引言
树莓派作为一款小巧而强大的单板计算机,在人工智能领域有着广泛的应用。本文将详细介绍如何在树莓派上部署人工智能模型,让你的树莓派发挥更大的作用。
一、引言
树莓派以其小巧、灵活、开源的特性,成为了人工智能领域的一股不可忽视的力量。随着人工智能技术的飞速发展,树莓派在图像识别、语音识别、自然语言处理等方面展现出了巨大的潜力。通过搭载适当的软件和硬件,树莓派可以轻松地实现各种人工智能功能,为个人项目和商业应用提供了低成本、高效率的解决方案。
在当今的科技时代,人工智能已经渗透到我们生活的方方面面。从智能家居到自动驾驶汽车,从医疗诊断到金融服务,人工智能正以前所未有的速度改变着世界。而树莓派作为一款微型电脑主板,为人工智能的应用提供了一个便捷的平台。它不仅具有强大的计算能力,还可以通过连接各种传感器和外设,实现丰富的功能。无论是学术研究还是商业应用,树莓派都为我们提供了一个全新的视角和工具来探索和创新。
二、准备工作
- 硬件准备
-
- 树莓派主板:树莓派主板是部署人工智能模型的核心硬件。不同型号的树莓派可能在性能和功能上有所差异,但都可以作为人工智能应用的基础平台。
-
- 英特尔神经计算棒二代(可选):英特尔神经计算棒二代可以为树莓派提供更强大的计算能力,尤其在处理深度学习任务时表现出色。它可以加速模型的推理过程,提高人工智能应用的性能。例如,在图像识别和语音处理等任务中,神经计算棒二代可以显著减少处理时间,提高实时性。
-
- 摄像头(可选):摄像头可以为树莓派的人工智能应用提供图像输入。例如,在物体识别、人脸识别等应用中,摄像头可以捕捉图像,然后通过人工智能模型进行分析和处理。摄像头的分辨率和帧率等参数会影响图像质量和处理速度,因此需要根据具体应用需求进行选择。
- 软件准备
-
- 安装 Raspbian 系统:Raspbian 是树莓派官方推荐的操作系统,它具有丰富的软件资源和良好的兼容性。安装 Raspbian 系统可以为后续的软件安装和配置提供一个稳定的基础。可以通过下载 Raspbian 系统镜像,然后使用烧录工具将镜像写入 SD 卡,再将 SD 卡插入树莓派启动即可完成安装。
-
- 更新软件源:更新软件源可以确保树莓派能够获取到最新的软件包和安全更新。可以通过修改 /etc/apt/sources.list 文件,将软件源替换为国内的镜像源,如阿里云、中科大等,以提高下载速度和稳定性。例如,可以使用以下命令更新软件源:
sudo nano /etc/apt/sources.list
deb http://mirrors.aliyun.com/raspbian/raspbian/ buster main contrib non-free rpi
保存并退出后,执行 sudo apt-get update 和 sudo apt-get upgrade 命令更新软件源列表和本地安装的软件包。
- 安装必要的软件包,如 cmake、opencv 等:
-
- cmake 是一个跨平台的构建工具,在安装 OpenCV 等软件时需要用到。可以使用以下命令安装 cmake:
sudo apt-get install build-essential cmake pkg-config
- opencv 是一个广泛使用的计算机视觉库,可以为树莓派的人工智能应用提供图像和视频处理功能。安装 opencv 可以参考以下步骤:
-
- 清理不必要文件和程序,以获得更大的磁盘空间:
sudo apt-get purge wolfram-engines
sudo apt-get purge libreoffice*
sudo apt-get clean
sudo apt-get autoremove
- 安装依赖:
sudo apt-get update && sudo apt-get upgrade
sudo apt-get install build-essential cmake pkg-config
sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt-get install libgtk2.0-dev libgtk-3-dev
sudo apt-get install python2.7-dev python3-dev
- 下载 / 拷贝 OpenCV 源码:可以从 GitHub 上下载 OpenCV 源码,也可以将提前下载好的 OpenCV 文件拷贝到树莓派的 /home/pi 文件夹里,并用 unzip 命令解压。例如:
cd ~
wget -O opencv.zip https://github.com/Itseez/opencv/archive/4.3.0.zip
unzip opencv.zip
wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/4.3.0.zip
unzip opencv_contrib.zip
- 配置 Python:安装 Python 的包管理器 pip,并安装 NumPy 库。例如:
wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py
sudo python3 get-pip.py
pip install numpy -i https://pypi.douban.com/simple
- 编译和安装 OpenCV:创建 build 文件夹,然后使用 cmake-gui 进行配置,最后进行编译和安装。例如:
cd ~/opencv-3.3.0/
mkdir build
cd build
cmake-gui
在 cmake-gui 中,设置源代码目录为 opencv-4.3.0 目录位置,设置二进制文件生成目录为 build 位置。配置完成后,点击 Generate 按钮生成 Makefile 文件,然后使用以下命令进行编译和安装:
make -j4
sudo make install
三、数据集准备
- 使用 labelimg 标注工具进行数据标注,生成 XML 文件。
树莓派是一种基于 Linux 系统的微型计算机,可以运行各种应用程序和工具。labelimg 是一种用于标注图像数据集的开源软件,可以帮助我们更快、更准确地构建图像识别模型。要在树莓派上运行 labelimg,需要先安装 Python 和 PyQt5 库。具体步骤如下:在终端中输入以下命令安装 Python3:
sudo apt-get update
sudo apt-get install python3-dev python3-pyqt5 python3-pyqt5.qtsvg
在终端中输入以下命令安装 pip:
sudo apt-get install python3-pip
在终端中输入以下命令安装 labelimg:
sudo pip3 install labelimg
在终端中进入 labelimg 的安装目录,输入以下命令启动 labelimg:
labelimg
此时会弹出一个界面,在界面中选择要标注的图像,就可以开始使用 labelimg 进行标注了。标注完成后,会生成 XML 文件。
2. 整理数据集,创建 Annotations、ImageSets、JPEGImages 三个文件夹,并在 ImageSets 下创建 Main 文件夹,建立 labellist.txt 文件。
整理成 VOC 格式的数据集:创建三个文件夹:Annotations、ImageSets、JPEGImages。将标注生成的 XML 文件存入 Annotations,图片存入 JPEGImages,训练集、测试集、验证集的划分情况存入 ImageSets。在 ImageSets 下创建一个 Main 文件夹,并且在 Main 文件夹下建立 labellist.txt,里面存入标注的标签。此 labellist.txt 文件复制一份与 Annotations、ImageSets、JPEGImages 同级位置放置。
3. 运行代码生成 trainval.txt、train.txt、val.txt、test.txt 文件,将图像按照训练集、验证集、测试集进行划分。
运行该代码将会生成 trainval.txt、train.txt、val.txt、test.txt,将我们标注的图像按照训练集、验证集、测试集的形式做一个划分。以下是代码示例:
import osimport randomtrainval_percent = 0.95 # 训练集验证集总占比train_percent = 0.9 # 训练集在 trainval_percent 里的 train 占比xmlfilepath = 'Annotations'txtsavepath = 'ImageSets/Main'total_xml = os.listdir(xmlfilepath)num = len(total_xml)list = range(num)tv = int(num * trainval_percent)tr = int(tv * train_percent)trainval = random.sample(list, tv)train = random.sample(trainval, tr)ftrainval = open('ImageSets/Main/trainval.txt', 'w')ftest = open('ImageSets/Main/test.txt', 'w')ftrain = open('ImageSets/Main/train.txt', 'w')fval = open('ImageSets/Main/val.txt', 'w')for i in list:name = total_xml[i][: -4]+ '\n'if i in trainval:ftrainval.write(name)if i in train:ftrain.write(name)else:fval.write(name)else:ftest.write(name)ftrainval.close()ftrain.close()fval.close()ftest.close()
以下代码可根据在 Main 文件夹中划分好的数据集进行位置索引,生成含有图像及对应的 XML 文件的地址信息的文件。
import osimport reimport randomdevkit_dir = './'output_dir = './'def get_dir(devkit_dir, type):return os.path.join(devkit_dir, type)def walk_dir(devkit_dir):filelist_dir = get_dir(devkit_dir, 'ImageSets/Main')annotation_dir = get_dir(devkit_dir, 'Annotations')img_dir = get_dir(devkit_dir, 'JPEGImages')trainval_list = []train_list = []val_list = []test_list = []added = set()for _, _, files in os.walk(filelist_dir):for fname in files:print(fname)img_ann_list = []if re.match('trainval.txt', fname):img_ann_list = trainval_listelif re.match('train.txt', fname):img_ann_list = train_listelif re.match('val.txt', fname):img_ann_list = val_listelif re.match('test.txt', fname):img_ann_list = test_listelse:continuefpath = os.path.join(filelist_dir, fname)for line in open(fpath):name_prefix = line.strip().split()[0]print(name_prefix)added.add(name_prefix)# ann_path = os.path.join(annotation_dir, name_prefix + '.xml')ann_path = annotation_dir + '/' + name_prefix + '.xml'print(ann_path)# img_path = os.path.join(img_dir, name_prefix + '.jpg')img_path = img_dir + '/' + name_prefix + '.jpg'assert os.path.isfile(ann_path), 'file %s not found.' % ann_pathassert os.path.isfile(img_path), 'file %s not found.' % img_pathimg_ann_list.append((img_path, ann_path))print(img_ann_list)return trainval_list, train_list, val_list, test_listdef prepare_filelist(devkit_dir, output_dir):trainval_list = []train_list = []val_list = []test_list = []trainval, train, val, test = walk_dir(devkit_dir)trainval_list.extend(trainval)train_list.extend(train)val_list.extend(val)test_list.extend(test)# print(trainval)with open(os.path.join(output_dir, 'trainval.txt'), 'w') as ftrainval:for item in trainval_list:ftrainval.write(item[0] + ' ' + item[1] + '\n')with open(os.path.join(output_dir, 'train.txt'), 'w') as ftrain:for item in train_list:ftrain.write(item[0] + ' ' + item[1] + '\n')with open(os.path.join(output_dir, 'val.txt'), 'w') as fval:for item in val_list:fval.write(item[0] + ' ' + item[1] + '\n')with open(os.path.join(output_dir, 'test.txt'), 'w') as ftest:for item in test_list:ftest.write(item[0] + ' ' + item[1] + '\n')if __name__ == '__main__':prepare_filelist(devkit_dir, output_dir)
- 将整个数据集拷贝至./PaddleDetection/dataset/voc 下,并修改相关文件。
最终创建完成的 VOC 数据集如下:将整个文件拷贝至./PaddleDetection/dataset/voc 下。以上全部完成后,还需要修改两个地方,ssdmobilenetv1_voc 源码中是以 20 类目标为准设计的,本项目的目标仅为两类。
- 找到./PaddleDetection/configs/ssd/ssdmobilenetv1voc.yml 文件,修改第 12 行的 numclasses,3 代表 2 个标签加一个背景 num_classes: 3。
- 找到./PaddleDetection/ppdet/data/source/voc.py 文件,修改 167 行的 pascalvoclabel () 函数,按照前面设定的 labellist.txt 文件里的标签顺序依次修改,并将多余的内容删掉。
def pascalvoc_label(with_background=True):
labels_map = {'PepsiCola':1,'CocaCola': 2}
if not with_background:
labels_map = {k: v - 1 for k, v in labels_map.items()}
return labels_map
至此,整个数据集制作及配置完成。
四、安装 OpenVINO toolkit
- 安装 cmake,以便进行语言编译。
树莓派安装 CMake 的步骤如下:首先卸载之前安装的 CMake(如果没安装过可以忽略此步骤),使用命令sudo apt-get autoremove cmake。然后去 CMake 官网找到所需版本,此处选择版本 v3.13。检查系统版本,使用命令getconf LONG_BIT,树莓派安装的是 32 位的系统所以安装cmake-3.13.0.tar.gz。接着下载源码,使用命令wget http://www.cmake.org/files/v3.13/cmake-3.13.0.tar.gz,解压源码,使用命令tar zxvf cmake-3.13.0.tar.gz。进入解压的文件开始安装,命令为cd cmake-3.13.0,./configure,make,sudo make install。安装结束后,确认是否安装成功,使用命令cmake --version。如果想知道安装路径,输入which cmake即可。
- 下载 OpenVINO toolkit for Raspbian 安装包,并进行解压和重命名。
参考大佬的文章,在自己踩坑的地方做一下记录。大佬文章的链接:用树莓派 4b 构建深度学习应用(八)Openvino 篇。首先下载安装包,版本选择可参考官方文档:https://docs.openvinotoolkit.org/cn/latest/_docs_install_guides_installing_openvino_raspbian.html。进入下载目录,使用命令cd ~/Downloads/,然后使用sudo wget https://download.01.org/opencv/2020/openvinotoolkit/2020.4/l_openvino_toolkit_runtime_raspbian_p_2020.4.287.tgz下载安装包。接着创建安装文件夹,使用命令sudo mkdir -p /opt/intel/openvino,解压缩文件,使用命令sudo tar -xf l_openvino_toolkit_runtime_raspbian_p_2020.4.287.tgz --strip 1 -C /opt/intel/openvino。
- 设置环境变量,将 OpenVINO toolkit 添加到系统路径中。
设置环境变量,才能编译和运行 OpenVINO 工具包应用程序。运行以下脚本临时设置环境变量:source /opt/intel/openvino/bin/setupvars.sh。要永久设置环境变量,可以使用命令echo "source /opt/intel/openvino/bin/setupvars.sh" >> ~/.bashrc。这样每次打开新的终端,将会出现:[setupvars.sh] OpenVINO environment initialized。
- 为英特尔神经棒二代配置 USB 规则。
将当前的 Linux 用户添加到 users 群组,使用命令sudo usermod -a -G users "$(whoami)"。安装 USB 规则,使用命令sh /opt/intel/openvino/install_dependencies/install_NCS_udev_rules.sh。这样就为英特尔神经棒二代配置好了 USB 规则。
五、编译和测试
- 在树莓派上编译 OpenVINO toolkit 的示例程序。
-
- 首先,导航到一个具有写访问权的目录,并创建一个示例构建目录。例如,可以使用以下命令:mkdir build && cd build。
-
- 然后,使用 CMake 编译 OpenVINO toolkit 的示例程序。执行以下命令:cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-march=armv7-a" /opt/intel/openvino/deployment_tools/inference_engine/samples/cpp。
-
- 最后,使用 make 命令进行编译。例如:make -j2 object_detection_sample_ssd。
- 下载神经棒模型的模型文件和权重文件。
-
- 可以使用以下命令下载神经棒模型的模型文件和权重文件:wget --no-check-certificate https://download.01.org/opencv/2020/openvinotoolkit/2020.4/open_model_zoo/face-detection-adas-0001/FP16/face-detection-adas-0001.bin和wget --no-check-certificate https://download.01.org/opencv/2020/openvinotoolkit/2020.4/open_model_zoo/face-detection-adas-0001/FP16/face-detection-adas-0001.xml。
- 进行人脸检测测试,验证模型的有效性。
-
- 找到一张人脸图片,使用以下命令进行人脸检测测试:./armv7l/Release/object_detection_sample_ssd -m face-detection-adas-0001.xml -d MYRIAD -i <path_to_image>,其中<path_to_image>替换为你的人脸图片的绝对路径。
-
- 如果应用程序输出一个图像,其中检测到的人脸用矩形包围,则说明模型有效。
六、配置摄像头(可选)
- 安装 python-opencv 和 fswebcam。
-
- 在树莓派上安装 OpenCV 和 fswebcam 可以为摄像头的使用提供必要的软件支持。首先,确保树莓派的系统已经更新,可以使用以下命令进行更新:sudo apt-get update和sudo apt-get upgrade。
-
- 安装 python-opencv,可以参考以下步骤:
-
-
- 卸载之前安装的可能冲突的软件:sudo apt remove python3-numpy python-numpy –y。
-
-
-
- 安装依赖文件:sudo apt-get install libhdf5-dev libatlas-base-dev libjasper-dev libqt4-test libqtgui4 vim -y。
-
-
-
- 使用pip3安装opencv-contrib-python:pip3 install opencv-contrib-python -i http://pypi.douban.com/simple/。
-
-
- 安装 fswebcam:sudo apt install fswebcam。添加用户权限:sudo usermod -a -G video(例如添加pi用户权限到群组中:sudo usermod -a -G video pi)。检测用户是否已正确添加到群组中命令:groups。
- 在 /etc/modules 文件末尾添加 bcm2835-v4l2,重启树莓派。
-
- 打开配置文件,进行修改,命令如下:sudo nano /etc/modules。
-
- 在打开文件中,添加一行:bcm2835-v4l2。
-
- 退出nano,快捷键Ctrl+X,然后输入Y。
-
- 重新启动树莓派系统。
- 验证摄像头连接是否成功,调用摄像头拍摄照片。
-
- 可以使用以下命令查看 USB 摄像头设备:lsusb可以查看系统识别的所有 USB 设备;ls /dev/video*则可以列出系统识别的所有视频设备。
-
- 对于原装摄像头,可以使用以下命令进行测试:import picamera,camera = picamera.PiCamera(),camera.capture('test.jpg'),camera.close()。如果一切正常,将在当前目录下找到拍摄的照片。
-
- 对于 USB 摄像头,可以使用fswebcam进行拍照测试。例如:fswebcam image.jpg拍一张照片,并保存为image.jpg(文件保存的路径默认是用户目录下);fswebcam -r resolution <image_name>可以指定分辨率拍照,如fswebcam -r 1280x720 image2.jpg拍摄一张分辨率 1280x720 的图像文件,并保存为image2.jpg;fswebcam -r resolution --no-banner <image_name>可以去除照片上的时间等信息,如fswebcam -r 1280x720 --no-banner image3.jpg拍摄一张分辨率 1280x720 的图像文件,图片上不显示时间等信息,并保存为image3.jpg。
-
- 还可以使用以下命令进行延时拍照:
-
-
- 新建Webcam文件夹并进入该文件:mkdir Webcam,cd Webcam。
-
-
-
- 新建webcam.sh脚本文件并编辑内容:sudo nano webcam.sh,文件内容如下:
-
#!/bin/bash
DATE=$(date +"%Y-%m-%d_%H%M")
fswebcam -r 1280x720 --no-banner /home/pi/Webcam/$DATE.jpg
- 按住Ctrl+X,输入Y,然后回车。
- 添加可执行权限:sudo chmod +x webcam.sh。
- 运行脚本:./webcam.sh。
- 可以使用Cron(计划任务)实现自动拍照,打开cron表进行编辑,初次使用会提示你选择编辑器,建议使用nano编辑器:crontab -e。将下面的代码添加到编辑的文档里面:* * * * * /home/pi/Webcam/webcam.sh 2>&1。保存文件退出后,终端会输出crontab: installing new crontab。如果相隔一分钟没有生成图片,可以重新启动服务和检查路径是否正确!开启cron服务:sudo service cron start;停止cron服务:sudo service cron stop。若使用cron服务停止命令无法关闭摄像头自动拍摄,建议直接使用crontab -e命令,将之前编辑的内容删除!
- 还可以使用Motion实现网页预览摄像头。安装Motion:sudo apt install motion。修改配置文件motion.conf:sudo nano /etc/motion/motion.conf,添加或者修改下面内容:daemon on,stream_localhost off,picture_output off,movie_output off,stream_maxrate 100,framerate 70,width 640,height 480。说明:
-
- 以上选项在配置文件未搜索到的可以直接添加在文件内,比如stream_maxrate选项需要自己添加,其它选项是有的。
-
- 帧率:可以自行修改(以上参数是我最佳的效果)。
-
- nano编辑器可以使用Ctrl+W快捷键搜索关键词,快速定位需要修改的内容。stream_maxrate:实时流媒体帧率;framerate:帧率;width:图像宽度;height:图像高度。可以调整以上参数!
- 修改/etc/default/motion文件,添加下面代码:motion后台运行start_motion_daemon=yes。
- 启动服务:sudo service motion start;停止服务:sudo service motion stop;重启服务:sudo service motion restart。开启motion:sudo motion。预览画面开启motion后,在同一局域网的浏览器上输入小车 IP:8081 查看摄像头实时画面。示例:192.168.2.93:8081。
- 在视频流中拍照保存本地:要实现这一步首先开启摄像头,然后另开一个终端执行以下命令:wget http://192.168.2.56:8080/?action=snapshot -O /home/pi/mjm_code/pic.jpg(照片会保存到 “/home/pi/mjm_code/pic.jpg”)。检查 /home/pi/mjm_code/ 路径,发现了pic.jpg,说明在视频流中拍照保存本地成功!
- 编写mjpg-streamer的开机自启脚本:在家目录下创建以下内容的脚本文件:touch mjpg.sh,内容为:cd /home/pi/mjpg-streamer/mjpg-streamer-experimental/./start.sh。这个脚本的本质就是先cd到mjpg-streamer的相应文件夹,然后启动刚刚的start.sh脚本;也就是是说这是一个运行脚本的脚本。赋予脚本运行权限:chmod +x mjpg.sh。配置开机自启:cd /etc/xdg/autostart/,sudo vi mjpg.desktop(创建一个 “mjpg.desktop”,一定要加sudo!),内容如下:
[Desktop Entry]
Name=mjpg
Exec=/home/pi/mjpg.sh
Type=Application
NoDisplay=true
保存退出后,reboot重启香橙派,然后再进入 192.168.2.56:8080 查看:此时,并没有输入任何指令,但是可以直接看到视频流,说明mjpg-streamer已经在后台自动启动!设置成功!start.sh:在当前路径下开启mjpg-streamer服务的脚本;mjpg.sh:在其他路径,运行start.sh脚本的脚本;mjpg.desktop:将mjpg设置为开机自启动的程序。
七、总结
通过以上步骤,我们成功地在树莓派上部署了人工智能模型。树莓派凭借其小巧的体积和强大的性能,为人工智能应用的开发提供了一个便捷的平台。
在整个过程中,我们从硬件和软件准备开始,逐步进行数据集准备、安装 OpenVINO toolkit、编译和测试,以及可选的配置摄像头步骤。通过这些步骤,我们可以根据实际需求,为树莓派赋予各种人工智能功能。
树莓派的强大性能和灵活性为人工智能应用的开发提供了更多的可能性。无论是在图像识别、语音处理、自然语言理解等领域,还是在机器人技术、边缘计算、物联网等应用场景中,树莓派都能发挥重要作用。
未来,随着技术的不断进步,我们可以期待树莓派在人工智能领域的应用会更加广泛和深入。更高的计算性能、更丰富的 AI 算法和更紧密的物联网集成,将为树莓派带来更多的发展机遇。
总之,树莓派在人工智能领域的应用前景广阔,让我们一起探索更多的可能性,为推动人工智能技术的发展贡献力量。