-
2021-02-06 15:19:57
前言
大家能看到这篇文章,想必对HOG还是有些了解了,那我就不赘述了,其实我自己不太懂,但是还是比刚开始好一些了。下面我的代码是参考这位博主的:点我查看
上面那位博主是用的cifar-10数据集,但是我们的数据集很可能是普通的图片,所以我进行了一些改进。
注意事项:
-
你的图片长宽可以不相等,设置好
image_height
和image_width
即可。
如果图片大小不相等,可以使用change_size.py,把所有图片大小resize成一样的。 -
你图片对应的标签必须是这样的:
001.jpg 1
003.jpg 2前面是图片名称,后面是对应的类别(类别用数字表示),中间要用空格隔开,每个标签占一行。
你要准备两个文件,一个是训练用的,一个是测试用的。
训练样本标签和预测的都是一样的格式
大家可以看github上面的实例.(image文件夹) -
你的训练和测试的图片可以放在同一个文件夹下面,也可以不同,设置好
train_image_path
和test_image_path
即可。 -
你要根据你图片的大小,对这行代码进行一些调整,这个调整需要你先了解hog的知识:
fd = hog(gray, orientations=18, pixels_per_cell=[8,8], cells_per_block=[4,4], visualise=False, transform_sqrt=True)
这是我为128x128大小图片设置的提取hog特征的参数,你需要适当改变一些,到时候的效果也不同。
orientations
我是选9或18,即梯度方向的个数一般来说,图片越大,
pixels_per_cell
和cells_per_block
里面的值可以相应变大。 -
如果你要进行多次,建议你把文件位置的参数写死
#训练集图片的位置 train_image_path = '/home/icelee/Downloads/dataset/small_shixun/' #测试集图片的位置 test_image_path = '/home/icelee/Downloads/dataset/small_shixun/' #训练集标签的位置 train_label_path = '/home/icelee/Downloads/dataset/mydata.txt' #测试集标签的位置 test_label_path = '/home/icelee/Downloads/dataset/test.txt' #图片大小 image_height = 128 image_width = 128
-
你需要安装sk-learn库,hog,PIL库等。可能还有一些零碎的库,大家用pip安装就好。
-
实验都是彩色图片,如果你的图片是纯黑白的,很有可能需要改一下代码,看一下代码注释即可
采用这个测试cifar-10,准确率有50%多一点点(乱猜的准确率是10%),所以效果还是可以的,虽然比不上深度学习。
为了方便大家查看,代码放在了github:GitHub - xiaobingchan/HOG_SVM: 使用HOG+SVM进行图像分类
可能出现的错误
ValueError: Expected 2D array, got 1D array instead: array=[]. Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.
出现上面的错误说明没有正常读取到图片,所以请检查图片宽高是不是和设置的size一样,路径是否正确。更改之后运行程序时,请选择重新获取特征。任何程序错误,以及技术疑问或需要解答的,请添加
更多相关内容 -
-
hog_svm图像分类(python代码)+图片
2022-01-05 10:35:51下载后,安装好版本匹配的python3.6,numpy,scipy,matplot,sklearn,skimage等包,后直接可以运行,无需修改代码。运行后输入y,就可以实习自带的图像分类(小鸡,小鸭,蛇,猫等分类)。 -
HOG_SVM:使用HOG+SVM进行图像分类
2021-05-11 14:06:09HOG+SVM 使用说明: 上面的hog_svm.py是用于训练的,通过提取图片的hog特征,然后通过SVM进行训练得到model,最后通过model进行预测,将结果写入result.txt文件之中。 代码不难,大家根据需要自己改改。 不要将hog的... -
hog+SVM图片分类实例
2018-08-03 10:06:29本代码是hog+svm分类实例,对于新手入门图像处理是个很好的实例,要运行本代码,需在代码同一级目录下建pos和neg文件夹,还有网上找几张图片,就可以运行了。还有更改一下路径就可以了。 -
HOG+SVM图像分类算法
2018-07-24 09:53:42基于HOG+SVM的图像分类算法,训练集和测试集根据自己的需要自行创立 -
svm_hog python图像分类。成功实现
2022-01-05 10:30:00python3.6,svm-hog图像分类,成功测试。代码图片打包下载。直接运行。python使用svm,hog进行图像分类时,需要使用sklearn,skimage,numpy,matplotlib等。这些包如果版本不对应很难成功运行代码。
svm_hog python源码下载地址
下载的压缩文件及其解压后的文件
配置好各种包后,直接运行hog_svm.py(注意:把raw_input (这个是python2.0版本的)改成 input(这个是python3的))
运行后程序输出
文件夹中的变化:
多了几个文件夹和一个输出测试结果 result.txt. 上面三个文件夹中都有训练产生的特征和参数。
result.txt里面是预测的结果
欢迎各位客官,点赞,收藏,加关注。
-
【实战类】Hog SVM进行图像分类任务
2021-08-26 13:46:37cifarc10图像下载地址:http://www.cs.toronto.edu/~kriz/cifar.html ...cifar转图像操作 import cv2 import numpy as np import os def unpickle(file): import _pickle as cPickle with open(file, 'rb')..目录
案例训练数据:cifar 10
图像下载地址(后面我们要用这批数据作为训练数据):CIFAR-10 and CIFAR-100 datasets
http://www.cs.toronto.edu/~kriz/cifar.html本文参考链接:HOG + SVM 进行图片分类(python)_程序员的点滴-CSDN博客_svm图片二分类python
https://blog.csdn.net/q1242027878/article/details/74271694HOG的描述:
图像处理——梯度直方图HOG_lanling1996的博客-CSDN博客_梯度直方图 图像处理之特征提取:HOG特征简单梳理 HOG方向梯度直方图,这里分解为方向梯度与直方图。 一、方向梯度 梯度:在向量微积分中,标量...
https://blog.csdn.net/lanling1996/article/details/112589519HOG主要应用于行人检测方面,以行人照片为例:
一、训练数据准备:cifar转图像操作
案例操作中使用的训练数据是cifar10的数据,这里我们需要先把原始数据,转为图像数据,进行本地化保存,下载好数据后,进行转图操作,转图代码如下:
import cv2 import numpy as np import os def unpickle(file): import _pickle as cPickle with open(file, 'rb') as f: dict = cPickle.load(f, encoding='iso-8859-1') return dict def main(cifar10_data_dir): train_txt=[] test_txt=[] for i in range(1, 2): train_data_file = os.path.join(cifar10_data_dir, 'data_batch_' + str(i)) print(train_data_file) data = unpickle(train_data_file) print('unpickle done', data) for j in range(10000): img = np.reshape(data['data'][j], (3, 32, 32)) img = img.transpose(1, 2, 0) img_name = 'train/' + str(data['labels'][j]) + '_' + str(j + (i - 1) * 10000) + '.jpg' cv2.imwrite(os.path.join(cifar10_data_dir, img_name), img) train_txt.append(str(data['labels'][j]) + '_' + str(j + (i - 1) * 10000) + '.jpg' + ' ' + str(data['labels'][j])) np.savetxt(r"./train.txt", np.reshape(train_txt, -1), delimiter=',', fmt='%5s') test_data_file = os.path.join(cifar10_data_dir, 'test_batch') data = unpickle(test_data_file) for i in range(10000): img = np.reshape(data['data'][i], (3, 32, 32)) img = img.transpose(1, 2, 0) img_name = 'test/' + str(data['labels'][i]) + '_' + str(i) + '.jpg' cv2.imwrite(os.path.join(cifar10_data_dir, img_name), img) test_txt.append(str(data['labels'][i]) + '_' + str(i) + '.jpg' + ' ' + str(data['labels'][i])) np.savetxt(r"./test.txt", np.reshape(test_txt, -1), delimiter=',', fmt='%5s') if __name__ == "__main__": main('cifar-10-batches-py')
如果遇到这个问题:
python 3以上版本使用pickle.load读取文件报UnicodeDecodeError: 'ascii' codec can't decode byte 0x8b in position 6
二、训练和验证部分
直接方代码,边训练边学习这段代码的含义,主要思路就是一下几点:
- 原图转hog梯度图
- 加载特征和标签进行训练
- 测试评估
# -*- coding=utf-8 -*- import glob import platform import time from PIL import Image from skimage.feature import hog import numpy as np import os import joblib from sklearn.svm import LinearSVC import shutil import sys # 第一个是你的类别 第二个是类别对应的名称 输出结果的时候方便查看 label_map = {0: 'airplane', 1: 'automobile', 2: 'bird', 3: 'cat', 4: 'deer', 5: 'dog', 6: 'frog', 7: 'horse', 8: 'ship', 9: 'truck,' } # 训练集图片的位置 train_image_path = './database/train' # 测试集图片的位置 test_image_path = './database/test' # 训练集标签的位置 train_label_path = os.path.join('./labels', 'train.txt') # 测试集标签的位置 test_label_path = os.path.join('./labels', 'test.txt') image_height = 32 image_width = 32 train_feat_path = './feature/train/' test_feat_path = './feature/test/' model_path = 'model/' # 获得图片列表 def get_image_list(filePath, nameList): print('read image from ', filePath) img_list = [] for name in nameList: temp = Image.open(os.path.join(filePath, name)) img_list.append(temp.copy()) temp.close() return img_list # 提取特征并保存 def get_feat(image_list, name_list, label_list, savePath): i = 0 for image in image_list: try: # 如果是灰度图片 把3改为-1 image = np.reshape(image, (image_height, image_width, -1)) except: print('发送了异常,图片大小size不满足要求:', name_list[i]) continue #gray = rgb2gray(image) / 255.0 # 如果直接就是灰度图 gray = image # 这句话根据你的尺寸改改 fd = hog(gray, orientations=12, block_norm='L1', pixels_per_cell=[8, 8], cells_per_block=[4, 4], visualize=False, transform_sqrt=True) fd = np.concatenate((fd, [label_list[i]])) fd_name = name_list[i] + '.feat' fd_path = os.path.join(savePath, fd_name) joblib.dump(fd, fd_path) i += 1 print("Test features are extracted and saved.") # 变成灰度图片 def rgb2gray(im): gray = im[:, :, 0] * 0.2989 + im[:, :, 1] * 0.5870 + im[:, :, 2] * 0.1140 return gray # 获得图片名称与对应的类别 def get_name_label(file_path): print("read label from ", file_path) name_list = [] label_list = [] with open(file_path) as f: for line in f.readlines(): #一般是name label 三部分,所以至少长度为3 所以可以通过这个忽略空白行 if len(line) >= 3: name_list.append(line.split(' ')[0]) label_list.append(line.split(' ')[1].replace('\n','').replace('\r','')) if not str(label_list[-1]).isdigit(): print("label必须为数字,得到的是:",label_list[-1], "程序终止,请检查文件") exit(1) return name_list, label_list # 提取特征 def extra_feat(): train_name, train_label = get_name_label(train_label_path) test_name, test_label = get_name_label(test_label_path) train_image = get_image_list(train_image_path, train_name) test_image = get_image_list(test_image_path, test_name) get_feat(train_image, train_name, train_label, train_feat_path) get_feat(test_image, test_name, test_label, test_feat_path) # 创建存放特征的文件夹 def mkdir(): if not os.path.exists(train_feat_path): os.mkdir(train_feat_path) if not os.path.exists(test_feat_path): os.mkdir(test_feat_path) # 训练和测试 def train_and_test(): t0 = time.time() features = [] labels = [] correct_number = 0 total = 0 for feat_path in glob.glob(os.path.join(train_feat_path, '*.feat')): data = joblib.load(feat_path) features.append(data[:-1]) labels.append(data[-1]) ############ 训练部分 ############ """ print("Training a Linear LinearSVM Classifier.") clf = LinearSVC() clf.fit(features, labels) # 下面的代码是保存模型的 if not os.path.exists(model_path): os.makedirs(model_path) joblib.dump(clf, model_path + 'model') """ ############ 训练完验证部分 ############ # 下面的代码是加载模型 可以注释上面的代码 直接进行加载模型 不进行训练 clf = joblib.load(model_path+'model') print("训练之后的模型存放在model文件夹中") # exit() result_list = [] for feat_path in glob.glob(os.path.join(test_feat_path, '*.feat')): total += 1 if platform.system() == 'Windows': symbol = '\\' else: symbol = '/' image_name = feat_path.split(symbol)[1].split('.feat')[0] data_test = joblib.load(feat_path) data_test_feat = data_test[:-1].reshape((1, -1)).astype(np.float64) result = clf.predict(data_test_feat) print(result) result_list.append(image_name + ' ' + str(result[0]) + '\n') if int(result[0]) == int(data_test[-1]): correct_number += 1 write_to_txt(result_list) rate = float(correct_number) / total t1 = time.time() print('准确率是: %f' % rate) print('耗时是 : %f' % (t1 - t0)) def write_to_txt(list): with open('result.txt', 'w') as f: f.writelines(list) print('每张图片的识别结果存放在result.txt里面') if __name__ == '__main__': mkdir() # 不存在文件夹就创建 # need_input = input('是否手动输入各个信息?y/n\n') if sys.version_info < (3,): need_extra_feat = input('是否需要重新获取特征?y/n\n') else: need_extra_feat = input('是否需要重新获取特征?y/n\n') if need_extra_feat == 'y': shutil.rmtree(train_feat_path) shutil.rmtree(test_feat_path) mkdir() extra_feat() train_and_test()
cifar10的训练和测试结果,如下:
是否需要重新获取特征?y/n y read label from ./labels\train.txt read label from ./labels\test.txt read image from ./database/train read image from ./database/test Test features are extracted and saved. Test features are extracted and saved. Training a Linear LinearSVM Classifier. 训练之后的模型存放在model文件夹中 每张图片的识别结果存放在result.txt里面 准确率是: 0.460400 耗时是 : 12.241030
三、hog梯度图可视化
直观的查看下hog梯度方向直方图的样式,以一张其它图像为例进行展示,你也可以替换为你自己的图像,如下:
from skimage.feature import hog from skimage import io from PIL import Image import cv2 img = cv2.cvtColor(cv2.imread('./database/train_medical/DRCrop_3.png'), cv2.COLOR_BGR2GRAY) print(img.shape) normalised_blocks, hog_image = hog(img, orientations=9, pixels_per_cell=(8, 8), cells_per_block=(8, 8), block_norm='L2-Hys', visualize=True) io.imshow(hog_image) io.show()
-
matlab版hog+svm图像二分类
2016-12-20 14:29:42该代码实现的是图像的二分类,hog用于图像的特征提取,svm表示的是对特征的分类。解压缩后,在添加到matlab的工作目录后,需要在代码中修改一下资源文件的路径(比如正负样本的图片路径),才可以正确运行。 -
HOG+SVM图像二分类
2016-09-23 17:05:24HOG+SVM图像二分类 -
hog+svm图像二分类
2019-01-14 16:43:52hog+svm图像二分类*(MATLAB版本),需要安装libsvm工具箱(环境是MATLAB2014a+libsvm3.23)。里面包含正负样本集图片。 -
SVM+HOG对图像进行分类(MATLAB实现)
2017-04-28 14:26:14主要完成对多种类型的图像进行分类,1、对图像HOG特征进行提取。2、SVM对提取的特征进行训练。3、预测未知图像。网上看到关于用opencv对图像进行分类的不少,这次用MATLAB做了些尝试,图像数据集为:链接: https://pan.baidu.com/s/1i5OhC7z 密码: utn7,其他MATLAB版本http://blog.csdn.net/libin88211/article/details/19968205 ,点击打开链接,http://blog.csdn.net/jcy1009015337/article/details/53763484 另外opencv版本的为:点击打开链接,http://blog.csdn.net/always2015/article/details/47107129
废话就不说,直接上代码(适合MATLAB 2016b版本及以上),代码有相应注释。
我训练的图像在磁盘上位置如下,包含5个类别,省去了前人制作txt存储图像路径的过程:
测试图像分布为:
%% 用hog特征对图像进行多分类,svm训练,1 VS 1 %% 1 数据集,包括训练的和测试的 (注意自己图片存放路径,附录我给出示例下载图片链接) imdsTrain = imageDatastore('F:\svm_images\train_images',... 'IncludeSubfolders',true,... 'LabelSource','foldernames'); imdsTest = imageDatastore('F:\svm_images\test_image'); %% 显示训练的图片种类Labels和数量Count Train_disp = countEachLabel(imdsTrain); disp(Train_disp); %% 2 对训练集中的每张图像进行hog特征提取,测试图像一样 % 预处理图像,主要是得到features特征大小,此大小与图像大小和Hog特征参数相关 imageSize = [256,256];% 对所有图像进行此尺寸的缩放 image1 = readimage(imdsTrain,1); scaleImage = imresize(image1,imageSize); [features, visualization] = extractHOGFeatures(scaleImage); imshow(scaleImage);hold on; plot(visualization) % 对所有训练图像进行特征提取 numImages = length(imdsTrain.Files); featuresTrain = zeros(numImages,size(features,2),'single'); % featuresTrain为单精度 for i = 1:numImages imageTrain = readimage(imdsTrain,i); imageTrain = imresize(imageTrain,imageSize); featuresTrain(i,:) = extractHOGFeatures(imageTrain); end % 所有训练图像标签 trainLabels = imdsTrain.Labels; % 开始svm多分类训练,注意:fitcsvm用于二分类,fitcecoc用于多分类,1 VS 1方法 classifer = fitcecoc(featuresTrain,trainLabels); %% 预测并显示预测效果图 numTest = length(imdsTest.Files); for i = 1:numTest testImage = readimage(imdsTest,i); scaleTestImage = imresize(testImage,imageSize); featureTest = extractHOGFeatures(scaleTestImage); [predictIndex,score] = predict(classifer,featureTest); figure;imshow(testImage); title(['predictImage: ',char(predictIndex)]); end
命令行对训练集imdsTrain
统计输出结果如下:
第一张图像显示的是提取到的HOG特征,这个主要可以初步了解下特征是否选择的合适,不合适可以调节extractHOGFeatures里面的参数,如cellsize,blocksize,bins等,具体可以参考这个点击打开链接 http://cn.mathworks.com/help/vision/ref/extracthogfeatures.html?searchHighlight=extractHOGFeatures&s_tid=doc_srchtitle。本程序选择的默认参数,从图1可以预览到特征分别合适。
-
Matlab实现HOG+SVM图像分类
2017-10-16 15:47:23我训练的图像在磁盘上位置如下,包含5个类别,省去了前人制作txt存储图像路径的过程: 测试图像分布为: 作者的代码写的非常工整,值得学习,尤其是利用了imageDatastore这种存储格式,使用... -
基于HOG特征与SVM算法的图像分类 .docx
2022-01-03 19:09:22本次实验使用的是自己提出的一个关于路面裂缝的crack数据集,为提升实验效果,先提取图像HOG特征,再利用SVM来进行分类训练,以识别图片中是否存在裂缝。本文设计了完整的HOG+SVM识别算法,使用自己提出的crack数据集... -
HOG SVM系列 文章目录
2021-07-23 14:21:25现在将HOG+SVM分类方面的文章做一个目录如下: ① 行人检测HOG+SVM:综述、INRIADATA数据集、线性SVM ② 行人检测(2)——环境配置:Matlab安装libsvm ③ 两个红外数据集:KAIST 和 SCUT的 adas 行人数据集 ④ ... -
svm图像二分类_matlab版hog
2019-04-10 22:24:00在代码中修改一下资源文件的路径,采用的MATLAB自带svmtrain函数,配置libsvm时需要进行一定处理,避免svmtrain函数冲突,该Demo完全有效 -
SVM + HOG实现图像分类
2019-06-02 11:32:21imdsTrain = imageDatastore('H:\DataSet\usr\svm_images\train_images',... 'IncludeSubfolders',true,... 'LabelSource','foldernames'); &amp;amp;amp;gt;&amp;amp;amp;gt; imdsTest = im -
Hog+SVM算子(图像分类)
2018-05-24 11:00:28图像分类算法:第一张图像显示的是提取到的HOG特征,这个主要可以初步了解下特征是否选择的合适,不合适可以调节extractHOGFeatures里面的参数,如cellsize,blocksize,bins等,具体可以参考这个点击打开链接 ... -
HOG+SVM 图像二分类
2016-10-24 20:22:18HOG+SVM 图像二分类 -
hog+svm图像检测流程 --python
2022-03-24 16:00:57利用hog和svm进行的图像检测,详细的流程以及python代码实现。(未完待续。。。) 6. 模型调整好后,就可以进行图像的检测,为了更好的突出显示检测效果.. -
hogsvmmatlab代码-Manual-Gear-Detection:使用HOG特征和SVM分类器检测手动档位
2021-06-12 17:11:24hog svm matlab代码使用 HOG 特征和 SVM 分类检测手动档位 ...湾将解析后的图像分类到 data/ground_gear_ranges/ 和 data/test_gear_ranges/ 中的相应文件夹中为了提高准确性,请包含尽可能多的来自 -
HOG+SVM——多分类
2020-05-25 11:31:37由于需要进行行人和车辆检测,那么如何将行人和车辆一起进行多分类呢? 由于先考虑了行人检测的问题,行人检测通常suppose长宽比为2:1,那么目标检测后的切片就得为2:1,涉及到对其他目标进行padding的问题。其他... -
SVM+HOG对图像进行多分类(OpenCV实现)
2017-08-09 16:51:39前几个月写了篇关于MATLAB实现SVM+HOG对图像进行多分类,链接:http://blog.csdn.net/cuixing001/article/details/70908064,先开始是用opencv实现的,可是识别效果很差,以为我写错代码了,后来纠结了好久好久,才... -
HOG+SVM进行图像分类
2014-07-13 15:48:16http://www.360doc.com/content/13/0313/11/2036337_271208986.shtml 可以用来参考的程序 -
matlab实现hog+svm图像二分类
2016-12-20 16:19:45最近因为需要实现hog+svm的分类代码,网上找了一些例子,觉得这篇博客还不错:http://blog.csdn.net/libin88211/article/details/19968205,下面结合该博客写一下步骤,供新手们交流学习~~ hog干嘛的?hog就是提取... -
HOG+SVM行人检测算法
2018-06-10 21:29:59在2005年CVPR上,来自法国的研究人员Navneet Dalal 和Bill Triggs提出利用Hog进行特征提取,利用线性SVM作为分类器,从而实现行人检测。而这两位也通过大量的测试发现,HOG +SVM是速度和效果综合平衡性能较好的一种... -
python svm+hog 训练自己的数据集实现图像多分类
2022-06-04 18:12:54https://gitee.com/qitiandashengdiyun/HOG_SVM_OK其他python svm的源码都是读取的非图片文件,这个源码是读取图片,并分类的。亲测可用 参考: https://blog.csdn.net/sinat_28371057/article/details/113726321 ...