草莓味的棉花糖|使用HOG对卫星图像中的船舶进行分类

我在浏览Kaggle数据集时发现了这个有趣的机器学习数据集() 。 该机器学习数据集包括从卫星图像中提取的船舶图像以及一些负面实例 。 查看此机器学习数据集 , 我们就可以看到正实例被裁剪为具有相同的宽度和高度 。
【草莓味的棉花糖|使用HOG对卫星图像中的船舶进行分类】这些数据的一个明显应用将是训练一种“船舶探测器” , 这种探测器可以从更大的卫星图像上利用计算机视觉探测船舶 。
为了实现这一目标 , 我想到了一种基于方向梯度直方图(HOG)的方法 , 这是传统机器学习方法中使用的一种特征表示方法 。
机器学习数据集由2000个图像样本组成 。 我们可以使用HOG特征和SVM实现分类器 , 可以提供相当好的结果 。 由于船舶的外观统一、简单 , 所以我们无需依靠复杂的模型就能得到良好的结果 。
方向梯度直方图方向梯度的直方图 , 也称为HOG , 在计算机视觉任务中被大量使用 , 特别是在检测行人和类似任务时
Hala特征表示由Dalal和Triggs引入 , 作为行人检测任务的表示方法 。 该方法建立在图像的局部强度梯度或边缘方向可以表征局部物体外观的思想的基础上 。 HOG特征在行人检测等各种目标识别任务中都取得了成功 。 当我们考虑将其用作开发更复杂的特征方法(如DPM)的基础时 , 该方法的重要性是显而易见的 。
图像被分成小单元 , 例如8×8像素 。 在单元内的每个像素处计算梯度向量 。 梯度向量被分类为直方图 。 梯度向量的方向决定了它将落入哪个区域 。 向量的大小有助于直方图的频率 。 因此 , 梯度越大 , 对直方图值的影响越大 。
块归一化在原始论文中 , 作者提出了一种归一化方法 , 使该表示方法对光照具有更强的不变性 。 该方法是通过组合多个单元来创建块 , 即:可以通过组合两行和两列单元来创建块 。 将单元的直方图连接在一起 , 并通过将直方图除以连接的矢量的大小来归一化 。 以这样的方式创建块:在两个块之间存在一行或一列单元的重叠 。
实现HOG特征分类器出于我们的目的 , 让我们使用scikit-image中的hog实现 , 因为我们可以在其他分类器中使用计算的HOG特征 。
importnumpyasnpimportjsonfrommatplotlibimportpyplotaspltfromskimage.featureimporthogfromskimageimportcolor,img_as_floatfromskimage.ioimportimreadfromsklearnimportsvmfromsklearn.metricsimportclassification_report,accuracy_scorefromskimage.transformimportpyramid_gaussian#Thisportiondealswithextractingthecodefromthekaggledatasetf=open(r'../input/shipsnet.json')dataset=json.load(f)f.close()data=https://pcff.toutiao.jxnews.com.cn/p/20200813/np.array(dataset['data']).astype('uint8')img_length=80#Bitofreshapingtogetthedatasetinorderdata=https://pcff.toutiao.jxnews.com.cn/p/20200813/data.reshape(-1,3,img_length,img_length).transpose([0,2,3,1])
#Converttheimagestograyscaledata_gray=[color.rgb2gray(i)foriindata]#pixelspercellppc=16hog_images=[]hog_features=[]forimageindata_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)