TensorRT初探——MobileNet_V1

MobileNet V1/V2/V3 轻量化网络对比:参数量减少 90% 下的 3 种核心优化策略 本文深入对比了MobileNet V1/V2/V3轻量化网络的核心优化策略,包括深度可分离卷积、倒残差结构和注意力机制,实现了参数量减少90%的同时保持较高精度。通过PyTorch实测数据,展示了各版本在RTX 3060上的推理速度差异,为移动端和边缘计算场景提供了高效的AI解决方案。 阅读详情

TensorRT初探——MobileNet_V1

引言

​ 随着人工智能的发展,深度学习在计算机视觉上的应用越来越广泛,但如何落地实际工程项目的问题也越发受人关注,如何在边缘设备上运行深度学习模型也成为一个热点。本文主要对常见的轻量级模型进行学习,并尝试对模型进行加速优化,也希望能对自己课题起到帮助。

MobileNetV1模型结构

​ 该模型是用来进行分类任务,并且网络将Conv->Bn->Relu的操作转变成了Depthwise Conv->BN->Relu->comv->BN->Relu,通过这种操作,模型的计算量会大幅减少,下面会讲mobilenet的两个核心操作:Depthwise Conv、Point Conv

Depthwise separable convolution(深度可分离卷积)和Point Conv(点卷积)

MobileNet的基本单位是(Depthwise separable convolution)深度可分离卷积,这种结构也是使得网络加速的关键所在。传统的卷积过程如下图所示:

假设图像大小为MxN,卷积核大小为KxL,输入特征通道数为m,卷积核数量为n,那么计算计算卷积的计算量为:M∗N∗K∗L∗m∗nM*N*K*L*m*nM∗N∗K∗L∗m∗n,而对于深度可分离卷积,卷积核不再在所有通道提取特征,而是为每个通道单独设置一个卷积,例如输入特征图维度为3,那么我们为就会设置3个二维卷积核与每个通道进行对应

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OIQpvJH0-1640098240128)(/Users/johan/Library/Application Support/typora-user-images/image-20211220001351497.png)]

通过这种方案,我们可以将计算量减少为M∗N∗K∗L∗mM*N*K*L*mM∗N∗K∗L∗m,可以看出计算量明显减少。

但就从目前来看,这种方案存在一个问题,那就是不同通道的特征向量完全没有交互,每个卷积核只是从一个通道提取特征,信息相对孤立。为了解决这个问题,模型又引入了pointwise convolution,这个结构其实就是用n个1x1维的卷积核对特征进行传统卷积,通过这种方案,既可以对不同通道特征起到融合作用,又可以对特征向量进行升维或者降维操作(因为输出特征维度取决于卷积核的个数)

使用TensorRT对图像进行推断

MobileNetv1代码


import os
import shutil
import time

import torch
import torch.nn as nn
from torch.nn.modules.activation import ReLU
from torch.nn.modules.batchnorm import BatchNorm2d
from torch.nn.modules.conv import Conv2d
import torch.nn.parallel
import torch.backends.cudnn as cudnn
import torch.optim
import torch.utils.data
import torchvision.transforms as transforms
import torchvision.datasets as datasets
import torchvision.models as models
from torch.autograd import Variable
class Net(nn.Module):
    def __init__(self,nclass=1000):
        super(Net,self).__init__()
        self.nclass=nclass
        def conv_bn(input_features,output_features,stride):
            return nn.Sequential(
                nn.Conv2d(input_features,output_features,3,stride,1,bias=False),
                nn.BatchNorm2d(output_features),
                nn.ReLU(inplace=True)
            )
        def conv_dw(input_features,output_features,stride):
            '''
            3为卷积核大小,stride为步长,在论文中有s1和s2两种步长,groups为是否进行分组卷积,此处应该设置为输入通道数量
            '''
            return nn.Sequential(
                nn.Conv2d(input_features,input_features,3,stride,1,groups=input_features,bias=False),
                nn.BatchNorm2d(input_features),
                nn.ReLU(inplace=True),
                '''
                论文中point convolution过程
                '''
                nn.Conv2d(input_features,output_features,1,1,0,bias=False),
                nn.BatchNorm2d(output_features),
                nn.ReLU(inplace=True)
            )
        self.model=nn.Sequential(
            conv_bn(3, 32, 2),
            conv_dw(32, 64, 1),
            conv_dw(64, 128, 2),
            conv_dw(128, 128, 1),
            conv_dw(128, 256, 2),
            conv_dw(256, 256, 1),
            conv_dw(256, 512, 2),
            conv_dw(512, 512, 1),
            conv_dw(512, 512, 1),
            conv_dw(512, 512, 1),
            conv_dw(512, 512, 1),
            conv_dw(512, 512, 1),
            conv_dw(512, 1024, 2),
            conv_dw(1024, 1024, 1),
            nn.AvgPool2d(7),
        )
        self.fc=nn.Linear(1024,self.nclass)
    def forward(self,X):
        x=self.model(X)
        x=x.view(-1,1024)
        x=self.fc(x)
        return x
def speed(model,name):
    t0 = time.time()
    input = torch.rand(1,3,224,224).cuda()    #input = torch.rand(1,3,224,224).cuda()
    input = Variable(input, volatile = True)
    t1 = time.time()

    model(input)

    t2 = time.time()
    for i in range(10):
        model(input)
    t3 = time.time()
    
    torch.save(model.state_dict(), "test_%s.pth"%name)
    print('%10s : %f' % (name, t3 - t2))
if __name__ == '__main__':
    t0=time.time()
    resnet18 = models.resnet18(num_classes=2).cuda()
    alexnet = models.alexnet(num_classes=2).cuda()
    vgg16 = models.vgg16(num_classes=2).cuda()
    squeezenet = models.squeezenet1_0(num_classes=2).cuda()
    mobilenet = Net().cuda()

    speed(resnet18, 'resnet18')
    speed(alexnet, 'alexnet')
    speed(vgg16, 'vgg16')
    speed(squeezenet, 'squeezenet')
    speed(mobilenet, 'mobilenet')

实验结果如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O1E4zzfD-1640098240129)(/Users/johan/Library/Application Support/typora-user-images/image-20211220095233117.png)]

(不知道为什么比resnet18还要慢~~)

将模型权重保存后查看,结果如下图所示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z9q03Tmy-1640098240129)(/Users/johan/Library/Application Support/typora-user-images/image-20211220100048622.png)]

TensorRT推断

TensorRT简单介绍

为了加速模型推理,我们通常需要将模型转变为tensorRT格式。转变过程主要有如下路线:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-axr8fhK8-1640098240130)(/Users/johan/Library/Application Support/typora-user-images/image-20211220232316664.png)]

TensorRT中的组件主要由四部分组成

  1. ONNX parser:将一个经过 PyTorch 训练的模型转换成 ONNX 格式作为输入,并在 TensorRT 中填充一个网络对象

  2. Builder:使用 TensorRT 中的网络并生成针对目标平台优化的引擎

  3. Engine:获取输入数据,执行推断,并产生推理输出。

  4. Logger:与生成器和引擎关联,以在构建和推理阶段捕获错误、警告和其他信息。

通常一个TensorRT应用程序也应该有四个步骤组成:

  1. 将预训练模型转换为onnx
  2. 将onnx模型导入tensorRT
  3. 应用优化并产生引擎
  4. 使用GPU进行推理
生成Onnx模型

在这里我们选择第二种思路,我们先将mobileNet转变成onnx格式,本文测试平台为Jetson,转变代码如下

import torch
import torch.nn as nn
from torch.nn.modules.activation import ReLU
from torch.nn.modules.batchnorm import BatchNorm2d
from torch.nn.modules.conv import Conv2d
import torch.nn.parallel
import torch.backends.cudnn as cudnn
import torch.optim
import torch.utils.data
import torchvision.transforms as transforms
import torchvision.datasets as datasets
import torchvision.models as models

class Net(nn.Module):
    def __init__(self,nclass=1000):
        super(Net,self).__init__()
        self.nclass=nclass
        def conv_bn(input_features,output_features,stride):
            return nn.Sequential(
                nn.Conv2d(input_features,output_features,3,stride,1,bias=False),
                nn.BatchNorm2d(output_features),
                nn.ReLU(inplace=True)
            )
        def conv_dw(input_features,output_features,stride):
            '''
            3为卷积核大小,stride为步长,在论文中有s1和s2两种步长,groups为是否进行分组卷积,此处应该设置为输入通道数量
            '''
            return nn.Sequential(
                nn.Conv2d(input_features,input_features,3,stride,1,groups=input_features,bias=False),
                nn.BatchNorm2d(input_features),
                nn.ReLU(inplace=True),
               #此处为论文中point convolution过程
                nn.Conv2d(input_features,output_features,1,1,0,bias=False),
                nn.BatchNorm2d(output_features),
                nn.ReLU(inplace=True)
            )
        self.model=nn.Sequential(
            conv_bn(3, 32, 2),
            conv_dw(32, 64, 1),
            conv_dw(64, 128, 2),
            conv_dw(128, 128, 1),
            conv_dw(128, 256, 2),
            conv_dw(256, 256, 1),
            conv_dw(256, 512, 2),
            conv_dw(512, 512, 1),
            conv_dw(512, 512, 1),
            conv_dw(512, 512, 1),
            conv_dw(512, 512, 1),
            conv_dw(512, 512, 1),
            conv_dw(512, 1024, 2),
            conv_dw(1024, 1024, 1),
            nn.AvgPool2d(7),
        )
        self.fc=nn.Linear(1024,self.nclass)
    def forward(self,X):
        x=self.model(X)
        x=x.view(-1,1024)
        x=self.fc(x)
        return x.view(-1,int(x.numel()//x.size(0)))
model=Net()
model=torch.load("mobileNet.pth")
dummy_input = torch.randn(1, 3, 224, 224, device='cuda')
torch.onnx.export(model, (dummy_input,), "mobileNet.onnx", verbose=True)
TensorRT使用onnx模型进行推理

得到onnx模型后,我们使用tensorRt生成trt文件,如何安装tensorRT请自行搜索,本文使用的tensorRT版本为8.0,下面我们分别使用c++生成引擎

c++代码如下:

#include <iostream>
#include "argsParser.h"
#include "buffers.h"
#include "common.h"
#include "logger.h"
#include "BatchStream.h"
#include "EntropyCalibrator.h"
#include "NvOnnxParser.h"
#include "NvInfer.h"

using namespace nvinfer1;
using namespace nvonnxparser;
int main() {
        std::cout<<"hello world"<<std::endl;
        samplesCommon::Args args;

        // 1 加载onnx模型
        IBuilder* builder = createInferBuilder(sample::gLogger.getTRTLogger());
        const auto explicitBatch = 1U << static_cast<uint32_t>(NetworkDefinitionCreationFlag::kEXPLICIT_BATCH);
        nvinfer1::INetworkDefinition* network = builder->createNetworkV2(explicitBatch);

        nvonnxparser::IParser* parser = nvonnxparser::createParser(*network, sample::gLogger.getTRTLogger());

        const char* onnx_filename="/home/case/Desktop/wza/mobileNetRT/weights/mobileNet.onnx";
        parser->parseFromFile(onnx_filename, static_cast<int>(sample::gLogger.getReportableSeverity()));
        for (int i = 0; i < parser->getNbErrors(); ++i)
        {
                std::cout << parser->getError(i)->desc() << std::endl;
        }
        std::cout << "successfully load the onnx model" << std::endl;

        // 2、build the engine
        unsigned int maxBatchSize=1;
        builder->setMaxBatchSize(maxBatchSize);
        IBuilderConfig* config = builder->createBuilderConfig();
        config->setMaxWorkspaceSize(1 << 20);
        ICudaEngine* engine = builder->buildEngineWithConfig(*network, *config);

        // 3、serialize Model
        IHostMemory *gieModelStream = engine->serialize();
        std::string serialize_str;
        std::ofstream serialize_output_stream;
        serialize_str.resize(gieModelStream->size());   
        memcpy((void*)serialize_str.data(),gieModelStream->data(),gieModelStream->size());
        serialize_output_stream.open("./serialize_engine_output.trt");
        serialize_output_stream<<serialize_str;
        serialize_output_stream.close();


        // 4、deserialize model
        IRuntime* runtime = createInferRuntime(sample::gLogger.getTRTLogger());
        std::string cached_path = "/home/case/Desktop/wza/mobileNetRT/build/serialize_engine_output.trt";
        std::ifstream fin(cached_path);
        std::string cached_engine = "";
        while (fin.peek() != EOF){ 
                std::stringstream buffer;
                buffer << fin.rdbuf();
                cached_engine.append(buffer.str());
        }
        fin.close();
        ICudaEngine* re_engine = runtime->deserializeCudaEngine(cached_engine.data(), cached_engine.size(), nullptr);

        std::cout << "Hello, World!" << std::endl;
        return 0;
}

使用python代码生成引擎并且进行推理

python代码如下所示:

import tensorrt as trt
import numpy as np
import pycuda.driver as cuda
import pycuda.autoinit
import sys
import os
import common
import random
import torch
from PIL import Image
class ModelData(object):
    MODEL_PATH = "ResNet50.onnx"
    INPUT_SHAPE = (3, 224, 224)
    # We can convert TensorRT data types to numpy types with trt.nptype()
    DTYPE = trt.float32
TRT_LOGGER = trt.Logger(trt.Logger.WARNING)
def build_engine(model_file,engine_path):
    builder=trt.Builder(TRT_LOGGER)
    network = builder.create_network(common.EXPLICIT_BATCH)
    config = builder.create_builder_config()
    parser = trt.OnnxParser(network, TRT_LOGGER)

    config.max_workspace_size = common.GiB(1)
    # Load the Onnx model and parse it in order to populate the TensorRT network.
    with open(model_file, 'rb') as model:
        if not parser.parse(model.read()):
            print ('ERROR: Failed to parse the ONNX file.')
            for error in range(parser.num_errors):
                print (parser.get_error(error))
            return None
    engine= builder.build_engine(network, config)
    with open(engine_path,"wb") as f:
        f.write(engine.serialize())
    return engine
def load_normalized_test_case(test_image, pagelocked_buffer):
    # Converts the input image to a CHW Numpy array
    def normalize_image(image):
        # Resize, antialias and transpose the image to CHW.
        c, h, w = ModelData.INPUT_SHAPE
        image_arr = np.asarray(image.resize((w, h), Image.ANTIALIAS)).transpose([2, 0, 1]).astype(trt.nptype(ModelData.DTYPE)).ravel()
        # This particular ResNet50 model requires some preprocessing, specifically, mean normalization.
        return (image_arr / 255.0 - 0.45) / 0.225

    # Normalize the image and copy to pagelocked memory.
    np.copyto(pagelocked_buffer, normalize_image(Image.open(test_image)))
    # np.copyto(pagelocked_buffer, normalize_image(test_image))
    return test_image

if __name__ =="__main__":
    _, data_files = common.find_sample_data(description="Runs a ResNet50 network with a TensorRT inference engine.", subfolder="resnet50", find_files=["binoculars.jpeg", "reflex_camera.jpeg", "tabby_tiger_cat.jpg", ModelData.MODEL_PATH, "class_labels.txt"])
    # Get test images, models and labels.
    test_images = data_files[0:3]#测试图像
    onnx_path = 'weights/mobileNet.onnx'
    engine_path = 'weights/mobileNet.engine'
    engine=build_engine(onnx_path,engine_path)
    context = engine.create_execution_context()
    test_image = random.choice(test_images)
    engine=build_engine(onnx_path,engine_path)
    inputs, outputs, bindings, stream = common.allocate_buffers(engine)
    test_case = load_normalized_test_case(test_image, inputs[0].host)
    trt_outputs = common.do_inference_v2(context, bindings=bindings, inputs=inputs, outputs=outputs, stream=stream)
    print(len(trt_outputs[0]))#打印模型输出

打印结果维度如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uTXRnkCp-1640098240130)(/Users/johan/Library/Application Support/typora-user-images/image-20211221191702296.png)]

结尾

至此整个流程圆满结束,中间也碰到许多困难,本来打算使用c++完成整个过程,但编译生成trt文件后后续资料没有找到,其次是c++水平太差,退而选择了python来完成整个流程。在环境配置方面,cmake的版本需要和tensorRT相匹配,这就需要各位具体问题具体分析,在出现问题并解决问题的过程中,希望自己水平或许有一点点提高吧~~~。总而言之,路漫漫其修远兮,吾将上下而求索。

PyTorch随笔 - 获取TensorRT(TRT)模型输入和输出 获取TensorRT(TRT)模型输入和输出,用于创建TRT的模型服务使用,具体参考脚本。 阅读详情

相关推荐

MobileNet v3 + LR-ASPP 轻量语义分割实战

语义分割是计算机视觉中实现像素级场景理解的基础技术,其核心在于多尺度特征融合与计算效率的平衡。LR-ASPP 作为 ASPP 的轻量化重构,通过深度可分离卷积、全局池化分支和通道精简,在保持感受野覆盖能力的同时显著降低参数量;MobileNet v3 凭借硬Swish激活与SE注意力机制,为边缘部署提供高性价比 backbone。二者组合特别适用于道路场景——该任务具有强类不平衡性、边缘敏感性及实时性约束,广泛应用于 ADAS 辅助驾驶、嵌入式感知终端与车载视觉 pipeline 快速验证。本文聚焦可落地的

weixin_34174422的博客 355

提取tensorflow lstm权重 和 中间层输出

@tf_export("nn.rnn_cell.BasicLSTMCell") class BasicLSTMCell(LayerRNNCell): input_depth = inputs_shape[1].value h_depth = self._num_units self._kernel = self.add_variable( _WEIGHTS_VARIABLE_NAME,...

koibiki的博客 9758

Nvidia Jetson平台实战:SSD-MobileNet-v2目标检测部署详解

Nvidia Jetson Inference 是专为边缘计算场景设计的高性能AI推理SDK,深度集成TensorRT与CUDA加速技术,面向嵌入式视觉应用提供端到端的推理解决方案。其核心封装了图像分类、目标检测、语义分割等主流任务的通用API接口,屏蔽底层硬件复杂性,使开发者可专注于上层逻辑开发。该库采用C++编写并提供Python绑定,支持FP16/INT8量化推理,在Jetson Nano至Orin全系列模块中实现低延迟、高吞吐的模型部署。其架构以GStreamer。

weixin_35754676的博客 1296

TensorRT推理时,如何比对中间层的误差

本文演示了TensorRT推理时,如何比对中间层的误差。在做TensorRT推理加速时,可能会遇到精度问题,希望定位到是哪一个节点引起的误差,还是累计误差。

Hi20240217的博客 948

基于TSM的动态手势识别:从ResNet-50到MobileNet-V2的实战对比

视频理解是计算机视觉领域的关键技术,其核心在于让模型不仅能识别静态图像内容,还能理解连续帧之间的时序关系与动态变化。TSM(时序平移模块)通过一种巧妙且低计算成本的方式,在2D卷积网络中实现了时序信息的高效融合,为动态行为识别提供了强大的基础。这项技术在智能交互、安防监控、体感游戏等场景中具有重要价值。本文聚焦于动态手势识别这一具体应用,深入探讨了如何利用TSM模块,结合20BN-JESTER V1大规模数据集,分别构建基于ResNet-50和MobileNet-V2骨干网络的识别系统,并对两者的精度与效率

weixin_34124651的博客 405

支持多层输出的TensorRT

这个demo是支持多层输出网络结构的TensorRT接口,原始资源来源于github,相应链接找不到了,不好意思;

使用TensotRT 4步搞定mobilnetV3深度学习模型部署

文章目录前言1. 配置环境,安装TensorRT2. 训练模型,并将模型转为.engine格式 前言 MobilnetV3作为谷歌目前发布的最新的轻量级深度学习模型,在性能和模型大小上都达到了很好的平衡,从而使其在移动端部署具有很大的优势,这里我们使用C++ 和Cuda模型推理加速工具TensorRT将训练好的Mobilenet模型封装成dll,使其能够方便快捷的部署在移动端。整过过程可以分为以下几个步骤: step 1 配置环境,安装TensorRT step 2 训练模型,并将模型转为.engine格

Christo的博客 2558

图像分类实战:mobilenetv2从训练到TensorRT部署(pytorch)

本例提取了植物幼苗数据集中的部分数据做数据集,数据集共有12种类别,演示如何使用pytorch版本的mobilenetv2图像分类模型实现分类任务。将训练的模型转为onnx,实现onnx的推理,然后再将onnx转为TensorRT,并实现推理。 通过本文你和学到: ​ 1、如何从torchvision.models调用mobilenetv2模型? ​ 2、如何自定义数据集加载方式? ​ 3、如何使用Cutout数据增强? ​ 4、如何使用Mixup数据增强。 ​ 5、如何实现训练和验证。 ​ 6、如何使用余弦退火调整学习率。 ​ 7、如何载入训练的模型进行预测。 ​ 8、pytorch转onnx,并实现onnx推理。 ​ 9、onnx转TensorRT,并实现TensorRT的推理。 希望通过这篇文章,能让大家对图像的分类和模型的部署有个清晰的认识。 链接:https://wanghao.blog.youkuaiyun.com/article/details/123003159

Jetson 上基于 PyTorch 重训 SSD-Mobilenet 目标检测模型:从 Open Images 数据下载到 TensorRT 部署全流程

本指南以 jetson-inference 仓库中的 [pytorch-ssd.md](https://link.gitcode.com/i/87cce3748ceca1ea4c54b3a320377a6f) 为核心脉络,完整讲解在 Jetson(JetPack 4.4+,含 TensorRT 7.1)上用 PyTorch 对 SSD-Mobilenet 做迁移学习(transfer learni

gitblog_00304的博客 926

Android汽车服务篇(一) CarService

本文主要说明了CarService这一系统服务的启动流程,以及一些关键成员的创建和初始化流程.同时简单介绍了一下客户端是如何获取和使用CarService对象, 如上文介绍的, CarService对象只是获取各个Manager的媒介,它本身并不承担管理传感器.空调等具体的任务.如果要获取车辆的相关信息,如车速, 车内空调温度,诊断信息, 或对车辆进行相关的控制,如升高和降低空调温度,控制座椅和车窗, 调节音量等,就要通过具体的Manager中的API和对应的服务来实现了.

u012514113的专栏 8146

《大明王朝1566》中,朝廷财政危机无法解决的根源分析

财政困局中的财富最终流向三重黑洞:​皇室挥霍​(如嘉靖炼丹修殿)、特权阶层贪腐​(严党年入百万两盐税)、制度性损耗​(宗室供养、低效官僚)。更深层的“钱”其实是被禁锢在道德化治理的牢笼中——当国家用“黄河长江皆可为用”的权术思维替代制度性改革时,财政危机便成为帝制王朝无法逃脱的宿命。

为了小家奋斗 1968

OpenMMlab导出mobilenet-v2模型并用onnxruntime和tensorrt推理

【代码】OpenMMlab导出mobilenet-v2的onnx模型并推理。

taifyang的博客 800

基于CLICKHOUSE的数据仓库分层规范

接入层。

zjyy1987的博客 769

边缘AI实战:如何用TensorRT在Jetson Nano上加速MobileNet推理(附性能对比)

本文详细介绍了如何在Jetson Nano上利用TensorRT加速MobileNet模型推理,涵盖从环境搭建到模型优化的全流程。通过剪枝、量化和TensorRT引擎生成等关键技术,实现了推理速度从15FPS提升至45.5FPS的显著优化,为边缘智能应用提供了实用解决方案。

weixin_30879169的博客 575

西门子【Automation Framework V1.2】AF架构:从软件栈到高效自动化项目的构建蓝图

本文深入解析西门子Automation Framework V1.2 (AF架构) 的核心价值与实施蓝图。该框架通过定义标准化的软件栈(如TIA Portal V19、STEP7、WinCC Unified)和严格的安装配置流程,将自动化项目开发从依赖个人经验的“手工作坊”模式,转变为高效、可复制的工业化模式。遵循此架构,工程师能快速构建稳定可靠的项目基础,规避环境冲突,从而专注于核心工艺与逻辑设计,大幅提升团队协作与项目交付效率。

weixin_29230059的博客 428

我用WorkBuddy“克隆“了一个我,从此每句话像我自己说的

各位,做这件事花了多长时间?准备样本可能要半小时,提炼风格十分钟,保存固化再花十分钟。加起来不到一个小时。但这一个小时之后呢?你就拥有了一个"永远在线的文字替身"。以后写口播稿,打开WorkBuddy跟它说;写课程逐字稿,跟它说;写公众号文章,也跟它说。写出来的东西,你的学员一看——“嘿,这不就是翟猛老师说的嘛。说到这儿,可能有人会问:老师,我的风格有那么重要吗?AI写的不都挺好的吗?各位你想想看,你为什么愿意听某个老师的课?不只是因为他讲的内容好,更是因为你喜欢他讲话的方式。

weixin_39284145的博客 819

基于MobileNet v2的实时口罩检测系统设计与优化

深度学习中的轻量化模型如MobileNet v2通过倒残差结构和线性瓶颈层设计,在保持较高精度的同时显著降低计算消耗。这类模型特别适合边缘计算场景,能够实现实时目标检测任务。在计算机视觉领域,口罩检测作为典型的物体识别应用,结合轻量化模型可部署于校园、商场等公共场所的防疫管理。本文详解如何利用MobileNet v2构建实时检测系统,包括模型优化技巧如ONNX转换和TensorRT加速,以及多线程视频流处理等工程实践。针对常见的小目标漏检和光照影响问题,提出了特征金字塔网络和数据增强的解决方案,最终在树莓派

注重长远 天天积累 cqujsjcyj 227

电路布局中近场耦合问题

开关电源EMC设计中,传导骚扰超标往往源于空间耦合而非参数问题。某案例中,DC-DC模块的非屏蔽电感磁场泄漏耦合到邻近X电容,导致0.5MHz频点超标。通过将X电容移至PCB底层、优化布局保持15mm间距后,问题完全解决。实践证明:EMC设计需注重空间隔离,优先采用屏蔽电感,滤波元件应远离高频磁场区,布局优化比参数调整更有效。这提示工程师需将电磁兼容视为空间问题而不仅是电气问题。

硬核科技 375

从GoogleNet到MobileNet V3:深度可分卷积的‘内卷’进化史,看巨头如何为模型‘瘦身’

本文深入探讨了深度可分卷积(Depthwise Separable Convolution)从GoogleNet到MobileNet V3的技术演进历程。通过分析Inception模块、Xception架构以及MobileNet系列的创新设计,揭示了如何通过深度可分卷积实现模型轻量化,显著降低计算复杂度同时保持性能。文章特别强调了MobileNet V3在硬件感知自动设计方面的突破,为移动端AI应用提供了高效解决方案。

weixin_30756499的博客 651

精度与速度双突破:YOLOv8-Pose 在 RK3588 上实现高性能人体姿态分析部署

本教程从YOLOv8-pose模型的姿态识别训练,到RK3588的边缘量化部署,为你打造了一套“高精度+高实时性+低成本”的人体姿态分析解决方案。无论是健身动作纠正、智能安防行为检测,还是工业人员姿态监控,这套技术都能直接复用——你只需替换数据集与业务逻辑,即可快速落地专属的边缘AI姿态识别系统。如果你在实践中遇到任何卡点,欢迎随时交流。记住,人体姿态识别的价值在于“关键点准、推理快、部署易”,而这三者的平衡,正是你通过本教程能掌握的核心能力。

know_F0727的博客 434

利用R批量计算相关系数

批量求相关系数

weixin_52073820的博客 1458

从GoogleNet到MobileNet V3:深度可分卷积如何一步步‘瘦身’你的模型?

本文深入探讨了从GoogleNet到MobileNet V3的演进历程,重点解析深度可分卷积(Depthwise Separable Convolution)技术如何实现模型轻量化。通过分析Depthwise卷积和Pointwise卷积的组合优化,展示了该技术在移动设备和嵌入式系统中的高效应用,帮助开发者在资源受限环境下保持模型性能。

weixin_30470643的博客 320

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

轻量化模型技术解析:从MobileNet到EfficientNet

模型轻量化是计算机视觉领域的关键技术,旨在平衡计算资源、内存占用和推理速度与模型精度。深度可分离卷积和神经架构搜索等技术显著提升了轻量化模型的性能。MobileNet系列通过深度可分离卷积和倒残差结构实现了高效的特征提取,而EfficientNet则通过复合缩放法则进一步优化了模型性能。这些技术在边缘计算和移动设备上具有广泛的应用价值,如智能安防和工业质检。轻量化模型的核心在于在硬件特性和业务需求之间找到最佳平衡点,MobileNetV3和EfficientNet-B2是当前工业实践中的优选方案。

weixin_34212762的博客 520

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

tf_trt_models性能对比:原生TensorFlow与TensorRT优化模型在Jetson平台的实测数据

tf_trt_models是一个将TensorFlow模型通过NVIDIA TensorRT加速的开源项目,专为提升深度学习模型在边缘设备上的运行效率而设计。本文将通过实际测试数据,展示原生TensorFlow与TensorRT优化模型在Jetson平台上的性能差异,帮助开发者了解如何利用tf_trt_models实现模型加速。 ## 为什么选择TensorRT优化? 在边缘计算场景中,设备资

gitblog_00752的博客 947

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

从GoogleNet到MobileNet V3:深度可分卷积如何一步步‘瘦身’成功?聊聊轻量化网络的演进史

本文探讨了深度可分卷积从GoogleNet到MobileNet V3的演进历程,揭示了轻量化网络如何通过结构创新实现高效计算。从GoogleNet的初步构想到Xception的明确分离,再到MobileNet系列的持续优化,深度可分卷积技术显著降低了参数量与计算成本,成为移动端部署的核心解决方案。文章重点分析了深度卷积与逐点卷积的技术优势及其在现代应用中的最佳实践。

weixin_30660027的博客 383
上一篇: 深度可分离卷积 to MobileNet_v1 to MobileNet_v2
CoderLife_
博客等级 码龄8年 22粉丝 11原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值