開發AI應用分享來到了本系列最后一期分享。
在windows上,如果我們按照上一期的方式安裝了tflite2pb,是不能直接運行的。因為命令行工具是為linux編譯的。那我們的廣大windows用戶就無緣了嗎?那可未必,小編給大家帶來一個好辦法,當然不僅僅適用于當前這個tflite2pb工具,話不多說,開始:
首先讓我們找到tflite2pb的安裝路徑:

打開tflite2tensorflow.py文件,并定位到5641行:

我們可以看到,這是函數的主入口,并且添加了對于命令行參數的解析,而且既然是def定義的函數,那我們就可以通過import來進行導入。那接下來小編就要利用這個函數做一些文章,首先在我們編寫的轉換函數中導入這個叫做main的函數:
fromtflite2tensorflow.tflite2tensorflowimportmain
現在已經導入了進來,接下來是怎么傳入main函數需要處理的參數,換句話來說,main函數實際上是處理系統命令行參數,那我們需要做的就是偽造一個系統命令行參數,那簡單了,首先導入sys模塊,然后開始系統參數偽造:
sys.argv = ['main.py',f'--model_path={tflite_model_name}.tflite',r'--flatc_path=flatc.exe','--schema_path=schema.fbs','--output_pb']
這里通過直接給sys.argv參數賦值,實際上相當于像系統命令行傳入了參數,接下來直接調用main:
main()
果不其然,成功運行,和在linux上運行效果一致,我們也獲得了saved_model文件夾以及模型:

下面就是進行模型的量化:
# Convert the model
converter = tf.lite.TFLiteConverter.from_saved_model("saved_model")
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.representative_dataset = gen_representative_data_gen(represent_data)
converter.inference_input_type = tf.int8
converter.inference_output_type = tf.int8
tflite_model = converter.convert()
# Save the i8 model.
withopen(f"{tflite_model_name}_i8_opt.tflite","wb")asf:
f.write(tflite_model)
熟悉tflite模型量化的伙伴應該是很熟悉了吧?首先聲明converter導入我們剛才生成的pb格式模型的文件夾,接下來指定量化類型為:
tf.lite.OpsSet.TFLITE_BUILTINS_INT8
指定代表性數據集:
converter.representative_dataset= gen_representative_data_gen(represent_data)
為了快速驗證模型,我們可以先隨機出來一些數據來指導模型量化:
defgen_representative_data_gen(datas_path): datas= np.load(datas_path) datas= (np.random.randint(0,255, size=(10,1,192,192,3), dtype='uint8') /255).astype("float32") defrepresentative_data_gen(samples=datas): forsample in samples: yield[sample] returnrepresentative_data_gen
并且指定輸入輸出格式:
converter.inference_input_type= tf.int8 converter.inference_output_type= tf.int8
最終保存量化好的模型:
withopen(f"{tflite_model_name}_i8_opt.tflite","wb")asf:
f.write(tflite_model)
當然,我們還可以打印出來模型的算子信息:
intepreter = tf.lite.Interpreter(model_path=f"{tflite_model_name}_i8_opt.tflite")
op_names =sorted(set([x['op_name']forx inintepreter._get_ops_details()]))
print("len ops: ",len(op_names))
print(op_names)
好了,至此,記站在巨人的肩膀上開發AI應用就到此完結了,此次系列分享給大家分享了小編的一次項目開發歷程,尤其是涉及到如何將網上找到的,不包含推理代碼的模型,如何一步步的進行分析,并最終轉換為可以為我們所用的模型,希望能夠幫助大家!
-
Linux
+關注
關注
88文章
11641瀏覽量
218191 -
WINDOWS
+關注
關注
4文章
3697瀏覽量
93317 -
AI
+關注
關注
90文章
38413瀏覽量
297697 -
函數
+關注
關注
3文章
4409瀏覽量
66979
原文標題:站在巨人肩膀上開發AI應用分享(三)
文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
使用ml configurator進行tflite網絡模型的轉換不成功怎么解決?
如何進行YOLO模型轉換?
用tflite接口調用tensorflow模型進行推理
EIQ onnx模型轉換為tf-lite失敗怎么解決?
如何在MIMXRT1064評估套件上部署tflite模型?
tflite + XNNPACK代表對量化網絡的推理不起作用是怎么回事?
如何將DS_CNN_S.pb轉換為ds_cnn_s.tflite?
RT1060注冊內存被TFLite Micro模型中的其他函數覆蓋了怎么解決?
【KV260視覺入門套件試用體驗】Vitis AI 進行模型校準和來量化
使用NVIDIA QAT工具包實現TensorRT量化網絡的設計
快速部署Tensorflow和TFLITE模型在Jacinto7 Soc

如何進行tflite模型量化
評論