瑞芯微:基于RKNN3568得ufldv2部署

news2025/1/13 7:29:48


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 np

from rknn.api import RKNN
import os

if __name__ == '__main__':

    platform = 'rk3568'
    exp = 'fastpose'
    Width = 640
    Height = 640
    MODEL_PATH = 'ufld.onnx'
    NEED_BUILD_MODEL = True
    # NEED_BUILD_MODEL = False
    im_file = './bus.jpg'

    # Create RKNN object
    rknn = 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 model
        print('--> Loading model')
        ret = rknn.load_onnx(MODEL_PATH)
        if ret != 0:
            print('load model failed!')
            exit(ret)
        print('done')

        # Build model
        print('--> Building model')
        ret = rknn.build(do_quantization=True, dataset=DATASET)
        if ret != 0:
            print('build model failed.')
            exit(ret)
        print('done')

        # Export rknn model
        if 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.coloradmin.cn/o/722211.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

猜猜看!哪张甜甜圈图是真的?AI数字人商业实践「真经」;LangChain X Prem挑战赛;故事绘本生成与盈利平台 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 猜猜看&#xff01;你觉得&#xff0c;哪张甜甜圈的图片是真的&#xff1f; 这是 Reddit网站 Midjourney 子区发起的一项趣味挑战&…

【计算机视觉】对比学习采样器sampler

前置知识准备 Samplers — Open Metric Learning documentation​​​​​​ 在该文档里&#xff0c;category表示类别&#xff0c;label表示商品&#xff0c;instance表示商品不同角度的图片。 category就是blouses_shirts&#xff1b;label就是15&#xff1b;instance就是这…

【设计模式】第十章:组合模式详解及应用案例

系列文章 【设计模式】七大设计原则 【设计模式】第一章&#xff1a;单例模式 【设计模式】第二章&#xff1a;工厂模式 【设计模式】第三章&#xff1a;建造者模式 【设计模式】第四章&#xff1a;原型模式 【设计模式】第五章&#xff1a;适配器模式 【设计模式】第六章&…

【数据可视化】SVG(一)

一、邂逅SVG和初体验 什么是SVG  SVG全称为&#xff08;Scalable Vector Graphics&#xff09;&#xff0c;即可缩放矢量图形。&#xff08;矢量定义&#xff1a;既有大小又有方向的量。在物理学中称作矢量&#xff0c;如一个带箭头线段&#xff1a;长度表示大小&#xff0…

(位运算) 1356. 根据数字二进制下 1 的数目排序 ——【Leetcode每日一题】

❓ 1356. 根据数字二进制下 1 的数目排序 难度&#xff1a;简单 给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。 如果存在多个数字二进制中 1 的数目相同&#xff0c;则必须将它们按照数值大小升序排列。 请你返回排序后的数组。 示…

python flask sqlite http服务

python flask 服务 为了让拼接项目能够简单实用http服务&#xff0c;用python flask 来做一个http服务&#xff0c;使用python的原因是拼接项目本身很多人工智能的服务是用python来写。数据库为了简单实用sqlite&#xff0c;python自带sqlite3 ,很方便 db.sql CREATE TABLE …

AcWing 98. 分形之城

题目链接:AcWing 98. 分形之城 问题描述 分析 这一道题看起来很麻烦&#xff0c;其实就是比较麻烦。 这是一道递归坐标变换的问题&#xff0c;坐标变换比较难想&#xff0c;建议自己动手画一画容易明白一些。 首先是城市等级 n n n 与总点数的关系&#xff0c;不难发现总点数…

golang Redis的新数据类型github.com/go-redis/redis/v8实践

Redis的新数据类型# 在redis中&#xff0c;后面添加了几个比较高级的数据类型 hyperloglog基数统计、GEO存储地理位置、bitmap位图、stream为消息队列设计的数据类型 这 4 种数据类型。 HyperLogLog类型# HyperLogLog简介# HyperLogLog 是一种用于数据统计的集合类型&#x…

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

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

16.电容触摸按键

1.电容触摸按键介绍&#xff1a; R是外接的充电电阻&#xff0c; Cs是没有触摸按下的触摸感应区和四周覆铜区域的一个杂散的电容&#xff1b;当使用手指去触摸感应区时&#xff0c;手指和感应区形成一个电容Cx&#xff0c;开关是电容放电的一个开关&#xff0c;在实际设计中是利…

Ubuntu 22.04.2 LTS LTS x86_64 安装 stable-diffusion-webui 【2】基本版本完结。

前篇 Ubuntu 20.04 LTS x86_64 安装 stable-diffusion-webui_hkNaruto的博客-CSDN博客 内容太多&#xff0c;分第二篇继续 中途重装了机器&#xff0c;20.04 &#xff0c;apt upgrade后自动升级到22.04.2 现状&#xff1a;起来了&#xff0c;又没完全起来 启动日志 (stab…

如何在 Linux 中将本地网络 IP 设置为静态的

文章目录 对于普通的 Linux 操作系统对于 Red Hat Enterprise Linux 9 笔者的运行环境&#xff1a; CentOS 8 Red Hat Enterprise Linux 9 在 Linux 中将本地网络 IP 设置为静态的&#xff0c;只需要在那台 Linux 上设置即可。为了方便&#xff0c;这里笔者使用了 Xshell 来远…

手写操作系统--主引导扇区以及内核加载器

在CPU上电后&#xff0c;会自动将cs:ip置为f000:fff0,下图就是一个计算机刚上电的模拟&#xff1a; ffff00这里开始的代码是BIOS自检&#xff0c;检查计算机的硬件完备性&#xff0c;做完这一切后将第一个扇区的内容复制到0x7c00的位置&#xff0c;并从0x7c00位置执行代码&…

第五章 逻辑回归

第五章 逻辑回归 Logistic回归的⼀般过程 收集数据&#xff1a;采⽤任意⽅法收集数据。准备数据&#xff1a;由于需要进⾏距离计算&#xff0c;因此要求数据类型为数值型。另外&#xff0c;结构化数据格式则最佳。分析数据&#xff1a;采⽤任意⽅法对数据进⾏分析。训练算法&…

Golang每日一练(leetDay0118) 扁平化嵌套列表迭代器、整数拆分

目录 341. 扁平化嵌套列表迭代器 Flatten Nested List Iterator &#x1f31f;&#x1f31f; 343. 整数拆分 Integer Break &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/…

vscode工作区实现机制

工作区是编辑器的重要部分&#xff0c;它承载着编辑器和本地文件的连接&#xff0c;对文件增、删、改、查。下面我会介绍vscode工作区的创建。同样我们知道vscode软件打开的时候没有默认工作区&#xff0c;这里我对它进行了改造&#xff0c;软件启动时指向默认工作区。 工作区目…

提高腾讯QQ(电脑版)语音通话、视频聊天和远程协助的稳定性的方法

一、背景说明 腾讯QQ默认使用的通讯协议是UDP。但是各大运营商将UDP的优先级设置为最低&#xff0c;导致UDP数据包经常被丢弃。导致腾讯QQ在语音通话、视频聊天和远程协助的时候&#xff0c;会出现连接不上、卡顿和断线&#xff0c;非常不稳定。我们可以手动将通讯协议调整为TC…

用Python实现自动化交易:从趋势到收益

在现代金融市场中&#xff0c;自动化交易已经成为越来越流行的一种方式。相比于传统的手工交易方式&#xff0c;自动化交易更加高效、精准、快速且免除了人为因素的影响。而Python作为一种高级编程语言&#xff0c;凭借其简单易学、灵活性强的优势逐渐成为自动化交易中最受欢迎…

Ubuntu下Go语言TCP广播服务器实现

最近在学习Go语言网络编程&#xff0c;突然想到很久以前的用C语言写过的TCP广播聊天程序&#xff0c;然后就用Go尝试写了一遍&#xff0c;在此做个记录。 目录 1.广播结构 2.实现效果 3.源码 4.Go语言学习参考网站 1.广播结构 2.实现效果 服务器&#xff1a; 客户端1&…

小程序 web-view h5页面背景音乐自动播放

/*** 年度账单-登录首页*/ import React,{useEffect} from react import swiper/swiper-bundle.min.css import styles from ./styles.less import bgm from ./bgm2.mp3 // 主体 const annualAccountLoginIndex (props) > {const goAnnualAccount ()>{const {location: …