最全计算机视觉项目实战-目标检测与识别_utils_paths(1)

🌟写在前面

本此博客我们简单的介绍一下目标检测与识别,我们从头开始介绍,从最简单的然后逐渐的走进项目。首先我们介绍使用深度学习和CV去做一个简单的目标识别项目。

🌟目标识别的重要应用场景

目标识别技术已广泛应用于国民经济、空间技术和国防等领域
利用雷达和计算机对遥远目标进行辨认。现代雷达(包括热雷达和激光雷达)不但是对遥远目标进行探测和定位的工具,而且能够测量与目标形体和表面物理特性有关的参数,进而对目标分类和识别。雷达目标识别技术开始于50年代末期,美国人用单脉冲雷达跟踪并记录了苏联发射的第二颗人造地球卫星的回波,通过对回波信号的分析,确认卫星上装有角反射器。现代防空雷达已具有辨认少数典型飞机机型的能力。反弹道导弹防御雷达(见目标截获和识别雷达)能从洲际导弹的碎块和少量诱饵中识别出真弹头。在空间探测中,对月球和金星表面的地形测绘和电磁物理特性参数测量,以及判定卫星发射后太阳电池翼是否打开等,都能应用目标识别技术。
在地球遥感方面,微波遥感仪器可以测定潮汐、海冰厚度和海面风速;可以对农作物分类辨识,并作长势检查和产量估计;还可以勘探矿藏和石油等地球资源。
目标识别还可利用再入大气层后的大团过滤技术。当目标群进入大气层时,在大气阻力的作用下,目标群中的真假目标由于轻重和阻力的不同而分开,轻目标、外形不规则的目标开始减速,落在真弹头的后面,从而可以区别目标。目标分类与目标识别的含义稍有不同。目标分类是将被测目标与已知目标的训练样本一一比较,回答同或异(真或假)。而目标识别还要求指出目标特性的具体数值,如形体、表面粗糙度和介电常数等。因此识别比分类包含更多的目标特征信息。

🌟任务目标

主要做一个目标识别任务。比如说下面几个图片,我能够利用最后的程序来识别他们分别是什么物体。
在这里插入图片描述
在这里插入图片描述

这里面不仅仅包含棕熊和火箭,还可以做很多很多的任务识别。我们来看一下。
在这里插入图片描述
这里面做的是一个1000分类的任务。其中包括一些水果,比如香蕉,或者是一些球类,比如说篮球、假发等等。

🌟项目解析

首先我们导入了utils_paths模块以及三方工具包。

import utils_paths
import numpy as np
import cv2

那么我们来看一下utils_paths模块做了什么。

import os
image_types = (".jpg", ".jpeg", ".png", ".bmp", ".tif", ".tiff")
def list\_images(basePath, contains=None):
    # 返回有效的文件集
    return list_files(basePath, validExts=image_types, contains=contains)

def list\_files(basePath, validExts=None, contains=None):
    # 循环遍历目录结构 os.walk(path)是一个目录的迭代器。root就是本身的地址,dirs就是该文件夹下的子文件夹目录,filenames是path路径下文件
    for (rootDir, dirNames, filenames) in os.walk(basePath):
        # 循环遍历当前目录的中文名
        for filename in filenames:
            # 如果包含字符串不是none,并且文件名不包含提供的字符串,则忽略该文件
            if contains is not None and filename.find(contains) == -1:
                continue
            # 确定当前文件的文件扩展名
           	ext = filename[filename.rfind("."):].lower()
            # 检查该文件是否为图像,是否应该进行处理
            if validExts is None or ext.endswith(validExts):
                # 构造到图像的路径并生成它
                imagePath = os.path.join(rootDir, filename)
                yield imagePath

首先这个模块定义了照片的类型,都可以是什么格式的其中包括jpg、png等等。
os.walk(path)是一个目录的迭代器。其中返回三个参数。

  1. root就是本身的地址。
  2. dirs就是该文件夹下的子文件夹目录。
  3. filenames是path路径下文件。

我们这个模块的目标就是要拿到照片的路径。并且yield回主程序当中。yield表示一个一个返回,返回一个然后处理,然后在返回去一个,直到结束。然后这里面判断了一下照片的拓展名,然后进行了判断看文件的拓展名和我们设置的那几个一致不一致。如果一致,就可以进行路径提取了~

rows = open("synset\_words.txt").read().strip().split("\n")
classes = [r[r.find(" ") + 1:].split(",")[0] for r in rows]

我们先要对标签文件进行处理!那么这里strip()表示消除空格。split("\n")这里就是以空格为分隔符。也就是说我们要一行一行的处理。我们截取一部分来看一下。
在这里插入图片描述
遍历每一行,然后从第二个元素开始找,并且以为分隔符来看分类标签都是什么。这里就把分类标签弄好了。
这里我们用到了深度学习当中的caffe,导入的是所需要的配置文件。

net = cv2.dnn.readNetFromCaffe("bvlc\_googlenet.prototxt",
	"bvlc\_googlenet.caffemodel")

cv2.dnn.readNetFromCaffe用于读取已经训练好的caffe模型。我们截取配置文件的其中一部分来看一下。
在这里插入图片描述
我们可以看到就是做了卷积,池化等操作。同深度学习中的卷积神经网络的做法较为相似,只不过这个caffe网络做的较深。光网络结构这个就有2000行左右。我们在这里进行了导入。
在这里插入图片描述
DNN神经网络的组成:

  1. 输入层:神经网络的第一层,原始的样本数据
  2. 隐藏层:除了输入层,输出层,中间的都是隐藏层
  3. 输出层:神经网络的最后一层,最终的计算结果

神经网络的特点:

  1. 每个连接都有个权值
  2. 同一层神经元之间没有连接
  3. 最后的输出结果对应的层也称之为全连接层
imagePaths = sorted(list(utils_paths.list_images("images/")))

然后从utils_paths模块中拿到图片路径!

image = cv2.imread(imagePaths[0])
resized = cv2.resize(image, (224, 224))
# image scalefactor size mean swapRB 
blob = cv2.dnn.blobFromImage(resized, 1, (224, 224), (104, 117, 123))
print("First Blob: {}".format(blob.shape))

这里读入了照片,然后做了一次resize操作,resize成(224,224)的图片。然后我们使用了cv2.dnn.blobFromImage这个函数,我们在这里介绍一下。
在这里插入图片描述

cv2.dnn.blobFromImage就是得到预测结果。我们来细致的讲一下这里:
在深度学习和图像分类领域,预处理任务通常包括了三类。

  1. 减均值操作。
  2. 按照比例缩放。
  3. 通道交换。

在这里插入图片描述

Opencv提供两个函数用来促进图像预处理,用于深度学习分类。
减去均值帮助我们对抗输入图像的亮度变化,所以我们将减去均值作为作为一个技术用来帮助我们的卷积神经网络,通常三个通道,R均值,G均值,B均值。然后我们也有一个比例因子,需要加上一个标准化。
需要注意的一点就是:不是所有的深度学习架构执行减去均值和缩放。

blob=cv2.dnn.blobFromImage(image,scalefactor=1.0,size,mean,swapRB=True,crop=False,ddepth=CV_32F)

net.setInput(blob)
preds = net.forward()

然后我们做了一次前向传播。就可以得到结果了。

idx = np.argsort(preds[0])[::-1][0]
text = "Label: {}, {:.2f}%".format(classes[idx],
	preds[0][idx] \* 100)
cv2.putText(image, text, (5, 25),  cv2.FONT_HERSHEY_SIMPLEX,
	0.7, (0, 0, 255), 2)
cv2.imshow("Image", image)
cv2.waitKey(0)

然后我们取分值最大的,然后再图片上添加上标题。就ok了!然后展示出来。

for p in imagePaths[1:]:
	image = cv2.imread(p)
	image = cv2.resize(image, (224, 224))
	images.append(image)

# blobFromImages函数,注意有s
blob = cv2.dnn.blobFromImages(images, 1, (224, 224), (104, 117, 123))#均值
print("Second Blob: {}".format(blob.shape))

# 获取预测结果


![img](https://img-blog.csdnimg.cn/img_convert/c6a069ff83425e4bd1fd1e217f91f3b8.png)
![img](https://img-blog.csdnimg.cn/img_convert/1834557e4e30eb5c91f114c50ac8caa1.png)
![img](https://img-blog.csdnimg.cn/img_convert/7b69677fe254066b86dce678ef3b87c9.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**

03856)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**

  • 20
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Windows环境下使用GCC编译生成的动态链接库(c_utils.so)可以通过以下步骤进行运行: 1. 确保已安装GCC编译器:如果未安装GCC编译器,可以从MinGW(Minimalist GNU for Windows)网站下载并安装MinGW,或者从CYGWIN网站下载并安装Cygwin,这两个都是提供GCC编译器的选择。 2. 打开命令提示符(CMD):在Windows中,按下Win + R键打开运行框,输入"cmd",然后按下回车键,即可打开命令提示符。 3. 切换到动态链接库所在的目录:使用`cd`命令切换到存放动态链接库(c_utils.so)的目录。假设动态链接库在"D:\myproject"目录下,可以使用以下命令切换到该目录: ``` cd D:\myproject ``` 4. 运行可执行程序:使用GCC编译生成的动态链接库创建的可执行程序(例如"main")进行运行,可以通过以下命令运行: ``` gcc main.c -L. -lc_utils -o main ``` 上述命令中,"-L."用于指定当前目录为链接库所在目录,"-lc_utils"用于指定链接的库为"c_utils","-o main"用于指定生成的可执行程序的名称为"main"。在运行该命令后,将生成名为"main.exe"的可执行文件。 5. 执行可执行程序:在命令提示符中运行生成的可执行程序(main.exe),可以使用以下命令: ``` main.exe ``` 运行该命令后,将执行"main"程序,并使用动态链接库中的函数。 需要注意的是,以上步骤仅适用于使用GCC编译生成的动态链接库在Windows环境下的运行。如果使用其他编译器或需要其他特殊设置,可能需要进行相应的调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值