本章为您介绍如何使用角蜂鸟在Python调用底层API实现基于SqueezeNet的图像识别器。
比起检测器,识别器可从图片分析得到较细的分类类别,例如猫、狗的某个品种。
在ImageRecognition目录下执行以下命令来启动 图像识别 范例。
~/SungemSDK/examples/apps/ImageRecognition$ python3 ImageRecognition.py
识别目标图像为青色框中区域(ROI)的图像部分。通过按 ‘w’ 与 ’s’ 可调整 ROI 的大小。
得到 Top5 结果例如: 属于计算机键盘概率98.39%、空格1.40%、打字机键盘0.22%、笔记本0.03%、仓鼠0.00%。
因为调用全部函数为底层API,终端不显示任何提示。
# Load device (载入设备)
devices = hs.EnumerateDevices()
dev = hs.Device(devices[0])
dev.OpenDevice()
# Load CNN model (载入模型)
with open('../../graphs/graph_sz', mode='rb') as f:
b = f.read()
graph = dev.AllocateGraph(b)
dim = (227,227)
# Load classes (载入分类标签)
classes=np.loadtxt('../../misc/image_category.txt',str,delimiter='\t')
# Set camera mode (摄像头模式)
if WEBCAM: video_capture = cv2.VideoCapture(0)
两种模式(WEBCAM):
# 裁切出ROI区域
sz = image_raw.shape
cx = int(sz[0]/2)
cy = int(sz[1]/2)
ROI = int(sz[0]*ROI_ratio)
cropped = image_raw[cx-ROI:cx+ROI,cy-ROI:cy+ROI,:]
# 前处理
cropped = cropped.astype(np.float32)
cropped[:,:,0] = (cropped[:,:,0] - 104)
cropped[:,:,1] = (cropped[:,:,1] - 117)
cropped[:,:,2] = (cropped[:,:,2] - 123)
# 图像数据传入角蜂鸟并排序分类结果
graph.LoadTensor(cv2.resize(cropped,dim).astype(np.float16), 'user object')
output, userobj = graph.GetResult()
output_label = output.argsort()[::-1][:5]
# 输出文字
for i in range(5):
label = re.search("n[0-9]+\s([^,]+)", classes[output_label[i]]).groups(1)[0]
cv2.putText(image_raw, "%s %0.2f %%" % (label, output[output_label[i]]*100), (20, 50+i*30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 255), 2)
# 画框
cv2.rectangle(image_raw, (cy-ROI, cx-ROI), (cy+ROI, cx+ROI),(255,255,0), 5)
# 显示图像
cv2.imshow('Result',image_raw)
# 检测键盘输入
key = cv2.waitKey(1)
if key == ord('w'):
ROI_ratio += 0.1
elif key == ord('s'):
ROI_ratio -= 0.1
if ROI_ratio < 0.1:
ROI_ratio = 0.1
输入result,输出画框之后的图像。之后通过OpenCV函数来显示图像。