瑞芯微:基于RKNN3568得ufldv2部署


Lane检测是自动驾驶和高级驾驶员辅助系统(ADAS)的基本组成部分,用于区分和定位道路上的车道线。尽管深度学习模型已经取得了巨大成功,但仍有一些重要且具有挑战性的问题需要解决。

第一个问题是效率问题。在实践中,车道线检测算法被大量执行,以利用受约束的车辆计算设备为下游任务提供即时感知结果,这需要快速的检测速度。

传统方法通常使用低级图像处理技术来解决车道检测问题。通过使用低级别的图像处理,传统方法本质上是以自下而上的方式工作的。他们的主要想法是通过HSI颜色模型和边缘提取算法等图像处理来利用视觉线索。Gold是使用立体视觉系统的边缘提取算法检测车道和障碍物的最早尝试之一。

除了使用不同颜色模型的特征和边缘提取方法外,有方法还提出使用投影几何和逆透视映射来利用车道线在现实世界中通常平行的先验信息。尽管许多方法尝试了不同的车道线传统特征,但在复杂的场景中,来自低级图像处理的语义信息仍然相对不足。通过这种方式,跟踪是另一种流行的后处理解决方案以增强鲁棒性。除了跟踪,马尔可夫和条件随机场也被用作后处理方法。此外,还提出了一些采用学习机制的方法(如模板匹配、决策树和支持向量机)。

随着深度学习的发展,一些基于深度神经网络的方法在车道检测方面显示出了优越性。这些方法通常使用指示车道存在和位置的Headtmap来处理车道线检测任务。

在这些早期的尝试之后,主流方法开始将车道检测视为一个分割问题。例如,VPGNet提出了一种由消失点引导的多任务分割网络,用于车道和道路标记检测。为了扩大逐像素分割的感受野并提高性能,SCNN在分割模块中使用了一种特殊的卷积运算。它通过处理切片特征并将其逐个相加来聚合来自不同维度的信息,这类似于递归神经网络。RONELD提出了一种SCNN的增强方法,通过分别寻找和构建直线和曲线主动车道。RESA还提出了一种类似的方法,通过反复的特征转移来扩大感受野。

由于分割方法的计算量很大,一些工作试图探索用于实时应用的轻量级方法。自注意力蒸馏(SAD)采用了一种注意力蒸馏机制,将高层次和低层次的注意力分别作为教师和学生对待。IntRA KD还使用inter-region affifinity蒸馏来提高学生网络的性能。通过注意力提取,浅层网络可以具有与深层网络类似的性能。CurveLane NAS引入了神经结构搜索技术,用于搜索为车道线检测量身定制的分割网络。在LaneAF中,这项工作提出通过在基于分割的affinity fields中进行投票来检测车道线。FOLO-Lane提出对局部模式进行建模,并通过全局几何解码器以自下而上的方式实现全局结构的全局预测。

python


import cv2
import numpy as npfrom rknn.api import RKNN
import osif __name__ == '__main__':platform = 'rk3568'exp = 'fastpose'Width = 640Height = 640MODEL_PATH = 'ufld.onnx'NEED_BUILD_MODEL = True# NEED_BUILD_MODEL = Falseim_file = './bus.jpg'# Create RKNN objectrknn = RKNN()OUT_DIR = "rknn_models"RKNN_MODEL_PATH = './{}/{}_kk.rknn'.format(OUT_DIR,exp+'-'+str(Width)+'-'+str(Height))if NEED_BUILD_MODEL:DATASET = './data.txt'rknn.config(mean_values=[[123, 116, 103]], std_values=[[58, 57, 57]], target_platform="rk3568")# Load modelprint('--> Loading model')ret = rknn.load_onnx(MODEL_PATH)if ret != 0:print('load model failed!')exit(ret)print('done')# Build modelprint('--> Building model')ret = rknn.build(do_quantization=True, dataset=DATASET)if ret != 0:print('build model failed.')exit(ret)print('done')# Export rknn modelif not os.path.exists(OUT_DIR):os.mkdir(OUT_DIR)print('--> Export RKNN model: {}'.format(RKNN_MODEL_PATH))ret = rknn.export_rknn(RKNN_MODEL_PATH)if ret != 0:print('Export rknn model failed.')exit(ret)print('done')else:ret = rknn.load_rknn(RKNN_MODEL_PATH)rknn.release()

main.c

// Copyright (c) 2021 by Rockchip Electronics Co., Ltd. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License./*-------------------------------------------Includes
-------------------------------------------*/
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>#define _BASETSD_H#include "RgaUtils.h"
#include "im2d.h"
#include "opencv2/core/core.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"
#include "rga.h"
#include "rknn_api.h"
#include "detface.h"#define PERF_WITH_POST 1
/*-------------------------------------------Functions
-------------------------------------------*/double __get_us(struct timeval t) { return (t.tv_sec * 1000000 + t.tv_usec); }// ================= 程序入口===============//
int main(int argc, char** argv)
{struct timeval start_time, stop_time;char*          model_name = NULL;model_name       = (char*)argv[1];char* image_name = argv[2];printf("Read %s ...\n", image_name);cv::Mat orig_img = cv::imread(image_name, 1);if (!orig_img.data) {printf("cv::imread %s fail!\n", image_name);return -1;}cv::Mat img;cv::cvtColor(orig_img, img, cv::COLOR_BGR2RGB);int img_width  = img.cols;int img_height = img.rows;std::string nameModel = "tusimple";detface facedet;facedet.detfaceinit(model_name,nameModel); // 初始化gettimeofday(&start_time, NULL); // 计算时间int test_count = 1;for(int  i =0;i<test_count;i++){detectufld1 detect_result_group;facedet.detfaceinference(img,detect_result_group,0.25,0.45);for (auto& line : detect_result_group.line_list){for (auto& p : line){cv::circle(orig_img, p, 3, cv::Scalar(0, 255, 0), -1);}}}gettimeofday(&stop_time, NULL);printf("loop count = %d , average run  %f ms\n", test_count,(__get_us(stop_time) - __get_us(start_time)) / 1000.0 / test_count);imwrite("./out.jpg", orig_img);facedet.detinit();// 释放
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/15059.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从JDK源码级别剖析JVM类加载机制

1 什么是Java虚拟机 一个可执行java字节码的虚拟机进程&#xff1b;跨平台的是java程序&#xff0c;而不是java虚拟机&#xff0c;java虚拟机在各个操作系统是不兼容的&#xff0c;例如windows、linux、mac都需要安装各自版本的虚拟机&#xff0c;java虚拟机通过jdk实现功能。…

docker-compose实现微服务jar+mysql的容器服务发布(经典版)

一 安装mysql服务 1.1 拉取镜像 1.拉取&#xff1a; docker pull mysql:5.7.29 2.查看镜像&#xff1a; docker images 1.2 在宿主机创建文件存储mysql 1.创建映射目录&#xff1a;mysql-c5 在/root/export/dockertest 目录下&#xff0c;mkdir -p mysql-c5 &#…

Elasticsearch介绍和安装

ELK简介 Elastic Stack核心产品包括Elasticsearch、Logstash、Kibana&#xff08;也称为ELK&#xff09;和Beats等等。能够安全可靠地获取任何来源、任何格式的数据&#xff0c;然后实时地对数据进行搜索、分析和可视化 Kibana是一个免费且开放的用户界面&#xff0c;能…

LVS +Keepalived高可用群集

文章目录 一、Keepalived概述二、Keepalived服务重要功能1.管理 LVS 负载均衡软件2.支持故障自动切换&#xff08;Failover&#xff09;3.实现 LVS 集群中节点的健康检查&#xff08;Health Checking&#xff09;4.VRRP通信原理 三、keepalived体系主要模块及作用四、keepalive…

LogicFlow 在HTML中的引入与使用

LogicFlow 在HTML中的引入与使用 LogicFlow的引入与使用&#xff0c;相较于BPMNJS相对容易一些&#xff0c;更加灵活一些&#xff0c;但是扩展代码可能写得更多一些。 示例展示 示例代码 github: https://github.com/iotzzh/origin-examples/blob/main/%E6%B5%81%E7%A8%8B%E5%9…

ADB 命令结合 monkey 的简单使用,超详细

一&#xff1a;ADB简介 1&#xff0c;什么是adb&#xff1a; ADB 全称为 Android Debug Bridge&#xff0c;起到调试桥的作用&#xff0c;是一个客户端-服务器端程序。其中客户端是用来操作的电脑&#xff0c;服务端是 Android 设备。ADB 也是 Android SDK 中的一个工具&#…

C++中的继承/虚继承原理

C中的继承 文章目录 C中的继承1.继承的概念和定义1.1 继承定义1.12 继承关系和访问限定符2.基类和派生类对象的复制转换3.继承中的作用域4.派生类的默认成员函数继承与友元 6.**继承与静态成员****复杂的菱形继承及菱形虚拟继承**7.虚继承解决数据冗余和二义性的原理 1.继承的概…

亚马逊云科技Zero ETL数据库,助力企业走向数据驱动的业务增长之路

据Forrester研究&#xff0c;相对于数据应用不够成熟的公司&#xff0c;那些有效获取业务洞察的公司&#xff0c;有高达8.5倍的可能性实现至少20%的收入增长。然而&#xff0c;要实现这一增长&#xff0c;需要简化一项流程——在数据分析前管理和准备好数据。这就是为什么亚马逊…

Java动态规划LeetCode1137. 第 N 个泰波那契数

方法1&#xff1a;通过动态规划解题&#xff0c;这道题也是动态规划的一道很好的入门题&#xff0c;因为比较简单和容易理解。 代码如下&#xff1a; public int tribonacci(int n) {//处理特殊情况if(n0){return 0;}if(n1||n2){return 1;}//定义数组int[]dpnew int[n1];//初…

随机数检测(三)

随机数检测&#xff08;三&#xff09;- 块内最大游程检测、二元推导检测、自相关检测、矩阵秩检测 3.8 块内最大游程检测方法3.9 二元推导检测方法3.10 自相关检测3.11 矩阵秩检测 如果商用密码产品认证中遇到问题&#xff0c;欢迎加微信symmrz或13720098215沟通。 3.8 块内最…

uniapp - [全端兼容] 多选弹框选择器,弹框形式的列表多选选择器组件插件(底部弹框式列表多选功能,支持数据回显、动态数据、主题色等配置)

前言 网上的教程都太乱了,各种不兼容且 BUG 太多,注释也没有很难进行改造。 本文 实现了 uniapp 全端兼容的弹框多选选择器,从底部弹出列表项进行多选(可回显已选中和各种主题色、样式配置), 您可以直接复制代码,稍微改改样式就能用了。 如下图所示,数据列表(支持接口…

23 | MySQL是怎么保证数据不丢的?

以下内容出自《MySQL 实战 45 讲》 23 | MySQL是怎么保证数据不丢的&#xff1f; binlog 的写入机制 1、事务执行过程中&#xff0c;先把日志写到 binlog cache&#xff0c;事务提交的时候&#xff0c;再把 binlog cache 写到 binlog 文件中。 2、一个事务的 binlog 是不能被…