使用Tensorflow?hub完成目標(biāo)檢測(cè)過程詳解
前言
本文主要介紹使用 tensorflow hub 中的 CenterNet HourGlass104 Keypoints 模型來完成簡(jiǎn)單的目標(biāo)檢測(cè)任務(wù)。使用到的主要環(huán)境是:
- tensorflow-cpu=2.10
- tensorflow-hub=0.11.0
- tensorflow-estimator=2.6.0
- python=3.8
- protobuf=3.20.1
導(dǎo)入必要的庫
首先導(dǎo)入必要的 python 包,后面要做一些復(fù)雜的安裝和配置工作,需要一點(diǎn)耐心和時(shí)間。在運(yùn)行下面代碼的時(shí)候可能會(huì)報(bào)錯(cuò):
TypeError: Descriptors cannot not be created directly. If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc >= 3.19.0. If you cannot immediately regenerate your protos, some other possible workarounds are: 1. Downgrade the protobuf package to 3.20.x or lower. 2. Set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python (but this will use pure-Python parsing and will be much slower).
你只需要重新使用 pip 安裝,將 protobuf 降低到 3.20.x 版本即可。
import os import pathlib import matplotlib import matplotlib.pyplot as plt import io import scipy.misc import numpy as np from six import BytesIO from PIL import Image, ImageDraw, ImageFont from six.moves.urllib.request import urlopen import tensorflow as tf import tensorflow_hub as hub tf.get_logger().setLevel('ERROR')
準(zhǔn)備數(shù)據(jù)和模型
(1)到 github.com/protocolbuf… 用迅雷下載對(duì)應(yīng)操作系統(tǒng)的壓縮包,我的是 win7 版本: github.com/protocolbuf…
(2)下載好之后隨便解壓到自定義目錄,我的是 “主目錄\protoc-22.1-win64”,然后將其中的 “主目錄\protoc-22.1-win64\bin” 路徑添加到用戶環(huán)境變量中的 PATH 變量中,重新打開命令行,輸入 protoc --version ,如果能正常返回版本號(hào)說明配置成功,可以開始使用。
(3)進(jìn)入命令行,在和本文件同一個(gè)目錄下,執(zhí)行命令
git clone --depth 1 https://github.com/tensorflow/models
,將 models 文件夾下載下來,進(jìn)入 models/research/ 下,使用命令執(zhí)行
protoc object_detection/protos/*.proto --python_out=.
將 models/research/object_detection/packages/tf2/setup.py 拷貝到和 models/research/ 下,然后使用執(zhí)行本文件的 python 對(duì)應(yīng)的 pip 去執(zhí)行安裝包操作
..\Anaconda3\envs\tfcpu2.10_py38\Scripts\pip.exe install . -i https://pypi.tuna.tsinghua.edu.cn/simple
中間可能會(huì)報(bào)錯(cuò)“error: netadata-generation-failed”,一般都是某個(gè)包安裝的時(shí)候出問題了,我們只需要看詳細(xì)的日志,單獨(dú)用 pip 進(jìn)行安裝即可,單獨(dú)安裝完之后,再去執(zhí)行上面的根據(jù) setup.py 的整裝操作,反復(fù)即可,過程有點(diǎn)麻煩但還是都可以安裝成功的。
(4)這里的模型本來在:
https://tfhub.dev/tensorflow/centernet/hourglass\_512x512\_kpts/1
但是由于網(wǎng)絡(luò)問題無法獲取,所以我們可以改為從
https://storage.googleapis.com/tfhub-modules/tensorflow/centernet/hourglass\_512x512\_kpts/1.tar.gz
獲取模型。
from object_detection.utils import label_map_util from object_detection.utils import visualization_utils as viz_utils from object_detection.utils import ops as utils_ops PATH_TO_LABELS = './models/research/object_detection/data/mscoco_label_map.pbtxt' category_index = label_map_util.create_category_index_from_labelmap(PATH_TO_LABELS, use_display_name=True) model_path = 'https://storage.googleapis.com/tfhub-modules/tensorflow/centernet/hourglass_512x512_kpts/1.tar.gz' print('TensorFlow Hub 中的模型地址: {}'.format(model_path)) print('加載模型...') hub_model = hub.load(model_path) print('加載成功!')
打印結(jié)果:
TensorFlow Hub 中的模型地址: https://storage.googleapis.com/tfhub-modules/tensorflow/centernet/hourglass_512x512_kpts/1.tar.gz 加載模型... WARNING:absl:Importing a function (__inference_batchnorm_layer_call_and_return_conditional_losses_42408) with ops with custom gradients. Will likely fail if a gradient is requested. WARNING:absl:Importing a function (__inference_batchnorm_layer_call_and_return_conditional_losses_209416) with ops with custom gradients. Will likely fail if a gradient is requested. ... WARNING:absl:Importing a function (__inference_batchnorm_layer_call_and_return_conditional_losses_56488) with ops with custom gradients. Will likely fail if a gradient is requested. 加載成功!
(5)在這里我們主要定義了一個(gè)函數(shù) load_image_into_numpy_array 來加載從網(wǎng)上下載圖片的圖片,并將其轉(zhuǎn)換為模型可以適配的輸入類型。
(6)IMAGES_FOR_TEST 字典中記錄了多個(gè)可以用來測(cè)試的圖片,但是這些都是在網(wǎng)上,用的使用需要調(diào)用 load_image_into_numpy_array 函數(shù)。
(7)COCO17_HUMAN_POSE_KEYPOINTS 記錄了人體姿態(tài)關(guān)鍵點(diǎn)。
(8)我們這里展示了 dogs 這張圖片,可以看到兩條可愛的小狗。
def load_image_into_numpy_array(path): image = None if(path.startswith('http')): response = urlopen(path) image_data = response.read() image_data = BytesIO(image_data) image = Image.open(image_data) else: image_data = tf.io.gfile.GFile(path, 'rb').read() image = Image.open(BytesIO(image_data)) (im_width, im_height) = image.size return np.array(image.getdata()).reshape((1, im_height, im_width, 3)).astype(np.uint8) IMAGES_FOR_TEST = { 'Beach' : 'models/research/object_detection/test_images/image2.jpg', 'Dogs' : 'models/research/object_detection/test_images/image1.jpg', 'Naxos Taverna' : 'https://upload.wikimedia.org/wikipedia/commons/6/60/Naxos_Taverna.jpg', 'Beatles' : 'https://upload.wikimedia.org/wikipedia/commons/1/1b/The_Coleoptera_of_the_British_islands_%28Plate_125%29_%288592917784%29.jpg', 'Phones' : 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Biblioteca_Maim%C3%B3nides%2C_Campus_Universitario_de_Rabanales_007.jpg/1024px-Biblioteca_Maim%C3%B3nides%2C_Campus_Universitario_de_Rabanales_007.jpg', 'Birds' : 'https://upload.wikimedia.org/wikipedia/commons/0/09/The_smaller_British_birds_%288053836633%29.jpg', } COCO17_HUMAN_POSE_KEYPOINTS = [(0, 1), (0, 2),(1, 3),(2, 4),(0, 5),(0, 6),(5, 7),(7, 9),(6, 8),(8, 10),(5, 6),(5, 11), (6, 12),(11, 12),(11, 13),(13, 15),(12, 14),(14, 16)] %matplotlib inline selected_image = 'Dogs' image_path = IMAGES_FOR_TEST[selected_image] image_np = load_image_into_numpy_array(image_path) plt.figure(figsize=(24,32)) plt.imshow(image_np[0]) plt.show()
目標(biāo)檢測(cè)
我們這里將經(jīng)過處理的小狗的圖片傳入模型中,會(huì)返回結(jié)果,我們只要使用結(jié)果來繪制出所檢測(cè)目標(biāo)的框,以及對(duì)應(yīng)的類別,分?jǐn)?shù),可以看出來結(jié)果是相當(dāng)?shù)臏?zhǔn)確的,甚至通過人的腿就能識(shí)別出人的框。
results = hub_model(image_np) result = {key:value.numpy() for key,value in results.items()} label_id_offset = 0 image_np_with_detections = image_np.copy() keypoints, keypoint_scores = None, None if 'detection_keypoints' in result: keypoints = result['detection_keypoints'][0] keypoint_scores = result['detection_keypoint_scores'][0] viz_utils.visualize_boxes_and_labels_on_image_array( image_np_with_detections[0], result['detection_boxes'][0], (result['detection_classes'][0] + label_id_offset).astype(int), result['detection_scores'][0], category_index, use_normalized_coordinates=True, max_boxes_to_draw=200, min_score_thresh=.30, agnostic_mode=False, keypoints=keypoints, keypoint_scores=keypoint_scores, keypoint_edges=COCO17_HUMAN_POSE_KEYPOINTS) plt.figure(figsize=(24,32)) plt.imshow(image_np_with_detections[0]) plt.show()
以上就是使用Tensorflow hub完成目標(biāo)檢測(cè)過程詳解的詳細(xì)內(nèi)容,更多關(guān)于Tensorflow hub目標(biāo)檢測(cè)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Tensorflow2.10使用BERT從文本中抽取答案實(shí)現(xiàn)詳解
- tensorflow2.10使用BERT實(shí)現(xiàn)Semantic Similarity過程解析
- 使用TensorFlow創(chuàng)建生成式對(duì)抗網(wǎng)絡(luò)GAN案例
- javascript命名約定(變量?函數(shù)?類?組件)
- Tensorflow2.4從頭訓(xùn)練Word?Embedding實(shí)現(xiàn)文本分類
- Tensorflow 2.4 搭建單層和多層 Bi-LSTM 模型
- 深度學(xué)習(xí)Tensorflow2.8?使用?BERT?進(jìn)行文本分類
- TensorFlow自定義模型保存加載和分布式訓(xùn)練
相關(guān)文章
Python中標(biāo)準(zhǔn)庫OS的常用方法總結(jié)大全
python中的OS庫提供了使用各種操作系統(tǒng)功能的接口。是經(jīng)常用到的一個(gè)庫,所以這篇文章主要給大家總結(jié)介紹了關(guān)于Python中標(biāo)準(zhǔn)庫OS的常用方法,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),需要的朋友們下面來一起看看吧。2017-07-07Python Numpy中數(shù)據(jù)的常用保存與讀取方法
這篇文章主要介紹了Python Numpy中數(shù)據(jù)的常用保存與讀取方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04python常用運(yùn)維腳本實(shí)例小結(jié)
這篇文章主要介紹了python常用運(yùn)維腳本實(shí)例小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02python定時(shí)按日期備份MySQL數(shù)據(jù)并壓縮
這篇文章主要為大家詳細(xì)介紹了python定時(shí)按日期備份MySQL數(shù)據(jù)并壓縮,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04Python基于pyjnius庫實(shí)現(xiàn)訪問java類
這篇文章主要介紹了Python基于pyjnius庫實(shí)現(xiàn)訪問java類,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07