進料 出料
機台允許的檢測空間,只能從機台的下方空間找位置進行相機的架設。
架設要求,相機與紙張Z軸需要盡量平行,不要有傾斜角度(這個會大副度影像精度)
實驗 (Z軸與相機需平行,傾斜情況越大誤差越大)
左側 右側
左側情況先進行光學校正。
左側實際量測出來為199.2136 mm 誤差0.7864mm
右側實際量測出來為198.7449 mm 誤差1.2551mm
進料 出料
機台允許的檢測空間,只能從機台的下方空間找位置進行相機的架設。
架設要求,相機與紙張Z軸需要盡量平行,不要有傾斜角度(這個會大副度影像精度)
實驗 (Z軸與相機需平行,傾斜情況越大誤差越大)
左側 右側
左側情況先進行光學校正。
左側實際量測出來為199.2136 mm 誤差0.7864mm
右側實際量測出來為198.7449 mm 誤差1.2551mm
鏡架螺絲有無檢測
影像檢測手法的基礎觀念
影像直方圖
直方圖表示影像中像素強度(無論是彩色或灰階)的分佈。它可以視覺化為圖表(或繪圖),可以直觀地了解強度(像素值)分佈。在此範例中,我們將假設 RGB 色彩空間,因此這些像素值將在 0 到 255 的範圍內。
繪製直方圖時,x 軸充當我們的「箱」。如果我們用 256 建構一個直方圖
bin,那麼我們就可以有效地計算每個像素值出現的次數。
相反,如果我們只使用 2
(等距)容器,然後我們計算像素在 [0, 128] 或 [128, 255] 範圍內的次數。
然後將與 x 軸值合併的像素數繪製在 y 軸上。
讓我們看一個範例圖像以使這一點更清楚:
我們繪製了一個直方圖,其中 x 軸上有 256 個 bin,y 軸上落入給定 bin 的像素百分比。檢查直方圖,請注意存在三個主峰。
直方圖中的第一個峰值位於 x=65 附近,我們看到像素數量急劇上升 – 顯然影像中存在某種具有非常暗值的物件。
然後,我們在直方圖中看到一個緩慢得多的上升峰值,在 x=100 附近開始上升,最後在 x=150 附近結束下降。該區域可能指的是影像的背景區域。
最後,我們看到 x=150 到 x=175 範圍內有大量像素。很難確切地說這個區域是什麼,但它肯定佔據了圖像的很大一部分。
影像直方圖的相似度
直方圖的分佈極為相似意味著兩幅圖像在灰度級別分佈上非常接近或相同,則代表影像內容有相似的內容或場場。
客戶需求:檢測鏡架上的螺絲是否有鎖附上?
實驗一
是否鎖附螺絲 | 直方圖相似度 |
有 | 0.90 |
無 | 0.35 |
實驗二
是否鎖附螺絲 | 直方圖相似度 |
有 | 0.95 |
無 | 0.21 |
實驗三
是否鎖附螺絲 | 直方圖相似度 |
有 | 0.93 |
無 | 0.50 |
實驗四
是否鎖附螺絲 | 直方圖相似度 |
有 | 0.83 |
無 | 0.48 |
實驗五
是否鎖附螺絲 | 直方圖相似度 |
有 | 0.97 |
無 | 0.13 |
實驗六
是否鎖附螺絲 | 直方圖相似度 |
有 | 0.94 |
無 | 0.25 |
從上面六個實驗可以得知,透過直方圖相似度的比對,可以有效的判斷是否有鎖附螺絲。
光學架設規格
光學系統硬體規格
No. | 品項 | 數量 | 備註 |
1 | 工業相機:USB 3.0, 1.2MP, Mono | 4 | |
2 | 工業鏡頭:f 50mm, F1.8, C Mount, ⅔” | 4 | |
3 | USB 3.0, 3M | 4 | |
4 | 光學檢測主機 | 1 | |
5 | 光源 | 2 | 待定 |
鐵條計數
傳統影像處理
較佳的影像呈現效果
較差的影像呈現效果
必需使用線掃描的影像處理才能得到最佳影像
電腦視覺軟硬體架構 | ||
NO | 品項 | 預估金額 |
1 | 工業電腦 | |
2 | 線掃描相機 | |
3 | 線掃描相機鏡頭 | |
4 | 線掃描光源 | |
5 | 線掃描光源控制器 | |
6 | AOI軟體 |
紙張尺寸量測
方案一
A4 紙張 寬x高 210mm x 297mm
使用「校正塊」,校正塊的直徑為31mm
方案二
紙張 寬 1500mm
使用「校正塊」,校正塊的直徑為31mm
Seaborn資料分析 + Sklearn
Seaborn 資料集中的 “tips” 是一個包含餐廳小費資料的資料集。這個資料集通常用於示範 Seaborn 中的數據可視化功能和統計分析。
“tips” 資料集包含了餐廳服務員收到的小費金額以及與小費相關的一些額外信息,例如顧客人數、就餐日期和時間、就餐者的性別、是否是吸煙區域、就餐的星期幾等等。這些信息可以用於探索性數據分析、統計分析以及建模工作。
這個資料集的結構通常包含以下幾個欄位:
這個資料集是 Seaborn 中內建的範例資料集之一,通常用於示範 Seaborn 中各種圖表的繪製和數據分析。
Seaborn 資料集中的 “diamonds” 是一個包含鑽石價格和屬性的資料集。這個資料集通常用於示範 Seaborn 中的數據可視化功能和統計分析。
“diamonds” 資料集包含了各種鑽石的屬性和價格信息。這些屬性包括鑽石的重量(克拉)、切工、顏色、淨度等,而價格則是以美元為單位。
這個資料集的結構通常包含以下幾個欄位:
這個資料集通常用於示範 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,對應於該類別。
One-Hot Encoding 在各種機器學習任務中廣泛使用,例如分類和回歸,當處理分類變量時。它有助於防止模型錯誤地假設類別之間的有序關係,並允許模型有效地從分類數據中學習。
Ordinal Encoding vs One-Hot Encoding
當碰到分類特徵時,建議根據數據的特性和機器學習模型的需求來選擇是使用Ordinal Encoding還是One-Hot Encoding進行轉換。
Ordinal Encoding 的優缺點:
優點:
缺點:
One-Hot Encoding 的優缺點:
優點:
缺點:
總的來說,當分類特徵具有明確的順序關係時,通常建議使用Ordinal Encoding;而當分類特徵沒有明確的順序關係時,則建議使用One-Hot Encoding。根據機器學習模型的需要以及數據的特性,選擇適合的編碼方法可以幫助提高模型的性能和準確性。
線性回歸(Linear Regression)
LinearRegression 是 scikit-learn 庫中的一個類別,用於 Python 編程語言,用於線性回歸任務。它是一種最簡單的線性模型,用於建模自變量和因變量之間的線性關係。
以下是關於 LinearRegression 的意義及用途的說明:
總之,LinearRegression 是一個簡單但非常有用的線性模型,適用於許多回歸任務,特別是在數據集具有線性結構且特徵空間不太複雜的情況下。
KNeighborsRegressor
KNeighborsRegressor 是 scikit-learn 庫中的一個類別,用於 Python 編程語言,用於回歸任務。它屬於基於鄰近的學習方法,通常用於建模連續型的因變量和一個或多個自變量之間的關係。
以下是關於 KNeighborsRegressor 的意義及用途的說明:
總之,KNeighborsRegressor 是一個簡單而有效的回歸模型,適用於許多回歸任務,特別是在數據集較小、特徵空間較小或需要進行探索性數據分析時。
RandomForestRegressor
RandomForestRegressor 是 scikit-learn 中的一個類別,用於 Python 程式語言,用於回歸任務。它屬於集成學習中的一種方法,基於隨機森林算法。
以下是關於 RandomForestRegressor 的意義及用途的說明:
總之,RandomForestRegressor 是一種強大且靈活的機器學習模型,適用於各種回歸任務,並且通常能夠產生準確且穩健的預測結果。
SVM
支持向量機(Support Vector Machine,SVM)是一種用於監督式學習的機器學習模型。它的主要目標是找到一個最佳的超平面來區分不同類別的數據點。以下是關於 SVM 的意義及用途的說明:
總之,SVM 是一個多功能的機器學習模型,廣泛應用於分類、回歸、特徵空間映射、異常檢測等各種任務中。它以其優秀的泛化能力和有效的非線性分類能力而聞名。
客戶需求:使用者會將PDF中的標籤內容印刷到白色的織布上,希望透過視覺檢測可以將印刷不良的情況偵測出來。
我們將計劃使用局部可變形模型來進行標籤內容在織布上的視覺檢測,提供更精細的測試。
局部可變形模型是一種用於視覺檢測的技術,它可以在圖像中尋找局部特定形狀的實例。這種模型具有一定的靈活性,可以應對目標物體在圖像中的變形、旋轉和縮放等情況。
以下是局部可變形模型的一些重要特點和工作原理:
我們故意將這張影像上幾處位置,故以把黑色的區域塗白。 看看是否可以將差異處檢測出來? |
可以看到左像影像比對出來異常的位置。 這幾處位置是塗白的位置。 |
實驗二
可以看到QRCode被圖白的區域也有偵測出來。
比對原始資料一
比對原始資料二
比對原始資料三
客戶需求∶ 我需要檢測車燈的打出來的光的顏色組成,如果超出範圍則發出警示。
檢測手法∶
色相直方圖分佈∶
影像的色相直方圖分佈是描述影像中不同色相值的統計分佈情況。在色相直方圖中,色相值通常被劃分成若干個區間,例如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 |
使用 High Dynamic Range (HDR) Imaging 技術可以有效解決影像過曝所造成的影像失真問題,並得到一個明暗對比清晰的影像。這可以通過以下步驟實現:
得到的Tonemap HDR Image, 用於光形的分析,可以得到下列數值
Golden 光型 | |
中心點、輪廓、角度 | 亮度分佈 |
測試品 光型 | |
中心點、輪廓、角度 | 亮度分佈 |
光型差異 | |
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]
,其中每個值代表相應列的峰-峰值