日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

sagemaker+deeplens学习

發(fā)布時(shí)間:2024/9/19 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sagemaker+deeplens学习 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

sagemaker+deeplens報(bào)告

文章目錄

  • sagemaker+deeplens報(bào)告
    • Sagemaker學(xué)習(xí)
      • 1. 使用boto3對(duì)S3操作
      • 2.boto3調(diào)用sagemaker
        • 2.1使用sagemakerRuntime
      • 3.sagemaker庫(kù)
        • 3.1EstimatorBase類
          • 3.1.1 具有以下方法:
          • 3.1.2 使用小示例
    • 部署基于SSD的目標(biāo)檢測(cè)模型上AWS deeplens
      • 1.AWS deeplens的兩版本
      • 2.關(guān)于注冊(cè)
          • 2.1關(guān)于攝像頭恢復(fù)出廠設(shè)置后注冊(cè)的坑
      • 3.支持的框架
      • 4.選擇算法
      • 5.將MXNet框架下的SSD模型轉(zhuǎn)發(fā)為可部署模式
          • 轉(zhuǎn)化為部署模式
          • 保存到S3存儲(chǔ)桶
      • 6.創(chuàng)建樣例模板的lambda函數(shù)
      • 7.關(guān)于lambda函數(shù)
          • 關(guān)于編寫lambda函數(shù)
      • 8.deeplens的模型中間件
          • 本地上傳模型到deeplens攝像頭并生成中間件,避免模型下載慢問(wèn)題
      • 9.進(jìn)行部署
        • 9.1導(dǎo)入模型
        • 9.2創(chuàng)建項(xiàng)目
        • 9.3部署
      • 10.在瀏覽器中查看項(xiàng)目輸出流
      • 11.制作U盤成為可引導(dǎo)設(shè)備
        • 11.1格式化U盤并對(duì)U盤分區(qū)
        • 11.2 將第一個(gè)盤制作成可引導(dǎo)盤
        • 11.3 剩余步驟
      • 12.排坑
          • deeplens連接到WiFi了,但是還控制臺(tái)還是長(zhǎng)時(shí)間顯示offline

Sagemaker學(xué)習(xí)

1. 使用boto3對(duì)S3操作

學(xué)sagemaker前先學(xué)習(xí)一下boto3庫(kù)。因?yàn)槭褂肧agemaker要配合S3服務(wù),使用這里 先學(xué)習(xí)boto3對(duì)S3服務(wù)的控制。

導(dǎo)入

import boto3

指定使用AWS上哪種服務(wù)

#獲取s3服務(wù)資源對(duì)象(相比client對(duì)象擁有更高級(jí)的抽象調(diào)用) s3 = boto3.resource('s3',region_name=region) #獲取S3客戶端對(duì)象(原生) s3_client = boto3.client('s3',region_name=region)

存儲(chǔ)桶的三個(gè)操作對(duì)象

#通過(guò)資源對(duì)象 s3 = boto3.resource('s3',region_name=region) #通過(guò)桶對(duì)象 s3.Bucket('mybucket') #S3客戶端對(duì)象 s3_client = boto3.client('s3',region_name=region)

創(chuàng)造一個(gè)S3存儲(chǔ)桶

#定義區(qū)域,因?yàn)镾3是全球服務(wù),所以要聲明要使用哪個(gè)區(qū)域的S3服務(wù) region = 'us-west-2' bucket_name = 'my-bucket' #獲取一個(gè)S3客戶端對(duì)象 s3_client = boto3.client('s3',region_name=region) s3_client.create_bucket(Bucket=bucket_name)

打印桶名

#s3 s3對(duì)象 #s3.buckets.all() 獲得s3中的所有桶對(duì)象 #bucket.name 桶名 s3 = boto3.resource('s3') for bucket in s3.buckets.all():print(bucket.name)

刪除存儲(chǔ)桶

s3_client = boto3.client('s3',region_name=region) s3_client.delete_bucket(Bucket='mybucket')

上傳文件

#文件方式 s3 = boto3.resource('s3') s3.Bucket('mybucket').upload_file('/tmp/hello.txt', 'hello.txt')#對(duì)象方式 s3 = boto3.resource('s3') with open('filename', 'rb') as data:s3.Bucket('mybucket').upload_fileobj(data, 'mykey')#s3.Bucket()方法返回指定的桶對(duì)象 #put_object() key:保存的文件名, Body:對(duì)象數(shù)據(jù) s3 = boto3.resource('s3') with open('filename', 'rb') as data:s3.Bucket('my-bucket').put_object(Key='test.jpg', Body=data)#使用客戶端對(duì)象上傳文件 s3_client = boto3.client('s3',region_name=region) s3_client.upload_file('myfile', Bucket='my-bucket', Key='mys3file')#使用客戶端對(duì)象上傳對(duì)象 s3_client = boto3.client('s3',region_name=region) with open('filename', 'rb') as data:s3_client.upload_fileobj(data, 'mybucket', 'mykey')

分段上傳

關(guān)于分段上傳這里解析一下:分段上傳是將一個(gè)大型對(duì)象,切分為若干個(gè)中小片段,并對(duì)這若干個(gè)片段進(jìn)行并行上傳,從上傳速度來(lái)將,分段上傳可以明顯比普通上傳要快。

分段上傳是一個(gè)三步過(guò)程:啟動(dòng)上傳,上傳對(duì)象部分,然后在上傳所有部分之后,完成分段上傳。

分段上傳都有一個(gè)對(duì)應(yīng)的ID號(hào)來(lái)識(shí)別唯一的上傳操作。

s3_client = boto3.client('s3',region_name=region) #創(chuàng)建分段上傳 response = s3_client.create_multipart_upload(Bucket='my-bucket',Key='myfile') #拿到上傳ID ID = response['UploadId'] #讀取一個(gè)大型文件 data = open('file', 'rb') #進(jìn)行多段上傳 s3_client.upload_part(Body=data,Bucket='my-bucket',Key='myfile',PartNumber=5,UploadId=ID) #對(duì)上傳到服務(wù)端多段數(shù)據(jù)發(fā)起合并請(qǐng)求 response2 = client.complete_multipart_upload(Bucket='examplebucket',Key='myfile',UploadId=ID)

從s3中下載文件

  • bucket S3存儲(chǔ)桶名字
  • path 桶文件路徑
  • localhost_path 本地路徑名
s3 = boto3.resource('s3') #下載文件 s3.download_file(bucket, path, localhost_path)#通過(guò)桶對(duì)象下載文件 s3.Bucket('mybucket').download_file('hello.txt', '/tmp/hello.txt')#通過(guò)客戶端下載文件對(duì)象 s3_client = boto3.client('s3') with open('filename', 'wb') as data:s3_client.download_fileobj('mybucket', 'mykey', data)#通過(guò)客戶端下載文件 s3_client.download_file('mybucket', 'hello.txt', '/tmp/hello.txt')#通過(guò)get_object獲取一個(gè)對(duì)象 #返回response,response包含對(duì)象的描述信息和數(shù)據(jù)體 response = s3_client.get_object_acl(Bucket='examplebucket',Key='HappyFace.jpg', ) data = response['Body']

刪除一個(gè)S3中的對(duì)象

#通過(guò)客戶端刪除 s3_client = boto3.client('s3',region_name=region) s3_client.delete_object(Bucket='mybucket',Key='cat.jpg')#通過(guò)桶對(duì)象刪除 s3 = boto3.resource('s3') s3.Bucket('mybucket').download_file('hello.txt', '/tmp/hello.txt')

獲取區(qū)域名

boto3.Session.region_name

2.boto3調(diào)用sagemaker

2.1使用sagemakerRuntime

SageMakerRuntime.Client是一個(gè)運(yùn)行時(shí)低級(jí)的客戶端類,提供一些簡(jiǎn)易的方法供程序員調(diào)用sagemaker上的資源。

client = boto3.client('sagemaker-runtime')

SageMakerRuntime.Client提供了以下方法:

  • can_paginate()
  • generate_presigned_url()
  • get_paginator()
  • get_waiter()
  • invoke_endpoint()

can_paginate()和get_paginator()

can_paginate(operation_name)用于判斷一個(gè)方法是否允許分頁(yè)。

get_paginator()用于個(gè)一個(gè)操作創(chuàng)建分頁(yè)。

關(guān)于分頁(yè)請(qǐng)求這個(gè)概念,這里簡(jiǎn)單描述一下:有些AWS操作返回的結(jié)果不完整,需要后續(xù)請(qǐng)求才能獲得整個(gè)結(jié)果集。在前一個(gè)請(qǐng)求未處理的情況下發(fā)送后續(xù)請(qǐng)求以繼續(xù)的過(guò)程稱為分頁(yè)。例如,amazon s3的list objects操作一次最多返回1000個(gè)對(duì)象,您必須使用適當(dāng)?shù)臉?biāo)記發(fā)送后續(xù)請(qǐng)求,以便檢索下一頁(yè)的結(jié)果。

這里引用官方的案例:

import botocore.session# Create a session and a client session = botocore.session.get_session() client = session.create_client('s3', region_name='us-west-2')# Create a reusable Paginator paginator = client.get_paginator('list_objects')# Create a PageIterator from the Paginator page_iterator = paginator.paginate(Bucket='my-bucket')for page in page_iterator:print(page['Contents'])

invoke_endpoint()

這個(gè)方法比較常用,該方法用于調(diào)用一個(gè)sagemaker終端節(jié)點(diǎn)去做模型的結(jié)果推斷。

  • sagemaker終端節(jié)點(diǎn)是sagemaker的一項(xiàng)服務(wù),用于將訓(xùn)練好的模型進(jìn)行快速的部署并用于對(duì)數(shù)據(jù)集進(jìn)行結(jié)果推斷。(一個(gè)容器化部署的模型)

invoke_endpoint()所有參數(shù)如下:

response = client.invoke_endpoint(EndpointName='string', #終端節(jié)點(diǎn)名字Body=b'bytes'|file, #推斷的數(shù)據(jù)ContentType='string', #數(shù)據(jù)的格式Accept='string', #推斷結(jié)果的格式CustomAttributes='string',TargetModel='string',TargetVariant='string',InferenceId='string' )

一個(gè)小示例:

假設(shè)你有一個(gè)終端節(jié)點(diǎn)叫myEndPoint,用來(lái)做貓狗分類的推斷。

ENDPOINT_NAME = 'myEndPoint' with open('cat.jpg', 'wb') as data:response = runtime.invoke_endpoint(EndpointName=ENDPOINT_NAME,ContentType='image/jpeg',Body=data)#輸出結(jié)果print(response) #response的結(jié)構(gòu) #{ # 'Body': StreamingBody(), 結(jié)果 # 'ContentType': 'string', 結(jié)果格式 # 'InvokedProductionVariant': 'string', # 'CustomAttributes': 'string' #}

3.sagemaker庫(kù)

3.1EstimatorBase類

sagemaker有一個(gè)Estimator Base類,用于執(zhí)行端對(duì)端的sagemaker的訓(xùn)練和部署任務(wù)

class sagemaker.estimator.Estimator

其構(gòu)造參數(shù):

sagemaker.estimator.EstimatorBase(role, instance_count=None, instance_type=None, volume_size=30, volume_kms_key=None, max_run=86400, input_mode='File', output_path=None, output_kms_key=None, base_job_name=None, sagemaker_session=None, tags=None, subnets=None, security_group_ids=None, model_uri=None, model_channel_name='model', metric_definitions=None, encrypt_inter_container_traffic=False, use_spot_instances=False, max_wait=None, checkpoint_s3_uri=None, checkpoint_local_path=None, rules=None, debugger_hook_config=None, tensorboard_output_config=None, enable_sagemaker_metrics=None, enable_network_isolation=False, profiler_config=None, disable_profiler=False, **kwargs)
3.1.1 具有以下方法:

獲取訓(xùn)練鏡像

#返回為訓(xùn)練用的一個(gè)docker鏡像路徑 training_image_uri() #如: training_image_uri(sess.boto_region_name, 'object-detection', repo_version="latest")

設(shè)置超參

#設(shè)置算法的參數(shù)(這根據(jù)你用的是哪個(gè)算法) hyperparameters()

判斷Estimator是否需要網(wǎng)絡(luò)隔離

#判斷Estimator是否需要網(wǎng)絡(luò)隔離,返回bool類型 enable_network_isolation()

指定訓(xùn)練名

#指定訓(xùn)練名 prepare_workflow_for_training(job_name=None)

執(zhí)行訓(xùn)練

#執(zhí)行訓(xùn)練任務(wù), #inputs:訓(xùn)練通道 logs:日志 job_name:訓(xùn)練任務(wù)名 fit(inputs=None, wait=True, logs='All', job_name=None, experiment_config=None)

Neo編譯

#使用Neo編譯一個(gè)模型 #target_instance_family:標(biāo)識(shí)編譯后要運(yùn)行模型的設(shè)備 #input_shape:通過(guò)dict的形象指定輸入通道, #如:{‘data’:[1,3,1024,1024]}, or {‘var1’: [1,1,28,28], ‘var2’:[1,1,28,28]} #output_path:編譯后的模型存儲(chǔ)路徑 #framework:框架 #framework_version:版本 #compile_max_run:設(shè)置編譯超時(shí)秒數(shù) #target_platform_os:捆綁的操作系統(tǒng),如:linux #target_platform_arch:系統(tǒng)位數(shù),如:X86_64 #target_platform_accelerator:硬件加速器平臺(tái),如NVIDIA compile_model(target_instance_family, input_shape, output_path, framework=None, framework_version=None, compile_max_run=900, tags=None, target_platform_os=None, target_platform_arch=None, target_platform_accelerator=None, compiler_options=None, **kwargs)

附加訓(xùn)練任務(wù)

#附加一個(gè)訓(xùn)練任務(wù) #作用:綁定某個(gè)訓(xùn)練任務(wù),可以獲取對(duì)應(yīng)的任務(wù)的配置,如果綁定的訓(xùn)練任務(wù)還在訓(xùn)練,那么綁定操作將被阻塞。 # 返回結(jié)果是:Estimator實(shí)例,通過(guò)該實(shí)例可以實(shí)現(xiàn)deploy()等操作 #training_job_name:綁定的訓(xùn)練任務(wù)名 #sagemaker_session: sagemaker的session #model_channel_name:模型路徑 classmethod attach(training_job_name, sagemaker_session=None, model_channel_name='model')

打印log

#打印log logs()

部署終端節(jié)點(diǎn)

#部署終端節(jié)點(diǎn) #只展示部分參數(shù),具體看官方文檔 #initial_instance_count:部署實(shí)例個(gè)數(shù) #instance_type:實(shí)例類型 #返回:sagemaker.predictor.Predictor對(duì)象 #在sagemaker2.0中 RealTimePredictor已經(jīng)被更名為Predictor deploy(initial_instance_count, instance_type) deploy(initial_instance_count, instance_type,endpoint_name=None)

注冊(cè)模型包

#創(chuàng)建用于創(chuàng)建SageMaker模型或在市場(chǎng)上上市的模型包 #content_types:模型輸入MIME類型(模型輸入類型) #response_types:模型輸出MIME類型(模型輸出類型) #inference_instances:推斷實(shí)例允許的實(shí)例類型列表 #transform_instances:批轉(zhuǎn)換實(shí)例允許的實(shí)例類型 register(content_types, response_types, inference_instances, transform_instances)

創(chuàng)建模型對(duì)象

#創(chuàng)建一個(gè)模型 #返回的是:sagemaker.model.Model對(duì)象 create_model(**kwargs) #接受以下參數(shù): #image_uri:一個(gè)docker容器鏡像 #model_data:模型,一般是存放在s3中的模型(.tar.gz包) #role:角色(與IAM服務(wù)有關(guān)) #env:環(huán)境變量,dict類型,與image_uri指定的容器中有關(guān)變量 #name:模型名稱 #vpc_config:vpc配置,部署時(shí)會(huì)用到 #enable_network_isolation:網(wǎng)絡(luò)隔離,一般為false #model_kms_key:kms的密鑰(與kms服務(wù)有關(guān))
3.1.2 使用小示例

本示例使用的是官方的示例,由于這個(gè)示例 有點(diǎn)久遠(yuǎn),有些方法調(diào)用的還是sagemaker sdk v1版本的API,所有使用的時(shí)候可能會(huì)有提示警告。本人做了些許修改,完整代碼請(qǐng)查閱:https://github.com/aws/amazon-sagemaker-examples/blob/master/introduction_to_amazon_algorithms/object_detection_pascalvoc_coco/object_detection_incremental_training.ipynb

第一步:獲取執(zhí)行role

#本示例在jupyter notebook下運(yùn)行 import sagemaker from sagemaker import get_execution_role#第一步獲取執(zhí)行權(quán)限 role = get_execution_role()

第二部:獲取數(shù)據(jù)并進(jìn)行處理

#從官方指定的地址下載2007年和2012年P(guān)ascal VOC 數(shù)據(jù)集 # Download the dataset !wget -P /tmp http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar !wget -P /tmp http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar !wget -P /tmp http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar # # Extract the data. !tar -xf /tmp/VOCtrainval_11-May-2012.tar && rm /tmp/VOCtrainval_11-May-2012.tar !tar -xf /tmp/VOCtrainval_06-Nov-2007.tar && rm /tmp/VOCtrainval_06-Nov-2007.tar !tar -xf /tmp/VOCtest_06-Nov-2007.tar && rm /tmp/VOCtest_06-Nov-2007.tar#如果你打算使用自己放在s3中的數(shù)據(jù)可以運(yùn)行以下代碼 #!aws s3 cp s3://my-bucket/data-path ./localhost-path#運(yùn)行官方提供的腳本文件 #這幾行腳本代碼是用于生成rec序列文件 #該文件在上面提供的網(wǎng)址的github目錄下 !python tools/prepare_dataset.py --dataset pascal --year 2007,2012 --set trainval --target VOCdevkit/train.lst !python tools/prepare_dataset.py --dataset pascal --year 2007 --set test --target VOCdevkit/val.lst --no-shuffle#關(guān)于使用自己只定義的數(shù)據(jù) #在使用官方提供的腳本時(shí)應(yīng)該注意:如果你的數(shù)據(jù)集是按照Pascal VOC2007和Pascal VOC2012數(shù)據(jù)集 #構(gòu)建的目錄結(jié)構(gòu),請(qǐng)到腳本目錄下的pascal_voc.names,更改你數(shù)據(jù)集中對(duì)應(yīng)的便簽名,官方提供的腳 #本將會(huì)讀取該文件的label,用作生成.rec .lst等文件。更多的Pascal VOC目錄結(jié)構(gòu)請(qǐng)根據(jù)需要自行 #查找。

第三步:上傳處理的數(shù)據(jù)到S3存儲(chǔ)桶中

#上傳到S3有很多方式,請(qǐng)參考上面boto3對(duì)s3的控制 import boto3 s3 = boto3.resource('s3')#訓(xùn)練集的上傳 train_localhost_path = '' train_S3_path = '' s3.Bucket('mybucket').upload_file(train_localhost_path, train_S3_path)#驗(yàn)證集的上傳 val_localhost_path = '' val_S3_path = '' s3.Bucket('mybucket').upload_file(val_localhost_path, val_S3_path)

第四步:獲取內(nèi)置算法鏡像

#舊的API #from sagemaker.amazon.amazon_estimator import get_image_uri #training_image = get_image_uri(sess.boto_region_name, 'object-detection', repo_version="latest")#新的API sess = sagemaker.Session() training_image = sagemaker.image_uris.retrieve("object-detection", sess.boto_region_name)

第五步:創(chuàng)建Estimator實(shí)例

s3_output_location = 's3的輸出路徑' model = sagemaker.estimator.Estimator(training_image,role, instance_count=1, instance_type='ml.p3.2xlarge',volume_size = 50,max_run = 360000,input_mode= 'File',output_path=s3_output_location,sagemaker_session=sess)

第六步:設(shè)置超參數(shù)

關(guān)于sagemaker內(nèi)置算法:目標(biāo)檢測(cè)算法,其是用那種方式實(shí)現(xiàn)的。sagemaker中的目標(biāo)檢測(cè)算法是使用SSD (Single Shot multibox Detector)框架實(shí)現(xiàn)的。并支持兩個(gè)基本網(wǎng)絡(luò): VGG 和 ResNet。 可以從頭開始訓(xùn)練網(wǎng)絡(luò),也可以使用已在 ImageNet 數(shù)據(jù)集上預(yù)先訓(xùn)練的模型進(jìn)行訓(xùn)練。

#不同的內(nèi)置算法會(huì)有不同的超參數(shù) #目標(biāo)檢測(cè)的超參數(shù)可以在以下網(wǎng)址中找到: #https://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/object-detection.html model.set_hyperparameters(base_network='resnet-50',use_pretrained_model=1,num_classes=20,mini_batch_size=32,epochs=1,learning_rate=0.001,lr_scheduler_step='3,6',lr_scheduler_factor=0.1,optimizer='sgd',momentum=0.9,weight_decay=0.0005,overlap_threshold=0.5,nms_threshold=0.45,image_shape=300,label_width=350,num_training_samples=16551)

第七步:訓(xùn)練

#舊的API #train_data = sagemaker.session.s3_input(s3_train_data, distribution='FullyReplicated', # content_type='application/x-recordio', s3_data_type='S3Prefix') #validation_data = sagemaker.session.s3_input(s3_validation_data, distribution='FullyReplicated', # content_type='application/x-recordio', s3_data_type='S3Prefix') #data_channels = {'train': train_data, 'validation': validation_data}#新的API如下: from sagemaker.inputs import TrainingInput train_data = '訓(xùn)練集S3路徑' validation_data = '驗(yàn)證集的S3路徑' train_channel = TrainingInput(train_data, content_type='application/x-recordio') valid_channel = TrainingInput(validation_data, content_type='application/x-recordio') data_channels = {'train': train_channel, 'validation': valid_channel} #開啟訓(xùn)練 model.fit(inputs=data_channels, logs=True)

第八步:部署

object_detector = model.deploy(initial_instance_count = 1,instance_type = 'ml.m4.xlarge')

第九步:驗(yàn)證模型

驗(yàn)證模型之前,請(qǐng)下載一張用于驗(yàn)證的圖片。

file_name = 'test.jpg' with open(file_name, 'rb') as image:f = image.read()b = bytearray(f)ne = open('n.txt','wb')ne.write(b)import json #預(yù)測(cè) object_detector.content_type = 'image/jpeg' results = object_detector.predict(b) detections = json.loads(results) print (detections) #結(jié)果格式 #https://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/object-detection-in-formats.html#可視化函數(shù) def visualize_detection(img_file, dets, classes=[], thresh=0.6):"""visualize detections in one imageParameters:----------img : numpy.arrayimage, in bgr formatdets : numpy.arrayssd detections, numpy.array([[id, score, x1, y1, x2, y2]...])each row is one objectclasses : tuple or list of strclass namesthresh : floatscore threshold"""import randomimport matplotlib.pyplot as pltimport matplotlib.image as mpimgimg=mpimg.imread(img_file)plt.imshow(img)height = img.shape[0]width = img.shape[1]colors = dict()for det in dets:(klass, score, x0, y0, x1, y1) = detif score < thresh:continuecls_id = int(klass)if cls_id not in colors:colors[cls_id] = (random.random(), random.random(), random.random())xmin = int(x0 * width)ymin = int(y0 * height)xmax = int(x1 * width)ymax = int(y1 * height)rect = plt.Rectangle((xmin, ymin), xmax - xmin,ymax - ymin, fill=False,edgecolor=colors[cls_id],linewidth=3.5)plt.gca().add_patch(rect)class_name = str(cls_id)if classes and len(classes) > cls_id:class_name = classes[cls_id]plt.gca().text(xmin, ymin - 2,'{:s} {:.3f}'.format(class_name, score),bbox=dict(facecolor=colors[cls_id], alpha=0.5),fontsize=12, color='white')plt.show()object_categories = ['aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor']# Setting a threshold 0.20 will only plot detection results that have a confidence score greater than 0.20. threshold = 0.20# Visualize the detections. visualize_detection(file_name, detections['prediction'], object_categories, threshold)

最后一步:關(guān)閉終端節(jié)點(diǎn)

sagemaker.Session().delete_endpoint(object_detector.endpoint)

部署基于SSD的目標(biāo)檢測(cè)模型上AWS deeplens

1.AWS deeplens的兩版本

AWS deeplens有兩個(gè)版本,分別是:V1.1,和V1.0

關(guān)于這兩個(gè)版本的硬件區(qū)別:https://docs.aws.amazon.com/zh_cn/deeplens/latest/dg/deeplens-hardware.html

關(guān)于硬件和軟件的版本區(qū)別這里就不多說(shuō),這里主要介紹如何將自己的深度學(xué)習(xí)模型部署到deeplens上面。

2.關(guān)于注冊(cè)

關(guān)于注冊(cè)我就不多說(shuō)了,官方文檔有具體說(shuō)明https://docs.aws.amazon.com/zh_cn/deeplens/latest/dg/deeplens-getting-started-register.html

2.1關(guān)于攝像頭恢復(fù)出廠設(shè)置后注冊(cè)的坑

如果你重置攝像頭恢復(fù)了出廠設(shè)置,(假設(shè)你當(dāng)前的設(shè)備為V1.1版本)使用V1.1版本的注冊(cè)方法,但是控制臺(tái)中怎么都無(wú)法檢測(cè)到攝像頭的USB注冊(cè)口,那可能是重置后的版本沒(méi)有裝好USB注冊(cè)口的驅(qū)動(dòng),那么你應(yīng)該使用一下V1.0的方式注冊(cè),V1.0注冊(cè)中有一個(gè)步驟是更新設(shè)備軟件,更新完軟件后可以改為V1.1的方式進(jìn)行設(shè)備的注冊(cè)。

3.支持的框架

當(dāng)前AWS deeplens支持一下深度學(xué)習(xí)框架:MXNet,TensorFlow,Caffe

如果你使用的是其他的算法框架,并要部署到AWS deeplens上面部署,你可能需要一些使用工具將你當(dāng)前使用的框架訓(xùn)練出來(lái)的模型轉(zhuǎn)換為MXNet,TensorFlow,Caffe這三個(gè)框架模型。

之所以使用這三個(gè)框架,很大一部分原因是:他那個(gè)AWS deeplens攝像頭里面用的是Intel? Atom 處理器因?yàn)閿z像頭會(huì)使用英特爾的一些模型優(yōu)化工具將這三個(gè)框架訓(xùn)練處理的模型轉(zhuǎn)換為攝像頭可以處理的優(yōu)化中間件,關(guān)于這個(gè)中間件,我后面會(huì)詳細(xì)說(shuō)明。

現(xiàn)在你需要知道的是AWS deeplens只支持三種框架,而sagemaker內(nèi)置算法訓(xùn)練處理的模型用的是MXNet,所以如果你使用的是sagemaker訓(xùn)練的深度學(xué)習(xí)模型,基本可以無(wú)縫地放到AWS deeplens上面跑。(但是如果是基于SSD的目標(biāo)檢測(cè)模型,可以還需要一些格外的處理。)

4.選擇算法

改步驟主要針對(duì)sagemaker和AWS deeplens集成服務(wù),因?yàn)檫@里選擇的是SSD的目標(biāo)檢測(cè)模型(一種目標(biāo)檢測(cè)算法),所以在選擇算法的時(shí)候請(qǐng)選擇:Object Detection

關(guān)于更多的算法需要去官方文檔看。

AWS DeepLens 是一款支持深度學(xué)習(xí)的視頻攝像機(jī)。它與多個(gè) AWS 機(jī)器學(xué)習(xí)服務(wù)集成,并可根據(jù)從 AWS 云預(yù)配置的部署模型執(zhí)行本地推理。所以DeepLens主要是搭載那些機(jī)器視覺(jué)模型的,主要還是:Object Detection,image classification,圖像風(fēng)格轉(zhuǎn)換

5.將MXNet框架下的SSD模型轉(zhuǎn)發(fā)為可部署模式

這個(gè)只針對(duì)MXNet框架下的訓(xùn)練的SSD模型。

關(guān)于將SSD模型轉(zhuǎn)發(fā)為可部署模式,這里需要說(shuō)明一下為什么要轉(zhuǎn)換為部署模式,在sagemaker訓(xùn)練的過(guò)程中,sagemaker的內(nèi)置算法會(huì)在模型的網(wǎng)絡(luò)結(jié)構(gòu)中添加一些只在訓(xùn)練中才有用的網(wǎng)絡(luò)結(jié)構(gòu):如dropout,smooth等,但我們部署模型時(shí)是不需要這些層的,這時(shí)我們需要將模型轉(zhuǎn)化為部署模式。

官網(wǎng)文檔中提供的地址不對(duì)了(不知道現(xiàn)在改了沒(méi)),現(xiàn)在打開這個(gè)地址:https://github.com/apache/incubator-mxnet/tree/master/,然后使用GitHub將MXnet整個(gè)庫(kù)下載下來(lái),然后在git中運(yùn)行如下命令:

git reset --hard 73d88974f8bca1e68441606fb0787a2cd17eb364

該命令是將GitHub的本地倉(cāng)庫(kù)回滾到指定的版本,因?yàn)楣俜绞且笥眠@個(gè)版本的MXnet的進(jìn)行部署模式的轉(zhuǎn)換。

然后進(jìn)入到這個(gè)庫(kù)目錄中,部署腳本就在MXnet項(xiàng)目目錄下的:

cd incubator-mxnet/example/ssd/

然后將模型放到model文件夾下面然后對(duì)模型壓縮包進(jìn)行解壓,解壓后會(huì)發(fā)現(xiàn)兩個(gè)文件,一個(gè)叫:

  • model_algo_1-0000.params
  • model_algo_1-symbol.json

后綴為.params的文件是模型,.json的文件是模型網(wǎng)絡(luò)的拓?fù)浣Y(jié)構(gòu)。

轉(zhuǎn)化為部署模式

然后運(yùn)行以下命令:

python deploy.py --network resnet50 --prefix F:\Mxnet\incubator-mxnet\example\ssd\model\model_algo_1 --data-shape 300 --num-class 2

這里只解析我使用的參數(shù),更多的參數(shù)自己看那個(gè)腳本或者使用 –help

  • –network 網(wǎng)絡(luò)結(jié)構(gòu)
  • –prefix 模型的工程前綴(去掉文件后綴后的路徑就是你的工程前綴)
  • –data-shape 模型輸入成的大小(這里300,是指圖片是300*300的格式,圖片通道數(shù)默認(rèn)是3)
  • –num-class 檢測(cè)分類的個(gè)數(shù)
保存到S3存儲(chǔ)桶

將轉(zhuǎn)化為部署模式的SSD模型,重新打包成tar.gz壓縮包,并放到存儲(chǔ)桶進(jìn)行存儲(chǔ)。如果你用的是window系統(tǒng)的話,去下載個(gè)7Z壓縮,7Z壓縮能制作tar.gz壓縮包。如果你是使用Linux系統(tǒng),在命令行輸入:

tar czvf my.tar.gz file1 file2 ....fileN
  • file1 file2 …fileN是要壓縮的文件
  • my.tar.gz是壓縮后壓縮包的名字

6.創(chuàng)建樣例模板的lambda函數(shù)

官方文檔的lambda樣例比較舊,所以使用控制臺(tái)中官方樣例中的lambda樣例,進(jìn)入AWS deeplens控制臺(tái)選擇Projects,創(chuàng)建項(xiàng)目

然后到lambda函數(shù)服務(wù)的控制臺(tái),會(huì)發(fā)現(xiàn)多出一個(gè)lambda函數(shù),如下:

進(jìn)入這個(gè)lambda函數(shù)的編輯頁(yè)

編輯好自定義的lambda函數(shù),記得發(fā)布版本,只有發(fā)布了的版本才能部署到deeplens上

7.關(guān)于lambda函數(shù)

AWS deeplens需要lambda函數(shù)協(xié)助,利用lambda函數(shù)AWS deeplens可以調(diào)用模型進(jìn)行推斷,AWS deeplens里面保存了模型和lambda函數(shù),在AWS deeplens中創(chuàng)建項(xiàng)目需要綁定一個(gè)模型和一個(gè)lambda函數(shù),當(dāng)攝像頭進(jìn)行模型部署的時(shí)候,AWS deeplens將會(huì)上傳模型和lambda函數(shù)到攝像頭設(shè)備上。當(dāng)攝像頭運(yùn)行時(shí),將調(diào)用lambda的函數(shù)將視頻幀傳遞給模型進(jìn)行處理,并將處理后的視頻幀傳到項(xiàng)目流那里。

在AWS deeplens攝像頭注冊(cè)成功時(shí),會(huì)創(chuàng)建如下兩個(gè)lambda函數(shù),請(qǐng)勿刪除:

  • deeplens_admin_version_poller
  • deeplens_admin_model_downloader
關(guān)于編寫lambda函數(shù)

lambda函數(shù)可以使用官方的簡(jiǎn)單案例的模板,然后看他那個(gè)核心代碼。因?yàn)橐{(diào)用模型對(duì)視頻幀進(jìn)行處理,所以要調(diào)用一些核心接口:

關(guān)于設(shè)備庫(kù)看官方文檔:https://docs.aws.amazon.com/zh_cn/deeplens/latest/dg/deeplens-device-library.html

mo模塊

mo模塊是用來(lái)優(yōu)化模型并生成AWS DeepLens 表示形式(也就是中間件)

import mo error, model_path = mo.optimize(model_name, input_width, input_height, platform, aux_inputs)
  • model_path 中間件路徑

awscam模塊

awscam模塊用來(lái)獲取視頻幀

import awscam #獲取視頻幀,video_frame是視頻幀 ret, video_frame = awscam.getLastFrame()

awscam模塊有個(gè)Model類,用來(lái)加載機(jī)器學(xué)習(xí)模型

import awscam #加載的是經(jīng)過(guò)mo模塊優(yōu)化后的模型 #model = awscam.Model(model_topology_file, loading_config),如: model = awscam.Model(model_path, {'GPU': 1})#調(diào)用模型的接口進(jìn)行視頻幀推斷 #raw_inference_results = model.doInference(video_frame) #解析結(jié)果 #result = model.parseResult(model_type, raw_infer_result) #如:parsed_inference_results = model.parseResult(model_type,model.doInference(frame_resize))

8.deeplens的模型中間件

將 AWS DeepLens 模型構(gòu)件從 Caffe(.prototxt 或 .caffemodel)、MXNet(.json 和 .params)或 TensorFlow (.pb) 表示形式轉(zhuǎn)換為 AWS DeepLens 表示形式并執(zhí)行必要的優(yōu)化。

關(guān)于這個(gè)優(yōu)化模塊去Intel優(yōu)化工具OpenVINO的官網(wǎng)看:https://docs.openvinotoolkit.org/latest/index.html

關(guān)于這個(gè)中間件去這里看:https://docs.openvinotoolkit.org/latest/openvino_docs_MO_DG_Deep_Learning_Model_Optimizer_DevGuide.html

  • .xml -描述網(wǎng)絡(luò)拓?fù)?/li>
  • .bin -包含權(quán)重并偏置二進(jìn)制數(shù)據(jù)。

deeplens中的優(yōu)化腳本在目錄

cd /opt/awscam/intel/deeplearning_deploymenttoolkit/deployment_tools/model_optimizer

有幾個(gè)優(yōu)化腳本:

  • mo_caffe.py
  • mo_kaldi.py
  • mo_mxnet.py
  • mo_onnx.py
  • mo_tf.py
  • mo.py

我用的mxnet框架,所以使用的是mo_mxnet.py

#查看有哪些參數(shù) python3 mo_mxnet.py -h#一些使用案例 python3 mo_mxnet.py --input_model /home/aws_cam/model/model_algo_1-0000.params --data_type FP16 --scale 1 --model_name model_algo_1 --reverse_input_channels --input_shape [1,3,300,300] --legacy_mxnet_model

當(dāng)然我們一般不用這些腳本,我們一般在lambda函數(shù)中通過(guò)mo.optimize來(lái)進(jìn)行模型的轉(zhuǎn)化和優(yōu)化。

本地上傳模型到deeplens攝像頭并生成中間件,避免模型下載慢問(wèn)題

不過(guò)這里也引出了一些小技巧,因?yàn)锳WS deeplens只在部分區(qū)開放了服務(wù),當(dāng)涉及到跨區(qū)域時(shí),就可能會(huì)面臨網(wǎng)絡(luò)帶寬問(wèn)題。因?yàn)樯蟼髂P偷皆贫?#xff0c;然后通過(guò)攝像頭自動(dòng)化部署從云端的下載模型到攝像頭本地并部署,這個(gè)下載的過(guò)程可能十分緩慢。這是我們可以優(yōu)先在本地上傳模型到攝像頭內(nèi)部,然后通過(guò)腳本在deeplens內(nèi)部生成模型中間件,然后在lambda函數(shù)指明模型中間件位置即可。而云端可以捆綁的一個(gè)空殼的模型和一個(gè)改寫好路徑的lambda函數(shù),然后調(diào)用自動(dòng)部署功能。

9.進(jìn)行部署

部署步驟如下:

  • 導(dǎo)入模型
  • 創(chuàng)建項(xiàng)目
  • 部署
  • 9.1導(dǎo)入模型

    導(dǎo)入模型可以從一下地方導(dǎo)入:

  • S3
  • sagemaker
  • 9.2創(chuàng)建項(xiàng)目

    創(chuàng)建一個(gè)項(xiàng)目需要兩樣?xùn)|西:一個(gè)是模型,一個(gè)是lambda函數(shù)

    模型只能有一個(gè),而lambda函數(shù)至少有一個(gè)。

    9.3部署

    因?yàn)槭亲詣?dòng)化部署,選擇好部署的項(xiàng)目一鍵部署即可,這個(gè)部署過(guò)程并不難,好部署好項(xiàng)目核心內(nèi)容主要還是如何使用lambda函數(shù)進(jìn)行視頻幀的處理,和如何對(duì)深度學(xué)習(xí)的網(wǎng)絡(luò)的輸出進(jìn)行解析。

    10.在瀏覽器中查看項(xiàng)目輸出流

    deeplens本來(lái)就是一臺(tái)計(jì)算機(jī),設(shè)備開放4000端口,供給其他計(jì)算機(jī)用瀏覽器訪問(wèn),并查看項(xiàng)目視頻流的輸出,

    地址:https://your-device-ip-address:4000,your-device-ip-address是你設(shè)備的私網(wǎng)IP地址。

    用瀏覽器對(duì)攝像頭的指定開放端口進(jìn)行訪問(wèn)前請(qǐng)確保你是有下載證書的,關(guān)于證書下載去官方文檔看,整個(gè)執(zhí)行的過(guò)程可以分一下基本分:

  • 下載證書到本地
  • 將證書導(dǎo)入到瀏覽器
  • 通過(guò)瀏覽器訪問(wèn)deeplens的指定端口
  • 查看項(xiàng)目流的輸出
  • 11.制作U盤成為可引導(dǎo)設(shè)備

    這里主要是制作USB 閃存驅(qū)動(dòng)器成為可引導(dǎo)設(shè)備,這是為了制作將AWS Deeplens恢復(fù)到出廠設(shè)置的引導(dǎo)U盤。官方文檔提供的在Ubuntu下制作為引導(dǎo)U盤,我這里在window系統(tǒng)下制作。

    11.1格式化U盤并對(duì)U盤分區(qū)

    U盤要分兩個(gè)區(qū)

    • 第一個(gè)分區(qū):2 GB 的 FAT32
    • 第二個(gè)分區(qū):至少 9 GB 的 NTFS

    第一分區(qū)是用來(lái)引導(dǎo)設(shè)備安裝,而第二分區(qū)就是你的攝像頭系統(tǒng)鏡像了。

    分區(qū)可以使用分區(qū)助手或其他分區(qū)軟件,window系統(tǒng)自帶的分區(qū)功能應(yīng)該也能分U盤, FAT32和NTFS是U盤的兩種系統(tǒng),式化時(shí)可以選擇的。

    11.2 將第一個(gè)盤制作成可引導(dǎo)盤

    去下載一個(gè)叫unetbootin的軟件,軟件長(zhǎng)這樣,然后安裝我給的截圖操作即可。

    11.3 剩余步驟

    剩余步驟按官方文檔操作即可,https://docs.aws.amazon.com/zh_cn/deeplens/latest/dg/deeplens-device-factory-reset-preparation.html

    12.排坑

    deeplens連接到WiFi了,但是還控制臺(tái)還是長(zhǎng)時(shí)間顯示offline

    可能是greengrassd服務(wù)卡住了,在deeplens終端運(yùn)行一下代碼:

    sudo systemctl restart greengrassd.service --no-block

    總結(jié)

    以上是生活随笔為你收集整理的sagemaker+deeplens学习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。