基于K210的口罩检测与人脸识别——手把手教学
笔者最近期末综合设计,设计一个
基于深度学习与FreeRTOS的多功能视觉防疫终端,本人负责人脸识别和口罩检测模块,采用k210完成该模块。

本次设计采用基于k210设计的maixbit开发板载UART / I2C接口,连接到esp32主流控制器,实现硬件无缝对接。同时,该单片机将Micropython移植到K210,带64 位双核带硬件 FPU、卷积加速器、FFT、Sha256 的 RISC-V CPU,基于该单片机的硬件基础,可以使用部署在K210上的YOLOv2模型,完成人脸识别和口罩识别部分。
KPU 是 K210 内部一个神经网络处理器,简单来说就是 KPU 能加载和运行各种现成的 AI 算法模型,实现各种机器视觉等功能。 MaixPy 中人脸识别本质是目标检测,主要通过在K210的KPU上跑 YOLO(You Only Look Once)目标检测算法来实现。
我们通过烧录训练好的模型和固件、在SD卡中存放已有模型,调用K210的KPU,实现口罩检测。基于这个思路,使用部署在K210上的YOLO模型完成口罩检测任务。
笔者采用自训练的方法获得,官方提供了现成的口罩检测和人脸检测模型,附上链接以供大家获取;值得注意的是,每个k210的机器码不同,需要烧录以下固件,并在串口助手连接的情况下,按下boot,显示你的机器码

固件下载库:固件下载
得到机器码后,进入maixhub官网


最后得到:

但这个代码只针对人脸检测,但我们目标还需要口罩检测,所以代码只能用于参考。
注意:我们可以通过把三个固件和一个bin(理解为:承载各个模型头文件的包)通过kflash烧录到k210中,也可以放在sd卡中,但在boot.py中要调用一下代码:
task_fd = kpu.load(0x200000) # 从flash 0x200000 加载人脸检测模型
task_ld = kpu.load(0x300000) # 从flash 0x300000 加载人脸五点关键点检测模型
task_fe = kpu.load(0x400000) # 从flash 0x400000 加载人脸196维特征值模型
`也可通过sipeed官网提供的固件(但会不会出bug我不了解):
sipeed提供的人脸检测模型下载(需要自己的机器码,通过烧录key_gen1.2.bin在串口获取)

下载模型后得到: .py 示例脚本,.smodel 模型文件

将模型下载到 flash 的 0x300000 位置(与示例脚本中模型加载位置对应)

到下载站下载 kmodelv4 支持固件, 并用 kflash 烧录

这里我将support.bin(v0.6.2_32)(默认地址)和口罩模型.smodel(起始地址改为:0x300000)打包成kfpkg,值得一提的是,人脸检测也是使用这个版本的固件

笔者采用以下方法
人脸检测模型放在sd卡,采用代码读取法
口罩检测模型烧录进sd卡,采用代码读取法
也可以调用地址法
task_fe = kpu.load("/sd/FE1.smodel") # 加载人脸196维特征值模型
task = kpu.load("/sd/mask.smodel") # 加载人脸196维特征值模型
//也可地址烧录法,通过kflash烧录,task = kpu.load(0x300000) #加载口罩检测模型
模型(人脸需要自己拿自己的机器码去下载)和代码
FreeRTOS实时人机交互部分采用ESP32完成,有问题请联系@体弱多病bamboo君
不多说上成果
基于深度学习与FreeRTOS的多功能视觉防疫终端
部分源码:
#==================加载模型分别是196特征值和mask(口罩和人脸)==================**
anchor = (0.1606, 0.3562, 0.4712, 0.9568, 0.9877, 1.9108, 1.8761, 3.5310, 3.4423, 5.6823) # anchor for face detect
dst_point = [(44, 59), (84, 59), (64, 82), (47, 105),
(81, 105)] # standard face key point position
a = kpu.init_yolo2(task, 0.5, 0.3, 5, anchor)
b = kpu.init_yolo2(task_fe, 0.5, 0.3, 5, anchor)
#==================窗口大小==================**
img_lcd = image.Image()
img_face = image.Image(size=(128, 128))
a = img_face.pix_to_ai()
#==================人脸相似度==================**
ACCURACY = 71
while (1):
img = sensor.snapshot()
clock.tick()
code = kpu.run_yolo2(task, img)
if code:
totalRes = len(code)
for item in code:
##==================图片转换==================**
a = img.draw_rectangle(item.rect())
face_cut = img.cut(item.x(), item.y(), item.w(), item.h())
face_cut_128 = face_cut.resize(128, 128)
a = face_cut_128.pix_to_ai()
#==================口罩==================**
confidence = float(item.value())
itemROL = item.rect()
classID = int(item.classid())
if confidence < 0.52:
_ = img.draw_rectangle(itemROL, color=color_B, tickness=5)
print("Please enter the detection range!")
continue
if classID == 1 and confidence > 0.65:
_ = img.draw_rectangle(itemROL, color=color_G, tickness=5)
if totalRes == 1:
drawConfidenceText(img, (0, 0), 1, confidence)
else:
_ = img.draw_rectangle(itemROL, color=color_R, tickness=5)
if totalRes == 1:
drawConfidenceText(img, (0, 0), 0, confidence)
#==================人脸==================**
fmap = kpu.forward(task_fe, face_cut_128)
feature = kpu.face_encode(fmap[:])
reg_flag = False
scores = []
for j in range(len(record_ftrs)):
score = kpu.face_compare(record_ftrs[j], feature)
scores.append(score)
max_score = 0
index = 0
del (face_cut_128)
for k in range(len(scores)):
if max_score < scores[k]:
max_score = scores[k]
index = k
if max_score > ACCURACY:
a = img.draw_string(item.x(), item.y(), ("%s :%2.1f" % (
names[index], max_score)), color=(0, 255, 0), scale=2)
lvbo(3)
sum_face=sum_face+1
if(sum_face-sum_unface>5):
sum_unface=0
if(sum_face>4):
face_yes=1
print("人脸识别成功")
#uart_A.write(names[index]+'\r\n')
FACE.value(1)
print(FACE.value())
sum_face=0
#time.sleep(3)
tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.UNIT_MS, period=3000, callback=None, arg=None)
FACE.value(0)
else:
a = img.draw_string(item.x(), item.y(), ("X :%2.1f" % (
max_score)), color=(255, 0, 0), scale=2)
lvbo(4)
sum_unface=sum_unface+1
#if(face_yes==0):
if(sum_unface-sum_face>5):
sum_unface=0
if(sum_face>4):
print("人脸识别失败")
#uart_A.write(names[index]+'\r\n')
FACE.value(0)
print(FACE.value())
sum_unface=0
#=====================**按键注册==================*
if start_processing:
record_ftrs = []
record_ftr = feature
record_ftrs.append(record_ftr)
save_feature(record_ftr) #存到SD卡
print(feature)
start_processing = False
break
lvbo(0)
fps = clock.fps()
#print("%2.1f fps" % fps)
img.draw_string(0, 200, "%2.1f fps" % fps, scale=2, color=(255, 0, 0))
a = lcd.display(img)
gc.collect()
b= img.draw_rectangle(80,22,159,195)
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。 准备工作: 1、U盘一个(尽量使用8G以上的U盘)。 2、一台正常联网可使用的电脑。 3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。 4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。 U盘启动盘制作步骤: 注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
我想知道我的代码是否在rspec下运行。这可能吗?原因是我正在加载一些错误记录器,这些记录器在测试期间会被故意错误(expect{x}.toraise_error)弄得乱七八糟。我查看了我的ENV变量,没有(明显的)测试环境变量的迹象。 最佳答案 在spec_helper.rb的开头添加:ENV['RACK_ENV']='test'现在您可以在代码中检查RACK_ENV是否经过测试。 关于ruby-检测由RSpec、Ruby运行的代码,我们在StackOverflow上找到一个类似的问题
我正在使用rubydaemongem。想知道如何向停止操作添加一些额外的步骤?希望我能检测到停止被调用,并向其添加一些额外的代码。任何人都知道我如何才能做到这一点? 最佳答案 查看守护程序gem代码,它似乎没有用于此目的的明显扩展点。但是,我想知道(在守护进程中)您是否可以捕获守护进程在发生“停止”时发送的KILL/TERM信号...?trap("TERM")do#executeyourextracodehereend或者你可以安装一个at_exit钩子(Hook):-at_exitdo#executeyourextracodehe
我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源
我正在根据Rakefile中的现有测试文件动态生成测试任务。假设您有各种以模式命名的单元测试文件test_.rb.所以我正在做的是创建一个以“测试”命名空间内的文件名命名的任务。使用下面的代码,我可以用raketest:调用所有测试require'rake/testtask'task:default=>'test:all'namespace:testdodesc"Runalltests"Rake::TestTask.new(:all)do|t|t.test_files=FileList['test_*.rb']endFileList['test_*.rb'].eachdo|task|n
我有一个定义类的Ruby脚本。我希望脚本执行语句BoolParser.generate:file_base=>'bool_parser'仅当脚本作为可执行文件被调用时,而不是当它被irbrequire(或通过-r在命令行上传递)时。我可以用什么来包装上面的语句,以防止它在我的Ruby文件加载时执行? 最佳答案 条件$0==__FILE__...!/usr/bin/ruby1.8classBoolParserdefself.generate(args)p['BoolParser.generate',args]endendif$0==_