基于python 的分类算法模板 -- 数据库索引、特征提取、分类、分类结果查看

我是用 jupyter notebook写的,各个功能模块清楚分明,顺便推荐给大家。 以图片分类为例:

主要依赖于:

  • scikit-learn
  • scikit-image
  • matplotlib
  • jupyter notebook
  • numpy
  • cv2 (倾向于使用 skimage image 代替之, skimage 使用的是 图像坐标 (通过行列检索),cv2使用笛卡尔坐标检索(x,y))

直接开始正文:

导入依赖库

  • 写个 lib.ipynb 将依赖库都放进去
%matplotlib inline
import platform

SYS = platform.system()

if 'Linux' in SYS:
    %run /home/v/WORKSPACE/GIT/LIB/lib.ipynb
else:
    %run d:/WORKSPACE/git/LIB/lib.ipynb
t1 = toc()

注意事项:

  1. lib.ipynb 是依赖库函数所在文件
  2. 为了方便linux 和 win 都能运行,所以加入最后几行。
  3. toc()函数是自己写的函数,为了方便整体计时,存放在lib里面,局部计时有%%timeit命令。

数据库(图片)路径

trainset = ps('image path for training ')
testset = ps('image path for testing')
print ("[INFO] There are %d classes in the trainset" % len(os.listdir(trainset)))

注意事项:

  1. ps函数可有可无,有兴趣的朋友可以留言。
  2. 每个文件夹存放一个类别的图片,文件夹的命名要体现图片label和category name,这样做会在分类上省事一些,通过下面的特征提取代码,大家可以看到。我的数据库是这样命名的:
train and test folders
class folders in train set

这样命名的好处很快可以在特征提取模块看到。

特征提取 -- HOG 特征

%%time
x_train=[]
y_train=[]

for floder_nmae in tqdm(os.listdir(trainset)):
    label= int( floder_nmae.split("__")[0] )

    class_path=os.path.join(trainset,floder_nmae)
    for img_name in os.listdir(class_path):
        img_path=os.path.join(class_path,img_name)
        
        ##  readin the original image
        ROI = imread(img_path, as_grey=True, resize =True, width =200, height =100)

        x_train.append(HOG(ROI,ori=9, ppc=(20, 20), cpb=(2, 2)))
        y_train.append(label)

     
x_test=[]
y_test=[]
        
for class_folder in tqdm(os.listdir(testset)):
    label= int( class_folder.split("__")[0] )

    class_path=os.path.join(testset,class_folder)
    for j in os.listdir(class_path):
        img_path=os.path.join(class_path,j)
        
        ##  readin the original image
        ROI = imread(img_path, as_grey=True, resize =True, width =200, height =100)
        
        x_test.append(HOG(ROI,ori=9,ppc=(20, 20), cpb=(2, 2)))
        y_test.append(label)
        
print (" number of train samples : %d " % len(x_train)  )
print (" number  of test samples : %d " % len(x_test)   )
print (" feature dim is : %d " % len(x_train[0])   )

注意事项:

  1. 文件夹命名的好处现在知道了吧,直接 .split("__")就可以得到类别label
  2. imread 函数和HOG函数都被我简单封装了下,存在lib里面,原因是不同语言各种各样的 图片读取, resize, 灰度化函数搞得我好乱啊,所以索性同一放在imread函数里面,集 图片读取,灰度化, resize, rescale于一身。如有朋友需要的话,我可以公布下这个函数。HOG函数也是一样,skimage不仅在HOG函数bins的方向上弄得不好,而且函数明明也过于冗长和复杂. ori = orientation, ppc = pixel per cell, cpb = cell per block 没人会质疑我的简化吧。
  3. 这部分的输出是这样的:
module output

wall time 就是jupyter notebook magic函数的功能,给出当前cell的运行时间。有机会写一系列 jupyter notebook (ipython) magic function的简文(如果有人提出的话)。

分类器的训练(linear SVM)

直接上代码

%%time

clf = svm.LinearSVC()

parameters = {
              'C': np.arange(1, 15, 1), 
              'multi_class': ['crammer_singer']
              }

# run randomized search
n_iter_search = 10
clf = RandomizedSearchCV(clf, 
                                   param_distributions = parameters, 
                                   n_iter = n_iter_search,
                                   n_jobs = 4,
                                   pre_dispatch = '2*n_jobs')

clf.fit(x_train, y_train)
  • crammer singer SVM 是为多类别分类设计的,这个我喜欢,因为效果好。
  • 现在知道 特征列表和label 列表明明的好处了吧。 x, y, train。体会一下。
  • 我特意加入了参数选择这一块,调参是个大问题,如果机器允许,就让他自己去找吧,当然是通过 coss validation的方式, Randomized SearchCV 默认是将训练数据5-fold还是6-fold, 这个参数也可以修改,需要的话可以百度 scikit learn documentation.
  • 这部分的输出: 有需要解释的地方可以提问。。。。。。
module output

测试 --测试集

这部分没啥说的, scikit learn 搞的函数接口还是简单易懂的。

y_pred = clf.predict(x_test)

分类结果 accuracy

  • 这里只提供了我写的 acc函数,scikit learn 没有提供acc的检测接口。 当然还有其他的准则去检验,如:precision, recall, f1 score. 这些还是不如acc 表达的清楚:分对的个数除以要分类的样本个数。
  • 依旧,acc被我封装起来了,存在lib.ipynb里面。
  • 上结果:
Paste_Image.png
  • 不用多解释了吧。
  • 函数总体运行时间,通过elapsed_time 得到, 现在知道toc()的作用了吧。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容