Oktatóanyag: Objektumészlelési modell betanítása (előzetes verzió) az AutoML és a Python használatával (v1)
A KÖVETKEZŐKRE VONATKOZIK:Python SDK azureml v1
Fontos
A cikkben bemutatott funkciók előzetes verzióban érhetők el. Ezeket kísérleti előzetes verziójú funkcióknak kell tekinteni, amelyek bármikor változhatnak.
Ebből az oktatóanyagból megtudhatja, hogyan taníthat be objektumészlelési modellt az Azure Machine Learning automatizált gépi tanulással az Azure Machine Learning Python SDK-val. Ez az objektumészlelési modell azonosítja, hogy a kép tartalmaz-e objektumokat, például dobozt, dobozt, tejes palackot vagy vízpalackot.
Az automatizált gépi tanulás elfogadja a betanítási adatokat és a konfigurációs beállításokat, és automatikusan iterálja a különböző funkció normalizálási/szabványosítási módszerek, modellek és hiperparaméter-beállítások kombinációit a legjobb modell eléréséhez.
Ebben az oktatóanyagban a Python SDK használatával fog kódot írni, és a következő feladatokat fogja megtanulni:
- Adatok letöltése és átalakítása
- Automatizált gépi tanulási objektumészlelési modell betanítása
- Hiperparaméter-értékek megadása a modellhez
- Hiperparaméter-takarítás végrehajtása
- A modell üzembe helyezése
- Észlelések vizualizációja
Előfeltételek
Ha nem rendelkezik Azure-előfizetéssel, mindössze néhány perc alatt létrehozhat egy ingyenes fiókot a virtuális gép létrehozásának megkezdése előtt. Próbálja ki ma az Azure Machine Learning ingyenes vagy fizetős verzióját .
A Python 3.7 vagy 3.8 támogatott ehhez a funkcióhoz
Ha még nem rendelkezik Azure Machine Learning-munkaterülettel, végezze el az Azure Machine Learning használatának első lépéseit ismertető rövid útmutatót .
Töltse le és csomagolja ki a *odFridgeObjects.zip adatfájlt. Az adatkészlet Pascal VOC formátumban van jegyzetelve, ahol minden kép egy XML-fájlnak felel meg. Minden xml-fájl információkat tartalmaz arról, hogy a megfelelő képfájl hol található, valamint információkat tartalmaz a határolókeretekről és az objektumcímkékről. Az adatok használatához először a szükséges JSONL-formátumra kell konvertálnia azokat a jegyzetfüzet Letöltött adatok konvertálása JSONL-be című szakaszában leírtak szerint.
Ez az oktatóanyag a GitHub azureml-examples adattárában is elérhető, ha saját helyi környezetben szeretné futtatni. A szükséges csomagok beszerzéséhez
- Az
pip install azureml
parancs futtatása - A teljes
automl
ügyfél telepítése
Számítási cél beállítása
Először be kell állítania egy számítási célt az automatizált gépi tanulási modell betanításához. A rendszerkép-feladatok automatizált gépi tanulási modelljei GPU-termékváltozatokat igényelnek.
Ez az oktatóanyag az NCsv3 sorozatot használja (V100 GPU-kkal), mivel az ilyen típusú számítási cél több GPU-t használ a betanítás felgyorsításához. Emellett több csomópontot is beállíthat, hogy kihasználhassa a párhuzamosságot a hiperparaméterek modellhez való hangolása során.
Az alábbi kód egy Standard _NC24s_v3 méretű GPU-számítást hoz létre, amely a munkaterülethez csatolt négy csomópontot tartalmazza( ws
).
Figyelmeztetés
Győződjön meg arról, hogy az előfizetés elegendő kvótával rendelkezik a használni kívánt számítási célhoz.
from azureml.core.compute import AmlCompute, ComputeTarget
cluster_name = "gpu-nc24sv3"
try:
compute_target = ComputeTarget(workspace=ws, name=cluster_name)
print('Found existing compute target.')
except KeyError:
print('Creating a new compute target...')
compute_config = AmlCompute.provisioning_configuration(vm_size='Standard_NC24s_v3',
idle_seconds_before_scaledown=1800,
min_nodes=0,
max_nodes=4)
compute_target = ComputeTarget.create(ws, cluster_name, compute_config)
#If no min_node_count is provided, the scale settings are used for the cluster.
compute_target.wait_for_completion(show_output=True, min_node_count=None, timeout_in_minutes=20)
Kísérlet beállítása
Ezután hozzon létre egy újat Experiment
a munkaterületen a modell betanítási futásának nyomon követéséhez.
from azureml.core import Experiment
experiment_name = 'automl-image-object-detection'
experiment = Experiment(ws, name=experiment_name)
Bemeneti adatok vizualizációja
Miután elkészítette a bemeneti képadatokat JSONL (JSON Lines) formátumban, megjelenítheti a kép alapigazság-határoló mezőinek megjelenítését. Ehhez győződjön meg arról, hogy telepítve van matplotlib
.
%pip install --upgrade matplotlib
%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import matplotlib.patches as patches
from PIL import Image as pil_image
import numpy as np
import json
import os
def plot_ground_truth_boxes(image_file, ground_truth_boxes):
# Display the image
plt.figure()
img_np = mpimg.imread(image_file)
img = pil_image.fromarray(img_np.astype("uint8"), "RGB")
img_w, img_h = img.size
fig,ax = plt.subplots(figsize=(12, 16))
ax.imshow(img_np)
ax.axis("off")
label_to_color_mapping = {}
for gt in ground_truth_boxes:
label = gt["label"]
xmin, ymin, xmax, ymax = gt["topX"], gt["topY"], gt["bottomX"], gt["bottomY"]
topleft_x, topleft_y = img_w * xmin, img_h * ymin
width, height = img_w * (xmax - xmin), img_h * (ymax - ymin)
if label in label_to_color_mapping:
color = label_to_color_mapping[label]
else:
# Generate a random color. If you want to use a specific color, you can use something like "red".
color = np.random.rand(3)
label_to_color_mapping[label] = color
# Display bounding box
rect = patches.Rectangle((topleft_x, topleft_y), width, height,
linewidth=2, edgecolor=color, facecolor="none")
ax.add_patch(rect)
# Display label
ax.text(topleft_x, topleft_y - 10, label, color=color, fontsize=20)
plt.show()
def plot_ground_truth_boxes_jsonl(image_file, jsonl_file):
image_base_name = os.path.basename(image_file)
ground_truth_data_found = False
with open(jsonl_file) as fp:
for line in fp.readlines():
line_json = json.loads(line)
filename = line_json["image_url"]
if image_base_name in filename:
ground_truth_data_found = True
plot_ground_truth_boxes(image_file, line_json["label"])
break
if not ground_truth_data_found:
print("Unable to find ground truth information for image: {}".format(image_file))
def plot_ground_truth_boxes_dataset(image_file, dataset_pd):
image_base_name = os.path.basename(image_file)
image_pd = dataset_pd[dataset_pd['portable_path'].str.contains(image_base_name)]
if not image_pd.empty:
ground_truth_boxes = image_pd.iloc[0]["label"]
plot_ground_truth_boxes(image_file, ground_truth_boxes)
else:
print("Unable to find ground truth information for image: {}".format(image_file))
A fenti segédfüggvények használatával bármely képhez futtathatja az alábbi kódot a határolókeretek megjelenítéséhez.
image_file = "./odFridgeObjects/images/31.jpg"
jsonl_file = "./odFridgeObjects/train_annotations.jsonl"
plot_ground_truth_boxes_jsonl(image_file, jsonl_file)
Adatok feltöltése és adathalmaz létrehozása
Az adatok betanításhoz való használatához töltse fel a munkaterületre egy adattáron keresztül. Az adattár olyan mechanizmust biztosít, amellyel adatokat tölthet fel vagy tölthet le, és kezelheti azokat a távoli számítási célokból.
ds = ws.get_default_datastore()
ds.upload(src_dir='./odFridgeObjects', target_path='odFridgeObjects')
Miután feltöltötte az adattárba, létrehozhat egy Azure Machine Learning-adatkészletet az adatokból. Az adathalmazok betanítás céljából egy hasznosítható objektumba csomagolják az adatokat.
Az alábbi kód létrehoz egy adatkészletet a betanításhoz. Mivel nincs megadva érvényesítési adatkészlet, alapértelmezés szerint a betanítási adatok 20%-a lesz érvényesítésre használva.
from azureml.core import Dataset
from azureml.data import DataType
training_dataset_name = 'odFridgeObjectsTrainingDataset'
if training_dataset_name in ws.datasets:
training_dataset = ws.datasets.get(training_dataset_name)
print('Found the training dataset', training_dataset_name)
else:
# create training dataset
# create training dataset
training_dataset = Dataset.Tabular.from_json_lines_files(
path=ds.path('odFridgeObjects/train_annotations.jsonl'),
set_column_types={"image_url": DataType.to_stream(ds.workspace)},
)
training_dataset = training_dataset.register(workspace=ws, name=training_dataset_name)
print("Training dataset name: " + training_dataset.name)
Adathalmaz vizualizációja
Az adathalmazból származó kép alapigazság-határoló mezőit is megjelenítheti.
Töltse be az adathalmazt egy pandas-adatkeretbe.
import azureml.dataprep as dprep
from azureml.dataprep.api.functions import get_portable_path
# Get pandas dataframe from the dataset
dflow = training_dataset._dataflow.add_column(get_portable_path(dprep.col("image_url")),
"portable_path", "image_url")
dataset_pd = dflow.to_pandas_dataframe(extended_types=True)
A határolókeretek megjelenítéséhez futtassa az alábbi kódot egy adott képhez.
image_file = "./odFridgeObjects/images/31.jpg"
plot_ground_truth_boxes_dataset(image_file, dataset_pd)
Az objektumészlelési kísérlet konfigurálása
Az automatikus gépi tanulási futtatások képpel kapcsolatos feladatokhoz való konfigurálásához használja az AutoMLImageConfig
objektumot. AutoMLImageConfig
A -ben megadhatja a paraméterrel rendelkező model_name
modellalgoritmusokat, és konfigurálhatja a beállításokat úgy, hogy egy hiperparaméter-söprést hajtanak végre egy meghatározott paraméterterületen az optimális modell megtalálásához.
Ebben a példában egy AutoMLImageConfig
objektumészlelési modell yolov5
betanítására használjuk a és fasterrcnn_resnet50_fpn
a , mindkettőt előre betanított COCO-val, egy nagyméretű objektumészlelési, szegmentálási és feliratozási adatkészlettel, amely több mint ezer címkézett képet tartalmaz több mint 80 címkekategóriával.
Hiperparaméter-takarítás képfeladatokhoz
Az optimális modell megkereséséhez hyperparaméter-átsöprést végezhet egy meghatározott paraméterterületen.
Az alábbi kód határozza meg az egyes definiált algoritmusok hiperparaméter-söpredékének előkészítéséhez szükséges paraméterterületet, yolov5
és fasterrcnn_resnet50_fpn
. A paramétertérben adja meg a , optimizer
, lr_scheduler
stb. értéktartományátlearning_rate
, hogy az AutoML válasszon az optimális elsődleges metrikával rendelkező modell létrehozásakor. Ha a hiperparaméter-értékek nincsenek megadva, akkor a rendszer minden algoritmushoz alapértelmezett értékeket használ.
A hangolási beállításokhoz véletlenszerű mintavételezéssel válasszon mintákat ebből a paraméterterületből a és BayesianParameterSampling
osztályok GridParameterSampling, RandomParameterSampling
importálásával. Ezzel arra utasítja az automatizált gépi tanulást, hogy próbáljon ki összesen 20 iterációt ezekkel a különböző mintákkal, és egyszerre négy iterációt futtasson a számítási célon, amelyet négy csomóponttal állítottunk be. Minél több paraméterrel rendelkezik a tér, annál több iterációra van szükség az optimális modellek megtalálásához.
A Bandit korai felmondási szabályzata is használatos. Ez a szabályzat leállítja a gyenge teljesítményű konfigurációkat; vagyis azok a konfigurációk, amelyek nem a legjobban teljesítő konfiguráció 20%-os tartalékidőn belül vannak, ami jelentősen megtakarítja a számítási erőforrásokat.
from azureml.train.hyperdrive import RandomParameterSampling
from azureml.train.hyperdrive import BanditPolicy, HyperDriveConfig
from azureml.train.hyperdrive import choice, uniform
parameter_space = {
'model': choice(
{
'model_name': choice('yolov5'),
'learning_rate': uniform(0.0001, 0.01),
#'model_size': choice('small', 'medium'), # model-specific
'img_size': choice(640, 704, 768), # model-specific
},
{
'model_name': choice('fasterrcnn_resnet50_fpn'),
'learning_rate': uniform(0.0001, 0.001),
#'warmup_cosine_lr_warmup_epochs': choice(0, 3),
'optimizer': choice('sgd', 'adam', 'adamw'),
'min_size': choice(600, 800), # model-specific
}
)
}
tuning_settings = {
'iterations': 20,
'max_concurrent_iterations': 4,
'hyperparameter_sampling': RandomParameterSampling(parameter_space),
'policy': BanditPolicy(evaluation_interval=2, slack_factor=0.2, delay_evaluation=6)
}
A paramétertér és a finomhangolási beállítások megadása után átadhatja őket az AutoMLImageConfig
objektumnak, majd elküldheti a kísérletet egy képmodell betanítására a betanítási adatkészlet használatával.
from azureml.train.automl import AutoMLImageConfig
automl_image_config = AutoMLImageConfig(task='image-object-detection',
compute_target=compute_target,
training_data=training_dataset,
validation_data=validation_dataset,
primary_metric='mean_average_precision',
**tuning_settings)
automl_image_run = experiment.submit(automl_image_config)
automl_image_run.wait_for_completion(wait_post_processing=True)
A hiperparaméterek átvizsgálásakor hasznos lehet megjeleníteni a HyperDrive felhasználói felületén kipróbált különböző konfigurációkat. Ehhez a felhasználói felülethez a fenti fő automl_image_run "Gyermekfuttatások" lapjára léphet, amely a HyperDrive szülőfuttatása. Ezután a "Gyermekfuttatások" fülre léphet. Másik lehetőségként itt közvetlenül láthatja a HyperDrive szülőfuttatását, és a Gyermekfuttatások lapra léphet:
from azureml.core import Run
hyperdrive_run = Run(experiment=experiment, run_id=automl_image_run.id + '_HD')
hyperdrive_run
A legjobb modell regisztrálása
A futtatás befejezése után regisztrálhatjuk a legjobb futtatásból létrehozott modellt.
best_child_run = automl_image_run.get_best_child()
model_name = best_child_run.properties['model_name']
model = best_child_run.register_model(model_name = model_name, model_path='outputs/model.pt')
Modell üzembe helyezése webszolgáltatásként
Miután elkészült a betanított modellel, üzembe helyezheti a modellt az Azure-ban. A betanított modellt webszolgáltatásként helyezheti üzembe Azure Container Instances (ACI) vagy Azure Kubernetes Service (AKS) rendszeren. Az ACI tökéletes választás az üzemelő példányok teszteléséhez, míg az AKS jobb választás a nagy léptékű, éles használathoz.
Ebben az oktatóanyagban a modellt webszolgáltatásként helyezzük üzembe az AKS-ben.
Hozzon létre egy AKS számítási fürtöt. Ebben a példában egy GPU virtuálisgép-termékváltozatot használunk az üzembehelyezési fürthöz
from azureml.core.compute import ComputeTarget, AksCompute from azureml.exceptions import ComputeTargetException # Choose a name for your cluster aks_name = "cluster-aks-gpu" # Check to see if the cluster already exists try: aks_target = ComputeTarget(workspace=ws, name=aks_name) print('Found existing compute target') except ComputeTargetException: print('Creating a new compute target...') # Provision AKS cluster with GPU machine prov_config = AksCompute.provisioning_configuration(vm_size="STANDARD_NC6", location="eastus2") # Create the cluster aks_target = ComputeTarget.create(workspace=ws, name=aks_name, provisioning_configuration=prov_config) aks_target.wait_for_completion(show_output=True)
Határozza meg a következtetési konfigurációt, amely leírja, hogyan állíthatja be a modellt tartalmazó webszolgáltatást. A pontozási szkriptet és a környezetet a betanítási futtatásból használhatja a következtetési konfigurációban.
Megjegyzés
A modell beállításainak módosításához nyissa meg a letöltött pontozási szkriptet, és módosítsa a model_settings változót a modell üzembe helyezése előtt.
from azureml.core.model import InferenceConfig best_child_run.download_file('outputs/scoring_file_v_1_0_0.py', output_file_path='score.py') environment = best_child_run.get_environment() inference_config = InferenceConfig(entry_script='score.py', environment=environment)
Ezután üzembe helyezheti a modellt AKS-webszolgáltatásként.
from azureml.core.webservice import AksWebservice from azureml.core.webservice import Webservice from azureml.core.model import Model from azureml.core.environment import Environment aks_config = AksWebservice.deploy_configuration(autoscale_enabled=True, cpu_cores=1, memory_gb=50, enable_app_insights=True) aks_service = Model.deploy(ws, models=[model], inference_config=inference_config, deployment_config=aks_config, deployment_target=aks_target, name='automl-image-test', overwrite=True) aks_service.wait_for_deployment(show_output=True) print(aks_service.state)
A webszolgáltatás tesztelése
Tesztelheti az üzembe helyezett webszolgáltatást az új rendszerképek előrejelzéséhez. Ebben az oktatóanyagban adjon át egy véletlenszerű képet az adathalmazból, és adja át a pontozási URI-nak.
import requests
# URL for the web service
scoring_uri = aks_service.scoring_uri
# If the service is authenticated, set the key or token
key, _ = aks_service.get_keys()
sample_image = './test_image.jpg'
# Load image data
data = open(sample_image, 'rb').read()
# Set the content type
headers = {'Content-Type': 'application/octet-stream'}
# If authentication is enabled, set the authorization header
headers['Authorization'] = f'Bearer {key}'
# Make the request and display the response
resp = requests.post(scoring_uri, data, headers=headers)
print(resp.text)
Észlelések vizualizációja
Most, hogy pontozott egy tesztképet, megjelenítheti a kép határolókeretét. Ehhez győződjön meg arról, hogy telepítve van a matplotlib.
%pip install --upgrade matplotlib
%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import matplotlib.patches as patches
from PIL import Image
import numpy as np
import json
IMAGE_SIZE = (18,12)
plt.figure(figsize=IMAGE_SIZE)
img_np=mpimg.imread(sample_image)
img = Image.fromarray(img_np.astype('uint8'),'RGB')
x, y = img.size
fig,ax = plt.subplots(1, figsize=(15,15))
# Display the image
ax.imshow(img_np)
# draw box and label for each detection
detections = json.loads(resp.text)
for detect in detections['boxes']:
label = detect['label']
box = detect['box']
conf_score = detect['score']
if conf_score > 0.6:
ymin, xmin, ymax, xmax = box['topY'],box['topX'], box['bottomY'],box['bottomX']
topleft_x, topleft_y = x * xmin, y * ymin
width, height = x * (xmax - xmin), y * (ymax - ymin)
print('{}: [{}, {}, {}, {}], {}'.format(detect['label'], round(topleft_x, 3),
round(topleft_y, 3), round(width, 3),
round(height, 3), round(conf_score, 3)))
color = np.random.rand(3) #'red'
rect = patches.Rectangle((topleft_x, topleft_y), width, height,
linewidth=3, edgecolor=color,facecolor='none')
ax.add_patch(rect)
plt.text(topleft_x, topleft_y - 10, label, color=color, fontsize=20)
plt.show()
Az erőforrások eltávolítása
Ne fejezze be ezt a szakaszt, ha más Azure Machine Learning-oktatóanyagokat szeretne futtatni.
Ha nem tervezi használni a létrehozott erőforrásokat, törölje őket, így nem kell díjat fizetnie.
- Az Azure Portalon válassza az Erőforráscsoportok lehetőséget a bal szélen.
- Válassza ki a listában az Ön által létrehozott erőforráscsoportot.
- Válassza az Erőforráscsoport törlése elemet.
- Írja be az erőforráscsoport nevét. Ezután válassza a Törlés elemet.
Megtarthatja az erőforráscsoportot is, de egyetlen munkaterületet törölhet. Jelenítse meg a munkaterület tulajdonságait, és válassza a Törlés lehetőséget.
Következő lépések
Ebben az automatizált gépi tanulási oktatóanyagban a következő feladatokat végezte el:
- Konfigurált egy munkaterületet, és előkészítette az adatokat egy kísérlethez.
- Automatizált objektumészlelési modell betanítása
- Megadott hiperparaméter-értékek a modellhez
- Hiperparaméter-takarítást hajtott végre
- A modell üzembe helyezése
- Vizualizációs észlelések
- További információ a számítógépes látásról az automatizált gépi tanulásban.
- Megtudhatja, hogyan állíthatja be az AutoML-t a számítógépes látásmodellek Pythonnal történő betanítása érdekében.
- Ismerje meg, hogyan konfigurálhatja a növekményes betanítást a számítógépes látási modelleken.
- Tekintse meg , hogy milyen hiperparaméterek érhetők el a számítógépes látási feladatokhoz.
- Tekintse át a részletes kódmintákat és használati eseteket az automatizált gépi tanulási minták GitHub-jegyzetfüzettárában. Ellenőrizze a "image-" előtaggal rendelkező mappákat a számítógépes látási modellek készítésére vonatkozó mintákhoz.
Megjegyzés
A hűtőobjektum-adatkészlet használata az MIT-licenc alatt található licencen keresztül érhető el.