1.1.  项目简介

  目标检测(Object Detection)的任务是在图像中找出检测对象的位置和犬小,是计算机视觉领域的核心问题之一,在自动驾驶、机器人和无人机等许多领域极具研究价值。

  随着深度学习的兴起,基于深度学习的目标检测算法逐渐成为主流。深度学习是指在多层神经网络上运用各种机器学习算法决图像、文本等各种问题的算法集合。因此,基于深度学习的目标检测算法又披称为目标检测网络。

  本项目使用一种名为 MobileNet-SSD的目标检测网络对图像进行目标捡测。

  MobileNet-SSD 能够在图像中检测出飞机、自行车、鸟、船、瓶子、公交车、汽车、猫、椅子、奶牛、餐桌、狗、马、摩托车、人、盆栽、羊、沙发、火车和电视机共 20 种物体和 1 种背景,平均准确率能达到72. 7%。由于训练神经网络需要大量的数据和强大的算力,这里将使用一个已经训练好的目

  标检测网络模型。在 Python 中,可以通过OpenCV 的dnn模块使用训练好的模型对图像进行目标检测,其步骤如下。

  (1)  加载 MobileNet_SSD目标检测网络模型。

  (2)  读入待检测图像,并将其转换成 blob 数据包。

  (3)  将 blob 数据包传入目标检测网络,并进行前向传播。

  (4) 根据返回结果标注图像中被检测出的对象。

  1.2.  准备工作

  在磁盘上创建一个名为“object-detect”的文件夹作项目目录,用于存放本项目的模型、源程序、图像和视频等文件,然后从原书“资源包/第 34 课”文件夹中把 model、images 和 videos3 个文件夹复制到“object-detect”文件夹中。

  在model文件夹中提供 MobileNetSSD目标捡测网络模型文件,包括神经网络模型文件 MobileNetSSD_deploy.caffemodel 和网络结构 描述文件MobileNetSSD_deploy.prdtotxt。

  在images文件夹中提供一些用于进行目标检测的图像,这些图像里含有汽车、飞机、行人、马、猫等。

  1.3.  目标检测过程

  新建一个空白源文件,以object_detection.jl作为文件名保存至“object-detect”文件夹中,然后编写程序检测图像中的物体,具体过程如下。

  (1) 导入cv2和其他模块

using PyCall
using Printf
using Distributions
cv2=pyimport("cv2")

  说明:Printf库主要用于字符串的格式化输出。Distributions库是用于概率分布和相关函数的Julia包,这里用于配合随机数发生器,生成一定分布范围的随机数。Distributions库需要安装。

  (2) 创建表示图像文件、网络描述文件和网络模型文件等的变量。

#指定图像和模型文件路径
image_path = "./images/example_1.jpg"
prototxt = "./model/MobileNetSSD_deploy.prototxt"
model = "./model/MobileNetSSD_deploy.caffemodel"

  (3) 创建物体分类标签、颜色和字体等的变量。

#设定目标名称
CLASSES = ("background", "aeroplane", "bicycle", "bird", "boat",
"bottle", "bus", "car", "cat", "chair", "cow", "dining-table",
"dog", "horse", "motorbike", "person", "pottedplant", "sheep",
"sofa", "train", "tvmonitor")
COLORS =rand(Uniform(0, 255),length(CLASSES),3)#
FONT = cv2.FONT_HERSHEY_SIMPLEX

  CLASSES 变量中这些分类标签是通过 MobileNet-SSD 网络训练的能够被检测的物体的名称,包括20种物体和1种背景。

  COLORS 变量存放的是随机分配的标签颜色。这里原python代码是这样的:

  COLORS =numpy.random.uniform(0, 255, size=(len(CLASSES), 3))

  对于Julia,我们安装了Distributions库,就可以配合rand函数生成0-255范围内的随机数。

  (4) 使用dnn模块从文件中加载神经网络模型。

#加载网络模型
net = cv2.dnn.readNetFromCaffe(prototxt, model)

  (5) 从文件中加载待检测的图像,用来构造一个 blob 数据包。

#读取图像并进行预处理
image = cv2.imread(image_path)
(h, w) = size(image)[1:2]
input_img = cv2.resize(image, (300, 300))
blob = cv2.dnn.blobFromImage(input_img, 0.007843, (300, 300), 127.5 rimg = permutedims(image, ndims(image):-1:1)
pyimg = PyReverseDims(rimg)

  cv2.dnn.blobFromImage函数返回一个blob 数据包,它是经过均值减法、归一化和通道交换之后的输人图。由于训练 MobileNet-SSD 网络时使用的是 300 * 300 大小的图像,所以这里也需要使用相同尺寸的图像。

  (6) 将 blob 数据包传人 MobileNet-SSD目标检测网络,并进行前向传播,然后等待返回检测结果。

#将图像传入网络
net.setInput(blob)
detections = net.forward()

  (7) 用循环结构读取检测结果中的检测区域,并标注出矩形框、分类名称和可信度。

#对结果进行处理
for i in 1:size(detections)[3]
idx =floor(Int,detections[1, 1, i, 2])
confidence = detections[1, 1, i, 3]
if confidence > 0.2
#画矩形框
#println(size(detections))
box = detections[1, 1, i, 4:7].* [w, h, w, h]
(x1, y1, x2, y2) = floor.(Int,box)#.astype("int")
#println(idx)
cv2.rectangle(pyimg, (x1, y1), (x2, y2), COL-ORS[idx], 2)
#标注信任度
label =label=@sprintf("[INFO] %s: %0.2f%%",CLASSES[idx], confidence * 100)
#print(label)
cv2.putText(pyimg, label, (x1, y1), FONT, 1, COLORS[idx], 1)
end
end

  (8) 将检测结果图像显示在窗口中。

#显示图像并等待
cv2.imshow("Image", pyimg)
cv2.waitKey(0)
cv2.destroyAllWindows()

  至此 目标检测程序编写完毕。运程程序,对图像(example_1.jpg)的检测结果如图所示:

由于源码包比较大,博客园限制上传。我把源码放在了这里:

julia+OpenCV目标检测代码-深度学习文档类资源-CSDN文库

对比python学julia(第四章:人工智能)--(第三节)目标检测的更多相关文章

  1. python学习心得第四章

     python 学习心得第四章 1.lambda表达式 1:什么是lambda表达式 为了简化简单函数的代码,选择使用lambda表达式 上面两个函数的表达式虽然不一样,但是本质是一样的,并且lamb ...

  2. 进击的Python【第十四章】:Web前端基础之Javascript

    进击的Python[第十四章]:Web前端基础之Javascript 一.javascript是什么 JavaScript 是一种轻量级的编程语言. JavaScript 是可插入 HTML 页面的编 ...

  3. 《Python CookBook2》 第四章 Python技巧 对象拷贝 && 通过列表推导构建列表

    (先学第四章) 对象拷贝 任务: Python通常只是使用指向原对象的引用,并不是真正的拷贝. 解决方案: >>> a = [1,2,3] >>> import c ...

  4. [Python学习笔记][第四章Python字符串]

    2016/1/28学习内容 第四章 Python字符串与正则表达式之字符串 编码规则 UTF-8 以1个字节表示英语字符(兼容ASCII),以3个字节表示中文及其他语言,UTF-8对全世界所有国家需要 ...

  5. 《零压力学Python》 之 第四章知识点归纳

    第四章(决策和循环)知识点归纳 if condition: indented_statements [ elif condition: Indented_statements] [else: Inde ...

  6. python 教程 第十四章、 地址薄作业

    第十四章. 地址薄作业 #A Byte of Python #!/usr/bin/env python import cPickle import os #define the contacts fi ...

  7. 2018-06-20 中文代码示例视频演示Python入门教程第四章 控制流

    知乎原链 续前作: 中文代码示例视频演示Python入门教程第三章 简介Python 对应在线文档: 4. More Control Flow Tools 录制中出了不少岔子. 另外, 输入法确实是一 ...

  8. DeepLearning.ai学习笔记(四)卷积神经网络 -- week3 目标检测

    一.目标定位 这一小节视频主要介绍了我们在实现目标定位时标签该如何定义. 上图左下角给出了损失函数的计算公式(这里使用的是平方差) 如图示,加入我们需要定位出图像中是否有pedestrian,car, ...

  9. 【Learning Python】【第四章】Python代码结构(一)

    这一章的主旨在于介绍python的代码结构 缩进 在很多的编程语言中,一般{}用于控制代码块,比如以下的一段C代码 if(var <= 10) { printf("....." ...

  10. Python开发【第四章】:Python函数剖析

    一.Python函数剖析 1.函数的调用顺序 #!/usr/bin/env python # -*- coding:utf-8 -*- #-Author-Lian #函数错误的调用方式 def fun ...

随机推荐

  1. 8.10考试总结(NOIP模拟35)[玩游戏·排列·最短路·矩形]

    所谓人,无论是谁到了最后,都会形单影只. T1 玩游戏 解题思路 可以把序列从 k 位置掰成两个序列. 问题就变成了两个序列从开头走向末尾是否可以保证前缀和之和一直不大于 0 . 并且可以移动到两个序 ...

  2. 2023 Hive 面试大纲

    先说一些废话 总结一下Hive面试宝典中的要点,方便读者快速过一遍Hive面试所需要的知识点. 本文请搭配 Hive面试宝典 来食用更美味哟 ┗( ▔, ▔ )┛ 方便自己系统性回忆,根据*的数量来标 ...

  3. 如果设备不支持vulkan,就用swiftshader,否则就加载系统的vulkan的正确姿势(让程序能够智能的在vulkan-1.dll和libvk_swiftshader.dll之间切换)

    一些老的显卡设备没有更新驱动,甚至根本就不支持Vulkan的显卡,遇到静态链接的vulkan-1.lib文件,启动exe就会崩溃. 你以为从别的机器拷贝这个vulkan-1.dll就可以了吗? 太傻太 ...

  4. 使用命令行(powershell)压缩(7Z RAR)指定日期文件

    使用命令行(powershell)压缩(7Z RAR)指定日期文件,powershell ,7z. WINDOWS命令行是无法按时间过滤文件的,我们通过powershell 里的Get-ChildIt ...

  5. wpfui:一个开源免费具有现代化设计趋势的WPF控件库

    wpfui介绍 wpfui是一款开源免费(MIT协议)具有现代化设计趋势的WPF界面库.wpfui为wpf的界面开发提供了流畅的体验,提供了一个简单的方法,让使用WPF编写的应用程序跟上现代设计趋势. ...

  6. restful接口返回JSONObject和父类抽象实现类设计,请求头获取sign和支付宝RSA签名验签工具类方法

    restful接口返回JSONObject和父类抽象实现类设计,请求头获取sign和支付宝RSA签名验签工具类方法 1.JSONObject可以通用数据的灵活性,类似Map数据,数据字段不清晰.具体返 ...

  7. IDEA生成类和方法注释模板详细说明 绝对好用

    吐槽 今天心血来潮,将使用了很久的IDEA旗舰版卸载了,想换社区版用一段时间,毕竟社区版开源免费.精简不卡顿,如果够用的话以后就省去了破解的烦恼,而且可以紧跟官网使用最新版 旧的IDEA配置忘记保存了 ...

  8. c/c++:带有返回类型的函数没有return语句会怎么样?

    c/c++:带有返回类型的函数没有return语句会怎么样 背景 机器有时候启动的时候发现异常,跟踪了代码发现,有人在写一个int函数的时候,有一个分支没有return: 参考:https://www ...

  9. git连接到https服务器时出现“gnutls_handshake() failed”

    git连接到https服务器时出现"错误: gnutls_handshake()失败" 问题描述 当我尝试使用git连接到任何HTTPS服务器时(例如git clone),它会出现 ...

  10. 全国产T3+FPGA的SPI与I2C通信方案分享

    近年来,随着中国新基建.中国制造2025规划的持续推进,单ARM处理器越来越难胜任工业现场的功能要求,特别是如今能源电力.工业控制.智慧医疗等行业,往往更需要ARM + FPGA架构的处理器平台来实现 ...