2022年4月15日 星期五

Python-Face Recognition-人臉辨識-使用 NB Webcam

 2022-4-15 撰寫文章 

  • (其實累積了Tibame 2021年的OpenCV 物流檢測課程 + 網路IThome + 市場上書本)

A.環境: (相關資訊 進入python 用help( ) 函數查)

  • 硬體:ASUS VivoBook Core i5 10th GEN ,NB 型號:X413FA(MGF:Y2020)
  • Python 版本 3.7.9  64
    •  (tags/v3.7.9:13c94747c7, Aug 17 2020, 18:58:18) [MSC v.1900 64 bit (AMD64)] on win32
  • face_recongition VERSION 
    •    1.2.3 PACKAGE CONTENTS
    •     api
    •     face_detection_cli
    •     face_recognition_cli
  • Visual Studio 2022 C++ (選項)
  • Cmake VERSION  3.22.3

  • dlib
  • OpenCV (cv2) opencv_version = '4.5.1.48'
help 使用說明文件:I
f this is your first time using Python, you should definitely check out
the tutorial on the Internet at 
https://docs.python.org/3.7/tutorial/

B.注意事項:

  • Python 請安裝合適的版本與位元(目前NB應該都是64位元)
  • 必須安裝 Cmake,Visual C++,OpenCV
  • 圖片檔案名稱大小寫,包含主檔名跟副檔名(ex: biden.jpg 跟biden.JPG可能會有錯誤)
  • 圖片存放路徑可以直接放在與 撰寫的python 程式檔(ex: Test.py)同一個folder路徑下
  • 程式有兩個python檔 =>每次新增圖片先用encoding訓練完,然後再用主程式測試
  •  建議有兩三張圖片,其中一張可以用來做測試,最好不同時期拍的照片或情境差距的照片

圖片資料:

  • 準備obama.jpg ,biden.jpg....等等可以先選三個人然後下載圖片.
  • 拿一張盡量臉部較明顯且解析好的拿來當訓練資料的圖.
  • 要增加圖,也要增加大括號裡面的圖名資料(如黃底)如下新增一個Tony.jpg:

 }, # 這個接在前面大括號的逗點別忘了.

    {

        "name": "Tony",

        "filename": "Tony.jpg",

        "face_encoding": None      

    }

主程式Code: findfaces_webcam.py

------------------------------------------------------------------------將以下拷貝

# Step 1 

# 需要先安装cmake

# CMake must be installed to build the following extensions: dlib


# 否則安裝 face_recognition 出現以下的 問題

#   × Running setup.py install for dlib did not run successfully.

#   │ exit code: 1

#   ╰─> [8 lines of output]

#       running install

#       running build

#       running build_py

#       package init file 'tools\python\dlib\__init__.py' not found (or not a regular file)

#       running build_ext

#       ERROR: CMake must be installed to build dlib

#       [end of output]


# Step2:

# 裝完 cmake 還得裝 Visual C++ 

# 否則 出現以下訊息.

# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!



# You must use Visual Studio to build a python extension on windows.  If you

# are getting this error it means you have not installed Visual C++.  Note

# that there are many flavors of Visual Studio, like Visual Studio for C#

# development.  You need to install Visual Studio for C++.



# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


# 然後裝完 Visual C++ 重新開機

# 最後安裝 face_recognition


# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

# Using legacy 'setup.py install' for dlib, since package 'wheel' is not installed.

# Installing collected packages: dlib, face_recognition

#   Running setup.py install for dlib ... done

# Successfully installed dlib-19.23.1 face_recognition-1.3.0

# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!



import face_recognition  

import cv2

import numpy as np

import pickle


with open("faces_encoding.dat", "rb") as f:

    known_face_list = pickle.load(f)    

known_face_encodings = [data["face_encoding"] for data in known_face_list]


cap = cv2.VideoCapture(0)

while True:

    ret, frame = cap.read()

    rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

    face_locations = face_recognition.face_locations(rgb_frame)

    face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)

    for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):

        face_distances = face_recognition.face_distance(known_face_encodings, face_encoding)

        best_match_index = np.argmin(face_distances)

        if face_distances[best_match_index] < 0.5:  ### 準確度距離改這段

            name = known_face_list[best_match_index]["name"]

        else:

            name = "Unknown"


        #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!畫框框標示

        #畫一個boarder=2 紅方框(0,0,255)    

        cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)

        # 畫一個填滿的實框

        cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED) 

        # 填入文字

        cv2.putText(frame, name, (left + 6, bottom - 6), cv2.FONT_HERSHEY_DUPLEX, 1.0, (255, 255, 255), 1)

    #顯示出來 辨識結果    

    cv2.imshow('Video', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):

        break


cap.release()

cv2.destroyAllWindows()



# !!!!!!!!!!!!!!      Tip 技巧:

# !!!!!!!!!!!!!!(1) 测试tolerance=0.5或0.4比较合适==> Tony 實測,覺得 distacne 0.5 真的好點

# !!!!!!!!!!!!!!(2) 可以用臉部大圖做訓練圖

# !!!!!!!!!!!!!!(3) 如果只是要拍照做人臉辨識(打卡)可以先關掉持續偵測減少負載,用靜態擷取的再做比對(亮燈擷取)

# !!!!!!!!!!!!!!!!   =>輸出判斷是誰的時候,可以用三張或多張圖同時聯集相似, 然後判斷是哪個人

# !!!!!!!!!!!!!!(4) 鏡頭解析度可以增高

# !!!!!!!!!!!!!!(5) 對函數作調參

# !!!!!!!!!!!!!!(6) 對webcam capture 的影像作適當前處理 新增成另一張,多一張 不同層次的圖像 比對 

# !!!!!!!!!!!!!!(7) 更準確的識別,可以設定重新採樣的次數,face_encodings 傳入 num_jitters 來實作,預設 0,範圍可設定 0-100,越高越準,但速度越慢,等比例慢(差距100倍?)

2022年3月30日 星期三

G-LAB01-AutoML-Autokeras-Chapter 2-MNIST dataset exercise

 AutoML學習 -2022-Mar-1st-22th Chapter 1-Chapter 2 

Topic:
2022年3月Topic主題:AutoML

-------------------
What I learn from:
-------------------
書本:
AutoML自動化機器學習: 用AutoKeras超輕鬆打造高效能AI模型
(Automated Machine Learning with AutoKeras: Deep Learning Made Accessible for Everyone with Just Few Lines of Coding

作者: Luis Sobrecueva
出版社: 旗標科技股份有限公司
出版日期:2021/12/31

--------------------------------------------------
What is AutoML/AutoKeras/甚麼是AutoKeras:
--------------------------------------------------
Auto-Keras 是一個開源、免費的工具,和 Google 的 AutoML 功能相似,也能為深度學習模型自動搜索架構和超參數,使用的方法是高效神經架構搜索(Efficient Neural Architecture Search,簡稱 ENAS)

When/何時:Year 2018 B /2018年初
Who design:?
Ref: https://lnkd.in/g5m3reDq



--------------------------------------------
初學者像我/Some beginner just like me :
--------------------------------------------
通常先使用 [MNIST 資料集],練習[機器學習]Machine Learning:
(MNIST 資料集: 就是一個數據庫,裡面存放一堆手寫的數字圖案照片)
附上練習圖片:(在Google Colab 上使用Auto-Keras)

心得回顧:
去年上過一些CNN 相關課程:
本次再度練習AutoKeras 更進一步的了解 機器學習的樣貌:
收集數據=>洗鍊調整數據=>資料視覺化分析(看看收集的分類)=>資料整規劃=>特徵工程=>[ 模型訓練(已知資料集訓練)=>評估模型(已知資料集測試) ]=>模型適配性(單一數據測試/陌生數據測試)=>模型儲存/模型model 部署.

所謂模型:
就是訓練出來的一個 CNN 神經元運算的邏輯參數與運算流程,包含各流程的結構。(結構/神經元層數例如: 卷積層=>池化層=>全連接層=>flatten=>dropout=>dense=>classification/Softmax 機率分類啟動 ....)

PS: Some are photo from:

https://ithelp.ithome.com.tw/articles/10275842


2022年3月13日 星期日

G-Lab 01 設定Google Login 服務-加載在網頁或應用程式

 

文章日期:2022/3/13 -

(文章日期 的用意,可能未來設定畫面 或者設定方式不同)


Step 1: 進入  https://console.developers.google.com/ 

            並點選同意繼續。


Step 2: 建立專案Poject:

                可能會設定到公司google workplace group 群組。

                如果自己要使用,用自己的google帳戶登入後設定使用(選擇無機構)



Step 3:選擇 一個 專案,然後點選左邊的OAuth2.0。




Step 4: 選擇 內部 或 外部 => 

理解如下:

  • 內部: 就是 只想讓 自己公司的 人使用,也就是外面的人即使知道website路徑也進不去。
  • 外部:就是開發 出來的應用程式 或 網頁,以google login 登入進入,進行管制。
官方說明與路徑如下:

用戶類型 -:內/外部使用者的說明。 

發布狀態- :測試 與 進行 中的 配額與注意事項。

https://support.google.com/cloud/answer/10311615#user-type&zippy=%2Ctesting


Step 5 : 設定網域以及 [隱私權同意 ]與相關 [服務條管等法律相關說明]

            可以放入公司官方文件的網址鏈結。





Step 6: 設定 要應用google login 的 網域/網站/應用程式

『已授權網域』要填寫未包含Https://跟www.的網址,填寫完畢點選『儲存並繼續』

如下, 假設填入 blog.com 就沒有紅字.







Step 6 - 點選左邊的[憑證]選項,接著點[建立憑證],然後再點選[OAuth 用戶端 ID]。

Step 7 - 應用程式類型選擇<網路應用程式>。

Step 8- 名稱處填入網站名稱,並在『已授權的重新導向URI』中填入可能應用重新導向的AP

例如網域為 https://www.Test.com.tw/


則需填入

https://www.Test.com.tw/Account/GoogleResponse

以及

https://www.Test.com.tw/signin-google
以及
https://www.Test.com.tw/GoogleAddResponse
以及
https://www.Test.com.tw/Account/GoogleAddResponse
以及
https://www.Test.com.tw/Account/GoogleAddResponse
以及
https://www.Test.com.tw/Account/signin-google
六個網址。

Step9 :完成後即會取得 用戶端 ID 以及 用戶端密碼 ,請將此資料複製給到後端平台管理員。

(自己設定後端也可以)

2022年1月31日 星期一

【PHP】《F1471》CH01-1-安裝XAMPP-(內含 開源伺服器Apache+PHP+MySQL)

必須安裝 後端伺服器!!

來自旗標 F1471 的學習 Chapter 1

PHP 是一種腳本語言(Script),後端伺服器端執行要有解譯伺服器,因此安裝Apache。

下載路徑:

https://www.apachefriends.org/zh_tw/download.html

我安裝的是 8.1.2版本,比對過 8.0.15下載 的套裝版本,似乎只差在PHP的版本。



2022年1月22日 星期六

LAB-16A:Node-Red write data to Google Spreadsheet-Method A :by Http Request

Topic :

如何透過Node-Red 將資料存入GoogleSpreadsheet

前言:三種方法,本文寫的是第二種Http Request(因為撰稿時其他兩種尚未完成)

經過上網查詢到有2種方法,但應該還有其他第三種。
第一種:是透過 Google Cloud 專案之API 建立授權 JSON填入,
第二種:是藉由Http Request 透過Google Form 的連動介面輸入SpreadSheet。
第三種:是 透過 Google SpreadSheet 的 Google App Script 建立GAS內預設函數 doPost() 來處理 http 的請求,然後進行寫入Google SpreadSheet。

環境:

(1)Node-Red version V 2.0.5

(2)開發環境套件使用:fChart -- 從  <Node -Red 視覺化開發工具> 作者 陳會安 ,所提供站台下載使用。

(3)作業系統: Windows 10 Version 20H2

(4)laptop NB:ASUS VivoBook S14 (Core i5 ,8th Gen)-製造年份2018年11月

(5)瀏覽器 :Google Chrome 版本 97.0.4692.99 (正式版本) (64 位元)

(6)Google SpreadSheet


設計邏輯: 

透過建立google Form ,運用其後端權限,來存取Google SpreadSheet。

設定步驟:

SpreadSheet :

(S1) 建立SpreadSheet : 打開 google SpreadSheet =>建立一個 SpreadSheet, 建立並輸入欄位名稱。-圖1


(S2)建立Google Form 表單 : 從SpreadSheet 功能表 > 工具 > 建立新表單 ,建立一個Googel Form (如此做法,SpreadSheet 會與表單自動建立連結 ,也就是Link 連動)圖2 圖3




(S3)抓取Prefill 網址: 按右上角 ...按鈕,然後按下選取 [取得預先填入的連結]。接下來 填入表單各項資料,直到填完表單,然後最底下可以看見[取得連結]。>> b然後按[複製連結]按鈕就取得 表單預備入資料的網址超鏈結。圖4



(S4)存檔 [預先填入鏈結] 路徑 於記事本或word等(總之存起來等會需要修改)。圖5



Node-Red:

(N1)建立flow : flow tab 頁面里面,建立 Inject -> function ->Http Request ->debug 流程。 圖6



(N2) inject 時間戳 Node: 維持不變 。圖7



(N3)function Node內容: 建立data {} (變數+大括號=JavaScript物件),然後根據SpreasSheet 有多少欄位要填入,建立對應的變數值指定。我寫的範例如下: 圖8

var data={}

data.name="Tony"

data.age="50"

data.title="manager"

data.dep="PD"

msg.payload=data

return msg;


(N4) Http Request 請求 Node:  
 a. 將 S5 步驟內的 HTTPS:// 內修改一些項目  (黃底的需要修改,綠底顯示參數&參數)-如圖9 


 a-I. prefill 改成 FormResponse 
 a-II. 所有參數值 分別改成對應 參數物件屬性值, 例如ex:  {{payload.name}}
 a-II 將[ 改完後的全路徑 ] 拷貝,填入<Http Request >Node 的 URL 欄位。--如圖10

Trial 運行

(T1) 打開Debug小蟲標籤 & 連動要寫入的Google SpreadSheet,準備觀察運行結果。--圖11


(T2) 確定Node彼此間線連接,各<Node 元件>右上角 沒有 紅色三角形。

(T3) 按下Deploy(部屬-也就是發行/運行),然後Node 皆無異常,視窗上方出現部屬成功。-圖13



(T4) 按下 Inject 注入一次的動作,觀察 Google SpreadSheet & debug 視窗是否有顯示正常數值。然後多按幾次看是否有連續出現(3次-4次)。-圖14



完成-----以上即完成此次的練習

2022年1月13日 星期四

日語學習資源




https://words.marugotoweb.jp/top.php?lang=zh


非常不錯的網站,選擇克制會排版,字體都蠻順眼。



2021年11月1日 星期一

何謂六位半電表

 最近在座公司的儀器校正

很好奇一專有名詞的定義

六位半電表:七位数字并且后六位可显示0~9。

半位 是甚麼测量结果的某一位能显示0~9的数字则称为1位,不能0~9全部显示则称为半位。

https://zhidao.baidu.com/question/361609164781515372.html

2021年9月21日 星期二

Python抓取天氣資料+Line Notify 通知

參考範例知識庫:

1:天氣查詢API介面 :
https://opendata.cwb.gov.tw/devManual/insrtuction?fbclid=IwAR1zwO-DgQW9Ot0E9pyUaKkwCxRix1E4EJpueBN_9chxPpYXbSI4DTrLvyE

用的是第3:

3.資料擷取-使用說明及目前開放資料擷取之氣象資料 線上API使用說明


2:Line Notify 連動程式碼 & Token 申請與 網路設定
https://ithelp.ithome.com.tw/articles/10223413

3:Dict 字典取值
https://www.runoob.com/python/att-dictionary-get.html

4:日期操作:
https://ithelp.ithome.com.tw/articles/10235251

天氣查詢工作事項:
申請帳號,獲得token key,填入 Authorization= 的後面 ,把XXX-XXX 取代掉.
url="https://opendata.cwb.gov.tw/api/v1/rest/datastore/F-C0032-001?Authorization=XXX-XXX&limit=1&elementName=Wx&format=JSON&locationName="

字典取值工作事項:
必須知道自己要取那些值,字典跟JSON格式的 Dict 與list 交換穿插的解讀

日期操作工作事項:
把日期值簡化

程式碼 注意事項:
1.注意 locationName之查詢城市是要 用輸入的或是預定的
2.要查那些資料先從requests 回饋資訊,先讀一次再 拆解JSON,擷取自己要的,過多的話可以先取第一個,再適當放大資料數。
3.程式分成 兩個def 模組,一個是get_weather 進行Request 取值,一個是 LineNotifyMessage 通知LineBOT
4.有兩個Token key 要先獲得,一個是 氣象查詢的,一個是Line Notify.

程式碼:

import requests

import json

import time

def get_weather():


# cityname=input("輸入天氣查詢城市")

#   F-C0032-001 是要查詢的資料種類,分類請查裝央氣象局對照表

cityname="桃園市"

# url 是來自中央氣象局給的 wbe query 網址, authorization 後面xxxxx...填入氣象局給你的授權碼..後面參數格式請查中央氣象局資料網站有說明.

url="https://opendata.cwb.gov.tw/api/v1/rest/datastore/F-C0032-001?Authorization=XXX-XXX&limit=1&elementName=Wx&format=JSON&locationName="

city_url=url + cityname

res=requests.get(city_url).text

# print(res)

res=json.loads(res)

a=res["records"]["location"][0]["locationName"]

b=res["records"]["location"][0]["weatherElement"][0]['time'][0]

c=res["records"]["location"][0]["weatherElement"][0]['time'][1]

d=res["records"]["location"][0]["weatherElement"][0]['time'][2]

k=res["records"]["datasetDescription"]

l=b["parameter"]["parameterName"]

# print("res 是何種資料結構 : ",type(res))

# print("a=",a)

# print("b=",b)

# print("c=",c)

# print("d=",d)

# print("K=",k)

# print("b類別=:",type(b))

# print("天氣 :" ,l)

bmsg=b.get("startTime") + "至\n" + b.get("endTime") + ":\n" + l

cmsg=c.get("startTime") + "至\n" + c.get("endTime") + ":\n" + c["parameter"]["parameterName"]

dmsg=d.get("startTime") + "至\n" + d.get("endTime") + ":\n" + d["parameter"]["parameterName"]

Tmsg="\n"+a+"\n"+ k + "\n"+ bmsg+ "\n"+ "\n" +cmsg +"\n"+'\n'+dmsg

# print("Tmsg=",Tmsg)

return Tmsg  #回傳值給msg

#------------------------------------------line 通知 的模組

def lineNotifyMessage(token, msg):

    headers = {

        "Authorization": "Bearer " + token, 

        "Content-Type" : "application/x-www-form-urlencoded"

    }


    payload = {'message': msg}

    r = requests.post("https://notify-api.line.me/api/notify", headers = headers, params = payload)

    return r.status_code


msg = get_weather()

token = '填入line給你的token 一長串字碼'

print("傳給line的msg=\n",msg)

#get_weather()

lineNotifyMessage(token,msg)

2021年9月20日 星期一

創客DIY網站與賣家-MAKER DIY


台灣物聯科技有限公司
https://www.taiwaniot.com.tw/
可以買到很多開發版


最近看到有人Post 一半都是套裝的電流電壓表/溫控器/自動往復循環/時間控制等等 http://www.topdiy.com/


https://shopee.tw/
蝦皮 就分店家專業性跟種類了。
也都有二手的。

https://www.ruten.com.tw/
露天也是,什麼都賣,什麼都不奇怪。
也都有二手的。


http://momoshop.com.tw/ 

Momo 

博客來 大家都知道

淘寶 大家都知道

2021年9月18日 星期六

C#-VISUAL STUDIO 2017安裝-2019安裝

(所有的初步文章發表,都先以草稿或文字。因主要以手機編輯。)




要開始學習C#了。

新手第一關就是「安裝環境」。

因為常常卡在環境的不同,或忘裝了某個東西。或是裝錯版本。或是不知道在哪裡安裝。

案例:
1:想起當初自學Python的時候,也是找在哪裡安裝,初期是看網路上的資料,後來真的太亂,因為有年代以及網路上案例開發時用的版本差異。
所以後來是買了一本書,跟書上使用相同的版本。
以及安裝時一大堆選項也才搞懂。
2:近期也有朋友問我Python開發程式,要花錢買嗎?像OFFICE一樣要花錢嗎?我說:不用錢。
她又問:哪邊可以安裝?我說:網路官網。
於是我把網址貼給他,並且告訴她:有版本跟作業系統種類跟作業系統位元版本。

這個視頻是我自己看到講得還不錯的。
而且自己也是裝了VS2019版本。

問題:
為什麼同事裝的是2017版本。到底去哪裝的啊?我怎麼沒看到?同事都說官網裝的啊。

解答:
影片裡,我找到解答,原來在可用相容裡面。YA!YES.

 https://m.youtube.com/watch?fbclid=IwAR1Y_X0CJDlUIAYYyVTWqB09RxO6VrzXMickKbfMNN8EVM9S634c-uPqb5w&v=SfeJfKM8xOY&feature=youtu.be#menu