首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >yolov3-python接口调用

yolov3-python接口调用

作者头像
py3study
发布于 2020-01-08 09:16:42
发布于 2020-01-08 09:16:42
1.7K00
代码可运行
举报
文章被收录于专栏:python3python3
运行总次数:0
代码可运行

在YOLO官网提供的Darknet源码中,有一个使用python接口的示例程序 darknet.py 示例如下:https://github.com/pjreddie/darknet/blob/master/python/darknet.py 其处理一张图片的代码段如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if __name__ == "__main__":
    net = load_net("cfg/tiny-yolo.cfg", "tiny-yolo.weights", 0)
    meta = load_meta("cfg/coco.data")
    r = detect(net, meta, "data/dog.jpg")
    print r

此时,你可能会觉得这儿很麻烦,因为官网提供的接口用python处理一张图片的时候,只能传入图片路径?要是处理视频帧的话岂不是需要先将图片保存,获得路径后再调用接口?不需要!下面我们就来解决这个问题。

首先,看detect函数的定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def detect(net, meta, image, thresh=.5, hier_thresh=.5, nms=.45):
    im = load_image(image, 0, 0)
    num = c_int(0)
    pnum = pointer(num)
    predict_image(net, im)
    dets = get_network_boxes(net, im.w, im.h, thresh, hier_thresh, None, 0, pnum)
    num = pnum[0]
    if (nms): do_nms_obj(dets, num, meta.classes, nms);
res = []
for j in range(num):
    for i in range(meta.classes):
        if dets[j].prob[i] > 0:
            b = dets[j].bbox
            res.append((meta.names[i], dets[j].prob[i], (b.x, b.y, b.w, b.h)))
res = sorted(res, key=lambda x: -x[1])
free_image(im)
free_detections(dets, num)
return res

传入detect函数的第三个参数image是字符串类型,即路径,随后调用load_image函数加载图片得到im对象,(注意这个im是Darknet中自定义的结构体image类型,定义在include/darknet.h中,该文件的详细注释在群内有分享。)再进行后续处理,那么我们改写接口的时候就可以直接将第三个参数改为image类型。做如下的修改:

1、在darkenet.py中自定义一个函数,内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def nparray_to_image(img):
    data = img.ctypes.data_as(POINTER(c_ubyte))
    image = ndarray_image(data, img.ctypes.shape, img.ctypes.strides)
    return image

2、在darknet.py中增加如下行代码,增加位置找到类似代码的位置就好

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ndarray_image = lib.ndarray_to_image
ndarray_image.argtypes = [POINTER(c_ubyte), POINTER(c_long), POINTER(c_long)]
ndarray_image.restype = IMAGE

3、在image.c中增加如下代码段,增加位置大概558行,灵活修改就好

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifdef NUMPY
image ndarray_to_image(unsigned char* src, long* shape, long* strides)
{
    int h = shape[0];
    int w = shape[1];
    int c = shape[2];
    int step_h = strides[0];
    int step_w = strides[1];
    int step_c = strides[2];
    image im = make_image(w, h, c);
    int i, j, k;
    int index1, index2 = 0;
for(i = 0; i < h; ++i){
        for(k= 0; k < c; ++k){
            for(j = 0; j < w; ++j){

                index1 = k*w*h + i*w + j;
                index2 = step_h*i + step_w*j + step_c*k;
                //fprintf(stderr, "w=%d h=%d c=%d step_w=%d step_h=%d step_c=%d \n", w, h, c, step_w, step_h, step_c);
                //fprintf(stderr, "im.data[%d]=%u data[%d]=%f \n", index1, src[index2], index2, src[index2]/255.);
                im.data[index1] = src[index2]/255.;
            }
        }
    }

rgbgr_image(im);

return im;

4、在image.h的19行后面加如下代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifdef NUMPY
image ndarray_to_image(unsigned char* src, long* shape, long* strides);
#endif

5、在makefile的47行后面中加如下代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ifeq ($(NUMPY), 1) 
COMMON+= -DNUMPY -I/usr/include/python2.7/ -I/usr/lib/python2.7/dist-packages/numpy/core/include/numpy/
CFLAGS+= -DNUMPY
endif
1234

前几行加 一条 NUMPY=1,增加后为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GPU=1
CUDNN=1
OPENCV=1
OPENMP=0
NUMPY=1
DEBUG=0

6、重新编译make clean + make 7、修改darknet.py的后续处理,示例代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if __name__ == "__main__":
    net = load_net(b"cfg/yolov3.cfg", b"yolov3.weights", 0)
    meta = load_meta(b"cfg/coco.data")
    vid = cv2.VideoCapture(' 1pondo.avi  ')
    while True:
        return_value,arr=vid.read()
        im=nparray_to_image(arr)
        r = detect(net, meta, im)
        此时r中返回了检测到的边框信息,老铁你要怎么处理随便你!
       ......

8、更改detect函数的前面几行,更改后为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def detect(net, meta, im, thresh=.5, hier_thresh=.5, nms=.45):
    num = c_int(0)
    pnum = pointer(num)

说明:更改了形参image为im,直接使用im,不需要再读取,去掉了加载图片行的代码。 9、加群一起讨论交流

参考链接 https://github.com/pjreddie/darknet/issues/289#issuecomment-342448358 欢迎大家一起讨论交流,共同做好目标检测!码字不易,且行且珍惜!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        </div>
					<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-448c2d19d9.css" rel="stylesheet">
            </div>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/08/31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
NLP入门 | 通俗讲解Subword Models
之前介绍的模型都是基于词向量的, 那么能不能换一个角度来表示语言。说英文的时候, 每个单词都是由音节构成的, 而人们听到了连续的音节就可以理解其中的含义, 而音节显然比词粒度更细。
Datawhale
2020/07/23
1.7K0
NLP入门 | 通俗讲解Subword Models
【Embedding】fastText:极快的文本分类工具
今天我们来看 Mikolov 大佬 2016 年的另一大巨作——fastText。2013 年大佬在 Google 开源了 Word2Vec,2016 年刚就职于 FaceBook 就开源了 fastText,全都掀起了轩然大波。
beyondGuo
2020/06/12
2.8K0
NLP中的词向量对比:word2vec/glove/fastText/elmo/GPT/bert
一、文本表示和各词向量间的对比 1、文本表示哪些方法? 2、怎么从语言模型理解词向量?怎么理解分布式假设? 3、传统的词向量有什么问题?怎么解决?各种词向量的特点是什么? 4、word2vec和NNLM对比有什么区别?(word2vec vs NNLM) 5、word2vec和fastText对比有什么区别?(word2vec vs fastText) 6、glove和word2vec、 LSA对比有什么区别?(word2vec vs glove vs LSA) 7、 elmo、GPT、bert三者之间有什么区别?(elmo vs GPT vs bert)
zenRRan
2019/06/14
3.9K0
NLP中的词向量对比:word2vec/glove/fastText/elmo/GPT/bert
无所不能的Embedding 2. FastText词向量&文本分类
Fasttext是FaceBook开源的文本分类和词向量训练库。最初看其他教程看的我十分迷惑,咋的一会ngram是字符一会ngram又变成了单词,最后发现其实是两个模型,一个是文本分类模型[Ref2],表现不是最好的但胜在结构简单高效,另一个用于词向量训练[Ref1],创新在于把单词分解成字符结构,可以infer训练集外的单词。这里拿quora的词分类数据集尝试了下Fasttext在文本分类的效果, 代码详见 https://github.com/DSXiangLi/Embedding
风雨中的小七
2020/09/08
1.8K0
无所不能的Embedding 2. FastText词向量&文本分类
Python3 使用fastText进行文本分类 新闻分类
这篇论文的模型非常之简单,之前了解过word2vec的同学可以发现这跟CBOW的模型框架非常相似。
大鹅
2021/06/15
3.2K0
技术干货丨fastText原理及实践
fastText是Facebook于2016年开源的一个词向量计算和文本分类工具,在学术上并没有太大创新。但是它的优点也非常明显,在文本分类任务中,fastText(浅层网络)往往能取得和深度网络相媲美的精度,却在训练时间上比深度网络快许多数量级。在标准的多核CPU上, 能够训练10亿词级别语料库的词向量在10分钟之内,能够分类有着30万多类别的50多万句子在1分钟之内。 本文首先会介绍一些预备知识,比如softmax、ngram等,然后简单介绍word2vec原理,之后来讲解fastText的原理,并
达观数据
2018/04/02
4K0
技术干货丨fastText原理及实践
NLP系列文章:子词嵌入(fastText)的理解!(附代码)
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
mantch
2019/08/29
2.3K0
NLP系列文章:子词嵌入(fastText)的理解!(附代码)
基于深度学习的文本分类应用!
在基于机器学习的文本分类中,我们介绍了几种常见的文本表示方法:One-hot、Bags of Words、N-gram、TF-IDF。这些方法存在两个共同的问题:一是转换得到的向量维度很高,需要较长的训练实践;二是没有考虑到单词与单词之间的关系,只是进行了统计。
Datawhale
2020/08/17
6730
斯坦福NLP课程 | 第12讲 - NLP子词模型
教程地址:http://www.showmeai.tech/tutorials/36
ShowMeAI
2022/05/16
8180
斯坦福NLP课程 | 第12讲 - NLP子词模型
NLP︱高级词向量表达(二)——FastText(简述、学习笔记)
本文介绍了fastText这款基于子词(subword)的文本分类模型,该模型在文本分类任务上表现优异,具有较快的训练速度,并且支持多种语言。fastText采用子词建模,将文本拆分成子词,然后利用这些子词来训练模型。相较于word2vec和BERT等模型,fastText具有更高的训练效率和更好的性能。同时,fastText还可以用于多语言文本分类,并且不需要额外的预处理或数据标注。
悟乙己
2018/01/02
4K1
NLP︱高级词向量表达(二)——FastText(简述、学习笔记)
Fasttext 总结
这两个改变都是为了做分类,第一个不需要解释,第二个做文本分类只需要考虑一次整个句子的特征就行,所以不使用滑动窗口,这也是为了降低计算复杂度。
Steve Wang
2020/09/14
9560
机器学习|7种经典预训练模型原理解析
目前无论在CV领域还是NLP领域,预训练都是一个很普遍和普适的方法。我们都知道深度学习的模型越庞大,模型参数越多,为了避免过拟合就需要相应大规模的数据集,但对于很多任务而言,样本标注的成本昂贵。相反,大规模无标签数据库相对容易建立,为了充分利用这些无标记数据,我们可以先使用它们在其他一些任务上学习一个好的特征表示,再用于训练目标任务。
智能生信
2021/02/04
5.7K0
fastText细节及实践
fastText模型是类似CBOW的三层结构,关于这个结构的介绍,很多博客都讲了,这里我不多赘述,我主要叙述一下其中的部分细节
mathor
2020/06/18
1.3K1
fastText细节及实践
NLP︱高级词向量表达(二)——FastText(简述、学习笔记)「建议收藏」
1、NLP︱高级词向量表达(一)——GloVe(理论、相关测评结果、R&python实现、相关应用) 2、NLP︱高级词向量表达(二)——FastText(简述、学习笔记) 3、NLP︱高级词向量表达(三)——WordRank(简述) 4、其他NLP词表示方法paper:从符号到分布式表示NLP中词各种表示方法综述
全栈程序员站长
2022/08/10
1.5K0
NLP︱高级词向量表达(二)——FastText(简述、学习笔记)「建议收藏」
【关于 NLP】百问百答
作者:杨夕、芙蕖、李玲、陈海顺、twilight、LeoLRH、JimmyDU、艾春辉、张永泰、金金金
杨夕
2021/03/11
1.1K0
【关于 NLP】百问百答
深度 | 比深度学习快几个数量级,详解Facebook最新开源工具——fastText
导读:Facebook声称fastText比其他学习方法要快得多,能够训练模型“在使用标准多核CPU的情况下10分钟内处理超过10亿个词汇”,特别是与深度模型对比,fastText能将训练时间由数天缩
AI科技评论
2018/03/07
1.1K0
深度 | 比深度学习快几个数量级,详解Facebook最新开源工具——fastText
词向量(1)--从Word2Vec到ELMo
若你是做NLP的,一定对词向量很亲切,若你是做推荐的,对词向量也一定不会陌生,以词向量为代表的序列向量化方法已经成为机器学习中必不可少的实战利器。
流川枫
2020/04/24
9810
word2vec原理(二) 基于Hierarchical Softmax的模型
    word2vec原理(二) 基于Hierarchical Softmax的模型
刘建平Pinard
2018/08/07
1.3K0
word2vec原理(二) 基于Hierarchical Softmax的模型
NLP: Word Embedding 词嵌入(Part2: fastText)
word2vec, n-gram 等 word-embedding 方法选择用vector表示single word 而不考虑词根词缀之间的关系
JiahuiZhu1998
2022/12/03
7700
【特征提取+分类模型】4种常见的NLP实践思路
越来越多的人选择参加算法赛事,为了提升项目实践能力,同时也希望能拿到好的成绩增加履历的丰富度。期望如此美好,现实却是:看完赛题,一点思路都木有。那么,当我们拿到一个算法赛题后,如何破题,如何找到可能的解题思路呢。
昱良
2020/08/28
3.4K0
【特征提取+分类模型】4种常见的NLP实践思路
推荐阅读
相关推荐
NLP入门 | 通俗讲解Subword Models
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验