详细记录YOLACT实例分割ncnn实现

2023-11-05

点击上方“AI算法修炼营”,选择加星标或“置顶”

标题以下,全是干货

整理:公众号@深度学习与计算机视觉

作者:nihui

链接:https://zhuanlan.zhihu.com/p/128974102

本文转载自知乎,作者已授权,未经许可请勿二次转载。

YOLACT实例分割

https://urlify.cn/rURFry

  • 端到端一阶段完成实例分割

  • 速度快,550x550图片在TitanXP上号称达到33FPS

  • 开源代码,pytorch大法好!

1 缘由

纵观整个github,无论是ncnn还是ncnn衍生项目,分类,检测,定位,特征提取,OCR,风格转换....

然而,就是没有找到实例分割的例子,以至于有人发了个issue,并点名要求搞个 YOLACT 实例分割https://github.com/Tencent/ncnn/issues/1679

那好吧于是写个YOLACT例子,顺带介绍下如何用ncnn实现类似这种需要后处理的算法

2 pytorch测试

YOLACT项目里有YOLACT++模型,速度更快,效果更好,不过YOLACT++用了个对部署不友好的经典骚操作deformable convolution

假装没看到,我们去下载YOLACT模型

新建weights文件夹,下载 yolact_resnet50_54_800000.pth

根据 README 指示,先拿张图试试看效果

$ python eval.py --trained_model=weights/yolact_resnet50_54_800000.pth --score_threshold=0.15 --top_k=15 --image=test.jpg

去掉后处理导出onnx

直接修改 eval.py 的 evalimage,把结果展示换成 onnx export

def evalimage(net:Yolact, path:str, save_path:str=None):
    frame = torch.from_numpy(cv2.imread(path)).cuda().float()
    batch = FastBaseTransform()(frame.unsqueeze(0))
    preds = net(batch)

    torch.onnx._export(net, batch, "yolact.onnx", export_params=True, keep_initializers_as_inputs=True, opset_version=11)

根据YOLACT issue中的信息,yolact.py开头的JIT要关掉才能导出onnx

# As of March 10, 2019, Pytorch DataParallel still doesn't support JIT Script Modules
use_jit = False

YOLACT后处理部分写得非常 pythonic,这样直接导出不行,要把后处理从模型剔除,方便导出转换

即便onnx能导出后处理,也不建议这么做

  • 后处理部分没有标准化,每个项目作者的实现细节也各不相同,比如各种nms和bbox计算方式,ncnn很难用统一的op实现(caffe-ssd因为只有一种版本,所以有实现)

  • 后处理在onnx中会转换成一大坨胶水op,非常琐碎,在框架中实现效率低下

  • onnx的大部分胶水op,ncnn不支持或有兼容问题,比如Gather等,无法直接使用

因此,去掉后处理导出onnx,是正确转换 pytorch ssd 等类似模型的通常做法

打开yolact.py,找到 class Yolact 的 forward 方法,把 detect 过程去掉,直接返回模型的 pred_outs 输出

            # return self.detect(pred_outs, self)
            return pred_outs;

再一次跑一遍图片测试,不包含后处理的 yolact.onnx 出现了

$ python eval.py --trained_model=weights/yolact_resnet50_54_800000.pth --score_threshold=0.15 --top_k=15 --image=test.jpg

简化onnx

直接导出的onnx模型有很多胶水op是ncnn不支持的,用onnx-simplifier是常规操作

$ pip install -U onnx --user
$ pip install -U onnxruntime --user
$ pip install -U onnx-simplifier --user

$ python -m onnxsim yolact.onnx yolact-sim.onnx

这时候遇到个问题

Graph must be in single static assignment (SSA) form, however '523' has been used as output names multiple times

经过在github翻看issue,确认这是 onnx bug

https://link.zhihu.com/?target=https%3A//github.com/onnx/onnx/issues/2613

幸好 onnx-simplifier 已提供办法绕过

$ python -m onnxsim --skip-fuse-bn yolact.onnx yolact-sim.onnx

5 ncnn模型转换和优化

前面简化onnx的时候,--skip-fuse-bn 跳过了 batchnorm 合并,不过没关系,ncnn 也有这个功能

ncnnoptimize 工具实现了很多种算子融合,比如常见的 convolution-batchnorm-relu 等等

最后的参数 0 表示fp32模型,65536 表示精简为fp16模型,能减少模型二进制体积

$ ./onnx2ncnn yolact-sim.onnx yolact.param yolact.bin
$ ./ncnnoptimize yolact.param yolact.bin yolact-opt.param yolact-opt.bin 0

手工微调模型

还是这句话,不报错不代表一定能用,先用netron工具打开param看看模型结构

这个模型输出有四个,用红框框出来了

Convolution              Conv_263                 1 1 617 619 0=32 1=1 5=1 6=8192 9=1
Permute                  Transpose_265            1 1 619 620 0=3
UnaryOp                  Tanh_400                 1 1 814 815 0=16
Concat                   Concat_401               5 1 634 673 712 751 790 816 0=-3
Concat                   Concat_402               5 1 646 685 724 763 802 817 0=-3
Concat                   Concat_403               5 1 659 698 737 776 815 818 0=-3
Softmax                  Softmax_405              1 1 817 820 0=1 1=1

YOLACT 的后处理需要 loc conf prior mask maskdim 这些东西

一开始看不出这几个输出对应的是什么,那么就先看shape

ncnn::Extractor ex = yolact.create_extractor();

ncnn::Mat in(550, 550, 3);
ex.input("input.1", in);

ncnn::Mat b620;
ncnn::Mat b816;
ncnn::Mat b818;
ncnn::Mat b820;
ex.extract("620", b620);// 32 x 138x138
ex.extract("816", b816);// 4 x 19248
ex.extract("818", b818);// 32 x 19248
ex.extract("820", b820);// 81 x 19248

直接编译运行发现 Concat 层 crash,即图中蓝框,Concat axis 参数是负数 0=-3,ncnn 还不支持

根据 Concat 多个输入shape,发现是二维数据在 h axis concat,直接改成 0=0 就可以替代

Concat                   Concat_401               5 1 634 673 712 751 790 816 0=0
Concat                   Concat_402               5 1 646 685 724 763 802 817 0=0
Concat                   Concat_403               5 1 659 698 737 776 815 818 0=0

b820在softmax后面,确信是 conf,shape 81x19248 表示 81分类 x 19248个prior

b816 shape 4x19248,对应于每个priorbox的bbox的偏移值

b818 shape 32x19248,根据YOLACT的后处理看,表示的是 maskdim,即32个分割热图的系数

b620 shape 32x138x138,即32个分割热图,前面有个permute层是NCHW->NHWC的转换 prior没有在模型中输出

ncnn 处理 b620 NHWC shape 不方便,改为 extract permute 前的 NCHW 数据 b619,即图中绿框输出

ncnn::Extractor ex = yolact.create_extractor();

ncnn::Mat in(550, 550, 3);
ex.input("input.1", in);

ncnn::Mat maskmaps;
ncnn::Mat location;
ncnn::Mat mask;
ncnn::Mat confidence;
ex.extract("619", maskmaps);// 138x138 x 32
ex.extract("816", location);// 4 x 19248
ex.extract("818", mask);// maskdim 32 x 19248
ex.extract("820", confidence);// 81 x 19248

生成prior

原始代码在 yolact.py class PredictionModule make_priors,增加一些 print 获得全部 priorbox 生成规则超参

const int conv_ws[5] = {69, 35, 18, 9, 5};
const int conv_hs[5] = {69, 35, 18, 9, 5};

const float aspect_ratios[3] = {1.f, 0.5f, 2.f};
const float scales[5] = {24.f, 48.f, 96.f, 192.f, 384.f};

YOLACT的prior四个数值是 center_x center_y box_w box_h,值域 0~1

作者当初写了个bug,box_h = box_w 固定成方的了,我们也要把这个bug复现出来

// make priorbox
ncnn::Mat priorbox(4, 19248);
{
    float* pb = priorbox;

    for (int p = 0; p < 5; p++)
    {
        int conv_w = conv_ws[p];
        int conv_h = conv_hs[p];

        float scale = scales[p];

        for (int i = 0; i < conv_h; i++)
        {
            for (int j = 0; j < conv_w; j++)
            {
                // +0.5 because priors are in center-size notation
                float cx = (j + 0.5f) / conv_w;
                float cy = (i + 0.5f) / conv_h;

                for (int k = 0; k < 3; k++)
                {
                    float ar = aspect_ratios[k];

                    ar = sqrt(ar);

                    float w = scale * ar / 550;
                    float h = scale / ar / 550;

                    // This is for backward compatability with a bug where I made everything square by accident
                    // cfg.backbone.use_square_anchors:
                    h = w;

                    pb[0] = cx;
                    pb[1] = cy;
                    pb[2] = w;
                    pb[3] = h;

                    pb += 4;
                }
            }
        }
    }
}

8 YOLACT全流程实现

预处理部分

data/config.py 有 ImageNet 的 MEAN STD,BGR顺序

# These are in BGR and are for ImageNet
MEANS = (103.94, 116.78, 123.68)
STD   = (57.38, 57.12, 58.40)

YOLACT实际输入RGB,要换下顺序

const int target_size = 550;

int img_w = bgr.cols;
int img_h = bgr.rows;

ncnn::Mat in = ncnn::Mat::from_pixels_resize(bgr.data, ncnn::Mat::PIXEL_BGR2RGB, img_w, img_h, target_size, target_size);

const float mean_vals[3] = {123.68f, 116.78f, 103.94f};
const float norm_vals[3] = {1.0/58.40f, 1.0/57.12f, 1.0/57.38f};
in.substract_mean_normalize(mean_vals, norm_vals);

后处理部分

这部分和 SSD 后处理非常类似,sort nms 这些代码抠 ncnn/src/layer/detectionoutput.cpp

唯一要注意的地方就是 bbox 生成和 SSD 不一样,要用 center_x center_y box_w box_h 实现,YOLACT原代码在 layers/box_util.py decode 函数

YOLACT有fastnms方法 layers/funstions/detection.py,速度更快,可我觉得普通nms毕竟是现成代码,用着挺好的

// generate all candidates for each class
for (int i=0; i<num_priors; i++)
{
    // find class id with highest score
    // start from 1 to skip background

    // ignore background or low score
    if (label == 0 || score <= confidence_thresh)
        continue;

    // apply center_size to priorbox with loc
    float var[4] = {0.1f, 0.1f, 0.2f, 0.2f};

    float pb_cx = pb[0];
    float pb_cy = pb[1];
    float pb_w = pb[2];
    float pb_h = pb[3];

    float bbox_cx = var[0] * loc[0] * pb_w + pb_cx;
    float bbox_cy = var[1] * loc[1] * pb_h + pb_cy;
    float bbox_w = (float)(exp(var[2] * loc[2]) * pb_w);
    float bbox_h = (float)(exp(var[3] * loc[3]) * pb_h);

    float obj_x1 = bbox_cx - bbox_w * 0.5f;
    float obj_y1 = bbox_cy - bbox_h * 0.5f;
    float obj_x2 = bbox_cx + bbox_w * 0.5f;
    float obj_y2 = bbox_cy + bbox_h * 0.5f;

    // clip inside image

    // append object candidate
}

// merge candidate box for each class
for (int i=0; i<(int)class_candidates.size(); i++)
{
    // sort + nms
}

// sort all result by score

// keep_top_k

分割图生成

maskmaps 实际是 32 张 138x138 尺寸的热图,前面输出的每个 object 都自带 32 个 float 系数

object 的分割图就是每张热图 * 对应系数,求和,放大到原图尺寸,二值化,最后 crop inside 输出框

unnatrual很好看的!

补充学习资料

噫?还有补充学习资料?

ncnn实现代码和转好的模型已上传到github

https://link.zhihu.com/?target=https%3A//github.com/Tencent/ncnn



目标检测系列秘籍一:模型加速之轻量化网络秘籍二:非极大值抑制及回归损失优化秘籍三:多尺度检测秘籍四:数据增强秘籍五:解决样本不均衡问题秘籍六:Anchor-Free视觉注意力机制系列Non-local模块与Self-attention之间的关系与区别?视觉注意力机制用于分类网络:SENet、CBAM、SKNetNon-local模块与SENet、CBAM的融合:GCNet、DANetNon-local模块如何改进?来看CCNet、ANN
语义分割系列一篇看完就懂的语义分割综述最新实例分割综述:从Mask RCNN 到 BlendMask超强视频语义分割算法!基于语义流快速而准确的场景解析CVPR2020 | HANet:通过高度驱动的注意力网络改善城市场景语义分割

基础积累系列卷积神经网络中的感受野怎么算?
图片中的绝对位置信息,CNN能搞定吗?理解计算机视觉中的损失函数深度学习相关的面试考点总结


自动驾驶学习笔记系列 Apollo Udacity自动驾驶课程笔记——高精度地图、厘米级定位 Apollo Udacity自动驾驶课程笔记——感知、预测 Apollo Udacity自动驾驶课程笔记——规划、控制自动驾驶系统中Lidar和Camera怎么融合?

竞赛与工程项目分享系列如何让笨重的深度学习模型在移动设备上跑起来基于Pytorch的YOLO目标检测项目工程大合集目标检测应用竞赛:铝型材表面瑕疵检测基于Mask R-CNN的道路物体检测与分割
SLAM系列视觉SLAM前端:视觉里程计和回环检测视觉SLAM后端:后端优化和建图模块视觉SLAM中特征点法开源算法:PTAM、ORB-SLAM视觉SLAM中直接法开源算法:LSD-SLAM、DSO视觉SLAM中特征点法和直接法的结合:SVO
2020年最新的iPad Pro上的激光雷达是什么?来聊聊激光SLAM



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

详细记录YOLACT实例分割ncnn实现 的相关文章

  • 阿里前端开发工具Weex安装学习

    支持原创 更多内容欢迎关注作者博客 http www china10s com blog p 314 移动互联网的开发方式 最开始的手机厂商定制版的封闭系统开发 到后来智能机出现之后 Android和iOS异军突起 形成了两大独立的阵营 这
  • Table is marked as crashed and should be repaired 解决办法

    遇到这个问题几个敲命令轻松搞定 1 首先进入mysql命令台 mysql u root p 回车 输入密码 2 查询所有的库 mysql gt show databases 3 进入数据库 eduyun 2015 sp1 是库名 mysql
  • JAVA设计模式(15)-解释器模式

    定义 给定一种语言 定义他的文法的一种表示 并定义一个解释器 该解释器使用该表示来解释语言中句子 类型 行为类模式 类图 解释器模式是一个比较少用的模式 本人之前也没有用过这个模式 下面我们就来一起看一下解释器模式 解释器模式的结构 抽象解
  • mac 如何安装hp laserjet m1136驱动

    直接在苹果的官网下载驱动就可以了 要下V5 1的那个版本https support apple com kb DL1888 viewlocale zh CN locale zh CN 选择系统偏好设置中的打印机 然后选择相对应的版本就可以了
  • C++语言基础

    1 1 1 简述下C 语言的特点 参考回答 C 在C语言基础上引入了面对对象的机制 同时也兼容C语言 C 有三大特性 1 封装 2 继承 3 多态 C 语言编写出的程序结构清晰 易于扩充 程序可读性好 C 生成的代码质量高 运行效率高 仅比
  • win10连接文件服务器记住密码如何删除,win10系统删除已记住的访问共享的账户与密码的操作方法...

    win10系统删除已记住的访问共享的账户与密码的操作方法 很多win10用户在使用电脑的时候 会发现win10系统删除已记住的访问共享的账户与密码的的现象 根据小编的调查并不是所有的朋友都知道win10系统删除已记住的访问共享的账户与密码的
  • Inno Setup 系列之先卸载之后再安装

    Inno Setup 系列之先卸载之后再安装 需求使用Inno Setup打包程序之后 很多时候我们需要在安装文件之前卸载原有的程序而不是覆盖安装 本文的Code就是实现了这样的功能 如果想要在安装前先卸载 那么需要加下面代码 需要注意的是
  • 案例分析2

    文章目录 16 质量属性 数据库 嵌入式 web 软件设计 15 质量属性 飞机起飞 嵌入式 数据库 数据持久层 14 mvc 数据流图 构件 质量属性 web 13 ESB mvc 安全 12 架构风格 ODP 嵌入式 设计模式 关系型数
  • QT-智能指针

    lt 智能指针与普通指针 最明显区别普通指针 要手动去释放 智能指针出了作用域自动释放 完全不用担心有内存忘记释放的操作 gt 智能指针 1 QScopedPointer 区域指针 2 QSharedPointer 智能指针 强引用计数指针
  • python 正则模块(re)

    1 正则表达式常见的具体应用场景如下 手机号校验 邮箱校验 身份证校验 网页标签匹配 车牌号校验 中文校验 2 re模块 正则表达式是一个特殊的字符序列 它能帮助你方便的检查一个字符串是否与某种模式匹配 Python 自1 5版本起增加了r
  • 加载人物模型

    var abPath prefab character nanjianshi 01all unity3d var assetName Nanjianshi 01All LuaHelper GetResManager LoadPrefabAs
  • LDAP和netty面试题

  • 自动化接口测试实战-第04天-读取外部数据文件、iHRM项目实战

    更多功能测试以及全套学习路线图均在专栏 戳进去领取 系列文章目录 身为开发必知必会的Linux Linux远程连接 命令的使用 Linux命令大全 唯一以案例详解文 持续更新中 Linux命令大全以及数据库 唯一以案例详解文 已完结 Web
  • 一次CNVD-2020-10487漏洞利用

    0x00漏洞简介 CNVD 2020 10487 tomcat ajp文件读取漏洞 0x01开始 某次对一个目标进行测试 用routerscan扫描搜集的C段资产 发现某个IP开放了22 6379 8009等端口 看到8009就想到了tom
  • 服务器ssd硬盘接笔记本,M.2固态硬盘怎么安装 台式机与笔记本电脑安装M.2 SSD方法图解...

    固态硬盘接口众多 不过目前最流行的还是SATA3 0和M 2接口SSD 不过 伴随着SATA3 0接口存在性能瓶颈 越来越多高速固态硬盘采用了M 2接口 那么M 2固态硬盘怎么安装 下面脚本之家就来教大家如何给台式电脑或者笔记本安装M 2固
  • 2.5.5 创建、安装VIO分区

    最后更新2021 07 26 与创建AIX分区相同 但在HMC选择创建vio server 分区 图 261 创建VIO分区 输入分区名 VIO分区的Partition ID与名称都可以随意指定 但为了便于管理 建议分区的名称就是用DNS可
  • 静态分析的四种基本方法

    数据流分析 Data Flow Analysis 将数据看作是图 节点是程序的基本快 边是描述控制如何从一个基本快转移掉另一个基本快 图可以解决很多问题 例如 以 图中边的抽象得出数学方程 七届就是可达性问题的答案 PREfix SLAM静
  • 服务器怎么清空系统盘,服务器怎么清空数据

    服务器怎么清空数据 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 无法看到 Windows 实例数据盘怎么办 磁盘挂载至
  • IPFS方得社区周欢:web3.0时代的分布式存储畅想

    链茶访是链茶馆新开辟的区块链项目报道专栏 每周会对一个项目团队进行专访 链茶馆将挖掘不同项目的闪光点 讲述区块链开发者的创业故事 为各位区块链同侪提供最新的项目资讯与行业动向 链茶馆今天采访了IPFS方得社区创始人周欢 该社区目前有4万用户
  • unity 常用的设计模式

    一 单例模式 在我们的整个游戏生命周期当中 有很多对象从始至终有且只有一个 这个唯一的实例只需要生成一次 并且直到游戏结束才需要销毁 单例模式一般应用于管理器类 或者是一些需要持久化存在的对象 优点 写起来很方便 调用方便 缺点 容易形成依

随机推荐

  • 深度学习3D可视化工具——Zetane Engine

    神经网络在工作的时候 里面到底是什么样 为了能透视这个 AI黑箱 中的过程 加拿大蒙特利尔一家公司开发一个3D可视化工具Zetane Engine 只需要上传一个模型 Zetane Engine就可以巡视整个神经网络 并且还可以放大网络中的
  • React-Router实战:路由传参(正则表达式)

    首先我们先做个路由普通传参的例子 一 准备工作 1 目录结构 index js components App gt App js Home gt Home js About gt About js News gt News js 2 源码
  • Qt常用命令和pro参数

    Qt常用工具 命令行指令 位于 C Qt5 7 1 5 7 msvc2015 64 bin 命令 功能 assistant 帮助文档 designer 设计器 linguist 翻译工具 lupdate 提取翻译字符串和生成ts文件 lre
  • logback不输出至文件_Logback日志使用详解

    Logback是由log4j创始人设计的一个开源日志组件 概述 Logback建立于三个主要类之上 日志记录器 Logger 输出端 Appender 和日志格式化器 Layout 这三种组件协同工作 使开发者可以按照消息类型和级别来记录消
  • caffe 红绿灯识别

    coding utf 8 加载必要的库 import numpy as np import sys os 设置当前目录 caffe root home ubuntu caffe sys path insert 0 caffe root py
  • Report, 20150402, Formulas on Entropy, Part I

    Section 1 Papoulis s Formula Lemma 1 If the random variables y 1 ldots y n are the linear combination of random variable
  • Artifactory Maven 使用教程

    Maven 仓库使用 修改 Maven 配置文件 选择左侧 Artifacts 选择自己需要上传的 Maven 仓库 点击Set Me Up 在弹出的设置框中点击 点击下载生成的文件 将生成的文件放到此目录下 或者你自己的 Maven 目录
  • 线性回归模型

    线性回归是最简单的机器学习模型 也是最基础最重要的分析工具 易于实现 本文将将简单讲述线性回归 最小二乘法和梯度下降三种算法 目录 1 线性回归方程 OLS 2 最小二乘法 OLS 3 梯度下降 GD 3 1超参数 的选择 3 2局部最小值
  • Android使用OpenCV来实现bitmap独立设置每个圆角

    Android使用OpenCV来实现bitmap独立设置每个圆角 关于opencv集成请参考我的其他文章 这里方便起见已经封装成java方法供大家调用 代码如下 public static Bitmap drawCircleRadius i
  • 打乱1-100的个数字的顺序

    package test import java util Random public class Test2 public static void swap int a int i int j if a null a length 0 i
  • Weex页面的编写——Weex的学习之路(六)

    通过前几博客我们把weex的内置组件都学习完了 组件的单独使用想必都可以了 那么 这次我们来做weex实际页面的编写 见证一下 一套代码在Android Ios和H5上使用 在weex官网推荐我们使用Weex Studio作为编译器 其实这
  • Unity 3D作业二:离散仿真引擎基础

    前言 中山大学中山大学数据科学与计算机学院3D游戏课程学习记录博客 简答题 1 解释游戏对象 GameObjects 和资源 Assets 的区别与联系 游戏对象 出现在游戏场景中 充当游戏的组件 游戏对象不做任何事情 需要特殊属性才能成为
  • Xcode Executable Not Found

    问题 Xcode编译项目报Executable Not Found的错误 Details Details Executable Not Found Domain DVTMachOErrorDomain Code 5 Recovery Sug
  • Rust 删除排序数组中的重复项

    力扣https leetcode cn com problems remove duplicates from sorted array 参考代码和注释 fn main let mut v Vec
  • Linux下Elasticsearch离线安装

    先去下载离线安装包 我这里是7 10 0 Past Releases of Elastic Stack Software Elastic 上传到 usr local下 解压 tar zxvf elasticsearch 7 10 0 lin
  • 【MATLAB】MATLAB打开后,提示内部崩溃,直接闪退关闭——解决方法

    问题描述 在第一次安装MATLAB软件时 正常使用 过了一段时间后 突然发现在命令行可以正常使用 但运行编译文件里的程序便会报 MathWorks 崩溃的错误 提示MATLAB遇到了内部问题 需要关闭 结果MATLAB自己闪退结束 解决方法
  • MATLAB(6)GUI应用介绍

    目录 GUI编辑器 控件 属性 回调函数 MATLAB常见的控件 普通按钮 切换按钮 可编辑文本 字符获取 字符显示 复选框 单选按钮 弹出式菜单 滑动条 列表框 表 坐标区 附录 各文件共享数据 保存 获取 GUI编辑器 MATLAB的G
  • 【问题记录】05 Host key for [ip] has changed and you have requested strict checking.Host key verification

    1 报错信息如下 为主机ip WARNING REMOTE HOST IDENTIFICATION HAS CHANGED IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY Someo
  • 操作系统实验——互斥与同步

    目录 1 SYSTEM V信号量 1 创建或打开 semget 2 申请或释放 semop 3 设置信号量 semctl 2 POSIX信号量 1 初始化 sem init 2 申请和释放 sem wait 3 销毁 sem destroy
  • 详细记录YOLACT实例分割ncnn实现

    点击上方 AI算法修炼营 选择加星标或 置顶 标题以下 全是干货 整理 公众号 深度学习与计算机视觉 作者 nihui 链接 https zhuanlan zhihu com p 128974102 本文转载自知乎 作者已授权 未经许可请勿