Spaces:
Sleeping
Sleeping
Upload 2 files
Browse files- gemini_ai.py +139 -0
- image_converter.py +62 -0
gemini_ai.py
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!pip install -q -U google-generativeai
|
| 2 |
+
import google.generativeai as genai
|
| 3 |
+
import PIL.Image
|
| 4 |
+
import image_converter as img_converter
|
| 5 |
+
import random
|
| 6 |
+
#基本設定都放這邊----------------------------------------
|
| 7 |
+
#
|
| 8 |
+
#
|
| 9 |
+
# 設定圖檔位置 (此處僅為範例,純文字查詢時可忽略)
|
| 10 |
+
image_path = r'G:\Python\tools\input_images\1411032041-楊智翔ai生成.webp'
|
| 11 |
+
|
| 12 |
+
|
| 13 |
+
# 要使用的模型種類,免費版一分鐘只能跑最多十筆
|
| 14 |
+
gemini_model = 'gemini-2.5-flash'
|
| 15 |
+
|
| 16 |
+
target_JSON = {
|
| 17 |
+
"物理環境": ["辦公室", "臥室", "工作室", "工廠"],
|
| 18 |
+
"技術應用": ["人工智慧", "虛擬實境", "大數據分析", "其他"],
|
| 19 |
+
"社交關係": ["獨立工作(1人)", "團隊合作(2人以上)", "遠程協作(遠端控制)"],
|
| 20 |
+
"職業情感": ["快樂", "睡覺", "壓力/焦慮", "成就感"],
|
| 21 |
+
"資訊設備": ["AI助手", "投影儀", "手機", "眼鏡投影",
|
| 22 |
+
"智慧手錶", "機械手臂", "平板",
|
| 23 |
+
"電腦", "鍵盤", "滑鼠", "其他"],
|
| 24 |
+
"物體": ["床", "椅子", "桌子",
|
| 25 |
+
"書架", "PC",
|
| 26 |
+
"肖像", "監視器",
|
| 27 |
+
"窗戶", "冷氣機","其他"],
|
| 28 |
+
"角色": ["機器人","教師","學生","動物","工作人員"]
|
| 29 |
+
}
|
| 30 |
+
|
| 31 |
+
|
| 32 |
+
#要求AI的提示語放這邊
|
| 33 |
+
# image_prompt = """您現在扮演一位圖片分類大師,擅長解讀圖片中的一些抽象涵義並加以分類。
|
| 34 |
+
# 請在各大類中選最近似的一樣,輸出結果如範例:"A[開心],B[學習],C[學校]"。
|
| 35 |
+
# 若您覺得,該圖片不具上列特徵,請回覆"A[NIL]",加上NIL表示該類未再提供的選項內。
|
| 36 |
+
# 以下是我們要請您分辨的種類:
|
| 37 |
+
# A情感類-人物表情: A[面無表情,開心,生氣,悲傷,緊張,輕視,想睡,疲憊,興奮,自信滿滿,臉部遮蔽]。
|
| 38 |
+
# B動作類-B[學習,工作,飲食,遊戲,駕駛,睡覺,冥想,醫療行為,會議,團隊討論,聽音樂,看電視,畫畫,騎車,烹飪,走路]。
|
| 39 |
+
# C場景類-C[辦公室等工作空間,書房,臥室,客廳,學校,網咖,超現實場景,車內,外太空]。"""
|
| 40 |
+
|
| 41 |
+
# image_prompt = """您現在扮演一位圖片分類大師,擅長解讀圖片中的一些抽象涵義並加以分類。
|
| 42 |
+
# 請在各大類中選最近似的一樣,輸出結果如範例:"物理環境[辦公室],技術應用[人工智慧,虛擬實境,其他],資訊設備[其他]"。
|
| 43 |
+
# 若您覺得,該圖片不具上列特徵,請回覆"XXX[NIL]",XXX為該類別,加上NIL表示該類未再提供的選項內。
|
| 44 |
+
# 以下是我們要請您分辨的種類,會以JSON標示:
|
| 45 |
+
# 物理環境[辦公室,臥室,工作室,工廠]。
|
| 46 |
+
# 技術應用[人工智慧,虛擬實境,大數據分析,其他]。
|
| 47 |
+
# 社交關係[獨立工作(1人),,團隊合作(2人以上),遠程協作(遠端控制)]。
|
| 48 |
+
# 職業情感[快樂,睡覺,壓力/焦慮,成就感]。
|
| 49 |
+
# 資訊設備[AI助手,投影儀,手機,眼鏡投影,智慧手錶,機械手臂,平板,電腦,鍵盤,滑鼠,其他]。
|
| 50 |
+
# 物體[床,椅子,桌子,書架,PC,肖像,監視器,窗戶,冷氣機,其他]。
|
| 51 |
+
# 角色[機器人,教師,學生,動物,工作人員]。
|
| 52 |
+
# """
|
| 53 |
+
|
| 54 |
+
image_prompt = """您現在扮演一位圖片分類大師,擅長解讀圖片中的一些抽象涵義並加以分類。
|
| 55 |
+
請在各大類中選最近似的一樣,輸出結果如範例:"物理環境[辦公室],技術應用[人工智慧,虛擬實境,其他],資訊設備[其他]"。
|
| 56 |
+
若您覺得,該圖片不具上列特徵,請回覆"XXX[NIL]",XXX為該類別,加上NIL表示該類未再提供的選項內。
|
| 57 |
+
以下是我們要請您分辨的種類,會以JSON標示:"""+ str(target_JSON)
|
| 58 |
+
|
| 59 |
+
#--------------------------------------------------------
|
| 60 |
+
## 替換冒號和逗號為換行符號
|
| 61 |
+
def replace_colon_comma_with_newline(input_string):
|
| 62 |
+
processed_string = input_string.replace(':', '\n').replace('],', ']\n')
|
| 63 |
+
return processed_string
|
| 64 |
+
|
| 65 |
+
|
| 66 |
+
|
| 67 |
+
|
| 68 |
+
|
| 69 |
+
# function,輸入是文字或是圖檔的位置
|
| 70 |
+
def analyze_content_with_gemini(input_content,target_JSON=target_JSON):
|
| 71 |
+
"""
|
| 72 |
+
透過 Gemini API 辨識內容,可處理純文字或圖片。
|
| 73 |
+
|
| 74 |
+
Args:
|
| 75 |
+
input_content (str or PIL.Image.Image):
|
| 76 |
+
如果輸入是字串,則代表要辨識的文字訊息或圖片路徑。
|
| 77 |
+
如果輸入是 PIL.Image.Image 物件,則直接使用該圖片。
|
| 78 |
+
|
| 79 |
+
Returns:
|
| 80 |
+
str: 辨識結果的文字描述。
|
| 81 |
+
"""
|
| 82 |
+
# 請將 'YOUR_API_KEY' 替換為您的實際 API 金鑰。
|
| 83 |
+
my_api_key = ['AIzaSyC6nBDxCuiE5GzBdTRQd-roYqVCGYCRy5M','AIzaSyDKHts9C72a68x58z1ItSRxgIU65UKN_xw','AIzaSyCgUnkkgAsBpsfrKe2Lqy5WgAbP0ktxKbg'] # 如果有多個金鑰,可以放在列表中
|
| 84 |
+
my_api_key = random.choice(my_api_key) # 隨機選擇一個金鑰避免同時間大量使用同一個金鑰會被停用API服務
|
| 85 |
+
#print(f"使用的API金鑰: {my_api_key}")
|
| 86 |
+
genai.configure(api_key=my_api_key)
|
| 87 |
+
|
| 88 |
+
try:
|
| 89 |
+
# 判斷輸入的類型
|
| 90 |
+
if isinstance(input_content, str):
|
| 91 |
+
# 如果輸入是字串��嘗試判斷是否為圖片路徑
|
| 92 |
+
# 這是一個簡易判斷,若您確定只傳純文字,可簡化此處邏輯。
|
| 93 |
+
if input_content.lower().endswith(('.png', '.jpg', '.jpeg', '.gif','.webp')):
|
| 94 |
+
if input_content.lower().endswith(('.webp')):
|
| 95 |
+
input_content = img_converter.convert_webp_to_jpg(input_content) # 如果是 webp 圖片,先轉換為 jpg
|
| 96 |
+
|
| 97 |
+
# 使用能處理圖片的模型
|
| 98 |
+
model = genai.GenerativeModel(gemini_model)
|
| 99 |
+
image_obj = PIL.Image.open(input_content)
|
| 100 |
+
|
| 101 |
+
#response = model.generate_content(["這張圖片是什麼?請詳細描述。", image_obj])
|
| 102 |
+
response = model.generate_content([image_prompt, image_obj])
|
| 103 |
+
else:
|
| 104 |
+
# 使用純文字模型
|
| 105 |
+
model = genai.GenerativeModel(gemini_model)
|
| 106 |
+
response = model.generate_content(input_content)
|
| 107 |
+
elif isinstance(input_content, PIL.Image.Image):
|
| 108 |
+
# 使用能處理圖片的模型
|
| 109 |
+
model = genai.GenerativeModel(gemini_model)
|
| 110 |
+
|
| 111 |
+
#response = model.generate_content(["這張圖片是什麼?請詳細描述。", input_content])
|
| 112 |
+
response = model.generate_content([image_prompt, input_content])
|
| 113 |
+
else:
|
| 114 |
+
return "錯誤:輸入必須是文字、圖片路徑(字串)或 PIL.Image 物件。"
|
| 115 |
+
|
| 116 |
+
return replace_colon_comma_with_newline(response.text)
|
| 117 |
+
|
| 118 |
+
except Exception as e:
|
| 119 |
+
return f"發生錯誤:{e}"
|
| 120 |
+
|
| 121 |
+
|
| 122 |
+
if __name__ == '__main__':
|
| 123 |
+
# --- 程式碼使用範例 ---
|
| 124 |
+
|
| 125 |
+
# 範例 1:傳送純文字訊息
|
| 126 |
+
# print("正在處理純文字訊息...")
|
| 127 |
+
# text_message = "你好,請簡要說明一下Python是什麼?"
|
| 128 |
+
# response_text = analyze_content_with_gemini(text_message)
|
| 129 |
+
# print("回應結果:")
|
| 130 |
+
# print(response_text)
|
| 131 |
+
# print("-" * 20)
|
| 132 |
+
|
| 133 |
+
# 範例 2:傳送圖片路徑
|
| 134 |
+
# 請確保 image_path 指向有效的圖片檔案
|
| 135 |
+
print("正在處理圖片訊息...")
|
| 136 |
+
response_image = analyze_content_with_gemini(image_path)
|
| 137 |
+
print("回應結果:")
|
| 138 |
+
print(response_image)
|
| 139 |
+
print("-" * 20)
|
image_converter.py
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# 這個程式將 webp 圖片轉換為 jpg 格式,
|
| 2 |
+
# 並儲存到指定的資料夾或與原檔案相同的資料夾中。
|
| 3 |
+
# 使用 PIL 庫來處理圖片格式轉換。
|
| 4 |
+
|
| 5 |
+
from PIL import Image
|
| 6 |
+
import os
|
| 7 |
+
|
| 8 |
+
def convert_webp_to_jpg(webp_path, output_folder=None):
|
| 9 |
+
"""
|
| 10 |
+
將 webp 檔案轉換為 jpg 檔案。
|
| 11 |
+
|
| 12 |
+
:param webp_path: 輸入的 webp 檔案路徑。
|
| 13 |
+
:param output_folder: 輸出的資料夾路徑。如果為 None,則輸出到與輸入檔案相同的資料夾。
|
| 14 |
+
:return: 輸出的 jpg 檔案路徑。
|
| 15 |
+
"""
|
| 16 |
+
try:
|
| 17 |
+
# 開啟 webp 圖片
|
| 18 |
+
img = Image.open(webp_path).convert("RGB")
|
| 19 |
+
|
| 20 |
+
# 決定輸出的檔案名稱與路徑
|
| 21 |
+
file_name = os.path.splitext(os.path.basename(webp_path))[0]
|
| 22 |
+
if output_folder:
|
| 23 |
+
if not os.path.exists(output_folder):
|
| 24 |
+
os.makedirs(output_folder)
|
| 25 |
+
output_path = os.path.join(output_folder, f"{file_name}.jpg")
|
| 26 |
+
else:
|
| 27 |
+
output_path = os.path.join(os.path.dirname(webp_path), f"{file_name}.jpg")
|
| 28 |
+
|
| 29 |
+
# 儲存為 jpg
|
| 30 |
+
img.save(output_path, "jpeg")
|
| 31 |
+
|
| 32 |
+
print(f"成功將 {webp_path} 轉換為 {output_path}")
|
| 33 |
+
return output_path
|
| 34 |
+
except Exception as e:
|
| 35 |
+
print(f"轉換失敗:{e}")
|
| 36 |
+
return None
|
| 37 |
+
|
| 38 |
+
if __name__ == '__main__':
|
| 39 |
+
|
| 40 |
+
# 建立一個假的 webp 檔案以供測試
|
| 41 |
+
if not os.path.exists("input_images"):
|
| 42 |
+
os.makedirs("input_images")
|
| 43 |
+
|
| 44 |
+
try:
|
| 45 |
+
# 建立一個簡單的白色圖片
|
| 46 |
+
#G:\Python\tools\input_images\1411032040-楊宗祥.webp
|
| 47 |
+
dummy_webp_path = r"G:\Python\tools\input_images\1411032040-楊宗祥.webp"
|
| 48 |
+
|
| 49 |
+
# 測試轉換函數
|
| 50 |
+
# 範例 1: 轉換並儲存在相同資料夾
|
| 51 |
+
print("\n--- 範例 1: 轉換並儲存在相同資料夾 ---")
|
| 52 |
+
output_path = convert_webp_to_jpg(dummy_webp_path)
|
| 53 |
+
|
| 54 |
+
# 範例 2: 轉換並儲存在指定資料夾
|
| 55 |
+
print("\n--- 範例 2: 轉換並儲存在指定資料夾 ---")
|
| 56 |
+
if not os.path.exists("output_images"):
|
| 57 |
+
os.makedirs("output_images")
|
| 58 |
+
output_path = convert_webp_to_jpg(dummy_webp_path, "output_images")
|
| 59 |
+
|
| 60 |
+
print(output_path)
|
| 61 |
+
except Exception as e:
|
| 62 |
+
print(f"執行範例時發生錯誤: {e}")
|