跳到主要內容

利用 Shell 腳本與 AI 工具高效批次處理大量相片

面對大量相片時,傳統手動整理、命名與修復既辛苦又耗時。透過兩支自動化 Shell 腳本與 AI 工具 CodeFormer,可以實現相片批次命名、縮圖、AI 修復、格式轉換與備份的一條龍作業,極大提升效率。


工作流程詳述

1. 匯入相片並命名資料夾

將拍攝好的相片傳入任意資料夾,並將該資料夾命名為「拍攝日期_分類+事件描述」,例如:
20251104_旅遊_阿里山
方便追蹤跟管理。

2. 自動命名相片(photorename2.sh)

運行 photorename2.sh,依據相片的 EXIF 資訊自動讀取拍攝時間(Image Created)和相機型號(Camera Model),再依照格式:

時分_相機型號_序號.副檔名

自動重命名相片檔案,例如:
1030_Canon_001.jpg
若照片缺少拍攝時間則用檔案的修改時間代替。命名後的檔案方便辨識該張照片的基本資訊。

3. 縮圖並 AI 修復(aiphoto2.sh)

運行 aiphoto2.sh,它會先呼叫 photorename2.sh 進行命名,再將照片依「最長邊1920像素」限制縮放,並呼叫 CodeFormer 進行人像修復、背景優化及彩色化等處理。

最後會將修復完的照片轉為 4K 解析度 JPG,90%壓縮率,以兼顧畫質與檔案大小。修復後會搬回原始資料夾並依「拍攝日期_分類+事件描述_時分_相機型號_序號」命名。

4. 原始相片壓縮保存

原始相片會集中移到一個子資料夾並壓縮打包,確保有完整原始備份且不占用過多空間。

5. 靈活使用

由於 CodeFormer AI 修復需要較多資源與時間,若不需精細處理,只執行 photorename2.sh 即可快速完成命名及匯整,保持 EXIF 資訊完整。


腳本內容詳列

photorename2.sh — 自動依拍攝時間、相機型號重新命名

#!/bin/bash

count=1
shopt -s nullglob

files=(*.jpg *.JPG *.jpeg *.JPEG *.png *.PNG *.tif *.TIF *.tiff *.TIFF)

for file in "${files[@]}"; do

# 取得 Camera Model
model=$(exiftags -c "$file" | grep "Camera Model" | awk -F': ' '{print $2}' | tr -d ' ')

# 取得 Image Created(格式類似 2024:09:10 10:00:32)
image_created=$(exiftags -i "$file" | grep "Image Created" | awk -F': ' '{print $2}')

# model 預設為 na
if [ -z "$model" ]; then
model="na"
fi

# 要取出時間 hhmm,若 image_created 無值則用檔案修改時間替代
if [ -z "$image_created" ]; then
time_hhmm=$(date -r "$file" +"%H%M")
echo "無 Image Created,使用檔案修改時間: $file -> $time_hhmm"
else
# 從 Image Created 字串取時間部分,再去掉冒號,只取前4字 hhmm
time_hhmm=$(echo "$image_created" | awk '{print $2}' | sed 's/://g' | cut -c1-4)
fi

seq=$(printf "%03d" $count)

ext="${file##*.}"

new_name="${time_hhmm}_${model}_${seq}.${ext}"

mv -i "$file" "$new_name"

echo "已重新命名: $file -> $new_name"

((count++))

done

aiphoto2.sh — 自動縮圖、AI修復並整理照片

#!/bin/bash
#依據時間、相機命名
photorename2.sh

USER_INPUT_DIR="$(pwd)"

CURRENT_DIR_NAME="$(basename "$USER_INPUT_DIR")"

# 新增:去除 _resize 字串的純目錄名稱
CLEAN_DIR_NAME="${CURRENT_DIR_NAME/_resize/}"

ORIGINAL_DIR="${USER_INPUT_DIR}/${CURRENT_DIR_NAME}_原始"

RESIZE_DIR="${USER_INPUT_DIR}/${CURRENT_DIR_NAME}_resize"

AI_OUTPUT_DIR="${USER_INPUT_DIR}/ai_${CURRENT_DIR_NAME}_resize"

mkdir -p "$ORIGINAL_DIR"

mkdir -p "$RESIZE_DIR"

echo "開始將 JPG/PNG 圖片縮放輸出到 $RESIZE_DIR ..."

shopt -s nullglob

for img in "$USER_INPUT_DIR"/*.{jpg,JPG,jpeg,JPEG,png,PNG}; do

filename=$(basename "$img")

convert "$img" -resize 1920x1920\> -quality 90 "$RESIZE_DIR/${filename%.*}.jpg"

done

shopt -u nullglob

echo "將目錄 $USER_INPUT_DIR 中所有非目錄檔案移動到 $ORIGINAL_DIR ..."

find "$USER_INPUT_DIR" -maxdepth 1 -type f ! -name "$(basename "$0")" -exec mv {} "$ORIGINAL_DIR/" \;

echo "切換到 $RESIZE_DIR 執行 aiphoto ..."

PROCESS_DIR="$RESIZE_DIR"

cd "$PROCESS_DIR" || { echo "無法切換到 $PROCESS_DIR"; exit 1; }

USER_HOME="$HOME"

TEMP_OUTPUT_DIR="$USER_HOME/aiphoto"

FINAL_OUTPUT_DIR="$PROCESS_DIR/ai_${CURRENT_DIR_NAME}"

mkdir -p "$TEMP_OUTPUT_DIR"

mkdir -p "$FINAL_OUTPUT_DIR"

cd "$HOME/CodeFormer"

source "$HOME/codeformer_env/bin/activate"

clear

echo "=============================================="

echo " CodeFormer 批次處理操作介面 "

echo "=============================================="

echo "原始圖片資料夾:$PROCESS_DIR"

echo "暫存輸出資料夾(使用者目錄):$TEMP_OUTPUT_DIR"

echo "最終輸出資料夾(原始目錄下):$FINAL_OUTPUT_DIR"

echo

echo "請選擇處理模式:"

echo " [1] 僅修復"

echo " [2] 利用 Real-ESRGAN 強化背景區域"

echo " [3] 以 Real-ESRGAN 進一步提升修復後的人臉細節"

echo " [4] 彩色化黑白或褪色照片"

echo " [5] 人臉修補(裁切並對齊的人臉)"

echo " [0] 離開程式"

read -p "請輸入選項數字(0-5,0離開): " choice

if [[ "$choice" =~ ^[1-3]$ ]]; then

read -p "請輸入權重值 (例如 0.7 或 1.0,建議 0.7~1.0): " weight

if ! [[ "$weight" =~ ^0*(\.([0-9]+))?$|^1(\.0*)?$ ]]; then

echo "錯誤:權重請輸入介於 0 與 1 之間的數字"

deactivate

exit 1

fi

fi

case $choice in

0)

echo "離開程式。"

deactivate

exit 0

;;

1)

echo "執行選項 1:僅使用權重 ${weight} 修復"

python inference_codeformer.py -w "$weight" --input_path "$PROCESS_DIR" --output_path "$TEMP_OUTPUT_DIR"

;;

2)

echo "執行選項 2:使用權重 ${weight} 並利用 Real-ESRGAN 強化背景區域"

python inference_codeformer.py -w "$weight" --bg_upsampler realesrgan --input_path "$PROCESS_DIR" --output_path "$TEMP_OUTPUT_DIR"

;;

3)

echo "執行選項 3:使用權重 ${weight} 並以 Real-ESRGAN 進一步提升修復後的人臉細節"

python inference_codeformer.py -w "$weight" --face_upsample --bg_upsampler realesrgan --input_path "$PROCESS_DIR" --output_path "$TEMP_OUTPUT_DIR"

;;

4)

echo "執行選項 4:彩色化黑白或褪色照片"

python inference_colorization.py --input_path "$PROCESS_DIR" --output_path "$TEMP_OUTPUT_DIR"

;;

5)

echo "執行選項 5:人臉修補(裁切並對齊的人臉)"

python inference_inpainting.py --input_path "$PROCESS_DIR" --output_path "$TEMP_OUTPUT_DIR"

;;

*)

echo "無效選項,請重新執行並選擇有效選項。"

deactivate

exit 1

;;

esac

if [ "$choice" -eq 4 ] || [ "$choice" -eq 5 ]; then

echo "搬移處理結果到最終資料夾 $FINAL_OUTPUT_DIR"

mv -v "$TEMP_OUTPUT_DIR"/* "$FINAL_OUTPUT_DIR"/

else

if [ -d "$TEMP_OUTPUT_DIR/final_results" ]; then

echo "搬移處理結果到最終資料夾 $FINAL_OUTPUT_DIR"

mv -v "$TEMP_OUTPUT_DIR/final_results/"*.png "$FINAL_OUTPUT_DIR"/

else

echo "找不到 $TEMP_OUTPUT_DIR/final_results 目錄,無法搬移結果"

fi

fi

echo "原始圖片保留於 $USER_INPUT_DIR ,處理結果已搬移至 $FINAL_OUTPUT_DIR"

deactivate

PARENT_DIR="$(dirname "$USER_INPUT_DIR")"

FINAL_OUTPUT_PARENT_DIR="${PARENT_DIR}/${CURRENT_DIR_NAME}"

mkdir -p "$FINAL_OUTPUT_PARENT_DIR"

echo "aiphoto 處理完成,開始轉換 $FINAL_OUTPUT_DIR 下的 png 檔案為 jpg,輸出至 $FINAL_OUTPUT_PARENT_DIR ..."

shopt -s nullglob

for pngimg in "$FINAL_OUTPUT_DIR"/*.png; do

filename=$(basename "$pngimg")

# 改用不含 _resize 的純目錄名稱做為前綴
newname="ai_${CLEAN_DIR_NAME}_${filename%.*}.jpg"

convert "$pngimg" -quality 90 "$FINAL_OUTPUT_PARENT_DIR/$newname"

done

shopt -u nullglob

echo "所有處理完成,結果已存放於 $FINAL_OUTPUT_PARENT_DIR"

# 刪除目錄_resize

rm -rf "$RESIZE_DIR"

# 壓縮目錄_原始成tgz,檔名為目錄_原始.tgz

tgz_file="${ORIGINAL_DIR}.tgz"

tar -czf "$tgz_file" -C "$USER_INPUT_DIR" "${CURRENT_DIR_NAME}_原始"

# 刪除目錄_原始

rm -rf "$ORIGINAL_DIR"

#結束音效
play -q /opt/finish.mp3

這兩支 Script 讓批次照片的整理與 AI 修復變得簡單又高效,適合大量相片管理的需求。 如需更深入腳本解析或運行流程說明,可隨時詢問!


 

留言

這個網誌中的熱門文章

Live Debian System 安裝使用 CodeFormer(使用Anaconda)XXX

目前人工智慧(AI)已有越來越多的應用,而CodeFormer是一種人工智慧數位臉部修復工具,一般可以在其官網上傳照片,它會修復後讓你下載,但傳過一次曠日費時,還好它是開源軟體,於是將其安裝到自己的電腦中,便可以批次處理,不過事涉大量運算,有獨顯速度會快些,沒有的就只能用CPU硬解。

Live Debian System 中安裝使用 AI 對話模型 Gemma3 / Taide / DeepSeek-r1 / Qwen3

隨著 AI 的興起,熱門的 ChatGPT 應用充斥在生活中,一般都要上網才能使用,但如果自己有好一點的設備(尤其是獨立顯示卡),也可以安裝在自己的機器中,成為隨身的幫手。目前有一些對話式AI 開放讓人自己架設安裝甚至訓練,不過訓練需要的資源非常驚人暫不討論,以手上既有的設備,大概只能架設中、小型的模型使用。本文以 Live Debian System 為例,搭配 6G Nvidia 顯示卡,安裝 Google 的 Gemma3 以及台灣自行訓練的 Taide 還有最近討論度很高的 DeepSeek,實做如下:

Debian 13 原生 Python 安裝與使用 CodeFormer 修復臉部照片與影片教學

目前人工智慧(AI)已有越來越多的應用,而 CodeFormer 是一種人工智慧數位臉部修復工具,一般可以在其官網上傳照片( https://huggingface.co/spaces/sczhou/CodeFormer ),它會修復後讓你下載,但傳過一次曠日費時。還好它是開源軟體,於是將其安裝到自己的電腦中,便可以批次處理。不過事涉大量運算,有獨顯速度會快些,沒有的就只能用 CPU 硬解。如果原稿臉部夠大張(最好 512×512 像素以上),其還原程度相當不錯,有針對臉部一般修復、精細修復、上色、破碎還原等功能,個人覺得蠻自然傳神的。 因為自己筆電沒有太高檔 GPU,且 Debian 12 時使用 Anaconda3 來處理在 Debian 13 時卻失效,常常說空間不足、安裝 CUDA 相依性錯誤等問題,重灌系統好幾次,於是改變作法,打掉重做,用原生 Python 來執行。 在 Debian 13 中安裝 Nvidia GPU 驅動 若使用 Nvidia GTX 1060 等顯卡,想讓 CodeFormer 利用 GPU 加速運算,需要先安裝 Nvidia 官方驅動與 CUDA 開發環境。 注意!核心要使用 Debian 標準版核心以免編譯失敗。 1. 更新系統並安裝基礎工具 sudo apt update sudo apt upgrade sudo apt install linux-headers-amd64 python3.13-venv sudo apt install -y build-essential dkms 2. 安裝 Nvidia 官方驅動 sudo apt install nvidia-detect nvidia-driver firmware-misc-nonfree sudo reboot (如果失敗,編輯 /etc/apt/sources.list 在套件庫中加入 contrib non-free 如下: deb http://free.nchc.org.tw/debian/ trixie main non-free-firmware contrib non-free )  3. 驗證驅動安裝是否成功 nvidia-smi Debian 13 原生 Python 安裝與 CodeFor...