此需求来源于我需要在openmv上做物体识别,但是openmv固件里面自带模型只有人脸(限正脸)和眼镜等等几个,如何使得openmv可以识别其他复杂物体?
我搜到了这篇文章(感谢原博主):
OPENMV使用OPENCV的Haar Cascade的xml模型?
在这篇的指引下,我们可以在openmv的github仓库中发现,官方已经提供了将xml文件转换为cascade文件的python代码,在命令行中直接运行即可。
这里说明几个注意点:
文章中博主提到的python2版本才可以转换,目前已经不存在这个问题,本人python3.6,window10下,可以成功转换
转换过程中若有报错,则虽然在同目录下产生了cascade文件,但大概率是不能使用的,如果文件只有1kb,也大概率是不能使用的(说明没有数据嘛)
经过实践,xml文件源代码中,图片是20乘20 是能够成功转换并可用的必要不充分条件。也就是图片一定要20乘20,但20乘20的xml仍然有可能在转换过程中报错而使得模型不可用。
转换成功的cascade文件大小从10+k到100+k都有,这取决于xml的精度
下面附上一段简单的基于自转换文件识别人是否佩戴口罩的代码:(附带了一个串口发送识别物体坐标)
#by z5z5z5z56 2020.10
import sensor, time, image
from pid import PID
from pyb import UART
#串口收发
#usart3 tx p4-----pb11
#usart3 rx p5-----pb10
uart = UART(3, 115200)
uart.init(115200,bits=8,parity=None,stop=1)#8个数据位,一个停止位,无奇偶校验位
# Reset sensor
sensor.reset()
sensor.set_contrast(3)#设置相机图像对比度。-3至+3。
sensor.set_gainceiling(16)#设置相机图像增益上限。2, 4, 8, 16, 32, 64, 128。
# HQVGA and GRAYSCALE are the best for face tracking.
sensor.set_framesize(sensor.HQVGA)
sensor.set_pixformat(sensor.GRAYSCALE)
#注意人脸识别只能用灰度图哦
# Load Haar Cascade加载Haar算子(识别目标的模型)保存到face_cascade
# By default this will use all stages, lower satges is faster but less accurate.
#HaarCascade的第一个参数是模型,这个模型如果是自定义的,则引号内为模型文件的路径;也可以使用内置的haar模型,
#比如“frontalface” 人脸模型或者“eye”人眼模型。
#stages值未传入时使用默认的stages。stages值设置的小一些可以加速匹配,但会降低准确率。
#face_cascade = image.HaarCascade("frontalface", stages=25)#识别正脸
face_cascade = image.HaarCascade("mask.cascade", stages=13)#识别是否戴口罩
print(face_cascade)
# FPS clock
clock = time.clock()
def find_max(blobs):
max_size=0
for blob in blobs:
if blob[2]*blob[3] > max_size:
max_blob=blob
max_size = blob[2]*blob[3]
return max_blob
while (True):
clock.tick()
# Capture snapshot
img = sensor.snapshot()
# 这个方法搜索与Haar Cascade匹配的所有区域的图像,并返回一个关于这些特征的边界框矩形元组(x,y,w,h)的列表。
# 若未发现任何特征,则返回一个空白列表。
#thresholds越大,匹配速度越快,错误率也会上升。scale可以缩放被匹配特征的大小。
objects = img.find_features(face_cascade, threshold=0.75, scale_factor=1.25)
#矩形元组(x,y,w,h)
# Draw objects,在找到的目标上画框,标记出来
for r in objects:
img.draw_rectangle(r)
if objects:
#输出坐标到串口
output_str="[%d,%d]" % (objects[0][0]+objects[0][2]/2,objects[0][1]+objects[0][3]/2) #方式1
#output_str=json.dumps([max_blob.cx(),max_blob.cy()]) #方式2
uart.write(output_str+'\r\n')#传输数据最后加上’\r\n’是回车换行的意思,
print('you send:',output_str)
else:
output_str="%d" % (0)
uart.write(output_str+'\r\n')#传输数据最后加上’\r\n’是回车换行的意思,
print('you send:',output_str)
#print('not found!')
# Print FPS.
# Note: Actual FPS is higher, streaming the FB makes it slower.
#print(clock.fps())
关于转换的python文件,一些xml基础识别模型(人侧脸、半身、全身、微笑等)以及转换教程的一套资料,也可以在这个链接下载