AGY CLI神器,以ASCII ART生成十二生肖圖( The goal is to generate ASCII art representations of the zodiac animals, ensuring accurate mirroring upon horizontal flipping and maintaining a consistent visual height across all designs)
🐾 十二生肖視覺指紋 (ASCII ART) —— 水平鏡像翻轉與語意對稱性檢驗
在電腦視覺(Computer Vision)中,**自然生物(如十二生肖)具有左右對稱性或視角不變性,即便水平鏡像翻轉(RandomHorizontalFlip),其核心拓撲特徵與類別語意依然完全守恆;而符號/文字(如手寫字)**則具備嚴格的非對稱方向相依性,翻轉即造成語意損壞。 以下為完整的 十二生肖 ASCII ART 翻轉對照矩陣:
========================================================================= 【十二生肖:具備水平鏡像不變性 (自然物體 100% Invariant)】 =========================================================================
1. 子鼠 (Rat)
_.._
( 'o\ )_
\____) ~
"" ""
_.._
_( /o' )
~ (____/
"" ""
2. 丑牛 (Ox)
(___)
(o o)_____/
\ \ \
| |--| |
(___) \_____(o o) / / / | |--| |
3. 寅虎 (Tiger)
/\_/\
(='.'=)
) ( \
(__ __)~~
/\_/\
(='.'=)
/ ) (
~~(__ __)
4. 卯兔 (Rabbit)
(\_/)
( 'x' )
/ \
c(")_(")
(\_/)
( 'x' )
/ \
(")_(")o
5. 辰龍 (Dragon)
<==::{}=
/ \
( \__/ )~
"" ""
={}=::==>
/ \
~( \__/ )
"" ""
6. 巳蛇 (Snake)
_.-~-.
(~:o_o:~)~>
`-----'
.-~-._
<~(~:o_o:~)
`-----'
7. 午馬 (Horse)
(\_/)_
(o o)\
/ \ \
| |--| |
_(\_/)
/(o o)
/ / \
| |--| |
8. 未羊 (Goat)
(v\_/v)
(o.o)
\_/
/ \
(v\_/v)
(o.o)
\_/
/ \
9. 申猴 (Monkey)
@('_')@
( : )
/| |\
" "
@('_')@
( : )
/| |\
" "
10. 酉雞 (Rooster)
(>o
//)
^^
o<)
(\\
^^
11. 戌狗 (Dog)
/ \__
( @\___
/ O
/ (_____/
__/ \ ___/@ ) O \ \_____) \
12. 亥豬 (Pig)
^..^
( oo )
( -- )
c(")_(")
^..^
( oo )
( -- )
(")_(")o
## ============================
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import numpy as np
import os
plt.rcParams['font.sans-serif'] = ['Microsoft JhengHei']
plt.rcParams['axes.unicode_minus'] = False
zodiac_animals = [
('鼠 (Rat)', '🐀'),
('牛 (Ox)', '🐂'),
('虎 (Tiger)', '🐅'),
('兔 (Rabbit)', '🐇'),
('龍 (Dragon)', '🐉'),
('蛇 (Snake)', '🐍'),
('馬 (Horse)', '🐎'),
('羊 (Goat)', '🐐'),
('猴 (Monkey)', '🐒'),
('雞 (Rooster)', '🐓'),
('狗 (Dog)', '🐕'),
('豬 (Pig)', '🐖')
]
fig, ax = plt.subplots(figsize=(14, 10), facecolor='#0d1117')
ax.set_facecolor('#161b22')
# Title & Subtitle
plt.suptitle('十二生肖「隨機水平翻轉 (RandomHorizontalFlip)」電腦視覺語意不變性檢驗',
fontsize=18, fontweight='bold', color='#58a6ff', y=0.96)
plt.title('【結論】自然物體 (十二生肖) 鏡像翻轉後語意完整保留 (100% Invariant) ;手寫數字/字母翻轉則造成語意損毀!',
fontsize=12, color='#8b949e', pad=15)
💜在 Python 電腦視覺與機器學習生態中,PIL (Pillow) 與 Matplotlib (PLT) 分工明確:前者專注於底層像素運算與高通量管線,後者則專精於卡氏座標視覺化與複雜圖文排版。
| 評估維度 | PIL / Pillow (from PIL import Image) |
Matplotlib (import matplotlib.pyplot as plt) |
|---|---|---|
| 主要定位 | 專門的影像處理函式庫 (Image Processing) | 資料視覺化與繪圖排版函式庫 (Data Visualization) |
| 底層運算核心 | C 語言優化之純像素緩衝區 (Pixel Buffer) | 向量圖形後端引擎 (Agg, SVG, PDF, Cairo) |
| 核心資料物件 | PIL.Image.Image 物件 (專屬記憶體格式) |
NumPy 陣列 (ndarray) / Figure & Axes 物件 |
| 座標排版機制 | 絕對像素座標 (需手動推算像素位置與間距) | 相對圖表座標系 (自動網格、子圖佈局、自適應錨點) |
| 文字與字型支援 | 需透過 ImageDraw.text,置中需手動算 bbox |
原生整合 font_manager,支援 ha='center' 自適應 |
| 顯示輸出管道 | img.show() (呼叫系統內建圖片檢視器) |
plt.imshow() 搭配 plt.show() (視窗或內嵌渲染) |
| 執行效能開銷 | 極致輕量、微秒至毫秒級響應,記憶體極低 | 較為笨重,初始化圖形後端與字型引擎開銷大 |
| 模型訓練管線 | 與 PyTorch torchvision.transforms 原生整合 |
嚴禁置於 DataLoader 訓練迴圈 (會造成 CPU 嚴重大塞車) |
二、 選型決策樹:繪製生肖看板該選誰?
挑戰:生肖增強圖表並非單純照片儲存,而是包含 3×4 網格、12 隻動物獨立卡片、雙向翻轉箭頭 ⇄、標題、說明文字與底部紅色警告欄 的複合排版。
- PLT 的排版優勢:透過
plt.subplots(3, 4)可自動計算自適應間距,搭配tight_layout()徹底免除手動推導 12 次像素偏移之苦。 - 文字置中與字型:直接指定微軟正黑體 (
Microsoft JhengHei),一行ha='center'即可完美居中;但在 Linux / Docker 容器環境(例如無介面的 GPU 伺服器)可能因缺少字型檔引發UserWarning: Glyph missing或方框亂碼(Tofu)。 - PIL 的維護代價:在 PIL 中沒有「網格」概念(底層點陣圖處理函式庫(Raster Graphic Processor),缺乏排版引擎(Layout Engine)與文字量測流排機制),每個生肖的左上角
(x, y)、標籤文字寬高全部必須用算式硬寫,稍微調整間距整個畫布便全數錯位。
挑戰:在 PyTorch 訓練時對 10 萬張圖片進行即時資料擴增 (如RandomHorizontalFlip(p=0.5))。
- PIL 的速度優勢:PIL / Pillow 是以 C 語言撰寫底層影像處理模組,但其內部並非直接採用 NumPy 樣式的 C 陣列切片步長(Strides)。以水平翻轉為例,它是呼叫內部 C 函式
ImagingFlipLeftRight進行指標與記憶體區塊拷貝。 - PLT 的致命缺陷:若在訓練迴圈中使用 Matplotlib 進行翻轉與存檔,啟動後端渲染器的巨大開銷會使資料載入成為嚴重瓶頸,訓練速度拖慢 100 倍以上。