本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——8ResNet模型的使用
本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——8ResNet模型的使用
上期我们已经完成了Bin模型的转化,本期是如何使用这个Bin模型
1.加载Bin模型
使用dnn模块加载Bin模型
models = dnn.load('../models/resnet18_224x224_nv12.bin')
2.图像预处理
2.1 首先需要先获取图像
获取图像方式很多可以cv2读取,也可以订阅ros消息
这里我以ros消息进行示例
self.subscription = self.create_subscription(Image,'/image',self.image_callback,10)
self.subscription # prevent unused variable warningdef image_callback(self,msg):# 将ROS的图像消息的字节数据转换为numpy数组np_arr = np.frombuffer(msg.data, dtype=np.uint8)# 使用OpenCV解码图像数据frame = cv2.imdecode(np_arr, cv2.IMREAD_COLOR)#经过上面操作已经可以变成opencv可以使用的类型了,这样就对接其他cv领域的操作
2.2模型输入
def convert_bgr_to_nv12(cv_image):yuv_image = cv2.cvtColor(cv_image, cv2.COLOR_BGR2YUV)y_channel = yuv_image[:, :, 0]u_channel = yuv_image[::2, ::2, 1]v_channel = yuv_image[::2, ::2, 2]uv_channel = np.empty((u_channel.shape[0], u_channel.shape[1] * 2), dtype=u_channel.dtype)uv_channel[:, ::2] = u_channeluv_channel[:, 1::2] = v_channelnv12_image = np.concatenate((y_channel.flatten(), uv_channel.flatten()))return nv12_imagedef process_frame(self,cv_image, models, original_width, original_height):# 将图像缩放到模型期望的尺寸cv_image_resized = cv2.resize(cv_image, (224, 224), interpolation=cv2.INTER_LINEAR)nv12_image = convert_bgr_to_nv12(cv_image_resized)# 使用模型进行推理outputs = models[0].forward(np.frombuffer(nv12_image, dtype=np.uint8))outputs = outputs[0].buffer# 假设模型输出是在224x224图像上的比例坐标x_ratio, y_ratio = outputs[0][0][0][0], outputs[0][1][0][0]# 将比例坐标转换为原始视频帧的像素坐标,注意跟你原始模型训练时候归一化有关#如果按照我的前面教程就是244*244的大小x_pixel = int(x_ratio * original_width)y_pixel = int(y_ratio * original_height)
2.3模型输出使用
经过2.2的使用,x_pixel
与y_pixel
就是黑线的x与y坐标
大家可以自行采用各种方式进行运动控制
3.总结
对于一个新模型的使用,无非就是图像输入大小的匹配、图像格式,对于dnn模型,大家注意要nv12格式。下一期为大家带来二维码方面的操作。