主頁 >  其他 > TensorFlow物件檢測-1.0和2.0:訓練,匯出,優化(TensorRT),推斷(Jetson Nano)

TensorFlow物件檢測-1.0和2.0:訓練,匯出,優化(TensorRT),推斷(Jetson Nano)

2020-11-14 05:20:32 其他

作者|Abhishek
編譯|Flin
來源|analyticsvidhya

第1部分

從在自定義資料集中訓練檢測器到使用TensorFlow 1.15在Jetson納米板或云上進行推理的詳細步驟

完整代碼可在GitHub上獲得

  • TensorFlow物件檢測API V2的教程可作為jupyter notebook使用

    • https://github.com/Tessellate-Imaging/Monk_Object_Detection/blob/master/example_notebooks/13_tf_obj_2/Train_Infer_Optimize_Deploy.ipynb
  • TensorFlow物件檢測API V1的教程可作為jupyter notebook使用

    • https://github.com/Tessellate-Imaging/Monk_Object_Detection/blob/master/example_notebooks/12_tf_obj_1/Train_Infer_Optimize_Deploy.ipynb

一些常見的困難包括

  • 使用物件檢測API庫查找兼容的TensorFlow(和相關的cuda)版本

  • 將自定義資料轉換為tf記錄格式

  • 混淆了tf1.0和tf2.0的流程

  • 手動更新模型組態檔以進行訓練

  • 運行訓練程序并解決組態檔中的問題

  • 將模型從一種格式匯出到另一種格式以進行推理

  • 混合了不同的模型格式型別——檢查點、凍結圖、saved_model (" .pb ")、tensorRT推斷圖等等

  • 在訓練模型上運行推理

  • 將訓練后的模型轉換為量化格式,以便部署在諸如Jetson Nano的板上

  • 構建引擎和部署引擎之間的tensorRT版本和cuda計算能力不匹配

這個清單永無止境……

為克服上述一些問題,我們在Monk Object Detection Toolkit中的Tensorflow 物件檢測 API的兩個版本上添加了一個低代碼的pythonic包裝器

使用它,開發人員和研究人員可以輕松地

  • 使用TF推送定制訓練資料集

  • 使用pythonic API配置所有引數的模型檔案

  • 根據使用的網路和cuda版本的可用性,在TF1.0和TF2.0之間進行選擇

  • 根據自己的資料集訓練、匯出、優化、推斷

  • 使用TensorRT優化模型并匯出到云服務器或Jetson Nano等嵌入式板

傳統流程概述

下面提到的是使用TF訓練和部署定制探測器的程序,在描述程序流程的同時,還強調了一個人在使一切正常作業時所面臨的問題;還提到了tf1.0和2.0版本的物件檢測庫的區別

程序A:TensorFlow與目標檢測裝置的兼容性

  • 要使用物件檢測 2.0,請使用TensorFlow 2.3.0,版本2.0.0和2.1.0通常會導致“ tensorflow_core.keras.utils”. 2.2.0版在使用“CollectiveAllReduceExtended”模塊進行訓練時會導致錯誤,

  • 使用TensorFlow 2.3.0時,需要Cuda 10.1,

  • 要使用物件檢測 1.0,請使用TensorFlow版本1.15.0或1.15.2,

  • 使用TensorFlow 1.15時,需要Cuda 10.0,

  • TFLite轉換仍然存在某些錯誤(將在以后的博客中討論)

程序B:設定資料集

  • TensorFlow提供資料集工具以將資料轉換為可接受的TF記錄格式

  • 但是這些示例僅適用于最常用的資料集,例如COCO,Pascal VOC,OpenImages,Pets-Dataset等,用戶需要根據選擇的示例筆記本,按照COCO、VOC、OID等格式重新格式化和排列資料集

  • 另一種方法是更新示例代碼以便提取自定義資料集,這本身就是一個艱難的程序

  • 為了使自定義資料集的加載變得容易,我們修改了示例并添加了進一步的決議器以支持多種資料注釋型別,并將其直接轉換為TF-Records,

程序C:更新配置并開始訓練程序

  • Monk的物件檢測API 1.0包裝器支持大約23個模型,物件檢測API 2.0支持大約26個模型

  • 一旦選擇了模型并下載了權重,就必須手動更新組態檔,

  • API 1.0和2.0的組態檔格式不同,需要以稍微不同的方式進行手動更改

  • tf1.0中的某些配置存在基本特征提取引數的問題,

  • 在對組態檔應用更新后,整個作業區必須按照TF Obj github site站點上的教程指定的方式進行安排,

    • 站點:https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/tf2_training_and_evaluation.md

  • 重新安排后,可以開始訓練,同樣,針對TF 1.0和TF 2.0模型的訓練是不同的,

  • 通過“Monk物件檢測”,我們添加了pythonic函式來更新組態檔,并且不再需要為作業空間使用嚴格的檔案夾結構,兩種TF版本的訓練程序幾乎都與Monk的包裝程式相同,

程序D:匯出經過訓練的模型以進行推理

  • 兩種物件檢測API均以檢查點 (“.ckpt”) 格式提供訓練有素的模型,

  • 為了在TF 1.0中進行推理,通常使用凍結圖形格式,

  • 為了在TF 2.0中進行推理,通常使用保存的模型格式,

  • 特別是對于初學者來說,轉換模型的程序在兩個API中都不相同,通常很難弄清楚

  • 為了簡化流程,我們添加了決議器,以使外部包裝器格式保持相同,這意味著我們能同時使用TF 1.0 API和TF 2.0 API,

程序E:TensorRT推論的模型優化

  • 匯出的模型最終使用TensorRT轉換為優化版本,

  • 支持的優化包括浮點32位和16位(FP32,FP16)和整數8位(INT8)量化,

  • 從tf1.0和tf2.0轉換匯出模型的量化程序是完全不同的,

  • TensorRT的版本存在其他問題,這意味著,使用TensorRT版本5.1.5優化的模型無法在使用TensorRT版本5.1.6的部署計算機上運行,一個非常具體的問題是使用TensorFlow 1.15.0的物件檢測1.0,這個TensorFlow帶有tensorRT 5.1.5,而Jetpacks中沒有這樣的版本,

  • TensorRT的另一個問題是cuda計算功能,意思是,除非采取適當措施,否則在具有7.0版計算能力的GPU(V100 Nvidia GPU)上優化的模型不能在具有5.3版計算能力的GPU(Jetson納米板)上運行,

  • 此博客通過訓練和優化物件檢測模型澄清了所有疑問

程序F:在Jetson Nano板上設定所有東西

  • 由于兩個API都需要不同的TensorFlow版本,因此安裝程序有所不同,Jetpack版本,CUDA版本以及TF 1.0在涉及tensorRT版本時都需要進一步注意,

讓我們從版本1.0開始,每次使用一個物件檢測API模塊,

TF物件檢測API 1.0

程序A:在開發機器上安裝

將要安裝的庫

  • 先決條件:numpy,scipy,pandas,pillow,OpenCV-python

  • 帶TensorRT 5.1.5的TensorFlow-GPU V1.15.0;如果在Nano板上部署則不需要

  • 帶TensorRT 6.0.1的TensorFlow-GPU V1.15.2;如果在Nano板上進行部署,則需要

  • 使用Monk Object Detection Toolkit的TF 物件檢測 API 1.0

(確保CUDA 10.0和CUDNN 7隨系統一起安裝了NVidia驅動程式)

當模型要部署在Jetson Nano板上時,請按照以下說明配置你的開發(訓練)機器

安裝必備的Python庫

$ git clone https://github.com/Tessellate-Imaging/Monk_Object_Detection.git

$ cd Monk_Object_Detection/12_tf_obj_1/installation

$ chmod +x install_cuda10_tensorrt6_part1.sh && ./install_cuda10_tensorrt6_part1.sh

安裝TensorRT 6.0.1

# Go to https://developer.nvidia.com/tensorrt
# Download 
# - nv-tensorrt-repo-ubuntu1804-cuda10.0-trt6.0.1.5-ga-20190913_1-1_amd64.deb (For Ubuntu18.04)
# - nv-tensorrt-repo-ubuntu1604-cuda10.0-trt6.0.1.5-ga-20190913_1-1_amd64.deb (For Ubuntu16.04)

# Run the following commands to install trt (in a terminal)

$ sudo dpkg -i nv-tensorrt-repo-ubuntu1804-cuda10.0-trt6.0.1.5-ga-20190913_1-1_amd64.deb
$ sudo apt-key add <key value will be mentioned as the output of previous command>
$ sudo apt-get update
$ sudo apt-get install tensorrt
$ sudo apt-get install uff-converter-tf
$ sudo apt-get install python3-libnvinfer-dev

安裝Bazel 0.26.1并從GitHub克隆TensorFlow

# Install bazel version 0.26.1
# Download bazel deb package from https://github.com/bazelbuild/bazel/releases/tag/0.26.1

$ sudo dpkg -i bazel_0.26.1-linux-x86_64.deb

# Clone Tensorflow and switch to tensorflow 1.15.2

$ git clone https://github.com/tensorflow/tensorflow.git
$ cd tensorflow
$ git checkout v1.15.2

配置TensorFlow

# Configure tensorflow

$ ./configure

    - Do you wish to build TensorFlow with XLA JIT support? [Y/n]: Y

    - Do you wish to build TensorFlow with OpenCL SYCL support? [y/N]: N

    - Do you wish to build TensorFlow with ROCm support? [y/N]: N

    - Do you wish to build TensorFlow with CUDA support? [y/N]: Y      

    - Do you wish to build TensorFlow with TensorRT support? [y/N]: Y

    - And press enter (set default) for all other config questions asked by the setup

構建并安裝TensorFlow(在AWS P3.2x實體上大約需要5個小時)

# Build tensorflow using bazel

$ bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package


# Once built create a wheel file for python installation and run pip installer

$ bazel-bin/tensorflow/tools/pip_package/build_pip_package tensorflow_pkg

$ cd tensorflow_pkg && pip install tensorflow*.whl

最后構建物件檢測API 1.0

# Compile Object Detection API v1

$ cd Monk_Object_Detection/12_tf_obj_1/installation

$ chmod +x install_cuda10_tensorrt6_part2.sh && ./install_cuda10_tensorrt6_part2.sh

當不打算在Jetson Nano Board上部署模型時,請按照以下說明配置你的開發(訓練)機器

安裝所有必需的庫并編譯物件檢測API 1.0

$ git clone https://github.com/Tessellate-Imaging/Monk_Object_Detection.git

$ cd Monk_Object_Detection/12_tf_obj_1/installation

$ chmod +x install_cuda10.sh && ./install_cuda10.sh

安裝TensorRT 5.1.5作為預構建的TensorFlow 1.15.0支持

# Go to https://developer.nvidia.com/tensorrt
# Download 
# - nv-tensorrt-repo-ubuntu1804-cuda10.0-trt5.1.5.0-ga-20190427_1-1_amd64.deb (For Ubuntu18.04)
# - nv-tensorrt-repo-ubuntu1604-cuda10.0-trt5.1.5.0-ga-20190427_1-1_amd64.deb(For Ubuntu16.04)

# Run the following commands to install trt (in a terminal)

$ sudo dpkg -i nv-tensorrt-repo-ubuntu1804-cuda10.0-trt5.1.5.0-ga-20190427_1-1_amd64.deb
$ sudo apt-key add <key value will be mentioned as the output of previous command>
$ sudo apt-get update
$ sudo apt-get install tensorrt
$ sudo apt-get install uff-converter-tf
$ sudo apt-get install python3-libnvinfer-dev

使用google colab時,請遵循以下說明(TensorRT在colab上可能無法正常運行)

# Switch to TF 1.0 version (Run the following line)
$ %tensorflow_version 1.x
# Now reset the runetime if prompted by colab

# Run the following commands
$ git clone https://github.com/Tessellate-Imaging/Monk_Object_Detection.git
$ cd Monk_Object_Detection/12_tf_obj_1/installation
$ chmod +x install_colab.sh && ./install_colab.sh

程序B:建立資料集

Monk物件檢測決議器要求資料集采用COCO或Pascal VOC格式,對于本教程,讓我們堅持使用Pascal VOC格式

要將資料集從任何格式轉換為Pascal VOC,請查看以下詳細教程

  • https://github.com/Tessellate-Imaging/Monk_Object_Detection/tree/master/example_notebooks/12_tf_obj_1

在這個例子中,船檢測資料集取自一個關于使用retinanet進行物件檢測的舊博客

  • 船檢測資料集:https://www.tejashwi.io/object-detection-with-fizyr-retinanet/
  • 博客:https://www.tejashwi.io/object-detection-with-fizyr-retinanet/

在這個jupyter notebook中提到了使用這些資料的步驟

  • https://github.com/Tessellate-Imaging/Monk_Object_Detection/blob/master/example_notebooks/13_tf_obj_2/Train_Infer_Optimize_Deploy.ipynb

程序C:更新配置并啟動訓練程序

加載訓練引擎

from train_detector import Detector

gtf = Detector();

在TF 1.15模型庫中加載所有可用模型

目前,它支持24種不同型號的SSD和Faster RCNN

加載訓練驗證資料集

將注釋轉換為VOC格式后加載資料集

根據可用的GPU設定批次大小,在本教程中,使用了帶v100gpu(16gbvram)的AWS ec2p3.2x計算機,批次大小為24非常適合,

train_img_dir = "ship/images/Train";
train_anno_dir = "ship/voc/";
class_list_file = "ship/classes.txt";

gtf.set_train_dataset(train_img_dir, train_anno_dir, class_list_file, batch_size=24)

運行決議器將資料集轉換為tfrecords

Tf Record檔案將存盤在data_tfrecord檔案夾中

gtf.create_tfrecord(data_output_dir="data_tfrecord")

選擇并加載模型

下載模型后,Monk會根據所選引數自動更新組態檔

在本教程中,我們使用了SSD MobileNet V1,它可以接收形狀為320x320x3 RGB影像的輸入影像

gtf.set_model_params(model_name="ssd_mobilenet_v1")

設定其他訓練和優化器引數

set_hyper_params(num_train_steps=10000,
lr=0.004,
lr_decay_rate=0.945,
output_dir="output_dir/",
sample_1_of_n_eval_examples=1,
sample_1_of_n_eval_on_train_examples=5,
checkpoint_dir=False,
run_once=False,
max_eval_retries=0,
num_workers=4,
checkpoint_after_every=500)

設定存盤匯出引數的目錄

gtf.export_params(output_directory="export_dir");

設定tensorRT優化引數

TensorRT優化器創建一個計劃,然后構建它,構建計劃是為了優化它正在構建的GPU的模型,

如前所述,在具有不同cuda計算能力的GPU上優化的模型無法在jetson nano上運行,因此Monk庫確保該計劃在開發機(云或colab)上編譯,而該計劃則在運行時在部署機(jetson nano)上構建

使用INT8優化時,無法執行此功能,計劃的編制和構建都必須在同一臺機器上,并且Jetson納米板與8位整數運算不太兼容

gtf.TensorRT_Optimization_Params(conversion_type="FP16", trt_dir="trt_fp16_dir")

訓練探測器

檢測器訓練運行一個執行sys.exit()函式的會話,因此在其上運行的包裝程式將關閉python系統,

為了解決此問題,提供了一個名為train.py的腳本,該腳本可以在jupyter notebook或終端命令上運行

根據引數設定,訓練好的模型將保存在名為“ output_dir”的檔案夾中,

# Run in a terminal
$ python Monk_Object_Detection/12_tf_obj_1/lib/train.py

# or run this command on a jupyter notebook
%run Monk_Object_Detection/12_tf_obj_1/lib/train.py

程序D:匯出經過訓練的模型以進行推理

匯出訓練有素的檢查點模型

export函式運行一個執行sys.exit()函式的會話,因此在其上運行的包裝器將關閉python系統,

為了解決此問題,提供了一個名為export.py的腳本,該腳本可以在jupyter notebook或終端命令上運行

根據引數設定,匯出的模型將保存在名為“ export_dir”的檔案夾中,

# Run in a terminal
$ python Monk_Object_Detection/12_tf_obj_1/lib/export.py

# or run this command on a jupyter notebook
%run Monk_Object_Detection/12_tf_obj_1/lib/export.py

程序E:TensorRT推論的模型優化

優化匯出模型

優化函式運行一個執行sys.exit()函式的會話,因此在其上運行的包裝程式將關閉python系統,

為了解決此問題,提供了一個名為optimize.py的腳本,該腳本可以在jupyter notebook電腦或終端命令上運行

根據引數設定,優化的模型將保存在名為“ trt_fp16_dir”的檔案夾中,

# Run in a terminal
$ python Monk_Object_Detection/12_tf_obj_1/lib/optimize.py

# or run this command on a jupyter notebook
%run Monk_Object_Detection/12_tf_obj_1/lib/optimize.py

程序F-1:在開發機器上運行推理

加載推理機

from infer_detector import Infer
gtf = Infer();

載入模型

首先加載匯出的模型并運行步驟,然后通過加載優化的模型重復相同的步驟(步驟保持不變)

# To load exported model
gtf.set_model_params('export_dir/frozen_inference_graph.pb', "ship/classes.txt")

# To load optimized model
gtf.set_model_params('trt_fp16_dir/trt_graph.pb', "ship/classes.txt")

對單個影像進行推斷

scores, bboxes, labels = gtf.infer_on_image('ship/test/img1.jpg', thresh=0.1);

使用兩個模型運行速度測驗分析

gtf.benchmark_for_speed('ship/test/img1.jpg')

在AWS P3.2x V100 GPU上使用匯出的模型(未優化)進行分析

Average Image loading time : 0.0091 sec
Average Inference time     : 0.0103 sec
Result extraction time     : 0.0801 sec
total_repetitions          : 100
total_time                 : 1.0321 sec
images_per_sec             : 96
latency_mean               : 10.3218 ms
latency_median             : 10.3234 ms
latency_min                : 9.4773 ms

在AWS P3.2x V100 GPU上使用優化模型進行分析

處理后優化使速度提高約2.5倍

Average Image loading time : 0.0092 sec
Average Inference time     : 0.0042 sec
Result extraction time     : 0.0807 sec
total_repetitions          : 100
total_time                 : 0.4241 sec
images_per_sec             : 235
latency_mean               : 4.2412 ms
latency_median             : 4.2438 ms
latency_min                : 4.0156 ms

程序F-3:在Jetson Nano板上安裝步驟

步驟1:更新Apt

$ sudo apt-get update
$ sudo apt-get upgrade

步驟2:安裝系統庫

$ sudo apt-get install nano git cmake libatlas-base-dev gfortran libhdf5-serial-dev hdf5-tools nano locate libfreetype6-dev python3-setuptools protobuf-compiler libprotobuf-dev openssl libssl-dev libcurl4-openssl-dev cython3 libxml2-dev libxslt1-dev python3-pip

$ sudo apt-get install libopenblas-dev libprotobuf-dev libleveldb-dev libsnappy-dev libhdf5-serial-dev protobuf-compiler libgflags-dev libgoogle-glog-dev liblmdb-dev

$ sudo pip3 install virtualenv virtualenvwrapper

步驟3:更新bashrc檔案

將這些行添加到?/ .bashrc檔案

export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv
source /usr/local/bin/virtualenvwrapper.sh

export PATH=/usr/local/cuda-10.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64\
${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

運行以下命令

$ source ~/.bashrc

步驟4:創建虛擬環境并安裝所有必需的python庫,安裝numpy大約需要15分鐘

$ mkvirtualenv -p /usr/bin/python3.6 tf2

$ pip install numpy==1.19.1

安裝scipy大約需要40分鐘

$ pip install scipy==1.5.1

安裝Jetson Nano TensorFlow-1.15,再花15分鐘

$ pip install scikit-build protobuf cython -vvvv

$ pip install grpcio absl-py py-cpuinfo psutil portpicker six mock requests gast h5py astor termcolor protobuf keras-applications keras-preprocessing wrapt google-pasta -vvvv

$ pip install https://developer.download.nvidia.com/compute/redist/jp/v43/tensorflow-gpu/tensorflow_gpu-1.15.0+nv19.12-cp36-cp36m-linux_aarch64.whl -vvvv

安裝OpenCV需要1.5個小時

$ mkdir opencv && cd opencv
$ wget -O opencv.zip https://github.com/opencv/opencv/archive/4.1.2.zip
$ unzip opencv.zip
$ mv opencv-4.1.2 opencv
$ cd opencv && mkdir build && cd build

$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D WITH_CUDA=OFF -D WITH_CUBLAS=OFF -D WITH_LIBV4L=ON -D BUILD_opencv_python3=ON -D BUILD_opencv_python2=OFF -D BUILD_opencv_java=OFF -D WITH_GSTREAMER=ON -D WITH_GTK=ON -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF -D OPENCV_ENABLE_NONFREE=OFF ..

$ make -j3
$ sudo make install

$ cd ~/.virtualenvs/tf2/lib/python3.6/site-packages
$ ln -s /usr/local/lib/python3.6/site-packages/cv2/python-3.6/cv2.cpython-36m-aarch64-linux-gnu.so cv2.so

最后克隆Monk物件檢測庫并安裝TF物件檢測API

$ git clone https://github.com/Tessellate-Imaging/Monk_Object_Detection.git

$ cd Monk_Object_Detection/12_tf_obj_1/installation/

$ chmod +x install_nano.sh && ./install_nano.sh

程序F-4:關于Jetson Nano的推論

將優化的權重檔案夾復制/下載到jetson nano作業目錄(克隆Monk庫)

從Monk_Object_Detection庫復制示例影像

$ cp -r Monk_Object_Detection/example_notebooks/sample_dataset/ship .

加載推理引擎和模型(此步驟大約需要4到5分鐘)

from infer_detector import Infer

gtf = Infer();

gtf.set_model_params('trt_fp16_dir/trt_graph.pb', "ship/classes.txt")

現在,如前所述,TensorRT負責計劃并在運行時構建(優化)計劃,因此第一次運行大約需要3-4分鐘

scores, bboxes, labels = gtf.infer_on_image('ship/test/img5.jpg', thresh=0.5, img_size=300);

突出顯示的區域顯示了Jetson Nano的TesnorRT建立(優化)計劃(模型)(作者擁有的影像)

再次運行它不會花費太多時間,

Benchmark板基準分析

gtf.benchmark_for_speed('ship/test/img1.jpg')
# With Jetson Nano power mode - 5W ModeAverage Image loading time : 0.0275 sec
Average Inference time     : 0.0621 sec
total_repetitions          : 100
total_time                 : 6.2172sec
images_per_sec             : 16
latency_mean               : 67.1722 ms
latency_median             : 60.7875 ms
latency_min                : 57.4391 ms
# With Jetson Nano power mode - MAXN ModeAverage Image loading time : 0.0173 sec
Average Inference time     : 0.0426 sec
total_repetitions          : 100
total_time                 : 4.2624 sec
images_per_sec             : 23
latency_mean               : 42.6243 ms
latency_median             : 41.9758 ms
latency_min                : 40.9001 ms

jupyter notebook提供TensorFlow物件檢測API 1.0的完整代碼

從谷歌驅動器下載所有預先訓練的權重

  • https://drive.google.com/file/d/1gtBp6G4Gix-b9epmUzd5kQtT1aY-iwXk/view?usp=sharing

第2部分

從在自定義資料集上訓練檢測器到在Jetson納米板或云上使用TensorFlow 2.3進行推理的詳細步驟

TF物件檢測API 2.0

程序A:在開發機器上安裝

要安裝的庫

前提條件:numpy,scipy,pandas,pandas,pillow,OpenCV-python

帶TensorRT 6.0.1的TensorFlow-GPU V2.3.0

使用Monk Object Detection Toolkit的TF Object Detection API 2.0

將進行TensorRT安裝

后續部分(確保CUDA 10.0和CUDNN 7隨系統一起安裝了NVidia驅動程式)

在開發(訓練)機器中運行以下步驟

$ git clone https://github.com/Tessellate-Imaging/Monk_Object_Detection.git

#For Cuda 10 systems
$ cd Monk_Object_Detection/13_tf_obj_1/installation && chmod +x install_cuda10.sh && ./install_cuda10.sh

#For Google colab
$ cd Monk_Object_Detection/13_tf_obj_1/installation && chmod +x install_colab.sh && ./install_colab.sh

程序B:建立資料集

這與第1部分中的相同,Monk物件檢測決議器要求資料集采用COCO或Pascal VOC格式,對于本教程,讓我們堅持使用Pascal VOC格式

要將你的資料集從任何格式轉換為Pascal VOC,請查看以下詳細教程

  • https://github.com/Tessellate-Imaging/Monk_Object_Detection/tree/master/example_notebooks/13_tf_obj_2

在此示例中,船檢測資料集是從一篇物件檢測的舊博客中獲取的

  • https://www.tejashwi.io/object-detection-with-fizyr-retinanet/

此jupyter notebook中提到了使用資料的步驟

  • https://github.com/Tessellate-Imaging/Monk_Object_Detection/blob/master/example_notebooks/13_tf_obj_2/Train_Infer_Optimize_Deploy.ipynb

程序C:更新配置并開始訓練程序

加載訓練引擎

from train_detector import Detector

gtf = Detector();

在TF 2.0 Model Zoo中加載所有可用的模型

目前,它支持26種SSD,Faster RCNN和EfficientDet不同的型號

即將添加對Centernet模型的支持,原始管道在訓練中有錯誤

加載訓練和驗證資料集

將注釋轉換為VOC格式后加載資料集

根據可用的GPU設定批處理大小,在本教程中,使用了具有V100 GPU(16 GB VRAM)的AWS EC2 P3.2x計算機,批次大小為24非常適合,

train_img_dir = "ship/images/Train";
train_anno_dir = "ship/voc/";
class_list_file = "ship/classes.txt";

gtf.set_train_dataset(train_img_dir, train_anno_dir, class_list_file, batch_size=24)

運行決議器將資料集轉換為tfrecords

Tf Record檔案將存盤在data_tfrecord檔案夾中

gtf.create_tfrecord(data_output_dir="data_tfrecord")

選擇并加載模型

下載模型后,Monk會根據所選引數自動更新組態檔

在本教程中,我們使用了SSD MobileNet V2,它可以接收形狀為320x320x3 RGB影像的輸入影像

  • SSD MobileNet V2:https://resources.wolframcloud.com/NeuralNetRepository/resources/SSD-MobileNet-V2-Trained-on-MS-COCO-Data
gtf.set_model_params(model_name="ssd_mobilenet_v2_320")

設定其他訓練和優化器引數

set_hyper_params(num_train_steps=10000,
lr=0.004,
lr_decay_rate=0.945,
output_dir="output_dir/",
sample_1_of_n_eval_examples=1,
sample_1_of_n_eval_on_train_examples=5,
checkpoint_dir=False,
run_once=False,
max_eval_retries=0,
num_workers=4,
checkpoint_after_every=500)

設定目錄,將存盤匯出的引數

gtf.export_params(output_directory="export_dir");

設定tensorRT優化引數

TensorRT優化器創建一個計劃,然后構建它,構建計劃是為了優化它正在構建的GPU的模型,

如前所述,在具有不同cuda計算能力的GPU上優化的模型無法在jetson nano上運行,因此Monk庫確保該計劃在開發機(云或colab)上編譯,而該計劃則在運行時在部署機(jetson nano)上構建

使用INT8優化時,無法執行此功能,計劃的編制和構建都必須在同一臺機器上,并且Jetson納米板與8位整數運算不太兼容

gtf.TensorRT_Optimization_Params(conversion_type="FP16", trt_dir="trt_fp16_dir")

訓練探測器

檢測器訓練運行一個執行sys.exit()函式的會話,因此在其上運行的包裝程式將關閉python系統,

為了解決此問題,提供了一個名為train.py的腳本,該腳本可以在jupyter notebook或終端命令上運行

根據引數設定,訓練好的模型將保存在名為“ output_dir”的檔案夾中,

# For terminal users
$ python Monk_Object_Detection/13_tf_obj_2/lib/train.py

# For jupyter notebook or colab users
%run Monk_Object_Detection/13_tf_obj_2/lib/train.py

程序D:匯出經過訓練的模型以進行推理

匯出訓練有素的檢查點模型

export函式運行一個執行sys.exit()函式的會話,因此在其上運行的包裝器將關閉python系統,

為了解決此問題,提供了一個名為export.py的腳本,該腳本可以在jupyter notebook或終端命令上運行

根據引數設定,匯出的模型將保存在名為“ export_dir”的檔案夾中,

# For terminal users
$ python Monk_Object_Detection/13_tf_obj_2/lib/export.py

# For jupyter notebook and colab users
%run Monk_Object_Detection/13_tf_obj_2/lib/export.py

程序E:TensorRT推論的模型優化

安裝TensorRT版本6.0.1

轉到Nvidia TensorRT頁面并下載基于OS和CUDA的TRT6軟體包,

下面提到的是適用于Ubuntu OS和Cuda 10.1的步驟

# Optimizing For TensorRT - Feature Not tested on colab
# This requires TensorRT 6.0.1 to be installed
# Go to https://developer.nvidia.com/tensorrt

# Download 
# - nv-tensorrt-repo-ubuntu1804-cuda10.1-trt6.0.1.5-ga-20190913_1-1_amd64.deb (For Ubuntu18.04)
# - nv-tensorrt-repo-ubuntu1604-cuda10.1-trt6.0.1.5-ga-20190913_1-1_amd64.deb (For Ubuntu16.04)
# Run the following commands to install trt (in a terminal)

$ sudo dpkg -i nv-tensorrt-repo-ubuntu1804-cuda10.1-trt6.0.1.5-ga-20190913_1-1_amd64.deb
$ sudo apt-key add /var/nv-tensorrt-repo-cuda10.1-trt6.0.1.5-ga-20190913/7fa2af80.pub
$ sudo apt-get update
$ sudo apt-get install tensorrt
$ sudo apt-get install uff-converter-tf
$ sudo apt-get install python3-libnvinfer-dev

優化匯出模型

優化函式運行一個執行sys.exit()函式的會話,因此在其上運行的包裝程式將關閉python系統,

為了解決此問題,提供了一個名為optimize.py的腳本,該腳本可以在jupyter notebook電腦或終端命令上運行

根據引數設定,優化的模型將保存在名為“ trt_fp16_dir”的檔案夾中,

# For terminal users
$ python Monk_Object_Detection/13_tf_obj_2/lib/optimize.py

# For jupyter notebook and colab users
%run Monk_Object_Detection/13_tf_obj_2/lib/optimize.py

程序F-1:在開發機器上運行推理

加載推理機

from infer_detector import Infer

gtf = Infer();

載入模型

首先加載匯出的模型并運行步驟;稍后通過加載優化的模型重復相同的步驟(步驟保持不變)

# To load exported model
gtf.set_model_params(exported_model_dir = 'export_dir')

# To load optimized model
gtf.set_model_params(exported_model_dir = 'trt_fp16_dir')

對單個影像進行推斷

scores, bboxes, labels = gtf.infer_on_image('ship/test/img1.jpg', thresh=0.1);

樣本推斷結果

使用兩個模型運行速度測驗分析

gtf.benchmark_for_speed('ship/test/img1.jpg')

在AWS P3.2x V100 GPU上使用匯出的模型(未優化)進行分析

Average Image loading time : 0.0110 sec
Average Inference time     : 0.0097 sec
Result extraction time     : 0.0352 sec
total_repetitions          : 100
total_time                 : 0.9794 sec
images_per_sec             : 102
latency_mean               : 9.7949 ms
latency_median             : 9.7095 ms
latency_min                : 9.1238 ms

在AWS P3.2x V100 GPU上使用優化模型進行分析

約1.5倍的速度加快處理后期優化

Average Image loading time : 0.0108 sec
Average Inference time     : 0.0062 sec
Result extraction time     : 0.0350 sec
total_repetitions          : 100
total_time                 : 0.6241 sec
images_per_sec             : 160
latency_mean               : 6.2422 ms
latency_median             : 6.2302 ms
latency_min                : 5.9401 ms  

程序F-2:在Jetson Nano板上設定所有東西

步驟1:下載Jetpack 4.3 SD卡映像 https://developer.nvidia.com/jetpack-43-archive

步驟2:將此圖片寫入SD卡,你可以使用 https://www.balena.io/etcher/

步驟3:將你的SD卡插入Nano板并啟動系統,然后完成安裝步驟

獲取有關Nvidia的“ Jetson Nano入門”頁面的更多詳細資訊

  • https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit

程序F-3:在Jetson Nano板上安裝步驟

步驟1:更新Apt

$ sudo apt-get update
$ sudo apt-get upgrade

步驟2:安裝系統庫

$ sudo apt-get install nano git cmake libatlas-base-dev gfortran libhdf5-serial-dev hdf5-tools nano locate libfreetype6-dev python3-setuptools protobuf-compiler libprotobuf-dev openssl libssl-dev libcurl4-openssl-dev cython3 libxml2-dev libxslt1-dev python3-pip

$ sudo apt-get install libopenblas-dev libprotobuf-dev libleveldb-dev libsnappy-dev libhdf5-serial-dev protobuf-compiler libgflags-dev libgoogle-glog-dev liblmdb-dev

$ sudo pip3 install virtualenv virtualenvwrapper

步驟3:更新bashrc檔案

將這些行添加到?/ .bashrc檔案

export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv
source /usr/local/bin/virtualenvwrapper.sh

export PATH=/usr/local/cuda-10.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64\
${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

運行以下命令

$ source ~/.bashrc

步驟4:創建虛擬環境并安裝所有必需的python庫

安裝numpy大約需要15分鐘

$ mkvirtualenv -p /usr/bin/python3.6 tf2

$ pip install numpy==1.19.1

安裝scipy大約需要40分鐘

$ pip install scipy==1.5.1

安裝Jetson Nano TensorFlow-2.0.0需再花費15分鐘

$ pip install scikit-build protobuf cython -vvvv

$ pip install grpcio absl-py py-cpuinfo psutil portpicker six mock requests gast h5py astor termcolor protobuf keras-applications keras-preprocessing wrapt google-pasta -vvvv

$ pip install https://developer.download.nvidia.com/compute/redist/jp/v43/tensorflow-gpu/tensorflow_gpu-2.0.0+nv19.12-cp36-cp36m-linux_aarch64.whl -vvvv

安裝OpenCV需要1.5個小時

$ mkdir opencv && cd opencv
$ wget -O opencv.zip https://github.com/opencv/opencv/archive/4.1.2.zip
$ unzip opencv.zip
$ mv opencv-4.1.2 opencv
$ cd opencv && mkdir build && cd build

$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D WITH_CUDA=OFF -D WITH_CUBLAS=OFF -D WITH_LIBV4L=ON -D BUILD_opencv_python3=ON -D BUILD_opencv_python2=OFF -D BUILD_opencv_java=OFF -D WITH_GSTREAMER=ON -D WITH_GTK=ON -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF -D OPENCV_ENABLE_NONFREE=OFF ..

$ make -j3
$ sudo make install

$ cd ~/.virtualenvs/tf2/lib/python3.6/site-packages
$ ln -s /usr/local/lib/python3.6/site-packages/cv2/python-3.6/cv2.cpython-36m-aarch64-linux-gnu.so cv2.so

最后克隆Monk Object Detection庫

注意:不要像在開發機器中那樣運行13_tf_obj_2的安裝,用tf2.0安裝tf物件檢測有一些問題,推理代碼不需要物件檢測API工具,

$ git clone https://github.com/Tessellate-Imaging/Monk_Object_Detection.git

程序F-4:關于Jetson Nano的推論

將優化的權重檔案夾復制/下載到jetson nano作業目錄(Monk庫為克隆目錄)

從Monk_Object_Detection庫復制示例影像

$ cp -r Monk_Object_Detection/example_notebooks/sample_dataset/ship .

加載推理引擎和模型(此步驟大約需要4到5分鐘)

from infer_detector_nano import Infer
gtf = Infer();

gtf.set_model_params(exported_model_dir = 'trt_fp16_dir')

現在,如前所述,TensorRT采用計劃并在運行時構建(優化)它,因此第一次運行大約需要3-4分鐘

scores, bboxes, labels = gtf.infer_on_image('ship/test/img1.jpg', thresh=0.1);

# Oputput will be saved as output.jpg
gtf.draw_on_image(self, bbox_thickness=3, text_size=1, text_thickness=2)

突出顯示的區域顯示了Jetson Nano的TesnorRT建立(優化)計劃(模型)(作者擁有的影像)

再次運行它不會花費太多時間,

Benchmark板基準分析

gtf.benchmark_for_speed('ship/test/img1.jpg')
# With Jetson Nano power mode - 5W ModeAverage Image loading time : 0.0486 sec
Average Inference time     : 0.1182 sec
total_repetitions          : 100
total_time                 : 11.8244 sec
images_per_sec             : 8
latency_mean               : 118.2443 ms
latency_median             : 117.8019 ms
latency_min                : 111.0002 ms
# With Jetson Nano power mode - MAXN ModeAverage Image loading time : 0.0319 sec
Average Inference time     : 0.0785 sec
total_repetitions          : 100
total_time                 : 7.853 sec
images_per_sec             : 12
latency_mean               : 78.5399 ms
latency_median             : 78.1973 ms
latency_min                : 76.2658 ms

jupyter notebook提供TensorFlow物件檢測API 2.0的完整代碼

  • https://github.com/Tessellate-Imaging/Monk_Object_Detection/blob/master/example_notebooks/13_tf_obj_2/Train_Infer_Optimize_Deploy.ipynb

從谷歌驅動器下載所有預先訓練的權重

  • https://drive.google.com/file/d/12iOSeYHut_ZxB9Z8_dO7ZdUBI7of-GMd/view?usp=sharing

TensorFlow物件檢測API V 2.0的所有作業到此結束

感謝閱讀!祝你編碼愉快!!

原文鏈接:https://www.analyticsvidhya.com/blog/2020/09/tensorflow-object-detection-1-0-2-0-train-export-optimize-tensorrt-infer-jetson-nano/

歡迎關注磐創AI博客站:
http://panchuang.net/

sklearn機器學習中文官方檔案:
http://sklearn123.com/

歡迎關注磐創博客資源匯總站:
http://docs.panchuang.net/

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/214423.html

標籤:其他

上一篇:python使用cuML訓練你的機器學習模型

下一篇:【Linux學習筆記17】系統故障恢復方法大全(一)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more