2023年6月8日 星期四

[Python]Json格式的列印方式

 json本身就是許多串列,每個串列裡面有許多字典型態的資料集合,所以可以用

json1 = [{"name":"jeff","age":40,"location":"taichung"}
,{"name":"renee","age":20,"location":"taichung"}
,{"name":"molly","age":6,"location":"taichung"}]
print(type(json1))

for list1 in json1:
for key,values in list1.items():
print(key,values)

輸出

<class 'list'> name jeff age 40 location taichung name renee age 20 location taichung name molly age 6 location taichung

2023年4月16日 星期日

ESP32-CAM無法臉部辨識

 ESP32-CAM的板子是跟夜市小霸王買的(有一陣子了),參考夜市小霸王的兩篇範例操作可正常運作。

帶CH340的ESP32CAM簡易測試

但在臉部辨識的部份,一直無法辨識到,後來參考這篇

內容有提到要使用ESP module 1.0.4,將ESP module version 1.0.6 移除,重新安裝version 1.0.4後,即可進行臉部辨識,且感覺畫面也比較流暢。









2023年1月3日 星期二

於Google Cloud Function建立ChatGPT人工智慧聊天機器人

 一、事前準備工作

ChatGPT帳號申請

LineBot帳號申請

Google Cloud Function設定

LineBot帳號申請

程式碼佈署

二、ChatGPT帳號申請


按TRY CHATGPT按鈕申請一個新的帳號

申請一組API key(申請過程中,切記要把SECRET KEY複製下來)

也可以直接在線上試著問它問題

三、LineBot帳號申請
參考以下連結申請Line Channel帳號

主要是獲得二個重要的Key
  • Channel secret
  • Channel access token

四、Google Cloud Function設定

1.建立函式
2.函式名稱可自行定義
3.地區可搜尋"taiwan"(asia-east1)
4.驗證點選"允許未經驗證的叫用"(現在好像儲存後都會跳掉?)
5.儲存
6.下一步


五、程式碼


1.執行階段選Python3.8
2.requirements.txt輸入
Flask==2.1.0
openai
requests
line-bot-sdk
3.main.py是主程式
4.進入點改為callback
5.程式碼

import openai
from flask import Flask, request, abort

from linebot import (
LineBotApi, WebhookHandler
)
from linebot.exceptions import (
InvalidSignatureError
)
from linebot.models import (
MessageEvent, TextMessage, TextSendMessage,
)

app = Flask(__name__)

line_bot_api = LineBotApi('你的 Channel access token')
handler = WebhookHandler('你的 Channel secret')


@app.route("/callback", methods=['POST'])
def callback(request):
# get X-Line-Signature header value
signature = request.headers['X-Line-Signature']

# get request body as text
body = request.get_data(as_text=True)
app.logger.info("Request body: " + body)

# handle webhook body
try:
handler.handle(body, signature)
except InvalidSignatureError:
print("Invalid signature. Please check your channel access token/channel secret.")
abort(400)

return 'OK'


@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
msg = event.message.text
reply_msg= ""

openai.api_key = '你的openai key'
response = openai.Completion.create(
engine='text-davinci-003',
prompt=msg,
max_tokens=256,
temperature=0.5,
)
reply_msg = response["choices"][0]["text"]

line_bot_api.reply_message(
event.reply_token,
TextSendMessage(reply_msg))


if __name__ == "__main__":
app.run()

六、部署

按下部署後(會需要一點點時間),到觸發條件,將觸發網址複製下來

貼到Line Developers的Messaging API settings -> Webhook settings (Use webhook要記得打開)


七、測試






2022年11月15日 星期二

[Python]改檔案名

import os

#由於要找的檔案很多,且在多層目錄結構下,所以先將完整路徑存到串列
fullpath = []

for root,dirs,files in os.walk(os.getcwd()): #使用os.walk找當下目錄的所有檔案
for f in files: #將每個檔案拿出來做名稱比較
if "gt-cpu" in f: #要比對的檔名字串
rename = "gtx-" + str.lower(f[4:])
print(f)
os.rename(os.path.join(root,f),os.path.join(root,rename))
print("=====After change========")
print(rename)
fullpath.append(os.path.join(root,f)) 

2022年11月11日 星期五

[Python]使用os.walk來找資料匣底下的檔案

 之前還不會用os.walk()時,都是先把檔案集中到單一資料匣下,再用os.listdir()去把檔案列出來。這樣一來就會多一個檔案整理的動作。

1.先來看一下測試時的目錄結構。


2.使用os.walk("目前路徑或其它路徑")去跑一下

import os
for respones in os.walk(os.getcwd()):
print("----------------")
print(respones)

得到的結果

----------------

('/Users/winer406/python/OS', ['test'], ['test1.py', 'test.py', 'test2.py'])

----------------

('/Users/winer406/python/OS/test', [], ['abc.py'])


回傳--> ("路徑","目錄","此目錄下的所有檔案")


3.使用os.walk的另一種呈現方式

import os
for root, dirs, files in os.walk(os.getcwd()):
print("----------------")
print(root)
print(dirs)
print(files)

得到的結果

----------------

/Users/winer406/python/OS  <-- 在這個路徑下

['test']  <-- 有1個資料匣

['test1.py', 'test.py', 'test2.py']  <--有3個檔案

----------------

/Users/winer406/python/OS/test  <-- 在這個路徑下

[]  <-- 沒有資料匣匣

['abc.py']  <-- 有1個檔

4.一次性將檔案的路徑(包含檔案名)列出來,方便做後續的處理

import os

for root, dirs, files in os.walk(os.getcwd()):
for file in files:
fullpath = os.path.join(root,file)
print(fullpath)

得到的結果

/Users/winer406/python/OS/test1.py

/Users/winer406/python/OS/test.py

/Users/winer406/python/OS/test2.py

/Users/winer406/python/OS/test/abc.py

有了絕對路徑,後面要處理檔案就比較方便了

資料參考來源:https://www.ewdna.com/2012/04/pythonoswalk.html




2022年9月28日 星期三

[Python]tkinter的背景顏色

 使用Python模組tkinter時,要留意Python的版本(但目前還不知道什麼?也有可能是其它環境參考設定造成顏色問題)

是要留意在哪個終端機底下(bash or zsh),於bash底下執行才會是灰色背景。

Python 3.9.7


輸入結果,背景是灰的(所以label的字不能刻意去改顏色)


Python 3.9.6 輸出結果背景是黑色的,label裡的字也看不到了~~


更新:原來是在bash底下才會是第一張圖,和Python版本無關。



2022年7月8日 星期五

[LAB]Google colab CPU vs. GPU vs. TPU

讀到網路上一篇文章提到,google colab免費版就有支援CPU/GPU/TPU的運算資源。第一次聽到TPU,原來是google開發的晶片,專門給人工智慧、機器學習和深度學習等的科學項目,提供更佳的處理效果。 

修改google colab的運算資源:



剛好之前在colab練習寫了一個人臉辨識的小程式,利用deepface模組,可以辨識圖片中人像的情緒、年齡、種族和性別。並透過不同的運算資源來記錄程式的運算時間,原本以為會是TPU > GPU > CPU,但結果是GPU > TPU ~= CPU ?會不會是因為TPU在處理深度學習模型訓練上才會有明顯效果,還在研究中... 下次來練習寫個模型訓練來測試看看。

程式碼:
import time
import cv2
from deepface import DeepFace

start = time.time()

img = cv2.imread('test3.png') # 讀取圖片
try:
analyze = DeepFace.analyze(img)
print("情緒:",analyze["dominant_emotion"],"年齡:",analyze["age"])
print("種族:",analyze["dominant_race"],"性別:",analyze["gender"])
except:
pass

end = time.time()
print(end - start)

CPU 3.90秒

GPU 1.63秒


TPU 3.58秒

======================Round2==========================

有google colab真的太方便,馬上可以來檢驗上述的猜測,是否TPU更適合放在訓練模型上。直接使用tensorflow於colab初學者範例來跑跑看。結果竟然是CPU > GPU > TPU 為什麼?

CPU 19.84秒

GPU 21.96秒

TPU 24.26秒


======================Round3==========================
如果只計算訓練模型的時間,是否會有變化?結果GPU > TPU > CPU

CPU 51.15秒

GPU 40.76秒

TPU 45.80秒




2022年2月6日 星期日

ESP32s 燒錄時發生Invalid head of packet(0xe0)錯誤

 試過調低upload speed 為115200後ok(原為921600)




2021年11月2日 星期二

Autodesk DWG TrueView 依使用情境匯出PDF

 工作上需要,有時要把客戶提供的CAD檔,裡面會有幾個樓層平面圖轉成PDF匯出。但不是很常做,因此時常忘記,因此在這裡做個記錄。


選擇Export --> PDF


Save As PDF --> Export欄位選擇Window, 然後旁邊圖示按下去,於Trueview視窗上拉選想要區域即可。


2020年11月4日 星期三

Solarwinds透過line notify發alert

 依下圖所示設定即可

需留意的是

1. Body一定要帶message=

2.不知道為什麼%一定要額外拉出來,不能使用變數帶有%(如memory 使用百分率等)。需要將變數轉成Byte(F=Bytes),然後再額外帶%25(=%)出來

message=${N=SwisEntity;M=PercentMemoryUsed;F=Bytes} %25