{"id":28309917,"url":"https://github.com/chansoopark98/tensorflow-keras-object-detection","last_synced_at":"2025-09-18T13:39:42.982Z","repository":{"id":50331902,"uuid":"326609010","full_name":"chansoopark98/Tensorflow-Keras-Object-Detection","owner":"chansoopark98","description":"Tensorflow-Keras based Real-time Object detection","archived":false,"fork":false,"pushed_at":"2022-11-05T12:44:18.000Z","size":162734,"stargazers_count":7,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-09T07:51:37.124Z","etag":null,"topics":["javascript","keras","mobilenet","object-detection","onnx","realtime","tensorflow","tensorflow-js"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chansoopark98.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-01-04T07:54:42.000Z","updated_at":"2024-03-15T05:46:57.000Z","dependencies_parsed_at":"2023-01-22T02:51:38.853Z","dependency_job_id":null,"html_url":"https://github.com/chansoopark98/Tensorflow-Keras-Object-Detection","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/chansoopark98/Tensorflow-Keras-Object-Detection","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chansoopark98%2FTensorflow-Keras-Object-Detection","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chansoopark98%2FTensorflow-Keras-Object-Detection/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chansoopark98%2FTensorflow-Keras-Object-Detection/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chansoopark98%2FTensorflow-Keras-Object-Detection/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chansoopark98","download_url":"https://codeload.github.com/chansoopark98/Tensorflow-Keras-Object-Detection/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chansoopark98%2FTensorflow-Keras-Object-Detection/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":275777162,"owners_count":25526808,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-18T02:00:09.552Z","response_time":77,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["javascript","keras","mobilenet","object-detection","onnx","realtime","tensorflow","tensorflow-js"],"created_at":"2025-05-24T10:11:53.270Z","updated_at":"2025-09-18T13:39:42.974Z","avatar_url":"https://github.com/chansoopark98.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1\u003eTensorflow-Keras Real-time Object Detection\u003c/h1\u003e\n\n\u003e All about Tensorflow/Keras Object Detection\n\n\n## Tensorflow/Keras를 활용한 Object detection repository  [![Hits](https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2Fchansoopark98%2FTensorflow-Keras-Object-Detection\u0026count_bg=%2379C83D\u0026title_bg=%23555555\u0026icon=\u0026icon_color=%23C41010\u0026title=hits\u0026edge_flat=false)](https://hits.seeyoufarm.com)\n\n\n\u003chr\u003e\n\n\u003cbr\u003e\n\n\u003cp align=\"center\"\u003e\n \u003cimg src=\"https://img.shields.io/github/issues/chansoopark98/Tensorflow-Keras-Object-Detection\"\u003e\n \u003cimg src=\"https://img.shields.io/github/forks/chansoopark98/Tensorflow-Keras-Object-Detection\"\u003e\n \u003cimg src=\"https://img.shields.io/github/stars/chansoopark98/Tensorflow-Keras-Object-Detection\"\u003e\n \u003cimg src=\"https://img.shields.io/github/license/chansoopark98/Tensorflow-Keras-Object-Detection\"\u003e\n \u003c/p\u003e\n\n\u003cbr\u003e\n\n\u003cp align=\"center\"\u003e\n \u003cimg src =\"https://img.shields.io/badge/Tensorflow-FF6F00.svg?\u0026style=for-the-badge\u0026logo=Tensorflow\u0026logoColor=white\"/\u003e\n \u003cimg src =\"https://img.shields.io/badge/Keras-D00000.svg?\u0026style=for-the-badge\u0026logo=Keras\u0026logoColor=white\"/\u003e\n \u003cimg src =\"https://img.shields.io/badge/ONNX-005CED.svg?\u0026style=for-the-badge\u0026logo=ONNX\u0026logoColor=white\"/\u003e\n\u003c/p\u003e\n\n\u003cbr\u003e\n\n\u003cp align=\"center\"\u003e\n \u003cimg alt=\"Python\" src =\"https://img.shields.io/badge/Python-3776AB.svg?\u0026style=for-the-badge\u0026logo=Python\u0026logoColor=white\"/\u003e\n \u003cimg src =\"https://img.shields.io/badge/OpenCV-5C3EE8.svg?\u0026style=for-the-badge\u0026logo=OpenCV\u0026logoColor=white\"/\u003e\n \u003cimg src =\"https://img.shields.io/badge/Numpy-013243.svg?\u0026style=for-the-badge\u0026logo=Numpy\u0026logoColor=white\"/\u003e\n \u003cimg src =\"https://img.shields.io/badge/JavaScript-F7DF1E.svg?\u0026style=for-the-badge\u0026logo=JavaScript\u0026logoColor=white\"/\u003e\n\u003c/p\u003e\n\n\u003cbr\u003e\n\n\u003cdiv style=\"text-align: center\"\u003e  \n\n다양한 환경에서 실시간 객체 검출을 위한 tensorflow-keras 오픈 소스 레포지토리입니다. \n\u003cbr\u003e\nMobileNet-ssd, EfficientNet-ssd와 같이 [Single Shot multibox Detector](https://arxiv.org/abs/1512.02325) 기반의 객체 검출 모델을 제공합니다.\n\u003cbr\u003e\nPASCAL VOC, COCO와 같은 벤치마크 데이터셋을 기본 제공하며, 사용자 설정에 따라 custom dataaset을 사용할 수 있습니다.\n\u003cbr\u003e\n학습된 모델을 다양한 프레임워크 및 환경에서 추론할 수 있도록 export 기능을 제공합니다.\n\n레포지토리 개선에 기여할 수 있도록 Pull-request 및 issue를 남겨주세요.\n\n저자 이메일 : chansoo0710@gmail.com\n\n\u003c/div\u003e\n\n\u003cbr\u003e\n\u003chr\u003e\n\u003cbr\u003e\n\n\u003cp align=\"center\"\u003e\n\n\u003cimg src=\"https://user-images.githubusercontent.com/60956651/183575643-7cd2957d-a701-490b-bcb3-b478e3890ede.png\" width=\"500\" height=\"400\"/\u003e\n\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\n\u003cimg src=\"https://user-images.githubusercontent.com/60956651/183576318-c12f872c-369a-4cdd-9e1a-50f8b5ae98e7.png\" width=\"500\" height=\"400\"/\u003e\n\n\u003c/p\u003e\n\n\u003cbr\u003e\n\n### Features\n- Dataset\n    - PASCAL VOC 07+12\n    - COCO2017\n    - Custom dataset\n- Train\n- Evaluate\n- Predict\n    - Image\n    - Video\n    - Webcam\n- Export\n    - TensorRT\n    - ONNX\n    - Tensorflow-lite\n    - Tensorflow-js\n- Tensorflow docker serving\n\n\u003cbr\u003e\n\n### **Use library:** \n- Tensorflow\n- Tensorflow-js\n- Tensorflow-lite\n- Tensorflow-datasets\n- Tensorflow-addons\n- Tensorflow-serving\n- Keras\n- OpenCV python\n\n### **Options:** Distribute training, Custom Data\n### **Models:** Single shot multibox detector (SSD), MobileNet-Series(1,2,3,3+), EfficientNet-Series(V1,V2,Lite)\n\n\n\u003cbr\u003e\n\u003chr/\u003e\n\n# Table of Contents\n\n ## 1. [Models](#1-models-1)\n ## 2. [Dependencies](#2-dependencies-1)\n ## 3. [Preparing datasets](#3-preparing-datasets-1)\n ## 4. [Train](#4-train-1)\n ## 5. [Eval](#5-eval-1)\n ## 6. [Predict](#6-predict-1)\n ## 7. [Export](#7-export-1)\n ## 8. [Demo](#8demo)\n\n\u003cbr\u003e\n\u003chr/\u003e\n\n# 1. Models\n\n현재 지원하는 모델 종류입니다.\n \n \u003cbr\u003e\n\n| Model | Params | Resolution(HxW) | Inference time(ms) | Pretrained weights | Pretrained datasets | mAP |\n| :-- | :-: | :-: | :-: | :-: | :-: | :-: |\n| EfficientNet-Lite-B0 | 3.01m | 300x300 | 0.019ms | [Link](https://github.com/chansoopark98/Tensorflow-Keras-Object-Detection/releases/download/untagged-b94ecf05cb81011df45c/_0807_efficient_lite_v0_lr0.002_b32_e300_single_gpu_bigger_adam_base-128_best_loss_73.0.h5) | PASCAL VOC | 73.0% |\n| EfficientNet-Lite-B0 | 3.01m | 300x300 | 0.019ms | [Link](https://github.com/chansoopark98/Tensorflow-Keras-Object-Detection/releases/download/v1.0.0-alpha/_0809_efficient_lite_v0_human_detection_lr0.002_b32_e300_base64_prior_normal_best_loss.h5) | Human detection | - |\n\n\u003cbr\u003e\n\n## Loss\n\n\u003ctable border=\"0\"\u003e\n\u003ctr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\n            \u003ch3\u003e\u003cstrong\u003eLoss\u003c/strong\u003e\u003c/h3\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n            \u003ch3\u003e\u003cstrong\u003eImplementation\u003c/strong\u003e\u003c/h3\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003c!-- CROSS ENTROPY --\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\n            Cross entropy loss\n        \u003c/td\u003e\n        \u003ctd\u003e\n            OK\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003c!-- FOCAL CROSS ENTROPY LOSS --\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\n            Focal cross entropy loss\n        \u003c/td\u003e\n        \u003ctd\u003e\n            OK\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\n            Hard negative mining\n        \u003c/td\u003e\n        \u003ctd\u003e\n            OK\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\n            Smooth L1\n        \u003c/td\u003e\n        \u003ctd\u003e\n            OK\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\n            GIoU\n        \u003c/td\u003e\n        \u003ctd\u003e\n            OK\n        \u003c/td\u003e\n    \u003c/tr\u003e\n\n\u003c/tr\u003e\n\u003c/table\u003e\n\n    \n\u003cbr\u003e\n\u003chr/\u003e\n\n# 2. Dependencies\n\n본 레포지토리의 종속성은 다음과 같습니다.\n\n\u003ctable border=\"0\"\u003e\n\u003ctr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\n        OS\n        \u003c/td\u003e\n        \u003ctd\u003e\n        Ubuntu 18.04\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\n        TF version\n        \u003c/td\u003e\n        \u003ctd\u003e\n        2.9.1\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\n        Python version\n        \u003c/td\u003e\n        \u003ctd\u003e\n        3.8.13\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\n        CUDA\n        \u003c/td\u003e\n        \u003ctd\u003e\n        11.1\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\n        CUDNN\n        \u003c/td\u003e\n        \u003ctd\u003e\n        cuDNN v8.1.0 , for CUDA 11.1\n        \u003c/td\u003e\n\u003c/table\u003e\n\u003cbr\u003e\n\u003chr/\u003e\n\n학습 및 평가를 위해 **Anaconda(miniconda)** 가상환경에서 패키지를 다운로드 합니다.\n    \n    conda create -n envs_name python=3.8\n\n    pip install -r requirements.txt\n\n\u003cbr\u003e\n\u003chr/\u003e\n\n# 3. Preparing datasets\n\n프로그램에 필요한 **Dataset**은 **Tensorflow Datasets** 라이브러리([TFDS](https://www.tensorflow.org/datasets/catalog/overview))를 사용합니다. \n\n### TFDS Object detection dataset\n1. [PASCAL VOC](https://www.tensorflow.org/datasets/catalog/voc)\n2. [COCO2017](https://www.tensorflow.org/datasets/catalog/coco)\n\n파일 다운로드 방법은 다음과 같습니다.\n\n    # PASCAL VOC download\n    python download_datasets.py --train_dataset='voc'\n\n    # COCO2017 download\n    python download_datasets.py --train_dataset='coco'\n\nCustom TFDS의 경우 [TFDS 변환 방법](https://github.com/chansoopark98/Tensorflow-Keras-Semantic-Segmentation#3-preparing-datasets-1)을 참고해주세요.\n\n\n\n\u003cbr\u003e\n\n\u003chr/\u003e\n\n# 4. Train\n\n학습하기전 tf.data의 메모리 할당 문제로 인해 TCMalloc을 사용하여 메모리 누수를 방지합니다.\n\n    1. sudo apt-get install libtcmalloc-minimal4\n    2. dpkg -L libtcmalloc-minimal4\n\n    2번을 통해 설치된 TCMalloc의 경로를 저장합니다\n\n\n## Training object detection\n\n**How to RUN?**\n    \nSingle gpu\n\n    LD_PRELOAD=\"/usr/lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4.3.0\" python train.py\n\nMutli gpu\n\n    LD_PRELOAD=\"/usr/lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4.3.0\" python train.py --multi_gpu\n\n\n### **Caution!**\n본 레포지토리는 single-GPU, multi-GPU 환경에서의 학습 및 추론을 지원합니다. \u003cbr\u003e\nSingle-GPU 사용 시, GPU 번호를 설정하여 사용할 수 있습니다. \u003cbr\u003e\npython train.py --help를 살펴보시고 학습에 필요한 설정값을 argument 인자값으로 추가해주세요. \u003cbr\u003e\n\n\u003cbr\u003e\n\u003chr\u003e\n\n# 5. Eval\nTraining 이후 모델의 정확도 평가 및 추론 속도를 계산합니다. \u003cbr\u003e\n\u003cbr\u003e\n계산 항목 : FLOPs, MIoU metric, Average inference time\n\u003cbr\u003e\n\n자세한 항목은 arguments를 참고해주세요.\n\n**1. PASCAL VOC EVALUATE**\n\n\n    python eval_voc.py --checkpoint_dir='./checkpoints/' --weight_path='weight.h5' --backbone_name='efficient_lite_v0' ... etc\n\n\u003cbr\u003e\n\nPASCAL VOC의 Precision-Recall graph 시각화 기능을 제공합니다.\n\neval_voc.py를 한 번 이상 실행해야 합니다.\n\n```bash\ncd experiemnts\npython draw_prec_rec_curve.py\n```\n\n\u003cbr\u003e\n\n\u003cp align=\"center\"\u003e\n\n\u003cimg src=\"https://user-images.githubusercontent.com/60956651/184134684-1cd5f636-8929-4fbc-9f05-d932add8d100.png\"\u003e\n\n\u003c/p\u003e\n\n\n\n\u003cbr\u003e\n\n\n\n**2. COCO2017 EVALUATE**\n\n추가 예정입니다.\n\n\n\n\n\n\u003chr\u003e\n\n# 6. Predict\nWeb-camera 또는 저장된 비디오를 실시간으로 추론할 수 있습니다. \u003cbr\u003e\n\u003cbr\u003e\n\n\n**Web-cam 실시간 추론**\n\n    python predict_webcam.py\n\n\n\u003cbr\u003e\n\n\u003cbr\u003e\n\u003chr\u003e\n\n# 7. Export\n\n학습된 모델을 다양한 프레임워크로 export하는 기능을 제공합니다.\n\n예를들어, tensorflow model을 ONNX로 변환할 수 있으며, 역으로 ONNX 모델을 tensorflow 모델로 재변환합니다.\n\n## **Tensorflow model to another frameworks**\n\n- ### 7.1 Convert to \u003cu\u003e**tensorRT**\u003c/u\u003e\n- ### 7.2 Convert to \u003cu\u003e**frozen graph**\u003c/u\u003e\n- ### 7.3 Convert to \u003cu\u003e**ONNX**\u003c/u\u003e\n- ### 7.4 Convert to \u003cu\u003e**tensorflow_js**\u003c/u\u003e\n- ### 7.5 Convert to \u003cu\u003e**tensorflow_lite**\u003c/u\u003e\n\n## **ONNX model to tensorflow**\n\n- ### 7.6 Convert \u003cu\u003e**ONNX**\u003c/u\u003e to \u003cu\u003e**tf saved model + frozen graph**\u003c/u\u003e\n\n\u003cbr\u003e\n\n\u003chr\u003e\n\n## **7.1** Convert to tensorRT\n\n\u003cbr\u003e\n\ntensorRT를 변환하기 위해서는 tensorRT 엔진을 빌드해야 합니다.\n\n본 레포지토리에서는 tf-trt를 이용하여 tensorRT 엔진을 빌드합니다.\n\nCUDA, CuDNN, TensorRT files\n\n\n\u003cbr\u003e\n\n현재 작성된 코드 기준으로 사용된 CUDA 및 CuDNN 그리고 TensorRT version은 다음과 같습니다. \u003cbr\u003e\n클릭 시 설치 링크로 이동합니다. \u003cbr\u003e\nCUDA 및 CuDNN이 사전에 설치가 완료된 경우 생략합니다.\n\n\u003cbr\u003e\n\n### CUDA : **[CUDA 11.1](https://www.tensorflow.org/datasets/catalog/overview)**\n### CuDNN : **[CuDNN 8.1.1](https://developer.nvidia.com/compute/machine-learning/cudnn/secure/8.1.1.33/11.2_20210301/cudnn-11.2-linux-x64-v8.1.1.33.tgz)**\n### TensorRT : **[TensorRT 7.2.2.3](https://developer.nvidia.com/compute/machine-learning/tensorrt/secure/7.2.2/tars/tensorrt-7.2.2.3.ubuntu-18.04.x86_64-gnu.cuda-11.1.cudnn8.0.tar.gz)**\n\n\u003cbr\u003e\n\n### **7.1.1** Install TensorRT\n\u003cbr\u003e\n\n가상 환경을 활성화합니다. (Anaconda와 같이 가상환경을 사용하지 않은 경우 생략합니다)\n    \n    conda activate ${env_name}\n\n\u003cbr\u003e\n\nTensorRT를 설치한 디렉토리로 이동하여 압축을 해제하고 pip를 업그레이드 합니다.\n\n```bash\ntar -xvzf TensorRT-7.2.2.3.Ubuntu-18.04.x86_64-gnu.cuda-11.1.cudnn8.0.tar.gz\npip3 install --upgrade pip\n```\n\n편집기를 이용하여 배시 쉘에 접근하여 환경 변수를 추가합니다.\n\n```bash\nsudo gedit ~/.bashrc\nexport PATH=\"/usr/local/cuda-11.1/bin:$PATH\"\nexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/park/TensorRT-7.2.2.3/onnx_graphsurgeon\nexport LD_LIBRARY_PATH=\"$LD_LIBRARY_PATH:/usr/local/cuda-11.1/lib64:/usr/local/cuda/extras/CUPTI/lib64:/home/park/TensorRT-7.2.2.3/lib\"\n```\n\nTensorRT 파이썬 패키지를 설치합니다.\n\n```bash\ncd python\npython3 -m pip install tensorrt-7.2.2.3-cp38-none-linux_x86_64.whl\n\ncd ../uff/\npython3 -m pip install uff-0.6.9-py2.py3-none-any.whl\n\ncd ../graphsurgeon\npython3 -m pip install graphsurgeon-0.4.5-py2.py3-none-any.whl\n\ncd ../onnx_graphsurgeon\npython3 -m pip install onnx_graphsurgeon-0.2.6-py2.py3-none-any.whl\n```\n\nterminal을 열어서 설치가 잘 되었는지 확인합니다.\n\n![test_python](https://user-images.githubusercontent.com/60956651/181165197-6a95119e-ea12-492b-9587-a0c5badc73be.png)\n\n\u003cbr\u003e\n\n### **7.1.2** Convert to TF-TensorRT\n\n\u003cbr\u003e\n\nTF-TRT 변환 작업 전 사전 학습된 **tensorflow saved model (.pb)** 이 필요합니다. \u003cbr\u003e\ntensorflow saved model이 없는 경우 **7.1.3** 절차를 따르고, 있는 경우에는 **7.1.4**로 넘어가세요.\n\n\n- ### **7.1.3** tensorflow saved model이 없는 경우\n    \u003cbr\u003e\n\n    본 레포지토리에서 **train.py**를 통해 학습된 가중치가 있는 경우 graph model로 변환하는 기능을 제공합니다.\n\n    \u003cbr\u003e\n\n    **train.py**에서 **--saved_model** argument로 그래프 저장 모드를 활성화합니다. 그리고 학습된 모델의 가중치가 저장된 경로를 추가해줍니다.\n\n        python train.py --saved_model --saved_model_path='your_model_weights.h5'\n\n    변환된 graph model의 기본 저장 경로는 **'./checkpoints/export_path/1'** 입니다.\n\n    ![saved_model_path](https://user-images.githubusercontent.com/60956651/181168185-376880d3-b9b8-4ea7-8c76-be8b498e34b1.png)\n\n    \u003cbr\u003e\n\n- ### **7.1.4** Converting\n\n    **(.pb)** 파일이 존재하는 경우 아래의 스크립트를 실행하여 변환 작업을 수행합니다.\n\n        python convert_to_tensorRT.py ...(argparse options)\n\n    TensorRT 엔진을 통해 모델을 변환합니다. 고정된 입력 크기를 바탕으로 엔진을 빌드하니 스크립트 실행 전 **--help** 인자를 확인해주세요.\n\n    \u003cbr\u003e\n    \n    아래와 같은 옵션을 제공합니다. \u003cbr\u003e\n\n    **모델 입력 해상도** (--image_size), **.pb 파일 디렉토리 경로** (input_saved_model_dir) \u003cbr\u003e\n    \n    **TensorRT 변환 모델 저장 경로** (output_saved_model_dir), **변환 부동소수점 모드 설정** (floating_mode)\n\n    \u003cbr\u003e\n\n\n\u003cbr\u003e\n\n\u003chr\u003e\n\n## 7.2 Convert to frozen graph\n\n\u003cbr\u003e\n\n다양한 환경에 쉽게 배포하기 위해 tensorflow-keras model을 frozen graph로 변환합니다.\n\ntrain.py를 통해 학습된 모델 가중치가 필요합니다. \n\n모델 가중치 저장 경로 및 백본 이름 등 필요한 arguments를 확인해주세요.\n\n    python convert_frozen_graph.py --help\n\n\n\u003ccenter\u003e\n\n![image](https://user-images.githubusercontent.com/60956651/183798749-a9e9dc0d-ecc3-4bf5-bd10-683680835e33.png)\n\n\u003c/center\u003e\n\n모델 출력에 post-processing을 추가할 경우 아래와 같은 인자를 추가해주세요.\n\n```bash\npython convert_frozen_graph.py --include_postprocess\n```\n\n\u003cbr\u003e\n\n변환이 완료되면 아래와 같은 경로(기본 저장 경로)에 .pb 파일과 .pbtxt 파일이 생성됩니다.\n\n\u003cbr\u003e\n\n\u003ccenter\u003e\n\n![image](https://user-images.githubusercontent.com/60956651/183799185-160c1f01-1a8d-4ad5-9243-7a51c5879b52.png)\n\n\u003c/center\u003e\n\n\u003cbr\u003e\n\n\u003chr\u003e\n\n## 7.3 Convert to ONNX\n\n\u003cbr\u003e\n\n학습된 tensorflow model을 ONNX 모델로 변환합니다.\n\nONNX로 변환하기 위해서 7.2 step의 frozen graph 변환 과정을 수행해야 합니다.\n\n\u003cbr\u003e\n\n```bash\npip install tf2onnx\n \npython -m tf2onnx.convert --input ./your_frozen_graph.pb --output ./frozen_to_onnx_model.onnx --inputs x:0 --outputs Identity:0 --opset 13\n```\n\n\u003cbr\u003e\n\n제공되는 변환 옵션은 다음과 같습니다.\n\u003cbr\u003e\n\n--input : Frozen graph model 저장 경로\n\u003cbr\u003e \n--output : ONNX 모델 저장 경로\n\u003cbr\u003e\n--inputs : Frozen graph 모델 입력 namespace\n\u003cbr\u003e\n--outputs : Frozen graph 모델 출력 namespace\n\u003cbr\u003e\n--opset : ONNX version\n\u003cbr\u003e\n\n아래와 같이 변환하는 경우,\n\n```bash\npython -m tf2onnx.convert --input ./checkpoints/converted_frozen_graph/frozen_graph.pb --output ./checkpoints/converted_frozen_graph/onnx_model.onnx --inputs x:0 --outputs Identity:0 --opset 13\n```\n\n\u003cbr\u003e\n\nONNX 모델 파일(.onnx)이 생성됩니다.\n\u003ccenter\u003e\n\n![image](https://user-images.githubusercontent.com/60956651/183800918-17c0b839-aee8-4454-a13d-0c10e904c31f.png)\n\n\u003c/center\u003e\n\n\u003cbr\u003e\n\n\u003chr\u003e\n\n## 7.4 Convert to tensorflow_js\n\n\u003cbr\u003e\n\nWeb (javascript)에서 추론이 가능하도록 tensorflow_js 컨버팅 기능을 제공합니다.\n\n**7.2 step의 frozen graph 변환 작업을 먼저 해야합니다.**\n\n\u003cbr\u003e\n\n```bash\ntensorflowjs_converter your_frozen_graph.pb ./output_dir/ --input_format=tf_frozen_model --output_node_names='Identity'\n```\n\n추가 변환 옵션은 --help로 확인할 수 있습니다.\n\n변환 시 양자화를 하는 경우 --quantize_float16 를 추가합니다.\n\n\u003cbr\u003e\n\n```bash\ntensorflowjs_converter ./checkpoints/converted_frozen_graph/frozen_graph.pb ./checkpoints/converted_tfjs/ --input_format=tf_frozen_model --output_node_names='Identity' --quantize_float16 \n```\n\n변환 결과는 다음과 같습니다.\n\n\u003ccenter\u003e\n\n![image](https://user-images.githubusercontent.com/60956651/183803331-0d9ed0f4-a3be-4fde-ac8c-6a2c9616a6fb.png)\n\n\u003c/center\u003e\n\n\u003cbr\u003e\n\ntensorflow-js로 모델 용량에 비례하여 바이너리 파일(.bin)과 모델 정보를 포함하는 model.json 파일이 생성됩니다.\n\n실제 웹에서 추론 가능한 샘플 코드는 다음과 같습니다.\n\nHTML 페이지에서 tensorflow_js를 import 합니다.\n\n\u003cbr\u003e\n\n```html\n\u003cscript src=\"https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@3.19.0/dist/tf.min.js\"\u003e\u003c/script\u003e\n```\n\n입력 데이터는 video element 또는 canvas의 이미지를 입력으로 사용합니다.\n\n학습된 모델의 이미지 크기에 맞게 조정합니다.\n\n```javascript\nconst model = await tf.loadGraphModel('model.json');\nconst inputImageTensor = tf.expandDims(tf.cast(tf.browser.fromPixels(videoElement), 'float32'), 0);\nconst resizedImage = tf.image.resizeBilinear(inputImageTensor, [300, 300]);\nconst normalizedImage = tf.div(resizedImage, 255);\n\n// post-processing이 포함된 경우 모델 최종 출력의 shape은 (N, 6) 입니다.\n// N은 검출된 샘플의 개수\n// 각 샘플마다 다음과 같은 데이터[x_min, y_min, x_max, y_max, scores, labels]를 포함합니다.\nvar output = await model.executeAsync(normalizedImage);\n\noutput = tf.squeeze(output, 0); // [Batch, N, 6] -\u003e [N, 6]\n    \nvar boxes = output.slice([0, 0], [-1, 4]); // [N, 4]\nvar scores = output.slice([0, 4], [-1, 1]); // [N, 1]\nvar labels = output.slice([0, 5], [-1, 1]); // [N, 1]\n\n// 메모리 해제\ntf.dispose(output);\ntf.dispose(boxes);\ntf.dispose(scores);\ntf.dispose(labels);\n```\n\n\u003cbr\u003e\n\n\u003chr\u003e\n\n## 7.5 Convert to tensorflow_lite\n\n\u003cbr\u003e\n\n모바일 Android, ios, raspberry pi와 같은 edge device에서 고속 추론이 가능하도록 tflite 변환 기능을 제공합니다.\n\n양자화를 적용하는 경우 변환 옵션은 다음과 같습니다.\n\n\u003cbr\u003e\n\n**GPU** : float16\n\n**CPU** : int8 (TODO)\n\n\u003cbr\u003e\n\n\n```bash\npython convert_to_tflite.py --checkpoint_dir='./checkpoints/' \\\n                            --model_weights='your_model_weights.h5' \\\n                            --backbone_name='efficient_lite_v0' \\\n                            --num_classes=21 \\\n                            --export_dir='./checkpoints/tflite_converted/' \\\n                            --tflite_name='tflite.tflite'\n```\n\u003cbr\u003e\n\n변환이 완료된 경우 저장 경로에 .tflite 파일이 생성됩니다.\n\n\u003cbr\u003e\n\u003ccenter\u003e\n\n![image](https://user-images.githubusercontent.com/60956651/183825152-d887e0d4-b5e6-412c-b0b9-2ce3978de756.png)\n\n\u003c/center\u003e\n\n변환 확인을 위해 스크립트를 실행합니다.\n\n```bash\npython convert_to_tflite.py --export_dir='./checkpoints/tflite_converted/' \\\n                            --tflite_name='tflite.tflite' \\\n                            --test\n```\n\n\u003cbr\u003e\n\n\u003chr\u003e\n\n## 7.6 Convert ONNX to tf saved model + frozen graph\n\n\u003cbr\u003e\n\n외부 프레임워크에서 학습된 모델 (e.g. pytorch)을 tensorflowjs, tflite 등  웹 및 엣지 디바이스에서\n쉽게 추론할 수 있도록 변환 기능을 제공합니다.\n\n\u003cbr\u003e\n\n**ONNX로 컨버팅된 모델 파일(.onnx)이 필요합니다!**\n\n```bash\npython convert_onnx_to_tf.py --onnx_dir='your_onnx_model.onnx' \\\n                             --output_dir='onnx2tf_converted'\n```\n\n\u003cbr\u003e\n\n\u003chr\u003e\n\n\u003cbr\u003e\n\n# 8.Demo\n\nSingle image inference test, Human detection 등 다양한 task의 detection demo를 제공합니다.\n\n\u003cbr\u003e\n\n## 8.1 Single image inference test\n\n학습된 가중치를 이용하여 단일 이미지에 대한 추론 테스트를 지원합니다.\n\n데모 실행 절차는 다음과 같습니다. \u003cbr\u003e\n\n\u003cbr\u003e\n\n1. README.md 상단에 있는 PASCAL VOC 데이터셋으로 사전 학습된 EfficientNet-Lite-B0 모델 가중치를 다운로드 받습니다.\n\n2. 저장받은 가중치를 레포지토리의 'checkpoints/' 경로를 복사한 뒤, 파이썬 스크립트를 실행합니다. \u003cbr\u003e\n   여기서 --weight_name을 저장받은 케라스 가중치 파일 (.h5)에 맞게 변경합니다.\n\n```bash\npython predict_image.py --backbone_name='efficient_lite_v0' --batch_size=1 --num_classes=21 --image_dir='./inputs/' --image_format='div' --weight_name='download_your_weights_name.h5'\n```\n\n### Caution : 자세한 옵션은 python predict_image.py --help를 통해 확인해주세요.\n\n\u003cbr\u003e\n\u003cbr\u003e\n\n## 8.2 Human detection\n\nPASCAL VOC 07+12, COCO2017에서 human(person) class에 해당하는 샘플만 추출하여 학습한 모델입니다.\n\n총 클래스 수 : 2 (background + human)\n\n1. README.md 상단에 있는 Human detection 데이터셋으로 사전 학습된 EfficientNet-Lite-B0 모델 가중치를 다운로드 받습니다.\n\n2. 단일 이미지 추론 모드는 predict_image.py를 이용하여 추론을 수행합니다. \u003cbr\u003e\n\n```bash\npython predict_image.py --backbone_name='efficient_lite_v0' --batch_size=1 --num_classes=2 --image_dir='./inputs/' --image_format='div' --weight_name='download_your_weights_name.h5'\n```\n\n3. 동영상 추론\n\n```bash\npython predict_webcam.py --backbone_name='efficient_lite_v0' --num_classes=2 --image_format='div' --weight_name='download_your_weights_name.h5'\n```\n\n\u003cp align=\"center\"\u003e\n\n\u003cimg src='./experiments/human_Detection_output.gif'\u003e\n\n\u003c/p\u003e","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchansoopark98%2Ftensorflow-keras-object-detection","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchansoopark98%2Ftensorflow-keras-object-detection","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchansoopark98%2Ftensorflow-keras-object-detection/lists"}