基于昇腾310的登录+黑白转彩系统(课程设计)

举报
yd_230390344 发表于 2024/12/26 21:52:31 2024/12/26
【摘要】 实验内容本次实验结合摄像头、按键、OLED屏幕、LED灯、晶体管,制作一款基于Yolov3的登录+黑白转彩系统。首先运行程序,LED灯闪烁五个来回后,OLED屏幕显示“enter”表示人脸拍摄开始,而后摄像头进行拍摄与采集数据,将数据实时送入Yolov3模型中进行人像识别,当识别到人像时,就视为识别成功。然后用户通过板子上的按键,输入密码,假若密码错误,则在OLED屏幕上显示“error!t...

实验内容

本次实验结合摄像头、按键、OLED屏幕、LED灯、晶体管,制作一款基于Yolov3的登录+黑白转彩系统。首先运行程序,LED灯闪烁五个来回后,OLED屏幕显示“enter”表示人脸拍摄开始,而后摄像头进行拍摄与采集数据,将数据实时送入Yolov3模型中进行人像识别,当识别到人像时,就视为识别成功。然后用户通过板子上的按键,输入密码,假若密码错误,则在OLED屏幕上显示“error!try again”,输入正确,则在OLED屏幕上显示“right! welcome”。登录成功后利用colorize模型实现“黑白照片转彩色”的功能,密码登录以及人脸识别、黑白转彩三个程序之间通过信号量机制进行交替的阻塞与运行。

实验思路

基于yolov3的人像检测

我把需要的命令行命令保存到了一个txt文件当中,方便多次使用。

首先需要将caffe框架的模型和权重文件转化为昇腾平台下适配的om模型,其次输入指令开启Web服务器;

利用opencv打开板子所连接的摄像头,并获取摄像头的每一帧图像数据,将图像送入模型进行识别。

在cpp文件和对应的.h文件中修改代码,每次修改完记得在build文件夹下面再一次编译。

基于按键的密码登录

修改task.c文件,重写按键的绑定函数与回调函数。这里选择PRESS_DOWN为检测的状态,同时将CallBack_PRESS_UP作为回调函数,即检测到按下这一状态后,就调用这个函数。在这个函数中,通过创建线程的方式进行运行。按键分别代表“2”和“3”,密码长度为6位,按下6次按键后即对密码进行判断,假若密码错误,则要求用户重新输入,并在OLED上显示“error!try again”,直至用户输入正确的密码为止,显示“right!welcome”。

OLED屏幕

初始化OLED屏幕,并设置OLED屏幕的显示方式(正色显示、反色显示)。使用ShowString函数进行显示,在该函数中需要指定显示字符的x与y坐标信息,以及需要显示的字符信息。

LED灯&晶体管

这个省略不写了,跟基础代码差不多。

基于colorize模型的黑白照片转彩色功能

代码是官方提供的,弄懂每一个函数都在实现什么功能,然后根据需要在对应的地方修改就可以了。

主函数main的大致流程是:检查应用程序执行时的输入,程序执行要求输入图片目录参数,实例化分类推理对象,参数为分类模型路径,模型输入要求的宽和高,初始化分类推理的acl资源,模型和内存,获取图片目录下所有的图片文件名,预处理图片,读取图片,把图片缩放到模型输入要求的尺寸,将预处理的图片送入模型推理,并获取推理结果,解析推理输出,并将推理得到的物体类别标记到图片上。

两个用户间的转换(进程间信号量机制)

由于摄像头模块必须在HwHiAiUser用户下进行运行,而其他模块(如按键模块与Oled模块)需要执行su root切换到root用户下,因此想要一次性执行两个代码,就需要开启两个终端,一个在HwHiAiUser用户下用于执行摄像头模块,一个在root用户下用于执行其他模块,两个进程需要按照特定的顺序执行。这里采用了信号量机制,利用一个tmp文件,作为两个程序之间的通信区域。当摄像头识别到人像后,就往tmp文件中写入“1”,并阻塞自己,让自己一直处于读取文件内容的状态。密码模块会先将自己阻塞,处于一直读取文件内容的状态,当从文件中读取了“1”,则立刻进入运行状态,直至用户完成了所有的操作后,再在tmp文件中写入“0”。同理,后面的黑白转彩模型和密码模块也是类似的操作。

实验主要步骤

前期准备

在HOME/HwHiAiUser路径下,放两个文件夹,一个Ascend310(登录功能),一个colorization(黑白转彩功能)。

首先简单了解文件夹结构,编译语句一般在build或scripts文件夹运行,inc放.h,model放模型,运行一般在out文件夹运行,src放cpp文件。

模型转换与运行

模型库,可以在这个里面寻找想要的模型并下载caffemodel和prototxt文件,不过其中的编译和运行方式与课内板子有所不同,可借鉴的只有模型下载和转换部分。

模型库ModelZoo-TensorFlow/TensorFlow/contrib at master · Ascend/ModelZoo-TensorFlow · GitHub


模型相关的代码不需要自己写,昇腾官方网站有一个sample.zip,里面包含有相应的代码,我们直接把想要的模型的对应代码拿下来就可以了。

将caffemodel和prototxt文件放入model文件夹,利用ATC模型进行模型转换,生成om文件等。接下来的步骤以黑白转彩模型为例。

修改.sh文件

主要是对路径进行修改,然后将需要联网的功能都改成本地跑的(因为我们组联网一直失败)。

设置环境变量

对src文件夹中的CMakeLists的环境变量进行设置,黑白转彩模型主要修改的是DDK_PATH

当然其他路径也要根据你的需求进行相应的修改。

同时需要利用bash修改环境变量 vi ~/.bashrc

export ASCEND_HOME=/data/Ascend/ascend-toolkit
export DDK_PATH=/data/Ascend/ascend-toolkit/latest
添加这两行。

修改代码

另外两个cpp文件实现代码的主要功能,需要根据自己的需求进行相应的更改。

编译运行

bash sample_build.sh  然后会在out中生成一个main文件,每次修改过代码记得都要重新编译,之后在out文件夹运行./main命令。照片就会成功生成在output文件夹当中了。

基础代码编写

修改src和inc中对应的cpp文件和头文件,实现想要的基础功能。

我们小组主要修改了task.cpp、yolov3.cpp、pca9667.cpp、object_detect.cpp以及对应的头文件。

将两者进行串联

利用上文提到的tmp文件进行串联,在VScode中同时开启2-3个终端运行代码。注意要及时结束上一个进程。

实验感想&出现错误与解法

  1. 下载的caffe模型无法使用。与开发板不配套,会出现各种奇怪的问题,建议从官方途径下载。
  2. 有om模型后不能正常运行。不要直接下载om模型,用ATC模型将caffemodel和prototxt文件转换成om。
  3. 模型正确运行之后,却找不到生成的彩色图片

    代码中写到会将生成的彩色图片放到同目录的output文件夹中,这个文件夹需要手动创立,并不会自己自动出现。如果指定路径下面没有这个文件夹,图片不会正确生成。

  4. 模型提示找不到acl.h。一般是环境变量配置有问题,需要检查bash和CMakeLists里面的环境是否都配置正确。
    每次用bash配置完环境变量需要重启终端,不然下一次会提示error然后让之后的配置不能顺利进行。配置完可以使用cat ~/.bashrc或者echo $PATH等命令确定环境配置是否成功。
  5. 提示找不到xx文件。直接拿出colorize文件夹会报错,因为在整个sample文件夹中还有一些colorize文件夹之外的文件会用到,建议直接下载整个sample文件夹并使用,或者把需要的文件单独拿出来。
  6. 编译运行.sh出错,在对其他文件修改后重新编译的时候,最好删除上一次编译运行出现的文件,比如out中的main文件。
  7. 摄像头找不到。拿到板子先检查dev中有没有vedio0;利用简单的拍照程序检验摄像头本身的好坏;两个USB口换着插;上一个摄像头进程没有停止所以被占用了,修改代码让每次运行完结束摄像头的占用;重启开发板;重新inithome;
  8. 找不到divice 0。至今不知道什么原因,通过更换SD卡解决的。
  9. 将caffe框架的模型和权重文件转化为昇腾平台下适配的om模型失败。命令行空格多了或少了;横杠多了或少了;绝对路径错误;文件名称不匹配。
  10. 人脸识别代码明明整齐而却功能失败。修改完没有编译。
  11. Web服务器点击视频之后没有显示。开了英文网站翻译,所以跳转的网址包含了中文,是错误网站。
  12. 进程串连不成功。检查文件路径的正确性,可以通过验证路径是否存在以及是否具有正确的读写权限来实现。修改读写文件的函数,确保它们能够正确处理文件操作,包括异常处理和确保数据的完整性。确保程序的阻塞和运行逻辑正确,以避免死锁和竞态条件,通常涉及到对同步机制(如锁和信号量)的正确使用。确保上一进程正常结束,可以实施适当的进程间通信和状态检查,以确保资源在进程间正确传递,没有被抢占或滥用。确保资源安全,实现资源管理和回收策略,以防止资源泄露和其他安全问题。

附言

  • 感谢Magik用户的“基于昇腾310的智能打卡系统(课程大作业)”一文,为我们实现两个用户的跳转提供了很大的帮助。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。