Zengyf-CVer's picture
app v02 update
7cea19b
# Streamlit YOLOv5 Model2X v0.2
# 创建人:曾逸夫
# 创建时间:2022-07-17
# 功能描述:多选,多项模型转换和打包下载
import os
import shutil
import time
import zipfile
import streamlit as st
# 目录操作
def dir_opt(target_dir):
if os.path.exists(target_dir):
shutil.rmtree(target_dir)
os.mkdir(target_dir)
else:
os.mkdir(target_dir)
# 文件下载
def download_file(uploaded_file):
# --------------- 下载 ---------------
with open(f"{uploaded_file}", 'rb') as fmodel:
# 读取转换的模型文件(pt2x)
f_download_model = fmodel.read()
st.download_button(label='下载转换后的模型', data=f_download_model, file_name=f"{uploaded_file}")
fmodel.close()
# 文件压缩
def zipDir(origin_dir, compress_file):
# --------------- 压缩 ---------------
zip = zipfile.ZipFile(f"{compress_file}", "w", zipfile.ZIP_DEFLATED)
for path, dirnames, filenames in os.walk(f"{origin_dir}"):
fpath = path.replace(f"{origin_dir}", '')
for filename in filenames:
zip.write(os.path.join(path, filename), os.path.join(fpath, filename))
zip.close()
# params_include_list = ["torchscript", "onnx", "openvino", "engine", "coreml", "saved_model", "pb", "tflite", "tfjs"]
def cb_opt(device, imgSize, weight_name, btn_model_list, params_include_list, iou_conf, tflite_options, onnx_options,
torchscript_options):
for i in range(len(btn_model_list)):
if btn_model_list[i]:
st.info(f"正在转换{params_include_list[i]}......")
s = time.time()
if i == 0: # torchscript
os.system(
f"python export.py --device {device} --imgsz {imgSize} --weights ./weights/{weight_name} --include {params_include_list[i]} "
+ "".join([f"--{x} " for x in torchscript_options]))
if i == 1: # onnx
os.system(
f"python export.py --device {device} --imgsz {imgSize} --weights ./weights/{weight_name} --include {params_include_list[i]} "
+ "".join([f"--{x} " for x in onnx_options]))
if i == 3:
# TensorRT需要在GPU模式下导出
pass
# os.system(
# f"python export.py --imgsz {imgSize} --weights ./weights/{weight_name} --include {params_include_list[i]} --device 0"
# )
elif i == 8: # tfjs
os.system(
f"python export.py --device {device} --imgsz {imgSize} --weights ./weights/{weight_name} --include {params_include_list[i]} --iou-thres {iou_conf[0]} --conf-thres {iou_conf[1]}"
)
elif i == 7: # tflite
# 参考:https://github.com/zldrobit/yolov5
os.system(
f"python export.py --device {device} --imgsz {imgSize} --weights ./weights/{weight_name} --include {params_include_list[i]} "
+ "".join([f"--{x} " for x in tflite_options]))
else:
os.system(
f"python export.py --device {device} --imgsz {imgSize} --weights ./weights/{weight_name} --include {params_include_list[i]}"
)
e = time.time()
st.success(f"{params_include_list[i]}转换完成,用时{round((e-s), 2)}秒")
zipDir("./weights", "convert_weights.zip") # 打包weights目录,包括原始权重和转换后的权重
download_file("convert_weights.zip") # 下载打包文件
def main():
with st.container():
st.title("Streamlit YOLOv5 Model2X")
st.text("基于Streamlit的YOLOv5模型转换工具")
st.write("-------------------------------------------------------------")
dir_opt("./weights")
uploaded_file = st.file_uploader("选择YOLOv5模型文件(.pt)")
if uploaded_file is not None:
# 读取上传的模型文件(.pt)
weight_name = uploaded_file.name
st.info(f"正在写入{weight_name}......")
bytes_data = uploaded_file.getvalue()
with open(f"./weights/{weight_name}", 'wb') as fb:
fb.write(bytes_data)
fb.close()
st.success(f"{weight_name}写入成功!")
device = st.radio("请选择设备", ('cpu', 'cuda:0'), index=0)
imgSize = st.radio("请选择图片尺寸", (320, 640, 1280), index=1)
st.text("请选择转换的类型:")
cb_torchscript = st.checkbox('TorchScript')
# ------------- torchscript -------------
if cb_torchscript:
torchscript_options = st.multiselect('onnx选项', ['optimize'])
else:
torchscript_options = []
cb_onnx = st.checkbox('ONNX')
# ------------- onnx -------------
if cb_onnx:
onnx_options = st.multiselect('onnx选项', ['dynamic', 'simplify'])
else:
onnx_options = []
cb_openvino = st.checkbox('OpenVINO')
cb_engine = st.checkbox('TensorRT')
cb_coreml = st.checkbox('CoreML')
cb_saved_model = st.checkbox('TensorFlow SavedModel')
cb_pb = st.checkbox('TensorFlow GraphDef')
cb_tflite = st.checkbox('TensorFlow Lite')
# ------------- tflite -------------
if cb_tflite:
tflite_options = st.multiselect('tflite选项', ['int8', 'nms', 'agnostic-nms'])
else:
tflite_options = []
# cb_edgetpu = st.checkbox('TensorFlow Edge TPU')
cb_tfjs = st.checkbox('TensorFlow.js')
# ------------- tfjs -------------
if cb_tfjs:
iou_thres = st.slider(label='NMS IoU', min_value=0.0, max_value=1.0, value=0.45, step=0.05)
conf_thres = st.slider(label='NMS CONF', min_value=0.0, max_value=1.0, value=0.5, step=0.05)
else:
iou_thres, conf_thres = 0.45, 0.5
btn_convert = st.button('转换')
btn_model_list = [
cb_torchscript, cb_onnx, cb_openvino, cb_engine, cb_coreml, cb_saved_model, cb_pb, cb_tflite, cb_tfjs]
params_include_list = [
"torchscript", "onnx", "openvino", "engine", "coreml", "saved_model", "pb", "tflite", "tfjs"]
if btn_convert:
cb_opt(device, imgSize, weight_name, btn_model_list, params_include_list, [iou_thres, conf_thres],
tflite_options, onnx_options, torchscript_options)
st.write("-------------------------------------------------------------")
if __name__ == "__main__":
main()