本科阶段最后一次竞赛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 warning

def 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_channel
    uv_channel[:, 1::2] = v_channel
    nv12_image = np.concatenate((y_channel.flatten(), uv_channel.flatten()))
    return nv12_image

def 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_pixely_pixel 就是黑线的x与y坐标

大家可以自行采用各种方式进行运动控制

3.总结

对于一个新模型的使用,无非就是图像输入大小的匹配、图像格式,对于dnn模型,大家注意要nv12格式。下一期为大家带来二维码方面的操作。