針對(duì)圖片分辨率不足的問(wèn)題,傳統(tǒng)的解決方案是使用雙線性或雙三次插值的方法來(lái)放大圖像;而針對(duì)圖片壓縮噪聲的問(wèn)題,傳統(tǒng)的解決方案則是通過(guò)各種算法實(shí)現(xiàn)平滑、去噪。
本SDK使用智能的方法,基于深度神經(jīng)網(wǎng)絡(luò),依托硬件的神經(jīng)網(wǎng)絡(luò)加速器,提供適用于移動(dòng)終端的1x和3x超分能力;1x超分可以去除圖片的壓縮噪聲,3x超分在有效抑制壓縮噪聲的同時(shí),提供3倍的邊長(zhǎng)放大能力。
基本概念
“超分”,即單張圖片空間域超分辨率(SISR:Single Image Super-Resolution),指給定單張圖片,使用智能方法將其放大,令其分辨率更高,得到比傳統(tǒng)放大更加清晰的細(xì)節(jié)紋理;或者在分辨率不變的情況下,去除壓縮噪聲,獲得更加銳利、干凈的圖片。
運(yùn)作機(jī)制
圖像超分引擎內(nèi)置于手機(jī)中,應(yīng)用程序可以通過(guò)本SDK訪問(wèn)超分能力,降低圖片超分應(yīng)用的開(kāi)發(fā)門檻,減小應(yīng)用程序大小。
約束與限制
- 支持處理的圖片格式包括JPEG、JPG、PNG,最終輸出的圖片僅支持JPEG格式。
- 目前支持1x和3x超分。兩種超分對(duì)圖片規(guī)格的支持情況如下表所示。
表1?1x和3x超分支持的圖片規(guī)格 超分類型
效果
支持圖片較長(zhǎng)邊最大像素?cái)?shù)
支持圖片較短邊最大像素?cái)?shù)
1x
不改變圖片的尺寸,但可以智能識(shí)別、抑制圖片本身的壓縮噪聲,令圖片更加干凈清晰。
1920
1080
3x
圖片的邊長(zhǎng)放大3倍。
1024
768
- 目前支持灰度圖和RGB圖像。在Java中為PixelMap的ALPHA_8和ARGB_8888兩種PixelFormat格式。其中,如果ARGB_8888格式的輸入圖片的Alpha通道沒(méi)有做超分或放大處理,輸出圖片的Alpha通道將被置為255。
- 正如其他智能算法存在著準(zhǔn)確率的限制,本SDK并不能解決所有圖片的放大和噪聲抑制問(wèn)題。對(duì)于某些成像質(zhì)量特別差或者存在著除壓縮噪聲外其他種類噪聲的圖片,本SDK并不一定總能得到令人滿意的結(jié)果。
圖像超分辨率開(kāi)發(fā)
場(chǎng)景介紹
圖像超分在實(shí)際應(yīng)用中有廣泛的前景,比如提升網(wǎng)絡(luò)圖片的畫(huà)質(zhì),在閱讀新聞時(shí)獲得更加清晰的大圖等等。
圖像超分可能的應(yīng)用場(chǎng)景包括但不限于:
- 抑制壓縮噪聲:1x的超分可以去除高壓縮率圖片的壓縮噪聲。
- 節(jié)省存儲(chǔ)和流量:可加大圖片壓縮率,有助于存儲(chǔ)及傳送高壓縮率的圖片。
- 高質(zhì)量放大:3x超分將圖片放大3倍,還能有效抑制壓縮噪聲。
開(kāi)放能力介紹
圖像超分提供了setVisionConfiguration()和doSuperResolution()兩個(gè)函數(shù)接口。
- setVisionConfiguration是IImageSuperResolution接口的成員,通過(guò)傳入的SisrConfiguration,選擇具體的超分參數(shù)。
void setVisionConfiguration(SisrConfiguration config);
-
下表列出了SisrConfiguration的常用設(shè)置:
接口
參數(shù)名
類型
參數(shù)說(shuō)明
setScale()
scale
float
設(shè)置超分倍數(shù)。目前支持SisrConfiguration.SISR_SCALE_1X和SisrConfiguration.SISR_SCALE_3X。
setScale()
void
void
設(shè)置超分倍數(shù)為默認(rèn)值SisrConfiguration.SISR_SCALE_1X。
setQuality()
quality
int
設(shè)置超分質(zhì)量。目前支持的參數(shù)類別為SisrConfiguration.SISR_QUALITY_LOW、
SisrConfiguration.SISR_QUALITY_MEDIUM和
SisrConfiguration.SISR_QUALITY_HIGH。
但該入?yún)⒛壳安⑽磳?shí)際使用,無(wú)論如何設(shè)置都會(huì)執(zhí)行當(dāng)前能力下的最高質(zhì)量超分。
setQuality()
void
void
設(shè)置返回圖片的超分質(zhì)量為SisrConfiguration.SISR_QUALITY_HIGH。
- 調(diào)用IImageSuperResolution的doSuperResolution()方法,執(zhí)行圖像超分。
int doSuperResolution(VisionImage image, ImageResult result, VisionCallback<ImageResult> visionCallback);
其中:
image為待超分的輸入圖片。
如果visionCallback為null,執(zhí)行同步調(diào)用,結(jié)果碼由方法返回,超分結(jié)果由result返回。
如果visionCallback為有效的回調(diào)函數(shù),則該函數(shù)為異步調(diào)用,函數(shù)返回時(shí)result中的結(jié)果無(wú)效,實(shí)際超分結(jié)果由回調(diào)函數(shù)返回。
同步模式調(diào)用成功時(shí),該函數(shù)返回結(jié)果碼0;異步模式調(diào)用請(qǐng)求發(fā)送成功時(shí),該函數(shù)返回結(jié)果碼700。
開(kāi)發(fā)步驟
在使用圖像超分SDK時(shí),先將相關(guān)的類添加至工程。
import ohos.ai.cv.common.ConnectionCallback;
import ohos.ai.cv.common.VisionCallback;
import ohos.ai.cv.common.VisionImage;
import ohos.ai.cv.common.VisionManager;
import ohos.ai.cv.common.ImageResult;
import ohos.ai.cv.sr.IImageSuperResolution;
import ohos.ai.cv.sr.SisrConfiguration;
import ohos.app.Context;
import ohos.media.image.PixelMap;
定義ConnectionCallback回調(diào),實(shí)現(xiàn)連接能力引擎成功與否后的操作。
ConnectionCallback connectionCallback = new ConnectionCallback() {
@Override
public void onServiceConnect() {
// 定義連接能力引擎成功后的操作。
}
@Override
public void onServiceDisconnect() {
// 定義連接能力引擎失敗后的操作。
}
};
調(diào)用VisionManager.init()方法,將此工程的context和和已經(jīng)定義的connectionCallback回調(diào)作為入?yún)?,建立與能力引擎的連接,context應(yīng)為ohos.aafwk.ability.Ability或ohos.aafwk.ability.AbilitySlice的實(shí)例或子類實(shí)例。
int result = VisionManager.init(context, connectionCallback);
在收到onServiceConnect回調(diào)連接服務(wù)成功后,實(shí)例化IImageSuperResolution接口,將此工程的context作為入?yún)?,context應(yīng)為ohos.aafwk.ability.Ability或ohos.aafwk.ability.AbilitySlice的實(shí)例或子類實(shí)例。
IImageSuperResolution imageSuperResolution = VisionManager.getSisr(context);
實(shí)例化VisionImage對(duì)象image,并傳入待超分圖片pixelMap。
VisionImage image = VisionImage.fromPixelMap(pixelMap);
實(shí)例化ImageResult對(duì)象imageResult,該對(duì)象用于在同步模式下存放doSuperResolution()方法傳出的超分后圖片結(jié)果。
ImageResult imageResult = new ImageResult();
(可選)定義VisionCallback<ImageResult>回調(diào)。
VisionCallback<ImageResult> callback= new VisionCallback<ImageResult>() {
@Override
public void onResult(ImageResult imageResult) {
// 對(duì)正確獲得圖片超分結(jié)果進(jìn)行處理。
}
@Override
public void onError(int i) {
// 處理錯(cuò)誤返回碼。
}
@Override
public void onProcessing(float v) {
// 返回處理進(jìn)度。
}
};
說(shuō)明
- 在異步模式下,該類的onResult()方法用于獲得超分的結(jié)果imageResult(內(nèi)含超分后圖片結(jié)果);onError()方法用于處理錯(cuò)誤返回碼;onProcessing()方法用于返回處理進(jìn)度,目前沒(méi)有實(shí)現(xiàn)此接口的功能。
- 同步與異步模式區(qū)別在于doSuperResolution()的最后一個(gè)參數(shù)visionCallback是否為空。若非空則為異步模式,此時(shí)會(huì)忽略自定義的ImageResult輸入result,接口調(diào)用結(jié)果一律從回調(diào)類visionCallback獲得。
通過(guò)SisrConfiguration配置超分參數(shù),可選擇超分倍數(shù)、質(zhì)量、調(diào)用模式(推薦使用MODE_IN同進(jìn)程模式)等??邕M(jìn)程模式(MODE_OUT)下調(diào)用方與能力引擎處于不同進(jìn)程;同進(jìn)程模式(MODE_IN)下,能力引擎在調(diào)用方進(jìn)程中實(shí)例化,調(diào)用方通過(guò)反射的方式調(diào)用引擎里的圖像超分能力。以下以同進(jìn)程調(diào)用,3x最高質(zhì)量超分為例:
SisrConfiguration.Builder builder = new SisrConfiguration.Builder();
builder.setProcessMode(VisionConfiguration.MODE_IN);
SisrConfiguration config = builder.build();
config.setScale(SisrConfiguration.SISR_SCALE_3X);
config.setQuality();
imageSuperResolution.setVisionConfiguration(config);
(可選)調(diào)用IImageSuperResolution的prepare方法。
result = imageSuperResolution.prepare();
說(shuō)明
如果返回的result不為0,說(shuō)明當(dāng)前超分能力準(zhǔn)備失敗,需要處理錯(cuò)誤,不再執(zhí)行之后的動(dòng)作。在doSuperResolution()方法中會(huì)首先調(diào)用prepare()啟動(dòng)引擎,如果引擎已經(jīng)啟動(dòng)則不會(huì)再次啟動(dòng)。
調(diào)用IImageSuperResolution的doSuperResolution方法。
result = imageSuperResolution.doSuperResolution(image, imageResult, null); // 同步
或者:
result = imageSuperResolution.doSuperResolution(image, null, callback); // 異步
說(shuō)明
- 同步模式調(diào)用完成時(shí),該函數(shù)立即返回結(jié)果碼。
- 異步模式調(diào)用請(qǐng)求發(fā)送成功時(shí),該函數(shù)返回結(jié)果碼700。如果返回其他的值,說(shuō)明異步調(diào)用請(qǐng)求不成功,需要先處理錯(cuò)誤,回調(diào)函數(shù)不會(huì)被調(diào)用。
- 如果異步模式調(diào)用請(qǐng)求發(fā)送成功,則超分完成后,相應(yīng)的回調(diào)函數(shù)會(huì)被自動(dòng)調(diào)用:
- 如果onResult()回調(diào)被調(diào)用,說(shuō)明超分成功,相當(dāng)于同步模式結(jié)果碼為“0”的情況。
- 如果onError()方法被調(diào)用,說(shuō)明超分發(fā)生了錯(cuò)誤,具體的調(diào)用結(jié)果碼將由onError()的參數(shù)接收。
結(jié)果碼定義如下表:
結(jié)果碼 |
說(shuō)明 |
---|---|
0 |
成功 |
-1 |
未知錯(cuò)誤 |
-2 |
不支持的功能或接口 |
-3 |
內(nèi)存分配失敗或創(chuàng)建對(duì)象失敗 |
-4 |
所需庫(kù)加載失敗 |
-10 |
引擎開(kāi)關(guān)已經(jīng)關(guān)閉 |
101 |
失敗 |
102 |
超時(shí) |
200 |
輸入?yún)?shù)不合法(圖片尺寸錯(cuò)誤) |
201 |
輸入?yún)?shù)不合法(為空) |
210 |
輸入?yún)?shù)合法 |
500 |
服務(wù)綁定異常 |
521 |
服務(wù)綁定異常斷開(kāi) |
522 |
服務(wù)已連接 |
600 |
模型文件異常 |
601 |
模型文件不存在 |
602 |
模型加載失敗 |
700 |
異步調(diào)用請(qǐng)求發(fā)送成功 |
1001 |
神經(jīng)網(wǎng)絡(luò)處理單元錯(cuò)誤 |
調(diào)用IImageSuperResolution的release()方法,釋放模型資源;調(diào)用pixelMap的release()方法,釋放圖片內(nèi)存。
result = imageSuperResolution.release();
if (pixelMap != null) {
pixelMap.release();
pixelMap = null;
}
說(shuō)明
不再使用圖像超分能力時(shí),調(diào)用release()方法釋放資源。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-510275.html
調(diào)用VisionManager.destroy()方法,斷開(kāi)與能力引擎的連接。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-510275.html
VisionManager.destroy();
到了這里,關(guān)于HarmonyOS學(xué)習(xí)路之開(kāi)發(fā)篇—AI功能開(kāi)發(fā)(圖像超分辨率)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!