首页 > 编程语言 >对比python学julia(第四章:人工智能)--(第三节)目标检测

对比python学julia(第四章:人工智能)--(第三节)目标检测

时间:2022-10-07 17:15:15浏览次数:58  
标签:python 检测 image cv2 julia 目标 -- blob 图像

  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)的检测结果如图所示:

 

标签:python,检测,image,cv2,julia,目标,--,blob,图像
From: https://www.cnblogs.com/zjzkiss/p/16759996.html

相关文章

  • AudioMixer中是如何决定track是否需要resample
    AudioMixer中是如何决定track是否需要resample?AudioMixer内部有成员变量mSampleRate和mTracks,Track对象内部有个成员变量sampleRate,在MixerThread进行prepareTracks_l检......
  • mysql sql语句
    基本sql语句不区分大小写,关键字尽量大写。ddl数据库操作showdabebases;查询所有数据库selectdababase();创建数据库系统creatdatabase[ifnotexists]数据库名[d......
  • MyBatis框架:第八章:自定义结果集,一对一,一对多,延迟加载,赖加载
    13.1、自定义结果集介绍自定义结果集,可以给复杂的对象使用。也就是对象内又嵌套一个对象。或者一个集合。在这种情况下。前面学过的知识点,已经无法直接获取出对象内对象......
  • docker部署WordPress
    下载数据库镜像[root@docker~]#dockerpullmysql:latest[root@docker~]#dockerimagesREPOSITORYTAGIMAGEIDCREATEDSIZErp......
  • 块级元素和行内元素
    一、块级元素(blockelement)块级元素总是从新行开始,并占据可用的全部宽度(尽可能向左和向右伸展)。这个<div>元素属于块级元素。块级元素的一些例子:<div><h1>......
  • R及R Studio下载安装教程(超详细)
     R语言是为数学研究工作者设计的一种数学编程语言,主要用于统计分析、绘图、数据挖掘。如果你是一个计算机程序的初学者并且急切地想了解计算机的通用编程,R语言不是一......
  • P2467 地精部落 题解
    P2467地精部落题解比较恶心的一道线性dp。要求1~N的排列,满足a[i-1]<a[i]>a[i+1]或a[i-1]>a[i]<a[i+1],求这样的排列的个数。既然是线性dp,那么状态一定和长度有关,一维的......
  • 压位高精度封装
    C++压位高精度封装模板普通的高精度算法都是一位只存放一个数字,但是我们这样显然浪费了大量的空间,一个int可以存放超过\(2\times10^9\)大小的数,考虑利用int的多位......
  • 文件管理工具“三剑客” #Everything #SpaceSniffer #Clover
    前言:本文收集了我日常使用的三个文件管理工具:文件搜索神器——Everything磁盘文件占用分析工具——SpaceSniffer文件资源管理器——Clover下面我从工具解决的痛点和......
  • ssm 竞赛管理系统
    ​ ​编辑​编辑    ​编辑1系统管理员系统管理员对各个模块具有最高权限,实现对个模块的综合管理,登录后,可以新建竞赛,对竞赛信息做出相应的增删改查,其详细功能如......