2024年12月18日 星期三

Python 學習筆記 : 簡單好用的 Web app 套件 gradio (七)

經過前面六篇測試, Gradio 系列的測試學習也進入尾聲, 最後一篇  Gradio web app 要來實作隨機貓狗圖片的顯示器, 這是我從茶米老師的課堂上學來的, 包含金門大學, 某高中 Python API 教學直播, 以及公司內訓我總共聽了三遍, 但沒有一次有跟得上實作 (因為我邊聽邊做會分心). 在摸熟 Gradio 用法後, 今天就來動手真正實作一遍唄. 參考 :

# 貓與狗的隨機圖


由於 Gradio PlaygroundHugging Face Space 均無法執行 requests 或 urllib 等爬蟲套件 (猜測是資安或業務考量, 付費帳戶也許就可以執行), 因此本測試均於本機執行 (也可以在 Colab 執行). 


十. 貓狗隨機圖片 : 

下面這兩個超棒的網站提供隨機的貓狗圖片 :


更棒的是還提供 API 讓我們可以用 Python 爬蟲程式輕易取得圖片, 其 API 網址如下 :


呼叫 requests.get() 並傳入 API 網址會傳回 JSON 字串回應, 呼叫字串的 json() 方法轉成字典或字典串列 data 後即可透過索引與屬性取得圖片的 URL :

貓咪圖片的網址 : data[0]['url']
狗狗圖片的網址 : data['message']

這些都可以利用 RestMan/PostMan 或瀏覽器開發者工具等分析 HTTP/HTTPS 的請求與回應訊息得到, 具體方法參考 :



1. 取得隨機貓咪圖片 :

首先用 Gradio 寫一個取得隨機貓咪圖片的 Web app, 程式碼如下 :

import gradio as gr
import requests

def handler():
    try:    
        url='https://api.thecatapi.com/v1/images/search'
        r=requests.get(url)   # 傳回 json 字串
        data=r.json()         # 轉成 Python 物件 (字典串列)
        return data[0]['url'] # 傳回圖片網址
    except Exception as e:  # 出現例外
        return None  # 傳回 None 不顯示圖片

out1=gr.Image(type='filepath',
              label='可愛的貓咪圖片',
              width=640,
              height=480)
iface=gr.Interface(
    fn=handler,          
    inputs=[],            
    outputs=[out1], 
    title='隨機貓咪圖',
    flagging_mode='never'
    )

iface.launch()

此例沒有輸入只有一個 Image 輸出元件, 當按下 Generate 按鈕時呼叫 handler() 函式利用 requests.get() 透過 API 網址取得圖片, 結果如下 :




也可以用 Python 內建的 urllib 模組來爬, 這樣就毋須安裝 requests, 改寫如下 :

import gradio as gr
import urllib.request
import json

def handler():
    try:
        url='https://api.thecatapi.com/v1/images/search'
        r=urllib.request.urlopen(url)
        data=json.load(r)  
        return data[0]['url']  
    except Exception as e:
        return None  

out1=gr.Image(type='filepath',
              label='可愛的貓咪圖片',
              width=640,
              height=480)

iface=gr.Interface(
    fn=handler,          
    inputs=[],            
    outputs=[out1],       
    title='隨機貓咪圖',
    flagging_mode='never'
    )

iface.launch()


2. 取得隨機狗狗圖片 :   

上面的隨機貓咪圖程式稍微修改一下即可取得狗狗圖片 : 

import gradio as gr
import requests

def handler():
    try:    
        url='https://dog.ceo/api/breeds/image/random'
        r=requests.get(url)     # 傳回 json 字串
        data=r.json()           # 轉成 Python 物件 (字典串列)
        return data['message']  # 傳回圖片網址
    except Exception as e:      # 出現例外
        return None  # 傳回 None 不顯示圖片

out1=gr.Image(type='filepath',
              label='可愛的狗狗圖片',
              width=640,
              height=480)
iface=gr.Interface(
    fn=handler,          
    inputs=[],            
    outputs=[out1], 
    title='隨機狗狗圖',
    flagging_mode='never'
    )

iface.launch()

結果如下 :




3. 選擇要取得隨機貓咪或狗狗圖片 :   

可以用一個 Radio 或 Dropdown 元件來選擇要取得貓咪還是狗狗圖片, 程式碼如下 : 

import gradio as gr
import requests

def handler(sel):
    try:
        if sel=='貓咪': 
            url='https://api.thecatapi.com/v1/images/search'
            r=requests.get(url)     # 傳回 json 字串
            data=r.json()           # 轉成 Python 物件 (字典串列) 
            return data[0]['url']   # 傳回圖片網址
        else:
            url='https://dog.ceo/api/breeds/image/random'
            r=requests.get(url)     # 傳回 json 字串
            data=r.json()           # 轉成 Python 物件 (字典串列)
            return data['message']  # 傳回圖片網址
    except Exception as e:
        return None  

in1=gr.Radio(label='請選擇貓咪或狗狗',
             choices=['貓咪', '狗狗'],
             value='貓咪')
out1=gr.Image(type='filepath',
              label='可愛的貓咪圖片',
              width=640,
              height=480)

iface=gr.Interface(
    fn=handler,          
    inputs=[in1],            
    outputs=[out1],       
    title='隨機貓咪或狗狗圖片',
    flagging_mode='never'
    )

iface.launch()

此使用一個 Radio 輸入物件讓使用者選擇要取得貓咪或狗狗圖片 (預設是貓咪), 其值會在按下 Submit 鈕時傳給 fn 所指定之處理函式 handler() 之參數 sel, 只要判斷 sel 是 '貓咪' 還是 '狗狗' 分別去不同 API 網址爬得隨機圖片之 url 即可, 結果如下 :





4. 在 Colab 佈署貓狗隨機圖片 App :  

上面的程式也可以在 Google 的 Colab 實作, 首先要安裝 gradio 套件 :

!pip install gradio     

然後機上面的程式貼到 Colab 儲存格中執行即可, 結果如下 :





可見 Colab 真是不錯的線上程式測試平台, requests 套件也可以執行. 

我從課堂上還學到在 Colab 上顯示圖片的方法, 先匯入 IPython.display 模組的 HTML 函式, 然後將含有 img 元素的 HTML 碼傳給 HTML() 即可 :

from IPython.display import HTML

url='https://cdn2.thecatapi.com/images/446.jpg'
img=f'<img src={url}>'
HTML(img)

結果如下 :




終於完成三個月前的課堂作業啦! 同時 Gradio 的測試學習也到此告一段落, 近一個月的鑽研收穫滿滿, 準備迎向另一個工具 Streamlit 的學測啦! 

沒有留言 :