發表文章

目前顯示的是 2020的文章

使用Python達成影像形態學處理(不使用Opencv函式庫)

圖片
  1.    研究動機 在進入專題實驗室時,觀看 DeltaMOOCx 的線上課程,看到形態學的操作,覺得使用函式可以快速的達成功能,但是我不禁思考如果不使用函式,自己是否可以完成,本研究使用 opencv 的 cv2.getStructuringElement() 、 cv2.erode() 、 cv2.dilate() 、 cv2.morphologyEx() 函式當作對照組與不使用函式之結果進行比較。 2.    研究步驟 2.1 結構元素 (Structures Element) 結構元素為型態學的必備元素,結構元素的大小可以使用者自訂, opencv 函式中可以自訂為交叉 、 長方形 、 橢圓形 ,本研究對照組的 opencv 函式中使用的結構元素為 3x3 的交叉區塊,因此不使用 opencv 函式的實驗組的結構元素也為 3x3 的交叉區塊。 2.2 膨脹 (Dilation) 膨脹操作是將結構元素逐個像素的由上而下 、由左至右的掃描,假如結構元素的原點與被掃描圖像該點像素值相同,則將整個結構元素覆蓋至該圖像。 圖一 形態學膨脹操作 2.3 侵蝕 (Erosion) 侵蝕操作是將結構元素逐個像素的由上而下 、由左至右的掃描,假如整個結構元素與被掃描圖像像素值相同,則將結構元素的原點覆蓋至該圖像。 圖二 形態學侵蝕操作 2.4 斷開 (Open) 先侵蝕,接著再膨脹。 圖三 形態學斷開操作 2.5 閉合 (Close) 先膨脹,接著再侵蝕。 圖四 形態學閉合操作 3.    實驗結果 以下是實驗組與對照組的結果表格 : 4.    結論 經過了形態學的練習,不管事程式亦或是觀念都有一定的提升,我覺得可以把結構元素跟      圖像做捲積,再做加減運算,或許可以達成更快的速度。線上課程中,還有教到濾波,邊緣偵測等影像處理的方法,也是日後挑戰的題目。

使用YOLOV3達成物件偵測功能(使用IDE輸出)

圖片
  1. 研究動機 在人工智慧概論中,老師介紹了數種的深度學習算法,例如 VGG16 、 ResNe t ,物件偵測的算法 Mask-Rcnn 、 Yolo 等,我對物件偵測非常的有興趣,在網路上搜尋作法時,發覺 Yolo 是一個包裝好的套件,舉凡預測影片圖片,都需要使用 Yolo 的指令,因此我想將 Yolo 的功能,搬移到用一般的 IDE 也可以使用 Yolo 。 2. 研究步驟 2.1 獲得 yolo 之預測輸出 Yolo 演算法的 darknet 資料夾中,有一個名為 darknet.py 的 python 檔案,為作者讓使用者自行使用的 python 接口,不過由於該檔案預測目標的座標是輸出錯誤的,因此需要先更改檔案使其預測正確,以下為使用更改後的 darknet.py 預測輸出結果之截圖,該檔案會回傳預測之陣列,內含預測之類別以及該類別之座標 3. 實驗結果      以下為單張圖片之範例, 獲得座標之後即可依照座標使用 opencv 函式庫標出方框,這樣的輸出結果跟 yolo 指令的輸出結果一模一樣,但是藉由獲得預測的輸出座標,可以產生更多的運用。 圖一 Yolo 執行畫面 、 程式動態影片 4. 結論 在把 yolo 搬移到 IDE 上執行後,更多可能的應用例如 : 即時影片馬賽克 、計算物體的出現次數等等,相信在未來需要使用到目標檢測的算法時,可以更為得心應手。

使用DLIB函式庫達成即時人臉辨識功能

圖片
  1. 研究動機 在大二上學期時,想要做出一個人臉門禁系統,在網路搜尋時,搜尋到 Dlib 這個函式庫,他提供了眾多的預訓練模型, 本作品使用 Dlib 函式庫搭配 tkinter 套件製作 GUI ,並且用到了本課程教的陣列運算,達成即時人臉辨識的功能。 2. 研究步驟 2.1 系統流程圖 圖一 系統流程圖 2.2 獲得人臉位置 在一張圖像中,我們要先辨識圖片中的人臉及其位置,在 Dlib 函式庫中,是以 CNN 的方法來獲得人臉的位置, Dlib 提供了已經訓練好的模型,在程式中只要使用 dlib.cnn_face_detection_model_v1 函式即可使用此模型,在該步驟中,此函式可以回傳檢測到人臉的數量以及座標。 圖二 獲得人臉位置功能圖例 2.3 獲得人臉關鍵點 在獲得人臉的數量以及座標之後,由於人臉有許多的器官,例如鼻子、眉毛等等, Dlib 規範了 68 個人臉的關鍵點,使用 dlib.shape_predictor 函式可以得到人臉 68 點關鍵點的座標,以更好的辨識人臉。 圖三 獲得人臉關鍵點 功能圖例 2.4 獲得人臉特徵向量 在人臉辨識中,最後需要將所辨識到的人臉轉成特徵向量,才可以快速地比較,如果是將人臉以圖像的方式比對,將會耗費很多的資源,在 Dlib 中作者提供了使用 29 層 ResNet 訓練而成的模型,在輸入了圖片以及關鍵點後 dlib.face_recognition_model_v1 這個函示會輸出 128 維的特徵向量,用來跟資料庫的特徵向量做比對。 圖四 獲得人臉特徵向量 功能圖例 2.5 比對相似人臉 獲得人臉特徵相量後,必須與資料庫的特徵向量比對,比對方法為先將人臉特徵向量減去資料庫的向量再取歐式距離,擁有最小歐式距離並且歐式距離小於自訂閾值的人臉標籤即是系統辨識出之人臉。 3. 實驗結果 在 GTX1050 顯示卡運算下,在 640x480 的尺寸中,將 1 幀畫面辨識出其中人臉,耗時僅 0.1 秒,是可以達到串流功能的,以下是靜態的執行畫面。 圖五程式執行畫面 、 程式動態影片 (google 雲端 ) 4. 結論 Dlib 中,使用 CNN 作為人臉偵測的方法, CNN 的方法雖然精度很高,但是需要的運算效能非常多,在像是樹梅派 嵌入式系統,是不能達成即時的

cv2.Laplacian

圖片
仔細看一下這個 3×3 kernel,有沒有注意到該 kernel 的九個值全部加起來為 0(-1×8+8=0)?也就是說,當影像區域的色彩一致時(可能為背景),kernel 計算出的平均值為 0,代表輸出值(kernel anchor)等於 0(黑色),而倘若影像區域的中間顏色比周圍亮(代表可能為物體的交界處),此時 kernel 中間的數值 8 便會強化加大該交界值而變得更亮,-1 則淡化了周圍非物件邊緣的像素強度,使得整體算出的輸出值(kernel anchor)更大。 程式碼: import cv2 img=cv2.imread("8.png",0) gray_lap = cv2.Laplacian(img, cv2.CV_16S, ksize=3) """ 即Sobel函式求完導數後會有負值,還有會大於255的值。 而原影象是uint8,即8位無符號數,所以Laplacian建立的影象位數不夠,會有截斷。 因此要使用16位有符號的資料型別,即cv2.CV_16S。 """ dst = cv2.convertScaleAbs(gray_lap) # 轉回uint8 """ convertScaleAbs函數是一個位深轉化函數,可將任意類型的數據轉化為CV_8UC1。具體數據處理方式如下: (1). 對於src*alpha+beta的結果如果是負值且大於-255,則直接取絕對值; (2). 對於src*alpha+beta的結果如果大於255,則取255; (3). 對於src*alpha+beta的結果是負值,且小於-255,則取255; (4). 對於src*alpha+beta的結果如果在0-255之間,則保持不變; """ print(dst) cv2.imshow("orign", img) cv2.imshow('laplacian', dst) cv2.waitKey(0) cv2.destroyAllWindows() 結果: 參考: https://blog.csdn.net/u013230291/article/details/100557267

heatmap-視覺化你的模型辨識特徵

圖片
本模型使用ResNet20訓練cifar10資料集保存的權重。 載點 點我 論文出處:Grad-CAM Visual Explanations from Deep Networks via Gradient-Based Localization 簡單來說cnn可以萃取圖片的特徵,越深的捲積層,越可以表現重要,可讓神經網路學習的特徵,Grad-CAM的目的就是提取最後一層的特徵,並且resize為原圖的大小,這就可以視覺化你的模型辨識特徵 程式碼如下: import cv2 import numpy as np from keras.models import load_model #用來啟動 NN from keras import backend as K from matplotlib import pyplot as plt test_image = cv2.resize(cv2.imread('./plane1.jpg'),(32,32)) test_image = np.asarray(test_image.astype("float32")) test_image = test_image/255. test_image = test_image.reshape((1,32,32,3)) model=load_model('./resnet_softmax.h5') preds = model.predict(test_image) print("所有結果resnet_softmax=",preds) print("第"+str(np.argmax(preds[0])+1)+"類") #返回數值最大的索引 #model.summary() model_output = model.output[:, np.argmax(preds[0])] last_conv_layer = model.get_layer('conv2d_22') grads = K.gradients(model_output, last_conv_layer.output)[0] pooled_grads = K.mean

26. Remove Duplicates from Sorted Array for python

圖片
class Solution: def removeDuplicates(self, nums: List[int]) -> int: count=0 if len(nums)==0: return 0 for i in range(len(nums)): if nums[count]!=nums[i]: count+=1 nums[count]=nums[i] return count+1

Without Function數位影像處理(細線化)程式碼python

圖片
import numpy as np import cv2 img = np.zeros((100,400),dtype='uint8') font = cv2.FONT_HERSHEY_SIMPLEX cv2.putText(img,'TheAILearner',(5,70), font, 2,(255),5,cv2.LINE_AA) img1 = img.copy() x=img.shape[0] y=img.shape[1] thin = np.zeros(img.shape,dtype='uint8') def e(img2): b=np.uint8(np.zeros((x,y))) for i in range(1,x-1): for j in range(1,y-1): if (img2[i-1][j-1]==255 and img2[i-1][j+1]==255 and img2[i+1][j-1]==255 and img2[i+1][j+1]==255): b[i][j]=255#侵蝕 return b def o(img2): c=np.uint8(np.zeros((x,y))) for i in range(1,x-1): for j in range(1,y-1): if (img2[i-1][j-1]==255 and img2[i-1][j+1]==255 and img2[i+1][j-1]==255 and img2[i+1][j+1]==255): c[i][j]=255#侵蝕 d=c.copy() for i in range(1,x-1): for j in range(1,y-1): if (c[i][j]==255): d[i][j]=255 d[i-1][j-1]=255 d[i+1][j-1]=255

Without Function數位影像處理(細線化)程式碼python數位影像處理(侵蝕,膨脹,斷開,閉合)程式碼python

圖片
import numpy as np import cv2 img=cv2.imread("9.png",0) cv2.imshow("ori",img) x=img.shape[0] y=img.shape[1] b=np.uint8(np.zeros((x,y))) for i in range(1,x-1): for j in range(1,y-1): if (img[i-1][j-1]==255 and img[i-1][j+1]==255 and img[i+1][j-1]==255 and img[i+1][j+1]==255): b[i][j]=255 cv2.imshow("Eroded",b) #侵蝕 img=cv2.imread("9.png",0) c=np.uint8(np.zeros((x,y))) for i in range(1,x-1): for j in range(1,y-1): if (img[i][j]==255): c[i][j]=255 c[i-1][j-1]=255 c[i+1][j-1]=255 c[i-1][j+1]=255 c[i+1][j+1]=255 cv2.imshow("Dilated",c)#膨脹 d=np.uint8(np.zeros((x,y))) for i in range(1,x-1): for j in range(1,y-1): if (b[i][j]==255): d[i][j]=255 d[i-1][j-1]=255 d[i+1][j-1]=255 d[i-1][j+1]=255 d[i+1][j+1]=255 cv2.imshow("open",d) #先侵蝕再膨脹-斷開 f=n

使用vgg16遷移學習達成訓練目標-2013kaggle

圖片
在深度學習的路上,手寫辨識被稱作深度學習的hello world,那2013年貓狗分類的比賽,也是很多人會遇到的題目,那如何獲得高準確率並且不用很多張圖片呢? 這時候遷移學習(Transfer Learning)就上場了,什麼是遷移學習呢?簡單來說就是拿別人訓練好的模型,把輸出加以修改,來達成你要學習的東西,因此如果你的訓練樣本很少,遷移學習或許是個好選擇。 vgg被用來訓練辨識ImageNet的1000種目標,那我們這次要辨識的目標是貓跟狗,貓跟狗也有在ImageNet的1000種目標裡面,所以很適合用遷移學習來完成。 這次的訓練集為:貓500張,狗500張,這麼少的資料就可以達到90%的準確率 程式碼如下: from keras import models from keras import layers from keras.applications import VGG16 from keras.preprocessing.image import ImageDataGenerator from keras import optimizers import matplotlib.pyplot as plt train_dir = './data/train/' test_dir = './data/validation/' conv_base=VGG16(weights='imagenet',include_top=False,input_shape=(150,150,3)) #載入VGG16 model = models.Sequential() model.add(conv_base) model.add(layers.Flatten()) model.add(layers.Dense(output_dim = 256, activation = 'relu')) model.add(layers.Dense(output_dim = 1, activation = 'sigmoid')) #Dense輸出有幾個output_dim就要改成那個數字,不過輸出只要不是1,activation(激活函數)就必須修改成softmax conv

Without Function數位影像處理(細線化)程式碼python數位影像處理(二值化,低通,高通,中值濾波器)程式碼python

圖片
值方圖等化 import cv2 img=cv2.imread("8.png",0) cv2.imshow("IMG",img) dst=cv2.equalizeHist(img) cv2.imshow("DST",dst) cv2.waitKey(0) cv2.destroyAllWindows()  影像二值化 import cv2 a=cv2.imread("8.png",0) cv2.imshow("IMG",a) x=a.shape[0] y=a.shape[1] threshold=125 for i in range(x): for j in range(y): if(a[i][j]>threshold): a[i][j]=0 else: a[i][j]=255 cv2.imshow("threshold",a) cv2.waitKey(0) cv2.destroyAllWindows() 調整影像強度 import cv2 a=cv2.imread("8.png",0) cv2.imshow("IMG",a) x=a.shape[0] y=a.shape[1] for i in range(x): for j in range(y): a[i][j]=a[i][j]*0.7 cv2.imshow("dark",a) b=cv2.imread("8.png",0) for i in range(x): for j in range(y): b[i][j]=b[i][j]*1.5 if(int(b[i][j])>=int(255)): b[i][j]=int(255) cv2.imshow("bright",b) cv2.waitKey(0) cv2.destroyAllWindows()

以python讀取yolo的輸出-darknet.py

在安裝完yolo後,也實際操作yolo後,就會想要把yolo辨識完的座標,再加以應用,照理說要取找到yolo資料夾的c語言(yolo是用c寫的)檔案,做完更改後,還要在yolo的根目錄(~darknet)裡,把yolo編譯一次,才算完成修改。 不過在yolo資料夾裡,藏著一個python的資料夾,裡面有個darknet.py,這個檔案可以把yolo辨識完的結果,使用python 輸出。 一開始打開這個文件,不是直接執行就可以啟動的,還要做些修改。 https://blog.csdn.net/weixin_39198406/article/details/83931727 詳情請看這個文件 主要就是yolo辨識完會傳一個r陣列,裡面有辨識的名稱,座標( 注意不是邊界座標,是中心點以及方格的高跟寬 ) 之後就能應用darknet.py來實現你的作品了 那如何用這個darknet.py實現影片的目標檢測呢,有辦法只是需要更改程式碼,之後再說 程式碼如下: 應該在darknet.py複製貼上就可以了 from ctypes import * import math import random import os import cv2 import numpy as np import random def sample(probs): s = sum(probs) probs = [a/s for a in probs] r = random.uniform(0, 1) for i in range(len(probs)): r = r - probs[i] if r <= 0: return i return len(probs)-1 def c_array(ctype, values): arr = (ctype*len(values))() arr[:] = values return arr class BOX(Structure): _fields_ = [("x", c_float), ("y", c_float),

大量圖片改名的最佳方法

from os import listdir from os.path import isfile, isdir, join import os  path="/home/sfgx880/圖片/aaa" #可改成大量圖片的絕對路徑 files=listdir(path)

以dlib實現人臉辨識打卡系統

圖片
一、    功能 在上班族上班的一天,打卡是非常重要的,打卡系統的存在是讓雇主知道員工的上下班時間,但是打卡鐘也是需要員工手動的把卡片放入打卡鐘裡面,有了人臉辨識打卡系統,打卡鐘跟每天打卡的這個動作就是多餘的了。 這個打卡系統基於 python 跟 dlib 組成,只需要人臉被辨識,就會記錄下時間以及在資料庫尋找人名,完全不需要按鍵的觸發或是編號,因為人臉就是編號。