我在浏览Kaggle数据集时发现了这个有趣的机器学习数据集(https://www.kaggle.com/rhammell/ships-in-satellite-imagery)。该机器学习数据集包括从卫星图像中提取的船舶图像以及一些负面实例。查看此机器学习数据集,我们就可以看到正实例被裁剪为具有相同的宽度和高度。

卫星捕获船舶的图像

这些数据的一个明显应用将是训练一种“船舶探测器”,这种探测器可以从更大的卫星图像上利用计算机视觉探测船舶。

我们可以训练机器学习模型来检测大型卫星图像中的船只

为了实现这一目标,我想到了一种基于方向梯度直方图(HOG)的方法,这是传统机器学习方法中使用的一种特征表示方法。

机器学习数据集由2000个图像样本组成。我们可以使用HOG特征和SVM实现分类器,可以提供相当好的结果。由于船舶的外观统一、简单,所以我们无需依靠复杂的模型就能得到良好的结果。

方向梯度直方图

方向梯度的直方图,也称为HOG,在计算机视觉任务中被大量使用,特别是在检测行人和类似任务时

Hala特征表示由Dalal和Triggs引入,作为行人检测任务的表示方法。该方法建立在图像的局部强度梯度或边缘方向可以表征局部物体外观的思想的基础上。HOG特征在行人检测等各种目标识别任务中都取得了成功。当我们考虑将其用作开发更复杂的特征方法(如DPM)的基础时,该方法的重要性是显而易见的。

图像被分成小单元,例如8×8像素。在单元内的每个像素处计算梯度向量。梯度向量被分类为直方图。梯度向量的方向决定了它将落入哪个区域。向量的大小有助于直方图的频率。因此,梯度越大,对直方图值的影响越大。

块归一化

在原始论文中,作者提出了一种归一化方法,使该表示方法对光照具有更强的不变性。该方法是通过组合多个单元来创建块,即:可以通过组合两行和两列单元来创建块。将单元的直方图连接在一起,并通过将直方图除以连接的矢量的大小来归一化。以这样的方式创建块:在两个块之间存在一行或一列单元的重叠。

实现HOG特征分类器

出于我们的目的,让我们使用scikit-image中的hog实现,因为我们可以在其他分类器中使用计算的HOG特征。

import numpy as npimport jsonfrom matplotlib import pyplot as pltfrom skimage.feature import hogfrom skimage import color,img_as_floatfrom skimage.io import imreadfrom sklearn import svmfrom sklearn.metrics import classification_report,accuracy_scorefrom skimage.transform import pyramid_gaussian#This portion deals with extracting the code from the kaggle datasetf = open(r'../input/shipsnet.json')dataset = json.load(f)f.close()data = np.array(dataset['data']).astype('uint8')img_length = 80#Bit of reshaping to get the dataset in orderdata = data.reshape(-1,3,img_length,img_length).transpose([0,2,3,1])

为了使用图像来计算hog特征,我们需要将图像转换为灰度。转换后的图像用于计算直方图。

#Convert the images to grayscaledata_gray = [ color.rgb2gray(i) for i in data]#pixels per cellppc = 16hog_images = []hog_features = []for image in data_gray: fd,hog_image = hog(image, orientations=8, pixels_per_cell=(ppc,ppc),cells_per_block=(4, 4),block_norm= 'L2',visualise=True) hog_images.append(hog_image) hog_features.append(fd)

hog函数返回两个值。存储在fd变量中的HOG特征和可用于表示图像的HOG特征的图像,其存储在hog_image变量中。如果您不想显示图像,只需将visualise参数设置为False,即可将其关闭 。

如果我们可视化hog_images对应于之前的图像,我们将得到这样的结果

在下一节中,我们准备我们的训练和测试数据集,比例为80:20。然后我们训练支持向量机来分类图像是否包含船。Python代码如下:

#Extract the labels from the datasetlabels = np.array(dataset['labels']).reshape(len(dataset['labels']),1)#Create the classifierclf = svm.SVC()hog_features = np.array(hog_features)data_frame = np.hstack((hog_features,labels))#Shuffle the data setnp.random.shuffle(data_frame)percentage = 80partition = int(len(hog_features)*percentage/100)x_train = data_frame[:partition,:-1]x_test = data_frame[partition:,:-1]y_train = data_frame[:partition,-1:].ravel() y_test = data_frame[partition:,-1:].ravel()#Train the classifier with the training dataclf.fit(x_train,y_train)

然后我们使用测试集来评估模型。为了更好地理解数据,最后会报告一些指标。

y_pred = clf.predict(x_test)print("Accuracy: "+str(accuracy_score(y_test, y_pred)))print('')print(classification_report(y_test, y_pred))

结论

本研究的目的是探讨传统计算机视觉技术在应用于普通图像识别任务时的性能。鉴于我们没有花太多时间调整参数,它还是相当不错的。使用HOG参数(例如每个单元的像素数和每个块的单元格)可能会产生不同的结果。这个结果表明我们并不总是需要求助于复杂的学习任务,有时解决方案可能很简单。在这篇文章中我们只研究了给定图像的分类,我们还没有涉及对象定位。有许多方法可以在图像中查找和定位对象,例如滑动窗口和选择性搜索以及诸如候选区域之类的新技术。

中input宽度_使用HOG对卫星图像中的船舶进行分类相关推荐

  1. 卫星图像中的车辆分析--A Large Contextual Dataset for Classification, Detection and Counting of Cars

    A Large Contextual Dataset for Classification, Detection and Counting of Cars with Deep Learning ECC ...

  2. python图像检测_如何用Python检测图像中的矩形项

    我发现了很多关于使用openCV等人在图像中找到"东西"的问题.在 Python中,但到目前为止,我一直无法将它们拼凑在一起,以便为我的问题提供可靠的解决方案. 我正在尝试使用计算 ...

  3. pythongui界面复选框数值选择并求和_如何使用Python从图像中分离复选框按钮和复......

    我已经拆分了以并行方式排列的图像,并像下面的图像一样保存了它们. 这是我的工作代码,用于拆分方形复选框和该图像中的文本. # Import necessary libraries from matpl ...

  4. python中数据读写_【循序渐进学Python——文件中数据的读写以及操作】

    [循序渐进学Python--文件中数据的读写以及操作] [循序渐进学Python--文件中数据的读写以及操作] [循序渐进学Python--文件中数据的读写以及操作] 相信大家都想过自己有一天,可以用 ...

  5. 神经网络和局部拉普拉斯滤波方法在高分辨率卫星图像中的应用

    原文:Applying Neural Network and Local Laplace Filter Methods to Very High Resolution Satellite Imager ...

  6. python中input()函数的返回是什么类型_Python中input函数的用法是什么?

    "input()"函数是输入函数,用于接受一个标准输入数据,且返回string类型.在Python3中,去除了"raw_input()"函数,仅保留了" ...

  7. python获取图片像素矩阵_用python处理图片实现图像中的像素访问

    这篇文章主要介绍了关于用python处理图片实现图像中的像素访问,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 前面的一些例子中,我们都是利用Image.open()来打开一幅图像,然 ...

  8. python像素大于_用python处理图片实现图像中的像素访问

    前面的一些例子中,我们都是利用Image.open()来打开一幅图像,然后直接对这个PIL对象进行操作.如果只是简单的操作还可以,但是如果操作稍微复杂一些,就比较吃力了.因此,通常我们加载完图片后,都 ...

  9. java中script类_在Scripting java(javax.script)中导入一个类

    我想将我在项目中创建的类导入到我的脚本中 我这样做但它不起作用: function doFunction(){ //Objectif Mensuel importPackage(java.lang); ...

  10. matlab中删除照片_如何使用matlab从图像中删除划痕

    如果您知道划痕的位置,则此问题称为 inpainting,并且存在非常复杂的算法.因此,一种方法是尽可能好地检测划痕,然后在其上使用标准的修复算法.我在Mathematica中玩了一下你的形象: 首先 ...

最新文章

  1. Hibernate学习笔记(一)----针对不同的数据库不同的配置
  2. python中文编码-python中文编码json中文输出问题
  3. Windows 公共控件库研究
  4. 怎么一键备份服务器系统还原,电脑怎么一键还原
  5. python电脑推荐_6款Python必备的可视化工具推荐
  6. Android之通过ContentProvider实现两个app(进程间)间通信以及函数调用
  7. 依赖: ros-melodic-desktop 但是它将不会被安装_npm系列之依赖管理
  8. X86 CPU特性之(3)-kaiser
  9. 请教如何注销从微信登陆的CSDN账户?
  10. vc6.0编译c++程序后在vc2008中调试的技巧(符号信息和链接)
  11. RiceQuant和 JoinQuant合成月k线、周k线的极简公式
  12. Qcom平台,dump解析环境配置
  13. 技术:车牌识别摄像机的应用,无人值守洗车房解决方案
  14. python学习笔记---Python基础【廖雪峰】
  15. 多线程系列学习:AQS(一)获取锁
  16. AndroidPlayPlane战机小游戏
  17. 腾讯云服务器Ubuntu系统如何使用 root 用户远程登录
  18. GROMACS中mdp文件注解小结
  19. Hadoop随堂练习
  20. get请求和post请求的区别(简洁易懂)

热门文章

  1. 多态在 Java 和 C++ 编程语言中的实现比较
  2. IE ADD for rms
  3. 十二款世界顶级杀毒软件下载,有序列号
  4. c#虹软2.0免费人脸识别 实例
  5. 易到起死回生的背后,谁在指点江山?
  6. 第一次java实验报告
  7. [IT技术]改变计算技术的伟大算法
  8. typedef NS_ENUM 等枚举介绍
  9. 深入浅出JavaScript (四)DHTML
  10. H3CSE(路由)学习笔记----下