---
# System prepended metadata

title: waifu2x - AI 圖像縮放和圖像降噪程式

---

# waifu2x - AI 圖像縮放和圖像降噪程式

## 簡介

waifu2x是一個用於動漫風格圖像的圖像縮放和圖像降噪程式，也支援處理普通圖片。

waifu2x的核心是一個用於超解析度成像的卷積神經網路(SRCNN)。它使用了NVIDIA CUDA技術，但也有使用OpenCL和Vulkan的替代實現。

https://zh.wikipedia.org/wiki/Waifu2x

## 下載

**waifu2x ncnn Vulkan**
https://github.com/nihui/waifu2x-ncnn-vulkan

## 使用說明

**基本用法**

waifu2x-ncnn-vulkan -i infile -o outfile [options]...

**選項說明**

-h
顯示說明

-v
詳細輸出

-i input-path
設定輸入路徑，可為檔案路徑或目錄。

-o output-path
設定輸入路徑，可為檔案路徑或目錄路徑。

-n noise-level
設定降噪等級，-1/0/1/2/3, 預設為0。等級越高效果越強，-1=不降噪。

-s scale
設定縮放等級，1/2, 預設為2。1 為不縮放，2 為兩倍。

-t tile-size
設定分塊大小，>=32/0皆為自動, 預設為0。使用較小的值來減少 GPU 記憶體使用，預設值為自動。

-m model-path
設定模型路徑，預設為models-cunet，位於程式目錄下的資料夾 (models-*)，用來針對不同類型的圖片，models-cunet: 一般圖片，models-upconv_7_anime_style_art_rgb: 插畫，models-upconv_7_photo: 照片。

-g gpu-id
使用 GPU，預設為0。可用 0,1,2 對於多 GPU。

-j load:proc:save
三階段執行續數量 (圖片解碼 + waifu2x 放大 + 圖片編碼)。預設為 1:2:2，使用較大的值可能增加 GPU 使用率與消耗更多 GPU 記憶體。對於小尺寸圖片可用 4:4:4，而大尺寸圖片可用 2:2:2，預設值通常對於大多數情況都不錯。如果發現 GPU 負載很低，則嘗試增加執行續數量以加快處裡。

-x
啟用 tta 模式

-f format
設定輸出格式 (png/webp, 預設為ext/png)，對於 png 格式的支援性較好，webp 編碼輸出的檔案則較小，以上兩者皆為無損。

## 應用

### 圖片放大與降噪

將 input.jpg 放大2倍、降噪強度2，儲存為 output.jpg
```powershell
waifu2x-ncnn-vulkan -v -i input.jpg -o output.jpg -n 2 -s 2
```
處理 intputdir 目錄下的所有圖片，儲存至 outputdir 目錄下
```powershell
waifu2x-ncnn-vulkan -v -i intputdir -o outputdir -n 2 -s 2
```

### 影片放大與降噪

由於 waifu2x 不支援影片格式輸入，必須先將影片轉換成連續圖片再用 waifu2x 處理圖片，由於是作為暫時的檔案，建議使用無損格式。最後將處理過的圖片轉成影片，再與片源音訊重新封裝合成新的影片檔即可。以下示範使用 ffmpeg 將影片轉換成圖片再轉回影片。

> 注意，CMD 中使用 %% 表示 %。

基本用法
ffmpeg [options for input] -i inputfile [options for output]  outputfile

**前置步驟**

由於將影片轉成連續會流失以下訊息：
* 顯示寬高比 (Display Aspect Ratio)
* 影格速率 (Frame Rate)
* 像素格式 (Pixel Format)

檢查 input.mpg 內容：
```powershell
ffmpeg -hide_banner -i input.mpg 
```

從主控台輸出訊息找到視訊串流的規格，例如下列這樣：
```text
Stream #0:0: Video: mpeg2video, yuv420p, 704x480 [SAR 40:33 DAR 16:9], 24000/1001 fps
```
記錄下所需的訊息，yuv420p、DAR 16:9、24000/1001 fps，之後會用到。

**影片轉換成連續圖片**

為了方便之後將連續圖片轉換成影片，使用 `-r`  轉換輸出 fps 為為固定不變的 fps 即 CFR。輸出檔名 `%07d` 為圖片的編號，由 0 起始，往前補 0 為 7 位數。

```powershell
ffmpeg -i input.mpg -r 24000/1001 -f image2 "frames_original\%07d.png"
```

由於 `yuv420p` 與 png 不相容，ffmpeg 將自動轉換成其他合適格式，以及 png 不支援非 1:1 的 SAR，將輸出錯誤的 DAR (顯示比例): `704x480 [SAR 1:1 DAR 44:30]`。因此，之後將圖片轉回影片時可使用 `-pix_fmt` 與 `-aspect` 選項，來轉換像素格式與強制指定顯示比例。
 
**放大圖片**

將 frames_original 目錄下的所有圖片放大降噪處理後輸出到 frames_scaled 目錄
```powershell
waifu2x-ncnn-vulkan -v -i frames_original -o frames_scaled -n 2 -s 2
```

輸入圖片 704x480 將得到 png 影像規格為 `rgb24, 1408x960 [SAR 1:1 DAR 44:30]` 的圖片，由於 1408x960不是標準解析度，若想得到符合標準解析度的寬或高，之後使用 ffmpeg 將圖片轉回影片時利用 `-s` 選項再次縮放畫面。

**連續圖片轉換成影片**

輸入是連續圖片檔必須使用 `-r` 來強制指定正確的輸入 fps；使用 `-pix_fmt` 轉換像素格式與片源相同；使用 `-aspect` 修正錯誤的顯示比例。對 input.mpg 使用 `-vn` 禁用影像，並使用 `-c:a copy` 複製音訊。1408x960 不是標準解析度，可用 `-s` 縮放輸出解析度到標準規格。

將 frames_scaled 目錄下的 PNG 圖片轉換成影片
```powershell
ffmpeg -f image2 -r 24000/1001 -i "frames_scaled\%07d.png" -vn -i input.mpg -s 1280x720 -c:v libx264 -refs:v 5 -preset:v slower -crf:v 18 -pix_fmt yuv420p -aspect 16/9 -c:a copy output.mkv
```

**分段處裡**

由於一次將整個影片輸出為圖片，將得到數量龐大的檔案數量，這對硬碟是不小的負擔。為了減輕硬碟的壓力，可以使用 `-ss` 與 `-t` 指定開始與持續時間將一個片段影片輸出為連續圖片。

```powershell
ffmpeg -i input.mpg -ss 00:00:00 -t 60 -r 24 -f image2 frames_original/%6d.png
```
```powershell
waifu2x-ncnn-vulkan -v -i frames_original -o frames_scaled -n 2 -s 2
```
```powershell
ffmpeg -f image2 -r 24000/1001 -i "frames_scaled\%6d.png" -s 1280x720 -c:v libx264 -refs:v 5 -preset:v slower -crf:v 18 -pix_fmt yuv420p -aspect 16/9 clips\000.mkv
```
假設影片長度為 00:24:35，重複以上步驟並使用不同的時間點得到多個分段影片。
`-i input.mpg -ss 00:01:00 -t 60` -> png files -> 001.mkv
`-i input.mpg -ss 00:02:00 -t 60` -> png files -> 002.mkv
`-i input.mpg -ss 00:03:00 -t 60` -> png files -> 003.mkv
中間省略......
`-i input.mpg -ss 00:24:00` -> png files -> 024.mkv

以上會得到 000.mkv ... 024.mkv，共 25個影片檔。將所有分段影片的檔名或完整路徑儲存為utf8編碼的純文字文件。

clipslist.txt
```text
file '000.mkv'
file '001.mkv'
file '002.mkv'
中間省略......
file '024.mkv'
```

串連所有分段影片並與片源音訊重新封裝合成新影片
```powershell
ffmpeg -f concat -safe 0 -i clipslist.txt -vn -i input.mpg -c copy output.mkv
```
