整合營銷服務商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          計算機視覺-python實現(xiàn)花的分類

          計算機視覺-python實現(xiàn)花的分類

          建一個rbghistogram.py文件

          import cv2 
          class RGBHistogram:
           def __init__(self,bins):
           # store the number of bins the histogram will use 
           self.bins=bins 
           def describe(self,image,mask=None):
           # compute a 3D histogram in the RGB colorspace,
           # then normalize the histogram so that images
           # with the same content,but either scaled larger
           # or smaller will have(roughly) the same histogram
           hist=cv2.calcHist([image],[0,1,2],
           mask,self.bins,[0,256,0,256,0,256])
           cv2.normalize(hist,hist)
           # return out 3D histogram as a flattened array
           return hist.flatten() 
          

          我們首先導入cv2,這是我們需要創(chuàng)建圖像描述符的唯一的package。

          然后,我們定義了RGBHistogram類,用于封裝花卉圖像的量化方式。__init__方法只接受一個參數(shù)——一個包含3D直方圖的bins的列表。

          描述圖像將由describe方法處理,該方法接收兩個參數(shù),一個將構建顏色直方圖的圖像,以及一個可選的mask。如果我們提供mask,則只有與mask區(qū)域相關聯(lián)的像素將用于構造直方圖。這允許我們僅描述圖像的花瓣,忽略圖像的其余部分(即,背景,其與花本身無關)。

          接著,構造直方圖。calcHist函數(shù)的第一個參數(shù)是我們想要描述的圖像的列表,該函數(shù)具體的參數(shù)請參考前面的文章。然后將生成的圖像進行標準化,并以特征向量返回。

          注意:cv2.normalize函數(shù)在OpenCV 2.4.X和OpenCV 3.0之間略有不同。 在OpenCV 2.4.X中,cv2.normalize函數(shù)實際上會返回規(guī)范化的直方圖。 但是,在OpenCV 3.0+中,cv2.normalize實際上對函數(shù)內的直方圖進行了規(guī)范化,并更新了傳入的第二個參數(shù)(即“輸出”)。這是一個微妙但重要的區(qū)別,在使用這兩個參數(shù)時要記住 OpenCV版本.

          現(xiàn)在已經(jīng)定義了圖像描述符,我們可以創(chuàng)建代碼來對給定花朵的物種進行分類:

          from __future__ import print_function
          from preprocess import RGBHistogram
          from sklearn.preprocessing import LabelEncoder
          from sklearn.ensemble import RandomForestClassifier
          from sklearn.cross_validation import train_test_split
          from sklearn.metrics import classification_report
          import numpy as np 
          import argparse
          import glob
          import cv2 
          # construct the argument parser and parse the arguments
          ap=argparse.ArgumentParser()
          ap.add_argument("-i", "--images", required=True,
           help="path to the image dataset")
          ap.add_argument("-m", "--masks", required=True,
           help="path to the image masks")
          args=vars(ap.parse_args())
          

          我們首先導入必要的package。我們首先導入了RGBHistogram用于描述我們的每個圖像。

          然后導入scikit-learn庫的LabelEncoder類。為了構建機器學習分類器以區(qū)分花種,我們首先需要一種方法來編碼與每個花類相關聯(lián)的“類標簽”。我們希望將向日葵,番紅花,雛菊和三色紫羅蘭區(qū)分開來,但為了構建機器學習模型,這些種類(以字符串表示的)需要轉換為整數(shù)。LabelEncoder類就是用來干這件事的。

          我們使用的實際分類模型是RandomForestClassifier。隨機森林是用于分類的集成學習方法,由多個決策樹組成。

          對于隨機森林中的每棵樹,構建一個自舉(替換采樣)樣本,通常由66%的數(shù)據(jù)集組成。然后,基于自舉樣本構建決策樹。在樹中的每個節(jié)點處,僅采用預測變量的樣本來計算節(jié)點分割標準。通常使用sqrt(n)預測變量,其中n是特征空間中預測變量的數(shù)量。然后重復該過程以訓練森林中的多棵樹(關于隨機森林分類器的詳細內容超出了本文的范圍,有興趣的可以參考機器學習方法)。

          但是,如果您是使用機器學習的新手,隨機森林是一個很好的起點,特別是在計算機視覺領域,他們只需很少的努力即可獲得更高的精度。同樣,雖然這不適用于所有計算機視覺分類問題,但隨機森林是獲得基線準確度的良好起點。

          然后我們從scikit-learn導入train_test_split函數(shù)。在構建機器學習模型時,我們需要兩組數(shù)據(jù):訓練集(training set)和測試(testing set)(或驗證(validation set))集。

          我們使用training data對機器學習模型進行訓練(在這種情況下,我們使用隨機森林學習模型)。然后使用testing data對模型進行評估。

          保持這兩組是獨一無二的非常重要,因為它允許在尚未看到的數(shù)據(jù)點上評估模型。如果模型已經(jīng)看到了數(shù)據(jù)點,那么結果是有偏見的,因為它具有不公平的優(yōu)勢!

          最后,我們使用NumPy進行數(shù)值處理,使用argparse來解析命令行參數(shù),使用glob來抓取磁盤上的圖像路徑,使用cv2進行OpenCV綁定。

          接著我們需要兩個命令行參數(shù):--images,指向包含其花圖像的目錄,--mask,指向包含mask鮮花的目錄。這些mask使我們只能專注于我們想要描述的花朵部分(即花瓣),忽略背景和其他雜亂,否則會扭曲特征向量并插入不需要的噪音。

          更多關于此數(shù)據(jù)集請參考Flowers

          # grab the image and mask paths 
          imagePaths=sorted(glob.glob(args["images"] + "\\*.png"))
          maskPaths=sorted(glob.glob(args["masks"] + "\\*.png"))
          # initialize the list of data and class label targets
          data=[]
          target=[]
          # initialize the image descriptor
          desc=RGBHistogram([8,8,8])
          # loop over the image and mask paths 
          for (imagePath,maskPath) in zip(imagePaths,maskPaths):
           # load the image and mask 
           image=cv2.imread(imagePath)
           mask=cv2.imread(maskPath)
           mask=cv2.cvtColor(mask,cv2.COLOR_BGR2GRAY)
           # describe the image 
           features=desc.describe(image,mask)
           # update the list of data and targets 
           data.append(features)
           target.append(imagePath.split("_")[-2])
          

          我們使用glob來分別抓住我們的圖像和mask的路徑。通過傳入包含圖像的目錄,然后是通配符*.png,我們能夠快速構建圖像路徑列表。

          接著,我們簡單地初始化數(shù)據(jù)矩陣和類標簽列表(即花的種類)。

          然后實例化我們的圖像描述符——每個通道有8個bins的3D RGB顏色直方圖。該圖像描述符將產(chǎn)生用于表征花的顏色的8×8×8=512維特征向量。

          接著我們開始在我們的圖像和mask上循環(huán)。我們將圖像和mask從磁盤中加載進來,然后在、將mask轉換為灰度。

          接著應用我們的3D RGB顏色直方圖產(chǎn)生我們的特征向量,然后將其存儲在數(shù)據(jù)矩陣中。

          然后解析花的種類,并更新target列表。

          現(xiàn)在我們可以應用我們的機器學習方法了。

          # grab the unique target names and encode the labels 
          targetNames=np.unique(target)
          le=LabelEncoder()
          target=le.fit_transform(target)
          # construct the training and testing splits 
          (trainData,testData,trainTarget,testTarget)=train_test_split(data,target,
           test_size=0.3,random_state=42)
          # train the classifier
          model=RandomForestClassifier(n_estimators=25,random_state=84)
          model.fit(trainData,trainTarget)
          # evaluate the classifier 
          print(classification_report(testTarget,model.predict(testData),
           target_names=targetNames))
          

          首先,我們給我們的類標簽進行編碼。NumPy的unique方法用于查找唯一的species名稱,然后將其輸入LabelEncoder。調用fit_transform將“唯一”物種名稱“擬合(fits)”為整數(shù),一個species對應于一個category,然后將字符串“轉換(transform)”為相應的整數(shù)類。target變量現(xiàn)在包含一個整數(shù)列表,每個數(shù)據(jù)點對應一個整數(shù)列表,其中每個整數(shù)映射到一個花種名稱。

          接著,我們開始構建我們的訓練和測試集。我們將使用train_test_split函數(shù)。我們需要傳遞我們數(shù)據(jù)矩陣和target列表,指定測試數(shù)據(jù)集是整個數(shù)據(jù)集大小的30%。使用偽隨機狀態(tài)42,以便我們可以在以后的運行中重現(xiàn)我們的結果。

          調用RandomForestClassifier函數(shù),使用森林中的25個決策樹進行訓練。同樣,明確使用偽隨機狀態(tài),以便我們的結果是可重復的。

          然后使用classification_report函數(shù)打印出我們的模型的準確性。我們將實際testing targets作為第一個參數(shù)傳遞,然后讓模型預測它認為花種對測試數(shù)據(jù)的影響。然后,classification_report函數(shù)將預測與真實targets進行比較,并為整個系統(tǒng)和每個單獨的類別標簽打印準確度報告。

          為了進一步研究分類,我們定義了以下代碼:

          # loop over a sample of the images 
          for i in np.random.choice(np.arange(0,len(imagePaths)),10):
           # grab the image and mask paths 
           imagePath=imagePaths[i]
           maskPath=maskPaths[i]
           # load the image and mask 
           image=cv2.imread(imagePath)
           mask=cv2.imread(maskPath)
           mask=cv2.cvtColor(mask,cv2.COLOR_BGR2GRAY)
           # describe the image 
           features=desc.describe(image,mask)
           # predict what type of flower the image is 
           flower=le.inverse_transform(model.predict([features]))[0]
           print(imagePath)
           print("I think this flower is a {}".format(flower.upper()))
           cv2.imshow("image",image)
           cv2.waitKey(0)
          

          我們首先從所有圖片里面隨機挑選10張不同的圖像進行調查,然后獲取對應的圖片和mask的路徑。

          然后我們將圖片和mask的路徑加載進來。并將mask圖片轉換為灰度圖像。

          然后,我們利用describe提取特征向量,以表征花的顏色。

          我們查詢我們的隨機森林分類器以確定花的種類,然后將其打印到控制臺并屏幕上顯示。

          最后執(zhí)行我們的腳本程序:

          python classify.py --image dataset\images --mask dataset\masks
          

          運行結果

          博客地址(有完整代碼):https://0leo0.github.io/2018/case_study_06.html

          關注不迷路哦!!!

          TML 代碼約定

          很多 Web 開發(fā)人員對 HTML 的代碼規(guī)范知之甚少。

          在2000年至2010年,許多Web開發(fā)人員從 HTML 轉換到 XHTML。

          使用 XHTML 開發(fā)人員逐漸養(yǎng)成了比較好的 HTML 編寫規(guī)范。

          而針對于 HTML5 ,我們應該形成比較好的代碼規(guī)范,以下提供了幾種規(guī)范的建議。

          使用正確的文檔類型

          文檔類型聲明位于HTML文檔的第一行:

          <!DOCTYPE html>

          如果你想跟其他標簽一樣使用小寫,可以使用以下代碼:

          <!doctype html>

          使用小寫元素名

          HTML5 元素名可以使用大寫和小寫字母。

          推薦使用小寫字母:

          • 混合了大小寫的風格是非常糟糕的。

          • 開發(fā)人員通常使用小寫 (類似 XHTML)。

          • 小寫風格看起來更加清爽。

          • 小寫字母容易編寫。

          不推薦:

          <SECTION>

          <p>這是一個段落。</p>

          </SECTION>

          非常糟糕:

          <Section>

          <p>這是一個段落。</p>

          </SECTION>

          推薦:

          <section>

          <p>這是一個段落。</p>

          </section>

          關閉所有 HTML 元素

          在 HTML5 中, 你不一定要關閉所有元素 (例如 <p> 元素),但我們建議每個元素都要添加關閉標簽。

          不推薦:

          <section>

          <p>這是一個段落。

          <p>這是一個段落。

          </section>

          推薦:

          <section>

          <p>這是一個段落。</p>

          <p>這是一個段落。</p>

          </section>

          關閉空的 HTML 元素

          在 HTML5 中, 空的 HTML 元素也不一定要關閉:

          我們可以這么寫:

          <meta charset="utf-8">

          也可以這么寫:

          <meta charset="utf-8" />

          在 XHTML 和 XML 中斜線 (/) 是必須的。

          如果你期望 XML 軟件使用你的頁面,使用這種風格是非常好的。

          使用小寫屬性名

          HTML5 屬性名允許使用大寫和小寫字母。

          我們推薦使用小寫字母屬性名:

          • 同時使用大小寫是非常不好的習慣。

          • 開發(fā)人員通常使用小寫 (類似 XHTML)。

          • 小寫風格看起來更加清爽。

          • 小寫字母容易編寫。

          不推薦:

          <div CLASS="menu">

          推薦:

          <div class="menu">

          屬性值

          HTML5 屬性值可以不用引號。

          屬性值我們推薦使用引號:

          • 如果屬性值含有空格需要使用引號。

          • 混合風格不推薦的,建議統(tǒng)一風格。

          • 屬性值使用引號易于閱讀。

          以下實例屬性值包含空格,沒有使用引號,所以不能起作用:

          <table class=table striped>

          以下使用了雙引號,是正確的:

          <table class="table striped">

          圖片屬性

          圖片通常使用 alt 屬性。 在圖片不能顯示時,它能替代圖片顯示。

          <img src="html5.gif" alt="HTML5" style="width:128px;height:128px">

          定義好圖片的尺寸,在加載時可以預留指定空間,減少閃爍。

          <img src="html5.gif" alt="HTML5" style="width:128px;height:128px">

          空格和等號

          等號前后可以使用空格。

          <link rel="stylesheet" href="styles.css">

          但我們推薦少用空格:

          <link rel="stylesheet" href="styles.css">

          避免一行代碼過長

          使用 HTML 編輯器,左右滾動代碼是不方便的。

          每行代碼盡量少于 80 個字符。

          空行和縮進

          不要無緣無故添加空行。

          為每個邏輯功能塊添加空行,這樣更易于閱讀。

          縮進使用兩個空格,不建議使用 TAB。

          比較短的代碼間不要使用不必要的空行和縮進。

          不必要的空行和縮進:

          <body>

          <h1>菜鳥教程</h1>

          <h2>HTML</h2>

          <p>

          菜鳥教程,學的不僅是技術,更是夢想。

          菜鳥教程,學的不僅是技術,更是夢想。

          菜鳥教程,學的不僅是技術,更是夢想,

          菜鳥教程,學的不僅是技術,更是夢想。

          </p>

          </body>

          推薦:

          <body>

          <h1>菜鳥教程</h1>

          <h2></h2>

          <p>菜鳥教程,學的不僅是技術,更是夢想。

          菜鳥教程,學的不僅是技術,更是夢想。

          菜鳥教程,學的不僅是技術,更是夢想。

          菜鳥教程,學的不僅是技術,更是夢想。</p>

          </body>

          表格實例:

          <table>

          <tr>

          <th>Name</th>

          <th>Description</th>

          </tr>

          <tr>

          <td>A</td>

          <td>Description of A</td>

          </tr>

          <tr>

          <td>B</td>

          <td>Description of B</td>

          </tr>

          </table>

          列表實例:

          <ol>

          <li>London</li>

          <li>Paris</li>

          <li>Tokyo</li>

          </ol>

          省略 <html> 和 <body>?

          在標準 HTML5 中, <html> 和 <body> 標簽是可以省略的。

          以下 HTML5 文檔是正確的:

          實例:

          <!DOCTYPE html>

          <head>

          <title>頁面標題</title>

          </head>

          <h1>這是一個標題</h1>

          <p>這是一個段落。</p>

          嘗試一下 ?

          不推薦省略 <html> 和 <body> 標簽。

          <html> 元素是文檔的根元素,用于描述頁面的語言:

          <!DOCTYPE html>

          <html lang="zh">

          聲明語言是為了方便屏幕閱讀器及搜索引擎。

          省略 <html> 或 <body> 在 DOM 和 XML 軟件中會崩潰。

          省略 <body> 在舊版瀏覽器 (IE9)會發(fā)生錯誤。

          省略 <head>?

          在標準 HTML5 中, <head>標簽是可以省略的。

          默認情況下,瀏覽器會將 <body> 之前的內容添加到一個默認的 <head> 元素上。

          實例

          <!DOCTYPE html>

          <html>

          <title>頁面標題</title>

          <body>

          <h1>這是一個標題</h1>

          <p>這是一個段落。</p>

          </body>

          </html>

          嘗試一下 ?

          現(xiàn)在省略 head 標簽還不推薦使用。

          元數(shù)據(jù)

          HTML5 中 <title> 元素是必須的,標題名描述了頁面的主題:

          <title>菜鳥教程</title>

          標題和語言可以讓搜索引擎很快了解你頁面的主題:

          <!DOCTYPE html>

          <html lang="zh">

          <head>

          <meta charset="UTF-8">

          <title>菜鳥教程</title>

          </head>

          HTML 注釋

          注釋可以寫在 <!-- 和 --> 中:

          <!-- 這是注釋 -->

          比較長的評論可以在 <!-- 和 --> 中分行寫:

          <!--

          這是一個較長評論。 這是 一個較長評論。這是一個較長評論。

          這是 一個較長評論 這是一個較長評論。 這是 一個較長評論。

          -->

          長評論第一個字符縮進兩個空格,更易于閱讀。

          樣式表

          樣式表使用簡潔的語法格式 ( type 屬性不是必須的):

          <link rel="stylesheet" href="styles.css">

          短的規(guī)則可以寫成一行:

          p.into {font-family: Verdana; font-size: 16em;}

          長的規(guī)則可以寫成多行:

          body {

          background-color: lightgrey;

          font-family: "Arial Black", Helvetica, sans-serif;

          font-size: 16em;

          color: black;

          }

          • 將左花括號與選擇器放在同一行。

          • 左花括號與選擇器間添加以空格。

          • 使用兩個空格來縮進。

          • 冒號與屬性值之間添加已空格。

          • 逗號和符號之后使用一個空格。

          • 每個屬性與值結尾都要使用符號。

          • 只有屬性值包含空格時才使用引號。

          • 右花括號放在新的一行。

          • 每行最多 80 個字符。

          在逗號和分號后添加空格是常用的一個規(guī)則。

          在 HTML 中載入 JavaScript

          使用簡潔的語法來載入外部的腳本文件 ( type 屬性不是必須的 ):

          <script src="myscript.js">

          使用 JavaScript 訪問 HTML 元素

          一個糟糕的 HTML 格式可能會導致 JavaScript 執(zhí)行錯誤。

          以下兩個 JavaScript 語句會輸出不同結果:

          實例

          var obj=getElementById("Demo")

          var obj=getElementById("demo")

          HTML 中 JavaScript 盡量使用相同的命名規(guī)則。

          訪問 JavaScript 代碼規(guī)范。

          使用小寫文件名

          大多 Web 服務器 (Apache, Unix) 對大小寫敏感: london.jpg 不能通過 London.jpg 訪問。

          其他 Web 服務器 (Microsoft, IIS) 對大小寫不敏感: london.jpg 可以通過 London.jpg 或 london.jpg 訪問。

          你必須保持統(tǒng)一的風格,我們建議統(tǒng)一使用小寫的文件名。

          文件擴展名

          HTML 文件后綴可以是 .html (或r .htm)。

          CSS 文件后綴是 .css

          JavaScript 文件后綴是 .js

          .htm 和 .html 的區(qū)別

          .htm 和 .html 的擴展名文件本質上是沒有區(qū)別的。瀏覽器和 Web 服務器都會把它們當作 HTML 文件來處理。

          區(qū)別在于:

          .htm 應用在早期 DOS 系統(tǒng),系統(tǒng)現(xiàn)在或者只能有三個字符。

          在 Unix 系統(tǒng)中后綴沒有特別限制,一般用 .html。

          技術上區(qū)別

          如果一個 URL 沒有指定文件名 (如 http://www.runoob.com/css/), 服務器會返回默認的文件名。通常默認文件名為 index.html, index.htm, default.html, 和 default.htm。

          如果服務器只配置了 "index.html" 作為默認文件,你必須將文件命名為 "index.html", 而不是 "index.htm"。

          但是,通常服務器可以設置多個默認文件,你可以根據(jù)需要設置默認文件嗎。

          不管怎樣,HTML 完整的后綴是 ".html"。

          如您還有不明白的可以在下面與我留言或是與我探討QQ群308855039,我們一起飛!

          天小編逛論壇,看到了一位神級大佬的作品,竟然用了8000CSS代碼花了一幅蒙娜麗莎,簡直驚為天人!小編我不得不把這源碼COPY一份下來,分享給頭條上的小伙伴們看看,或許是用了什么工具吧,小編我也不是很懂,但是如果是用CSS寫的,那么這個人就真的是個大神了,好了話不多說,直接上效果圖和代碼!

          這個蒙娜麗莎特效的源碼文末有領取地址

          CSS全部源碼共享:

          這個是照片版的蒙娜麗莎,大家能夠看出差別有多大嗎?

          我的web前端技術學習交流群:733581373

          我是一名前端開發(fā)程序員,自己整理了一份2018最全面前端學習資料,從最基礎的HTML+CSS+JS到移動端HTML5到各種框架都有整理,送給每一位前端小伙伴,這里是小白聚集地,歡迎初學和進階中的小伙伴。

          【這個蒙娜麗莎特效的源碼也上傳qun文件了的】

          最后再給初學前端的小伙伴說幾句:

          HTML相當于告訴你網(wǎng)頁上的東西是什么,例如:這是一個鏈接、這是一個標題、這是一個段落。HTML是構成網(wǎng)頁的基礎。

          CSS相當于告訴你網(wǎng)頁上的東西是什么樣的,例如:這個鏈接是紅色的、這個標題是藍色的、這個段落是黑色的。CSS是作用在HTML元素之上的,可以調整HTML元素的樣式,使網(wǎng)頁布局更漂亮、合理。

          JS相當于告訴你網(wǎng)頁上的東西該怎么變化,例如:鼠標移動到鏈接上時鏈接變成藍色、鼠標移動到頭像上時顯示個人信息等等。JS是在HTML和CSS的基礎上的,作用是使網(wǎng)頁使用起來更容易、方便。

          ajax是前端需要用到的一個重要的技術。

          Jquery是一個前端框架,主要作用是使編寫JS代碼更方便。


          主站蜘蛛池模板: 亚洲va乱码一区二区三区| 亚洲一区二区三区乱码在线欧洲| 日韩AV无码久久一区二区| 人妻体内射精一区二区三区| 色综合视频一区二区三区44| 一区二区免费在线观看| 国产麻豆精品一区二区三区v视界 国产美女精品一区二区三区 | 无码AV中文一区二区三区| 精品国产免费一区二区| 精品成人乱色一区二区| 亚洲欧洲∨国产一区二区三区| 国产伦精品一区三区视频| 91一区二区三区四区五区| 国产在线一区二区三区av | 老熟妇仑乱视频一区二区| 日本一区二区三区在线视频| 精品无码成人片一区二区98| 亚洲一区二区三区高清不卡| 精品人妻无码一区二区色欲产成人 | 一区二区三区在线播放| 无码精品前田一区二区| 后入内射国产一区二区| 亚洲一区二区三区高清| 亚欧在线精品免费观看一区| 精品国产AV无码一区二区三区| 日韩aⅴ人妻无码一区二区| 亚洲国产一区明星换脸| 精品伦精品一区二区三区视频 | 日韩精品一区二三区中文| 国产精品美女一区二区| 在线观看国产一区| 日本激情一区二区三区| 精品人妻无码一区二区三区蜜桃一| 97人妻无码一区二区精品免费| 亚洲一区二区三区91| 国产精品亚洲一区二区三区久久| 国产一区二区精品久久91| 国产日韩一区二区三区在线观看| 末成年女A∨片一区二区| 国产成人AV区一区二区三| 国产一区二区三区久久精品|