andythebest commited on
Commit
bfae1fb
·
verified ·
1 Parent(s): 9f6e700

Upload 2 files

Browse files
Files changed (2) hide show
  1. gemini_ai.py +139 -0
  2. 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}")