一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用TensorFlow Hub的ESRGAN模型來(lái)在安卓app中生成超分圖片

Tensorflowers ? 來(lái)源:TensorFlow ? 作者:魏巍 ? 2020-11-26 09:40 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

從一張低分辨率的圖片生成一張對(duì)應(yīng)的高分辨率圖片的任務(wù)通常被稱為單圖超分(Single Image Super Resolution - SISR)。盡管可以使用傳統(tǒng)的插值方法(如雙線性插值和雙三次插值)來(lái)完成這個(gè)任務(wù),但是產(chǎn)生的圖片質(zhì)量卻經(jīng)常差強(qiáng)人意。深度學(xué)習(xí),尤其是對(duì)抗生成網(wǎng)絡(luò) GAN,已經(jīng)被成功應(yīng)用在超分任務(wù)上,比如 SRGAN 和 ESRGAN 都可以生成比較真實(shí)的超分圖片。那么在本文里,我們將介紹一下如何使用TensorFlow Hub上的一個(gè)預(yù)訓(xùn)練的 ESRGAN 模型來(lái)在一個(gè)安卓 app 中生成超分圖片。最終的 app 效果如下圖,我們也已經(jīng)將完整代碼開(kāi)源給大家參考。

SRGAN
https://arxiv.org/abs/1609.04802

ESRGAN
https://arxiv.org/abs/1809.00219

完整代碼
https://github.com/tensorflow/examples/tree/master/lite/examples/super_resolution

首先,我們可以很方便的從 TFHub 上加載 ESRGAN 模型,然后很容易的將其轉(zhuǎn)化為一個(gè) TFLite 模型。注意在這里我們使用了動(dòng)態(tài)范圍量化(dynamic range quantization),并將輸入圖片的尺寸固定在50x50像素(我們已經(jīng)將轉(zhuǎn)化后的模型上傳到 TFHub 上了):

model = hub.load("https://tfhub.dev/captain-pool/esrgan-tf2/1") concrete_func = model.signatures[tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY] concrete_func.inputs[0].set_shape([1, 50, 50, 3]) converter = tf.lite.TFLiteConverter.from_concrete_functions([concrete_func]) converter.optimizations = [tf.lite.Optimize.DEFAULT] tflite_model = converter.convert() # Save the TF Lite model. with tf.io.gfile.GFile('ESRGAN.tflite', 'wb') as f: f.write(tflite_model) esrgan_model_path = './ESRGAN.tflite'

TFHub
https://hub.tensorflow.google.cn/

TFHub(轉(zhuǎn)化后模型)
https://hub.tensorflow.google.cn/captain-pool/lite-model/esrgan-tf2/1

現(xiàn)在 TFLite 已經(jīng)支持動(dòng)態(tài)大小的輸入,所以你也可以在模型轉(zhuǎn)化的時(shí)候不指定輸入圖片的大小,而在運(yùn)行的時(shí)候動(dòng)態(tài)指定。如果你想使用動(dòng)態(tài)輸入大小,請(qǐng)參考這個(gè)例子。

例子
https://github.com/tensorflow/tensorflow/blob/c58c88b23122576fc99ecde988aab6041593809b/tensorflow/lite/python/lite_test.py#L529-L560

模型轉(zhuǎn)化完之后,我們可以很快驗(yàn)證 ESRGAN 生成的超分圖片質(zhì)量確實(shí)比雙三次插值要好很多。如果你想更多的了解 ESRGAN 模型,我們還有另外一個(gè)教程可供參考:

lr = cv2.imread(test_img_path) lr = cv2.cvtColor(lr, cv2.COLOR_BGR2RGB) lr = tf.expand_dims(lr, axis=0) lr = tf.cast(lr, tf.float32) # Load TFLite model and allocate tensors. interpreter = tf.lite.Interpreter(model_path=esrgan_model_path) interpreter.allocate_tensors() # Get input and output tensors. input_details = interpreter.get_input_details() output_details = interpreter.get_output_details() # Run the model interpreter.set_tensor(input_details[0]['index'], lr) interpreter.invoke() # Extract the output and postprocess it output_data = interpreter.get_tensor(output_details[0]['index']) sr = tf.squeeze(output_data, axis=0) sr = tf.clip_by_value(sr, 0, 255) sr = tf.round(sr) sr = tf.cast(sr, tf.uint8)

教程
https://tensorflow.google.cn/hub/tutorials/image_enhancing

LR: 輸入的低分辨率圖片,該圖從 DIV2K 數(shù)據(jù)集中的一張蝴蝶圖片中切割出來(lái). ESRGAN (x4): ESRGAN 模型生成的超分圖片,單邊分辨率提升4倍. Bicubic: 雙三次插值生成圖片. 在這里大家可以很容易看出來(lái),雙三次插值生成的圖片要比 ESRGAN 模型生成的超分圖片模糊很多

你可能已經(jīng)知道,TensorFlow Lite 是 TensorFlow 用于在端側(cè)運(yùn)行的官方框架,目前全球已有超過(guò)40億臺(tái)設(shè)備在運(yùn)行 TFLite,它可以運(yùn)行在安卓,iOS,基于 LinuxIoT 設(shè)備以及微處理器上。你可以使用 Java, C/C++ 或其他編程語(yǔ)言來(lái)運(yùn)行 TFLite。在這篇文章中,我們將使用 TFLite C API,因?yàn)橛性S多的開(kāi)發(fā)者表示希望我們能提供這樣一個(gè)范例。

DIV2K
https://data.vision.ee.ethz.ch/cvl/DIV2K/

Java, C/C++
https://tensorflow.google.cn/lite/guide/android

TFLite C API
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/c/c_api.h

我們?cè)陬A(yù)先編譯好的 AAR 文件中包含了 TFLite C API需要的頭文件和庫(kù) (包括核心庫(kù)和 GPU 庫(kù))。為了正確的設(shè)置好 Android 項(xiàng)目,我們首先需要下載兩個(gè) JAR 文件并將相應(yīng)的頭文件和庫(kù)抽取出來(lái)。我們可以在一個(gè) download.gradle 文件中定義這些任務(wù),然后將這些任務(wù)導(dǎo)入 build.gradle。下面我們先定義下載 TFLite JAR 文件的兩個(gè)任務(wù):

task downloadTFLiteAARFile() { download { src "https://bintray.com/google/tensorflow/download_file?file_path=org%2Ftensorflow%2Ftensorflow-lite%2F2.3.0%2Ftensorflow-lite-2.3.0.aar" dest "${project.rootDir}/libraries/tensorflow-lite-2.3.0.aar" overwrite false retries 5 } } task downloadTFLiteGPUDelegateAARFile() { download { src "https://bintray.com/google/tensorflow/download_file?file_path=org%2Ftensorflow%2Ftensorflow-lite-gpu%2F2.3.0%2Ftensorflow-lite-gpu-2.3.0.aar" dest "${project.rootDir}/libraries/tensorflow-lite-gpu-2.3.0.aar" overwrite false retries 5 } }

AAR 文件
https://tensorflow.google.cn/lite/guide/android#use_tflite_c_api

然后我們定義另一個(gè)任務(wù)來(lái)講頭文件和庫(kù)解壓然后放到正確的位置:

task fetchTFLiteLibs() { copy { from zipTree("${project.rootDir}/libraries/tensorflow-lite-2.3.0.aar") into "${project.rootDir}/libraries/tensorflowlite/" include "headers/tensorflow/lite/c/*h" include "headers/tensorflow/lite/*h" include "jni/**/libtensorflowlite_jni.so" } copy { from zipTree("${project.rootDir}/libraries/tensorflow-lite-gpu-2.3.0.aar") into "${project.rootDir}/libraries/tensorflowlite-gpu/" include "headers/tensorflow/lite/delegates/gpu/*h" include "jni/**/libtensorflowlite_gpu_jni.so" }

因?yàn)槲覀兪怯冒沧?NDK 來(lái)編譯這個(gè) app,我們需要讓 Android Studio 知道如何處理對(duì)應(yīng)的原生文件。我們?cè)?CMakeList.txt 文件中這樣寫:

set(TFLITE_LIBPATH "${CMAKE_CURRENT_SOURCE_DIR}/../../../../libraries/tensorflowlite/jni") set(TFLITE_INCLUDE "${CMAKE_CURRENT_SOURCE_DIR}/../../../../libraries/tensorflowlite/headers") set(TFLITE_GPU_LIBPATH "${CMAKE_CURRENT_SOURCE_DIR}/../../../../libraries/tensorflowlite-gpu/jni") set(TFLITE_GPU_INCLUDE "${CMAKE_CURRENT_SOURCE_DIR}/../../../../libraries/tensorflowlite-gpu/headers") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++14") set(CMAKE_CXX_STANDARD 14) add_library(SuperResolution SHARED SuperResolution_jni.cpp SuperResolution.cpp) add_library(lib_tensorflowlite SHARED IMPORTED) set_target_properties(lib_tensorflowlite PROPERTIES IMPORTED_LOCATION ${TFLITE_LIBPATH}/${ANDROID_ABI}/libtensorflowlite_jni.so) add_library(lib_tensorflowlite_gpu SHARED IMPORTED) set_target_properties(lib_tensorflowlite_gpu PROPERTIES IMPORTED_LOCATION ${TFLITE_GPU_LIBPATH}/${ANDROID_ABI}/libtensorflowlite_gpu_jni.so) find_library(log-lib log) include_directories(${TFLITE_INCLUDE}) target_include_directories(SuperResolution PRIVATE ${TFLITE_INCLUDE}) include_directories(${TFLITE_GPU_INCLUDE}) target_include_directories(SuperResolution PRIVATE ${TFLITE_GPU_INCLUDE}) target_link_libraries(SuperResolution android lib_tensorflowlite lib_tensorflowlite_gpu ${log-lib})

我們?cè)?app 里包含了3個(gè)示例圖片,這樣用戶可能會(huì)運(yùn)行同一個(gè)模型多次,這意味著為了提高運(yùn)行效率,我們需要將 TFLite 解釋執(zhí)行器進(jìn)行緩存。這一點(diǎn)我們可以在解釋執(zhí)行器成功建立后通過(guò)將其指針從 C++ 傳回到 Java 來(lái)實(shí)現(xiàn):

extern "C" JNIEXPORT jlong JNICALL Java_org_tensorflow_lite_examples_superresolution_MainActivity_initWithByteBufferFromJNI(JNIEnv *env, jobject thiz, jobject model_buffer, jboolean use_gpu) { const void *model_data = static_cast(env->GetDirectBufferAddress(model_buffer)); jlong model_size_bytes = env->GetDirectBufferCapacity(model_buffer); SuperResolution *super_resolution = new SuperResolution(model_data, static_cast(model_size_bytes), use_gpu); if (super_resolution->IsInterpreterCreated()) { LOGI("Interpreter is created successfully"); return reinterpret_cast(super_resolution); } else { delete super_resolution; return 0; } }

解釋執(zhí)行器建立之后,運(yùn)行模型實(shí)際上就非常簡(jiǎn)單了,我們只需要按照 TFLite C API 來(lái)就好。不過(guò)我們需要注意的是如何從每個(gè)像素中抽取 RGB 值:

// Extract RGB values from each pixel float input_buffer[kNumberOfInputPixels * kImageChannels]; for (int i = 0, j = 0; i < kNumberOfInputPixels; i++) { // Alpha is ignored input_buffer[j++] = static_cast((lr_img_rgb[i] >> 16) & 0xff); input_buffer[j++] = static_cast((lr_img_rgb[i] >> 8) & 0xff); input_buffer[j++] = static_cast((lr_img_rgb[i]) & 0xff); }

TFLite C API
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/c/c_api.h

運(yùn)行完模型后我們需要再將 RGB 值再打包進(jìn)每個(gè)像素:

// Postprocess the output from TFLite int clipped_output[kImageChannels]; auto rgb_colors = std::make_unique(kNumberOfOutputPixels); for (int i = 0; i < kNumberOfOutputPixels; i++) { for (int j = 0; j < kImageChannels; j++) { clipped_output[j] = std::max(0, std::min(255, output_buffer[i * kImageChannels + j])); } // When we have RGB values, we pack them into a single pixel. // Alpha is set to 255. rgb_colors[i] = (255u & 0xff) << 24 | (clipped_output[0] & 0xff) << 16 | (clipped_output[1] & 0xff) << 8 | (clipped_output[2] & 0xff); }

那么到這里我們就完成了這個(gè) app 的關(guān)鍵步驟,我們可以用這個(gè) app 來(lái)生成超分圖片。您可以在對(duì)應(yīng)的代碼庫(kù)中看到更多信息。我們希望這個(gè)范例能作為一個(gè)好的參考來(lái)幫助剛剛起步的開(kāi)發(fā)者更快的掌握如何使用 TFLite C/C++ API 來(lái)搭建自己的機(jī)器學(xué)習(xí) app。

對(duì)應(yīng)的代碼庫(kù)中
https://github.com/tensorflow/examples/tree/master/lite/examples/super_resolution

致謝

作者十分感謝 @captain__pool 將他實(shí)現(xiàn)的 ESRGAN 模型上傳到 TFHub, 以及 TFLite 團(tuán)隊(duì)的 Tian Lin 和 Jared Duke 提供十分有幫助的反饋。

— 參考 —

[1] Christian Ledig, Lucas Theis, Ferenc Huszar, Jose Caballero, Andrew Cunningham, Alejandro Acosta, Andrew Aitken, Alykhan Tejani, Johannes Totz, Zehan Wang, Wenzhe Shi. 2016. Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network.

[2] Xintao Wang, Ke Yu, Shixiang Wu, Jinjin Gu, Yihao Liu, Chao Dong, Chen Change Loy, Yu Qiao, Xiaoou Tang. 2018. ESRGAN: Enhanced Super-Resolution Generative Adversarial Networks.

[3] Tensorflow 2.x based implementation of EDSR, WDSR and SRGAN for single image super-resolution

https://github.com/krasserm/super-resolution

[4] @captain__pool 的 ESGRAN 代碼實(shí)現(xiàn)

https://github.com/captain-pool/GSOC

[5] Eirikur Agustsson, Radu Timofte. 2017. NTIRE 2017 Challenge on Single Image Super-Resolution: Dataset and Study.

責(zé)任編輯:xj

原文標(biāo)題:學(xué)習(xí)教程 | 使用 TensorFlow Lite 在 Android App 中生成超分圖片

文章出處:【微信公眾號(hào):TensorFlow】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Android
    +關(guān)注

    關(guān)注

    12

    文章

    3973

    瀏覽量

    130262
  • APP
    APP
    +關(guān)注

    關(guān)注

    33

    文章

    1587

    瀏覽量

    74265
  • tensorflow
    +關(guān)注

    關(guān)注

    13

    文章

    330

    瀏覽量

    61183

原文標(biāo)題:學(xué)習(xí)教程 | 使用 TensorFlow Lite 在 Android App 中生成超分圖片

文章出處:【微信號(hào):tensorflowers,微信公眾號(hào):Tensorflowers】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Copilot操作指南(一):使用圖片生成原理圖符號(hào)、PCB封裝

    “ ?上周推出支持圖片生成模型的華秋發(fā)行版之后,得到了很多小伙伴的肯定。但看到更多的回復(fù)是:為什么我的 Copilot 無(wú)法生成符號(hào)?只有普通的文本回復(fù)?今天就為大家詳細(xì)講解下
    的頭像 發(fā)表于 07-15 11:14 ?774次閱讀
    Copilot操作指南(一):使用<b class='flag-5'>圖片</b><b class='flag-5'>生成</b>原理圖符號(hào)、PCB封裝

    無(wú)法將Tensorflow Lite模型轉(zhuǎn)換為OpenVINO?格式怎么處理?

    Tensorflow Lite 模型轉(zhuǎn)換為 OpenVINO? 格式。 遇到的錯(cuò)誤: FrontEnd API failed with OpConversionFailure:No translator found for TFLite_Detection_PostP
    發(fā)表于 06-25 08:27

    手機(jī)APP遠(yuǎn)程控制,智能家居監(jiān)測(cè)、智能控制系統(tǒng)(STM32L4、服務(wù)器、源碼)實(shí)例項(xiàng)目打包下載

    手機(jī)APP遠(yuǎn)程控制,智能家居監(jiān)測(cè)、智能控制系統(tǒng)(STM32L4、服務(wù)器、源碼)實(shí)例項(xiàng)目打包,推薦下載!
    發(fā)表于 05-29 21:47

    手機(jī)APP遠(yuǎn)程控制,智能家居監(jiān)測(cè)、智能控制系統(tǒng)(STM32L4、服務(wù)器、源碼)

    手機(jī)APP遠(yuǎn)程控制,智能家居監(jiān)測(cè)、智能控制系統(tǒng)(STM32L4、服務(wù)器、源碼) 項(xiàng)目實(shí)例下載! 純分享帖,需要者可點(diǎn)擊附件免費(fèi)獲取完整資料~~~【免責(zé)聲明】本文系網(wǎng)絡(luò)轉(zhuǎn)載,版權(quán)歸原作者所有。本文所用視頻、
    發(fā)表于 05-23 21:00

    迅為RK3588開(kāi)發(fā)板GPIO調(diào)用APP運(yùn)行測(cè)試

    Android Studio 的 locat 日志打印窗口,篩選打印“package:mine”,然后點(diǎn)擊 APP 界面的“調(diào)用 GPIO”按鈕,會(huì)循環(huán)打印 GPIO 引腳打開(kāi)和 GPIO 引腳關(guān)閉,如下圖所示: 到此,
    發(fā)表于 05-13 10:49

    使用gpif designer fx2lpCTL0中生成波形來(lái)連接FPGA 以便從FPGA獲取數(shù)據(jù),為什么不能正常工作?

    我想使用gpif designer fx2lp CTL0 中生成波形來(lái)連接FPGA 以便從FPGA 獲取數(shù)據(jù)。 它在 CTL0 的下降沿逐幀獲取數(shù)據(jù)。 每幀有 32 個(gè)脈沖,但是當(dāng)我這樣配置時(shí),它不能正常工作。 我不明白。 我
    發(fā)表于 05-06 13:01

    使用各種TensorFlow模型運(yùn)行模型優(yōu)化器時(shí)遇到錯(cuò)誤非法指令怎么解決?

    使用各種 TensorFlow 模型運(yùn)行模型優(yōu)化器時(shí)遇到 [i]錯(cuò)誤非法指令
    發(fā)表于 03-05 09:56

    自制 AirTag,支持/鴻蒙/PC/Home Assistant,無(wú)需擁有 iPhone

    ,模擬發(fā)出 FindMy 藍(lán)牙廣播。 這樣制作出的定位標(biāo)簽,不需要蘋果手機(jī)綁定,支持/鴻蒙/PC/Home Assistant 查看標(biāo)簽的位置。 制作教程 我 gitee 上建了一個(gè)項(xiàng)目
    發(fā)表于 02-25 11:22

    APP開(kāi)發(fā)中,如何使用加密芯片?

    加密芯片是一種專門設(shè)計(jì)用于保護(hù)信息安全的硬件設(shè)備,它通過(guò)內(nèi)置的加密算法對(duì)數(shù)據(jù)進(jìn)行加密和解密,以防止敏感數(shù)據(jù)被竊取或篡改。如下圖HD-RK3568-IOT工控板,搭載ATSHA204A加密芯片,常用于有安全防護(hù)要求的工商業(yè)場(chǎng)景,下文將為大家介紹
    的頭像 發(fā)表于 10-31 17:43 ?999次閱讀
    <b class='flag-5'>安</b><b class='flag-5'>卓</b><b class='flag-5'>APP</b>開(kāi)發(fā)中,如何使用加密芯片?

    AIC3262 CODEC能否下運(yùn)用?

    我們有多路音頻混音應(yīng)用需求(雙路MIC. LINE IN, I2S 音源輸入,耳機(jī)輸出監(jiān)聽(tīng)及混音后錄音),針對(duì)混音還有通過(guò)DSP 作混響, 10段EQ應(yīng)用, 該裝置需要在環(huán)境下運(yùn)行。不知TI AIC3262 CODEC能否
    發(fā)表于 10-29 08:19

    TAS5731想在app中的平衡器界面中直觀的根據(jù)對(duì)應(yīng)頻率的值調(diào)整寄存器值有什么方法嗎?

    想在app中的平衡器界面中直觀的根據(jù)對(duì)應(yīng)頻率的值調(diào)整寄存器值有什么方法嗎? 之前是通過(guò)TAS57X1 GDE工具調(diào)好后生成的參數(shù)設(shè)置值寫進(jìn)去,每次只能調(diào)好一組參數(shù)設(shè)置進(jìn)去
    發(fā)表于 10-22 07:30

    快速部署Tensorflow和TFLITE模型Jacinto7 Soc

    電子發(fā)燒友網(wǎng)站提供《快速部署Tensorflow和TFLITE模型Jacinto7 Soc.pdf》資料免費(fèi)下載
    發(fā)表于 09-27 11:41 ?0次下載
    快速部署<b class='flag-5'>Tensorflow</b>和TFLITE<b class='flag-5'>模型</b><b class='flag-5'>在</b>Jacinto7 Soc

    基于ArkTS語(yǔ)言的OpenHarmony APP應(yīng)用開(kāi)發(fā):圖片處理

    1、程序介紹本案例使用TextArea實(shí)現(xiàn)多文本輸入,使用mediaLibrary實(shí)現(xiàn)在相冊(cè)中獲取圖片,使用image生成pixelMap,使用pixelMap的scale(),crop
    的頭像 發(fā)表于 09-20 08:07 ?1319次閱讀
    基于ArkTS語(yǔ)言的OpenHarmony <b class='flag-5'>APP</b>應(yīng)用開(kāi)發(fā):<b class='flag-5'>圖片</b>處理

    工控主板軌道交通中的應(yīng)用特點(diǎn)

    工控主板軌道交通中的應(yīng)用特點(diǎn)主要體現(xiàn)在以下幾個(gè)方面:
    的頭像 發(fā)表于 08-22 17:15 ?598次閱讀

    工控機(jī)inbox系列有不支持32位app的嗎?

    工控機(jī) inbox系列有不支持32位app的嗎
    發(fā)表于 07-24 06:59