前言
模型转换后,性能多多少少都有点损失,为了评估肯定需要在海思上跑个数据集,但是海思的图片输入格式是bgr_planner格式,所以需要对图片做个格式转换。对于大神来说,直接全用c/c++完成,但本菜逼只能选择这种two-stage方式了。
代码
废话不多说,代码都是经过试验,确定能跑的通的。为了放心,特意还做了个试验,同一张图片用python转为bgr_planner格式,和用c++转为bgr_planner格式,再先后喂入人脸识别模型,最后的输出特征值差了0.05左右。
import cv2
import os
import numpy as np
import struct
# 图片转为bgr_planner文件并保存
def mat_to_bgr_planner(img_path, bgr_path, new_size, bgr_planner=1):
img = cv2.imread(img_path)
img = cv2.resize(img, new_size)
height = img.shape[0]
width = img.shape[1]
channel = img.shape[2]
with open(bgr_path, "wb") as bgr:
for chn in range(channel):
if bgr_planner: # 输出 bgr_planner
img_split = img[:, :, chn]
else: # 输出 rgb_planner
img_split = img[:, :, 2 - chn]
for row in range(height):
for col in range(width):
element = int(img_split[row, col])
element = struct.pack('B', element)
bgr.write(element)
print("mat_to_bgr_planner done !")
img_path = r"F:\demo\lfw_nnie_test\bgr_test_id10.jpg"
#img_path = r"F:\HiSVP_PC_V1.2.2.2\tools\nnie\windows\RuyiStudio-2.0.41_\workspace\nniefacelib\data\nnie_image\rgb_planar\id10.jpg"
bgr_path = r"F:\demo\lfw_nnie_test\bgr_test_id10.bgr"
new_size = (112, 112)
#mat_to_bgr_planner(img_path, bgr_path, new_size)
# bgr_planner文件转为图片并保存
def bgr_planner_to_mat(bgr_path, img_path, shape, bgr_planner=1):
height, width, channel = shape
img = np.zeros(shape)
with open(bgr_path, "rb") as bgr:
for chn in range(channel):
if bgr_planner: # 输入 bgr_planner
img_split = img[:, :, chn]
else: # 输入 rgb_planner
img_split = img[:, :, 2 - chn]
for row in range(height):
for col in range(width):
element = bgr.read(1)
element = struct.unpack('B', element)
img_split[row, col] = element[0]
cv2.imwrite(img_path, img)
print("bgr_planner_to_mat done !")
bgr_path = r"F:\demo\lfw_nnie_test\bgr_image\Aaron_Eckhart_0001.bgr"
img_path = r"F:\demo\lfw_nnie_test\Aaron_Eckhart_0001.jpg"
shape = (112, 112, 3)
#bgr_planner_to_mat(bgr_path, img_path, shape)