Oktatóanyag: Objektumészlelési modell (előzetes verzió) betanítása 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.
Ebben az oktatóanyagban 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ók normalizálási/szabványosítási módszereinek, modelljeinek és hiperparaméter-beállításainak kombinációjával, hogy a legjobb modellt érje el.
Ebben az oktatóanyagban a Python SDK használatával fog kódot írni, és a következő feladatokat fogja elsajátítani:
- 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 még nincs Azure-előfizetése, kezdés előtt hozzon létre egy ingyenes fiókot. 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 a rövid útmutatót: Az Azure Machine Learning használatának első lépései.
Töltse le és bontsa ki a *odFridgeObjects.zip adatfájlt. Az adathalmaz Pascal VOC formátumban van jegyzetelve, ahol minden kép egy XML-fájlnak felel meg. Minden xml-fájl információt tartalmaz arról, hogy hol található a megfelelő képfájl, valamint információkat tartalmaz a határolókeretekről és az objektumfeliratokról. Az adatok használatához először a szükséges JSONL-formátumra kell konvertálnia azokat, ahogyan az a letöltött adatok konvertálása a jegyzetfüzet JSONL-szakaszában látható.
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, amelyet az automatizált ml-modell betanításához használ. 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 ez a számítási céltípus 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ág előnyeit a modell hiperparamétereinek finomhangolása során.
Az alábbi kód egy Standard _NC24s_v3 méretű GPU-számítást hoz létre a munkaterülethez ws
csatolt négy csomóponttal.
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 munkaterületet Experiment
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 megjelenítése
Miután JSONL (JSON Lines) formátumban előkészítette a bemeneti képadatokat, 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 a következő 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%-át használja az ellenőrzéshez.
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 adatkészletbő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)
Bármely kép esetében futtathatja a következő kódot a határolókeretek megjelenítéséhez.
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
Ha automatikus gépi tanulási futtatásokat szeretne konfigurálni a képpel kapcsolatos feladatokhoz, használja az AutoMLImageConfig
objektumot. AutoMLImageConfig
Itt megadhatja a paraméterrel rendelkező model_name
modellalgoritmusokat, és konfigurálhatja a beállításokat úgy, hogy hiperparaméter-átsöprést hajtanak végre egy megadott paraméterterületen az optimális modell megtalálásához.
Ebben a példában egy AutoMLImageConfig
objektumészlelési modell yolov5
fasterrcnn_resnet50_fpn
betanítására használjuk a COCO-n előre betanított objektumészlelési, szegmentálási és feliratozási adatkészletet, amely több mint több 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 hiperparaméter-átsöprést hajthat végre egy meghatározott paraméterterületen.
Az alábbi kód határozza meg a paraméterterületet az egyes definiált algoritmusok hiperparaméter-takarításának előkészítése során, yolov5
és fasterrcnn_resnet50_fpn
. A paramétertérben adja meg, hogy az AutoML milyen értéktartományt learning_rate
optimizer
lr_scheduler
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 szúrópróbaszerű mintavételezéssel válasszon mintákat ebből a paramétertérből az osztályok és BayesianParameterSampling
az GridParameterSampling, RandomParameterSampling
osztályok importálásával. Ez azt jelenti, hogy az automatizált gépi tanulás összesen 20 iterációt próbál ki ezekkel a különböző mintákkal, és egyszerre négy iterációt futtat a számítási célon, amelyet négy csomópont használatával állítottunk be. Minél több paramétere van a térnek, 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ékideje alatt 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 hangolási beállítások meghatározása után átadhatja őket az AutoMLImageConfig
objektumnak, majd elküldheti a kísérletet egy képmodell betanításához 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)
Hiperparaméter-átvizsgáláskor hasznos lehet a HyperDrive felhasználói felületén kipróbált különböző konfigurációk megjelenítése. Ehhez a felhasználói felülethez a fő automl_image_run felhasználói felületén található "Gyermekfuttatások" lapra lépve, 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 a HyperDrive szülőfuttatását láthatja, és a Gyermekfuttatások lapra navigálhat:
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 elvégezte a betanított modellt, üzembe helyezheti a modellt az Azure-ban. A betanított modellt webszolgáltatásként üzembe helyezheti az Azure Container Instances (ACI) vagy az Azure Kubernetes Service (AKS) szolgáltatásban. Az ACI tökéletes megoldás az üzemelő példányok tesztelésére, míg az AKS jobban megfelel a nagy léptékű, éles használatnak.
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)
Adja 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.
Feljegyzé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
Az üzembe helyezett webszolgáltatást tesztelheti 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 elért 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 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.
- Adja meg 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éteres 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 való betanítása érdekében.
- Megtudhatja, hogyan konfigurálhat növekményes betanítást számítógépes látásmodelleken.
- Tekintse meg , 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 mappák "image-" előtagját a számítógépes látásmodellek készítésére vonatkozó mintákhoz.
Feljegyzés
A hűtőobjektum-adatkészlet használata az MIT-licenc alatt található licencen keresztül érhető el.
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: