大尺寸紙張量測

紙張尺寸量測

方案一  

A4  紙張 寬x高 210mm x 297mm

使用「校正塊」,校正塊的直徑為31mm

使用工業相機拍攝校正塊

 使用AOI程式檢測校正塊

校正塊寬度為248像素

計算「像素 VS 實際尺寸」轉換比例

31 mm / 248 = 0.125 mm

使用工業相機拍A4紙張

使用AOI程式量測A4紙張

A4紙張量測寬度為1680.06像素

AOI量測像素 X 轉換比例 = 實際尺寸

1680.06 X 0.125 mm = 210.0075 mm

檢測流程

方案二

紙張 寬 1500mm 

使用「校正塊」,校正塊的直徑為31mm

使用工業相機拍攝校正塊

 使用AOI程式檢測校正塊

校正塊寬度為724像素

計算「像素 VS 實際尺寸」轉換比例

31 mm / 724 = 0.042817 mm

左側相機影像 (W=2448 pixel)

紙張寬度 2448 – 742.385 = 1705.615 (pixel)

1705.615 X 0.042817 mm = 73.029 mm

右側相機影像(W=2448 pixel)

紙張寬度 1511.82 (pixel)

1511.82 X 0.042817 mm = 64.7315 mm

已知紙張寬度1500mm

AOI 程式可以在教導時得到

  • 左側紙張寬度73.029 mm
  • 右側紙張寬度64.7315 mm
  • 中間段影像沒有照到處的補償值為 1500 mm – 73.029 mm – 64.7315 mm = 1362.2395 mm

檢測流程

分類: AOI, 未分類 | 標籤: | 發佈留言

Seaborn + SKlearn 資料分析

Seaborn資料分析 + Sklearn

Seaborn 資料集中的 “tips” 是一個包含餐廳小費資料的資料集。這個資料集通常用於示範 Seaborn 中的數據可視化功能和統計分析。

“tips” 資料集包含了餐廳服務員收到的小費金額以及與小費相關的一些額外信息,例如顧客人數、就餐日期和時間、就餐者的性別、是否是吸煙區域、就餐的星期幾等等。這些信息可以用於探索性數據分析、統計分析以及建模工作。

這個資料集的結構通常包含以下幾個欄位:

  • total_bill:總消費金額(含小費)。
  • tip:小費金額。
  • sex:就餐者的性別。
  • smoker:是否吸煙。
  • day:就餐的星期幾。
  • time:就餐的時間(午餐或晚餐)。
  • size:就餐者的人數。

這個資料集是 Seaborn 中內建的範例資料集之一,通常用於示範 Seaborn 中各種圖表的繪製和數據分析。

Seaborn 資料集中的 “diamonds” 是一個包含鑽石價格和屬性的資料集。這個資料集通常用於示範 Seaborn 中的數據可視化功能和統計分析。

“diamonds” 資料集包含了各種鑽石的屬性和價格信息。這些屬性包括鑽石的重量(克拉)、切工、顏色、淨度等,而價格則是以美元為單位。

這個資料集的結構通常包含以下幾個欄位:

  • carat:鑽石的重量(克拉)。
  • cut:鑽石的切工質量,包括 Fair、Good、Very Good、Premium 和 Ideal 等級。
  • color:鑽石的顏色,從 J(最差)到 D(最好)。
  • clarity:鑽石的淨度,包括 I1、SI2、SI1、VS2、VS1、VVS2、VVS1 和 IF 等級。
  • depth:鑽石的深度比例(百分比)。
  • table:鑽石的平頂比例(百分比)。
  • price:鑽石的價格(美元)。
  • x、y、z:鑽石的長寬高尺寸(毫米)。

這個資料集通常用於示範 Seaborn 中的散點圖、直方圖、盒圖等圖表的繪製,以及數據探索和統計分析。

Categorical Feature

在機器學習和統計建模中,Categorical Feature(分類特徵)是指具有有限數量可能值的特徵或變量。這些可能的值是離散的並且不具有順序關係。分類特徵通常描述了特定的類別、類型或類別,而不是數值或連續性數據。

例如,在一個房地產數據集中,”地區”可以是一個分類特徵,因為它可以被劃分為有限的類別,如 “市中心”、”市郊” 和 “郊區”。又或者在一個網站用戶行為數據集中,”瀏覽器類型” 可能是一個分類特徵,因為它可以被劃分為類別,如 “Chrome”、”Firefox” 和 “Safari”。

處理分類特徵的一種常見方法是對其進行One-Hot Encoding(一位有效編碼)。這將把分類特徵轉換為二進制向量,使其適合於機器學習算法的輸入。另一種方法是將分類特徵轉換為整數編碼,即將每個可能的類別映射到一個整數值。這兩種方法都可以將分類特徵轉換為數值表示形式,從而使其適用於機器學習算法。

Ordinal Encoding

Ordinal Encoding(序數編碼)是一種將分類特徵轉換為數值表示形式的技術,其中每個類別都被映射到一個整數值。與 One-Hot Encoding 不同,序數編碼將類別映射到整數值,而不是創建二進制向量。這種方法適用於那些具有順序關係的類別,即類別之間存在某種自然的順序。

例如,假設有一個類別特徵 “教育程度”,其可能的值包括 “高中”、”大學” 和 “碩士”。這些值之間存在一種自然的順序,因為 “碩士” 學位通常高於 “大學” 學位,而 “大學” 學位又高於 “高中” 學歷。在這種情況下,可以將 “高中”、”大學” 和 “碩士” 分別映射到整數值 0、1 和 2。

序數編碼通常用於處理具有順序關係的分類特徵,以便將它們轉換為數值表示形式,使其適合於機器學習算法的輸入。然而,需要注意的是,使用序數編碼時,應該確保所選擇的整數值能夠準確地反映類別之間的相對順序,以避免對模型的影響產生不良影響。

One-Hot Encoding

One-Hot Encoding(一位有效編碼)是一種在機器學習和數據處理中常用的技術,用於將分類變量表示為二進制向量。它將分類變量轉換為一種形式,可以提供給機器學習算法,以改善模型的性能和準確性。

在 One-Hot Encoding 中,每個類別被表示為一個二進制向量,其中除了對應於該類別的一個元素被設置為 1 之外,所有元素都是零。這樣就創建了分類變量的二進制表示,使其適用於期望數值輸入的機器學習算法。

以下是一個例子來說明 One-Hot Encoding:

假設我們有一個分類變量 “顏色”,有三個類別:紅色、綠色和藍色。使用 One-Hot Encoding,我們可以將這些類別表示為二進制向量:

  • 紅色:[1, 0, 0]
  • 綠色:[0, 1, 0]
  • 藍色:[0, 0, 1]

現在,每個類別都被表示為一個二進制向量,其中一個元素設置為 1,對應於該類別。

One-Hot Encoding 在各種機器學習任務中廣泛使用,例如分類和回歸,當處理分類變量時。它有助於防止模型錯誤地假設類別之間的有序關係,並允許模型有效地從分類數據中學習。

Ordinal Encoding vs One-Hot Encoding

當碰到分類特徵時,建議根據數據的特性和機器學習模型的需求來選擇是使用Ordinal Encoding還是One-Hot Encoding進行轉換。

Ordinal Encoding 的優缺點:

優點:

  1. 保留了類別之間的順序關係,對於有序分類特徵來說更符合直覺。
  2. 生成的特徵維度較低,節省了數據空間。
  3. 在某些情況下,可以提供更好的解釋性,因為整數編碼可以直接反映不同類別之間的相對關係。

缺點:

  1. 可能會引入錯誤的順序假設,對於沒有明確順序的分類特徵可能不適用。
  2. 數值之間的差異可能被模型誤解為具有固定的大小或間隔,導致模型偏差。
  3. 如果特徵的數量很大,而其中的類別數量較少,則可能浪費了大量的內存空間。

One-Hot Encoding 的優缺點:

優點:

  1. 不會引入任何錯誤的順序假設,適用於沒有明確順序的分類特徵。
  2. 每個類別都是獨立的二進制變量,避免了將類別解釋為具有固定大小或間隔的風險。
  3. 可以避免在特徵數量較大時導致的內存浪費。

缺點:

  1. 生成的特徵維度較高,可能會導致所謂的維度災難,增加模型的計算成本和複雜性。
  2. 無法保留類別之間的順序關係,可能會丟失一些信息,特別是對於具有明確順序的分類特徵來說。

總的來說,當分類特徵具有明確的順序關係時,通常建議使用Ordinal Encoding;而當分類特徵沒有明確的順序關係時,則建議使用One-Hot Encoding。根據機器學習模型的需要以及數據的特性,選擇適合的編碼方法可以幫助提高模型的性能和準確性。

線性回歸(Linear Regression)

LinearRegression 是 scikit-learn 庫中的一個類別,用於 Python 編程語言,用於線性回歸任務。它是一種最簡單的線性模型,用於建模自變量和因變量之間的線性關係。

以下是關於 LinearRegression 的意義及用途的說明:

  1. 意義:LinearRegression 用於建立自變量(特徵)與因變量之間的線性關係模型。它的基本假設是,因變量與自變量之間存在線性關係,可以用一條直線(在一維情況下)或者一個超平面(在高維情況下)來描述這種關係。
  2. 用途:
    • 預測任務:LinearRegression 主要用於預測任務,其中目標是根據輸入特徵來預測連續型的因變量。例如,根據房屋的各種特徵(如面積、臥室數量、地理位置等),預測房屋的價格。
    • 關聯性分析:線性回歸也用於分析自變量與因變量之間的關聯性。通過模型的係數,可以了解每個自變量對因變量的影響程度,以及它們之間的方向關係(正相關或負相關)。
    • 參數估計:線性回歸還可以用於估計模型中的參數,如斜率和截距。這些參數對於理解模型的行為和做出預測是非常重要的。
    • 模型評估:除了預測和關聯性分析,線性回歸還可以用於評估模型的性能。通過比較預測值與實際觀測值之間的差異,可以評估模型的擬合優度。

總之,LinearRegression 是一個簡單但非常有用的線性模型,適用於許多回歸任務,特別是在數據集具有線性結構且特徵空間不太複雜的情況下。

KNeighborsRegressor

KNeighborsRegressor 是 scikit-learn 庫中的一個類別,用於 Python 編程語言,用於回歸任務。它屬於基於鄰近的學習方法,通常用於建模連續型的因變量和一個或多個自變量之間的關係。

以下是關於 KNeighborsRegressor 的意義及用途的說明:

  1. 意義:KNeighborsRegressor 使用基於鄰居的方法來進行回歸預測。它的基本思想是:對於一個新的數據點,通過查找與該點最近的 K 個鄰居的目標值(因變量值),然後利用這些鄰居的目標值來進行預測。具體來說,預測值通常是這些鄰居目標值的平均值或加權平均值。
  2. 用途:
    • 預測任務:KNeighborsRegressor 通常用於預測任務,其中目標是根據輸入特徵來預測連續型的因變量。例如,根據房屋的各種特徵(如面積、臥室數量、地理位置等),預測房屋的價格。
    • 探索性數據分析:通過查看數據點的近鄰,可以幫助了解數據的分佈和結構。這對於探索性數據分析非常有用,可以幫助發現數據中的模式和趨勢。
    • 回歸模型的基準測試:KNeighborsRegressor 可以用作其他回歸模型的基準測試,以幫助評估更複雜模型的性能。尤其是對於數據較少或者特徵空間較小的情況下,它可以作為一個簡單但有效的基準模型。
  3. 注意事項:
    • 參數選擇:在使用 KNeighborsRegressor 時,需要選擇適當的參數,特別是鄰居數量 n_neighbors。選擇合適的鄰居數量對於模型的性能至關重要。
    • 數據預處理:與大多數機器學習算法一樣,數據預處理也很重要。在使用 KNeighborsRegressor 之前,需要對數據進行特徵縮放和處理缺失值等預處理步驟。

總之,KNeighborsRegressor 是一個簡單而有效的回歸模型,適用於許多回歸任務,特別是在數據集較小、特徵空間較小或需要進行探索性數據分析時。

RandomForestRegressor

RandomForestRegressor 是 scikit-learn 中的一個類別,用於 Python 程式語言,用於回歸任務。它屬於集成學習中的一種方法,基於隨機森林算法。

以下是關於 RandomForestRegressor 的意義及用途的說明:

  1. 意義:RandomForestRegressor 用於建立多個決策樹的集成模型,通過結合這些決策樹的預測結果來進行回歸預測。每個決策樹都是基於隨機樣本和隨機特徵進行構建,因此具有一定的隨機性,這有助於減少過擬合和提高模型的泛化能力。
  2. 用途:
    • 預測任務:RandomForestRegressor 主要用於預測連續型的因變量。它可以應用於各種領域,如金融、醫療、零售等,用於預測股票價格、疾病發生率、銷售量等連續型數據。
    • 特徵重要性分析:隨機森林可以計算每個特徵的重要性,這有助於了解哪些特徵對於模型的預測能力最為重要。這對於特徵選擇和模型解釋非常有用。
    • 處理大型數據集:由於隨機森林的並行性和可擴展性,它們通常能夠有效處理大型數據集,包括高維數據和大量樣本。
    • 抗過擬合能力:由於隨機森林的隨機性特性,它們通常對於過擬合具有較強的抗性。因此,即使在較少的數據量下,隨機森林也能夠產生良好的預測結果。

總之,RandomForestRegressor 是一種強大且靈活的機器學習模型,適用於各種回歸任務,並且通常能夠產生準確且穩健的預測結果。

SVM

支持向量機(Support Vector Machine,SVM)是一種用於監督式學習的機器學習模型。它的主要目標是找到一個最佳的超平面來區分不同類別的數據點。以下是關於 SVM 的意義及用途的說明:

  1. 意義:SVM 的核心概念是將數據映射到高維空間,從而使得數據在這個空間中可以被一個超平面有效地分割。這個超平面可以最大化類別之間的邊際(margin),從而提高模型的泛化能力。
  2. 用途:
    • 分類任務:SVM 主要用於二元分類任務,即將數據分成兩個類別。通過找到一個最佳的超平面,SVM 可以有效地區分不同類別的數據點。此外,SVM 也可以通過使用多個二元 SVM 構建多類別分類器。
    • 回歸任務:除了分類,SVM 還可以用於回歸任務。支持向量回歸(Support Vector Regression,SVR)通過找到一個最佳的超平面來進行連續型目標變量的預測。
    • 特徵空間映射:SVM 可以使用不同的核函數來將數據映射到高維空間,從而實現非線性分類。這使得 SVM 在處理非線性問題時非常有效。
    • 異常檢測:由於 SVM 能夠找到最佳的分割超平面,因此它也常被用於異常檢測任務中,即識別數據中的異常或極端值。
    • 文本分類:SVM 在文本分類任務中也經常被使用,例如垃圾郵件檢測、情感分析等。

總之,SVM 是一個多功能的機器學習模型,廣泛應用於分類、回歸、特徵空間映射、異常檢測等各種任務中。它以其優秀的泛化能力和有效的非線性分類能力而聞名。

分類: AI | 標籤: , | 發佈留言

印刷檢測

客戶需求:使用者會將PDF中的標籤內容印刷到白色的織布上,希望透過視覺檢測可以將印刷不良的情況偵測出來。

我們將計劃使用局部可變形模型來進行標籤內容在織布上的視覺檢測,提供更精細的測試。

局部可變形模型是一種用於視覺檢測的技術,它可以在圖像中尋找局部特定形狀的實例。這種模型具有一定的靈活性,可以應對目標物體在圖像中的變形、旋轉和縮放等情況。

以下是局部可變形模型的一些重要特點和工作原理:

  1. 創建模型:創建局部可變形模型的過程通常包括以下步驟:
    • 選擇目標物體的形狀,可以是點、線、圓等。
    • 從圖像中提取這些形狀的特徵,比如邊緣、角點等。
    • 構建模型,包括特徵點的位置、連接關係和形狀特徵。
  2. 模型搜索:一旦模型被創建,它可以應用於圖像中搜索符合該模型的實例。搜索過程通常包括以下步驟:
    • 在圖像中的每個位置上應用模型,計算模型與圖像的匹配程度。
    • 根據匹配程度選擇最佳的實例,通常使用分數或相似性度量。
    • 如果模型具有變形能力,可以應對目標物體的旋轉、縮放和畸變等變化。


實驗一

我們故意將這張影像上幾處位置,故以把黑色的區域塗白。
看看是否可以將差異處檢測出來?
可以看到左像影像比對出來異常的位置。
這幾處位置是塗白的位置。

實驗二

可以看到QRCode被圖白的區域也有偵測出來。

AOI程式比對結果

  • 最左側下方是當初建檔的模型「局部可變形匹配的可變形模型
  • 中間是此次要比對的「樣品影像」。
  • 最右側是「比對結果」可以看到差異處

比對原始資料一

比對原始資料二

比對原始資料三

分類: AOI | 發佈留言

顏色檢測

客戶需求∶  我需要檢測車燈的打出來的光的顏色組成,如果超出範圍則發出警示。

檢測手法∶

  1. 車燈點亮,照射到前方白板。
  2. 相機拍攝白板,取得影像。
  3. 視覺檢測系統進行分析使用圖像分割技術(例如閾值處理、分水嶺算法、區域增長等)來檢測影像中光亮處的影像。
  4. 顏色檢測: 分析影像的色相分佈,與Golden樣本的色相分佈,使用歸一相似度”(Normalized Similarity)來比對,當相似度超出設定範圍時,則發出警報。

色相直方圖分佈∶

 影像的色相直方圖分佈是描述影像中不同色相值的統計分佈情況。在色相直方圖中,色相值通常被劃分成若干個區間,例如0到180度之間的若干個小區間。然後,統計圖像中每個區間內像素的數量或者像素的比例,形成一個直方圖。

色相直方圖可以反映出圖像中各個色相的分布情況,即哪些色相在圖像中佔據主導地位,哪些色相較少出現。通過觀察色相直方圖,可以直觀地了解圖像的整體顏色分布情況,以及圖像中具體顏色的特徵。

通常,色相直方圖是基於圖像的色彩空間進行計算的,例如RGB色彩空間或者HSV色彩空間。在HSV色彩空間中,色相(Hue)表示顏色的種類或者色調,因此色相直方圖反映了圖像中不同種類顏色的分布情況。

通過比較不同圖像的色相直方圖分佈,我們可以評估它們之間的顏色相似度或者差異度,從而用於圖像檢索、圖像分類、圖像匹配等領域。

歸一相似度∶

“歸一相似度”(Normalized Similarity)指的是將相似度值歸一化到特定的範圍內,通常是0到1之間。這樣做的目的是使得相似度值更易於理解和比較,不受圖像尺寸、亮度等因素的影響。

在計算兩個直方圖的相似度時,我們可以得到一個原始的相似度值,表示它們之間的相似程度。但是這個值的範圍通常不是固定的,並且可能受到直方圖的大小、圖像的亮度等因素的影響。因此,將這個相似度值歸一化到0到1之間可以消除這些影響,使得相似度更具有可比性。

在歸一化相似度中,常見的做法是使用以下公式:

歸一化相似度=原始相似度直方圖1的總和+直方圖2的總和−原始相似度

歸一化相似度=

直方圖1的總和+直方圖2的總和−原始相似度

原始相似度

這樣得到的歸一化相似度值會保證在0到1之間,其中1表示完全相同,0表示完全不同。

合格
相似度:0.987
偏紅
相似度:0.552
偏黃
相似度:0.231
偏綠
相似度:0.318
偏藍
相似度:0.239
分類: AOI | 標籤: | 發佈留言

車燈光型檢測

右駕光型量測規範示意

左駕光型量測規範示意

車燈配光室

AOI 輔助車燈燈型量測架設示意圖

使用 High Dynamic Range (HDR) Imaging 技術可以有效解決影像過曝所造成的影像失真問題,並得到一個明暗對比清晰的影像。這可以通過以下步驟實現:

  1. 拍攝多張照片:使用不同的曝光時間來拍攝同一場景的多張照片。這些照片包括適度曝光、過曝和曝光不足的版本。
  2. 合併照片:將這些多張照片合併成一張 HDR 圖像。這可以通過將照片的亮度信息合併起來,從而獲得一張具有更廣動態範圍的 HDR 圖像。
  3. 色調映射(Tone Mapping):對 HDR 圖像進行色調映射,將其轉換為顯示設備(如顯示器或打印機)可以顯示的標準動態範圍圖像。這一步旨在保留 HDR 圖像的細節和對比度,同時使其在一般顯示設備上呈現出自然的外觀。

AOI 視覺分析

透過HDR技術取得 Tonemap HDR image 及相機反應函數

得到的Tonemap HDR Image, 用於光形的分析,可以得到下列數值

  • 中心點
  • 光型輪廓
  • 光型旋轉矩型 (角度)
  • 光型與Golden的差異處
  • 透過相機反應函式可以亮度值
Golden 光型
中心點、輪廓、角度亮度分佈
測試品  光型
中心點、輪廓、角度亮度分佈
光型差異
分類: AOI | 標籤: | 發佈留言

Numpy Peak To Peak

NumPy 函式 ptp() 計算陣列沿指定軸的峰值之差(即峰-峰值)。

這是它的功能:

  • 峰-峰值:它計算沿指定軸的最大值和最小值之間的差值。

以下是語法:

numpy.ptp(a, axis=None, out=None, keepdims=<no value>)
  • a:輸入陣列。
  • axis:沿其查找峰值的軸。默認情況下,它會將陣列展平。
  • out:可選的輸出陣列,用於放置結果。
  • keepdims:如果設置為 True,則保留大小為一的減少的維度。

例如:

import numpy as np 
# 創建一個陣列 x = np.array([[4, 9, 2, 10], [6, 9, 7, 12]]) 

# x.shape is (2, 4)

# 沿著軸 0 計算峰-峰值 

result = np.ptp(x, axis=0) 

#x[0] => [4, 9, 2, 10]
#x[1] => [6, 9, 7, 12]

#[6-4, 9-9, 7-2, 12-10]

print(result)  

# 輸出: [2 0 5 2]

在這個例子中,np.ptp(x, axis=0) 計算了沿著軸 0(列)的峰-峰值,結果是一個陣列 [2, 0, 5, 2],其中每個值代表相應列的峰-峰值。

import numpy as np 
# 創建一個陣列 x = np.array([[4, 9, 2, 10], [6, 9, 7, 12]]) 

# x.shape is (2, 4)

# 沿著軸 1 計算峰-峰值 

result = np.ptp(x, axis=1) 

#x[:, 0] => [4, 6]
#x[:, 1] => [9, 9]
#x[:, 2] => [2, 7]
#x[:, 3] => [10, 12]

#[10 - 2, 12 - 6]
print(result)  

# 輸出: [8, 6]

在這個例子中,np.ptp(x, axis=1) 計算了沿著軸 1(行)的峰-峰值,結果是一個陣列 [8, 6],其中每個值代表相應列的峰-峰值

分類: 未分類 | 標籤: | 發佈留言

numpy.ndarray

  • ndarray.size
  • ndarray.itemsize
  • ndarray.nbytes
  • ndarray.resize
  • ndarray.T
  • ndarray.ndim
  • ndarray.real
  • ndarray.imag
  • ndarray.dtype
  • ndarray.flat
  • ndarray.tolist()
  • ndarray.astype
分類: 未分類 | 發佈留言

Numpy Spliting

水平分割

  • numpy.hsplit(a, 3)
  • numpy.split(a, 3, axis=1)

垂直分割

  • numpy.vsplit(a, 3)
  • numpy.split(a, 3, axis=0)

深度分割

  • numpy.dsplit(a, 3)
分類: 未分類 | 發佈留言

Numpy Stacking

水平、橫向合併

  • numpy.hstack((a, b))
  • numpy.concatenate((a, b), axis=1)
  • numpy.column_stack((a, b))

垂直、直立合併

  • numpy.vstack((a, b))
  • numpy.concatenate((a, b), axis=0)
  • numpy.row_stack((a, b))

深度合併

  • numpy.dstack((a, b))
import cv2
import numpy as np
import matplotlib.pyplot as plt

# Load the two sample images
image1 = cv2.imread('space/1.jpg')
image2 = cv2.imread('space/2.jpg')

# Convert images to grayscale (optional)
image1_gray = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
image2_gray = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)

# Perform image stitching (depth-wise stacking)
stitched_image = np.dstack((image1_gray, image2_gray))

# Plot the original images
plt.figure(figsize=(12, 6))

plt.subplot(2, 2, 1)
plt.imshow(cv2.cvtColor(image1, cv2.COLOR_BGR2RGB))
plt.title('Image 1')

plt.subplot(2, 2, 2)
plt.imshow(cv2.cvtColor(image2, cv2.COLOR_BGR2RGB))
plt.title('Image 2')

# Plot one channel of the stitched image (for visualization)
plt.subplot(2, 2, 3)
plt.imshow(stitched_image[:, :, 0], cmap='gray')  # Display the first channel
plt.title('Stitched Image (Channel 0)')

# Plot one channel of the stitched image (for visualization)
plt.subplot(2, 2, 4)
plt.imshow(stitched_image[:, :, 1], cmap='gray')  # Display the first channel
plt.title('Stitched Image (Channel 1)')

plt.tight_layout()
plt.show()
分類: 未分類 | 標籤: | 發佈留言

線性回歸(Linear Regression)

首先,使用make_regression函數生成了一些合成數據,然後將數據分成訓練集和測試集。接著創建了LinearRegression模型的實例,並使用訓練集對模型進行訓練。訓練完成後,打印出了模型的係數和對新數據的預測結果。最後,通過可視化將訓練集和測試集的散點圖以及線性回歸的平面呈現出來。

import numpy as np
import matplotlib.pyplot as mpl
from mpl_toolkits.mplot3d import Axes3D
from sklearn import linear_model
from sklearn.datasets import make_regression

# Generating synthetic data for training and testing
X, y = make_regression(n_samples=100, n_features=2, n_informative=1, random_state=0, noise=50)

# X and y are values for 3D space. We first need to train
# the machine, so we split X and y into X_train, X_test,
# y_train, and y_test. The *_train data will be given to the 
# model to train it.
X_train, X_test = X[:80], X[-20:]
y_train, y_test = y[:80], y[-20:]

# Creating instance of model
regr = linear_model.LinearRegression()

# Training the model 
regr.fit(X_train, y_train)

# Printing the coefficients 
print(regr.coef_)
# [-10.25691752 90.5463984 ]
# Predicting y-value based on training 
X1 = np.array([1.2, 4])
print(regr.predict([X1]))
# 350.860363861
# With the *_test data we can see how the result matches 
# the data the model was trained with.
# It should be a good match as the *_train and *_test
# data come from the same sample. Output: 1 is perfect
# prediction and anything lower is worse. 
print(regr.score(X_test, y_test))
# 0.949827492261

fig = mpl.figure(figsize=(8, 5))
ax = fig.add_subplot(111, projection='3d') 
ax.view_init(elev=20, azim=0)
# ax = Axes3D(fig)
# Data
ax.scatter(X_train[:,0], X_train[:,1], y_train, facecolor='#00CC00') 
ax.scatter(X_test[:,0], X_test[:,1], y_test, facecolor='#FF7800')

# Function with coefficient variables
coef = regr.coef_
line = lambda x1, x2: coef[0] * x1 + coef[1] * x2
grid_x1, grid_x2 = np.mgrid[-2:2:10j, -2:2:10j] 
ax.plot_surface(grid_x1, grid_x2, line(grid_x1, grid_x2), alpha=0.1, color='k') 
ax.xaxis.set_visible(False)
ax.yaxis.set_visible(False)
ax.zaxis.set_visible(False)
分類: AI, AOI | 標籤: , | 發佈留言