Skip to main content

2 posts tagged with "tool"

View All Tags

· 7 min read
Sparsh Agarwal

/img/content-blog-raw-blog-detectron-2-untitled.png

Introduction

Detectron 2 is a next-generation open-source object detection system from Facebook AI Research. With the repo you can use and train the various state-of-the-art models for detection tasks such as bounding-box detection, instance and semantic segmentation, and person keypoint detection.

The following is the directory tree of detectron 2:

detectron2
├─checkpoint <- checkpointer and model catalog handlers
├─config <- default configs and handlers
├─data <- dataset handlers and data loaders
├─engine <- predictor and trainer engines
├─evaluation <- evaluator for each dataset
├─export <- converter of detectron2 models to caffe2 (ONNX)
├─layers <- custom layers e.g. deformable conv.
├─model_zoo <- pre-trained model links and handler
├─modeling
│ ├─meta_arch <- meta architecture e.g. R-CNN, RetinaNet
│ ├─backbone <- backbone network e.g. ResNet, FPN
│ ├─proposal_generator <- region proposal network
│ └─roi_heads <- head networks for pooled ROIs e.g. box, mask heads
├─solver <- optimizer and scheduler builders
├─structures <- structure classes e.g. Boxes, Instances, etc
└─utils <- utility modules e.g. visualizer, logger, etc

Installation

%%time
!pip install -U torch==1.4+cu100 torchvision==0.5+cu100 -f https://download.pytorch.org/whl/torch_stable.html;
!pip install cython pyyaml==5.1;
!pip install -U 'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI';
!pip install detectron2 -f https://dl.fbaipublicfiles.com/detectron2/wheels/cu100/index.html;

from detectron2 import model_zoo
from detectron2.engine import DefaultPredictor
from detectron2.config import get_cfg
from detectron2.utils.visualizer import Visualizer
from detectron2.data import MetadataCatalog

Inference on pre-trained models

Original image

Original image

Object detection with Faster-RCNN-101

Object detection with Faster-RCNN-101

Instance segmentation with Mask-RCNN-50

Instance segmentation with Mask-RCNN-50

Keypoint estimation with Keypoint-RCNN-50

Keypoint estimation with Keypoint-RCNN-50

Panoptic segmentation with Panoptic-FPN-101

Panoptic segmentation with Panoptic-FPN-101

Default Mask R-CNN (top) vs. Mask R-CNN with PointRend (bottom) comparison

Default Mask R-CNN (top) vs. Mask R-CNN with PointRend (bottom) comparison

Fine-tuning Balloons Dataset

Load the data

# download, decompress the data
!wget https://github.com/matterport/Mask_RCNN/releases/download/v2.1/balloon_dataset.zip
!unzip balloon_dataset.zip > /dev/null

Convert dataset into Detectron2's standard format

from detectron2.structures import BoxMode
# write a function that loads the dataset into detectron2's standard format
def get_balloon_dicts(img_dir):
json_file = os.path.join(img_dir, "via_region_data.json")
with open(json_file) as f:
imgs_anns = json.load(f)

dataset_dicts = []
for _, v in imgs_anns.items():
record = {}

filename = os.path.join(img_dir, v["filename"])
height, width = cv2.imread(filename).shape[:2]

record["file_name"] = filename
record["height"] = height
record["width"] = width

annos = v["regions"]
objs = []
for _, anno in annos.items():
assert not anno["region_attributes"]
anno = anno["shape_attributes"]
px = anno["all_points_x"]
py = anno["all_points_y"]
poly = [(x + 0.5, y + 0.5) for x, y in zip(px, py)]
poly = list(itertools.chain.from_iterable(poly))

obj = {
"bbox": [np.min(px), np.min(py), np.max(px), np.max(py)],
"bbox_mode": BoxMode.XYXY_ABS,
"segmentation": [poly],
"category_id": 0,
"iscrowd": 0
}
objs.append(obj)
record["annotations"] = objs
dataset_dicts.append(record)
return dataset_dicts

from detectron2.data import DatasetCatalog, MetadataCatalog
for d in ["train", "val"]:
DatasetCatalog.register("balloon/" + d, lambda d=d: get_balloon_dicts("balloon/" + d))
MetadataCatalog.get("balloon/" + d).set(thing_classes=["balloon"])
balloon_metadata = MetadataCatalog.get("balloon/train")

Model configuration and training

from detectron2.engine import DefaultTrainer
from detectron2.config import get_cfg

cfg = get_cfg()
cfg.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"))
cfg.DATASETS.TRAIN = ("balloon/train",)
cfg.DATASETS.TEST = () # no metrics implemented for this dataset
cfg.DATALOADER.NUM_WORKERS = 2
cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml")
cfg.SOLVER.IMS_PER_BATCH = 2
cfg.SOLVER.BASE_LR = 0.00025
cfg.SOLVER.MAX_ITER = 300 # 300 iterations seems good enough, but you can certainly train longer
cfg.MODEL.ROI_HEADS.BATCH_SIZE_PER_IMAGE = 128 # faster, and good enough for this toy dataset
cfg.MODEL.ROI_HEADS.NUM_CLASSES = 1 # only has one class (ballon)

os.makedirs(cfg.OUTPUT_DIR, exist_ok=True)
trainer = DefaultTrainer(cfg)
trainer.resume_or_load(resume=False)
trainer.train()

Inference and Visualization

from detectron2.utils.visualizer import ColorMode

# load weights
cfg.MODEL.WEIGHTS = os.path.join(cfg.OUTPUT_DIR, "model_final.pth")
cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.7 # set the testing threshold for this model
# Set training data-set path
cfg.DATASETS.TEST = ("balloon/val", )
# Create predictor (model for inference)
predictor = DefaultPredictor(cfg)

dataset_dicts = get_balloon_dicts("balloon/val")
for d in random.sample(dataset_dicts, 3):
im = cv2.imread(d["file_name"])
outputs = predictor(im)
v = Visualizer(im[:, :, ::-1],
metadata=balloon_metadata,
scale=0.8,
instance_mode=ColorMode.IMAGE_BW # remove the colors of unsegmented pixels
)
v = v.draw_instance_predictions(outputs["instances"].to("cpu"))
cv2_imshow(v.get_image()[:, :, ::-1])

/img/content-blog-raw-blog-detectron-2-untitled-7.png

/img/content-blog-raw-blog-detectron-2-untitled-8.png

/img/content-blog-raw-blog-detectron-2-untitled-9.png

Fine-tuning Chip Dataset

Load the data

#get the dataset
!pip install -q kaggle
!pip install -q kaggle-cli
os.environ['KAGGLE_USERNAME'] = "sparshag"
os.environ['KAGGLE_KEY'] = "1b1f894d1fa6febe9676681b44ad807b"
!kaggle datasets download -d tannergi/microcontroller-detection
!unzip microcontroller-detection.zip

Convert dataset into Detectron2's standard format

# Registering the dataset
from detectron2.structures import BoxMode
def get_microcontroller_dicts(csv_file, img_dir):
df = pd.read_csv(csv_file)
df['filename'] = df['filename'].map(lambda x: img_dir+x)

classes = ['Raspberry_Pi_3', 'Arduino_Nano', 'ESP8266', 'Heltec_ESP32_Lora']

df['class_int'] = df['class'].map(lambda x: classes.index(x))

dataset_dicts = []
for filename in df['filename'].unique().tolist():
record = {}

height, width = cv2.imread(filename).shape[:2]

record["file_name"] = filename
record["height"] = height
record["width"] = width

objs = []
for index, row in df[(df['filename']==filename)].iterrows():
obj= {
'bbox': [row['xmin'], row['ymin'], row['xmax'], row['ymax']],
'bbox_mode': BoxMode.XYXY_ABS,
'category_id': row['class_int'],
"iscrowd": 0
}
objs.append(obj)
record["annotations"] = objs
dataset_dicts.append(record)
return dataset_dicts

classes = ['Raspberry_Pi_3', 'Arduino_Nano', 'ESP8266', 'Heltec_ESP32_Lora']
for d in ["train", "test"]:
DatasetCatalog.register('microcontroller/' + d, lambda d=d: get_microcontroller_dicts('Microcontroller Detection/' + d + '_labels.csv', 'Microcontroller Detection/' + d+'/'))
MetadataCatalog.get('microcontroller/' + d).set(thing_classes=classes)
microcontroller_metadata = MetadataCatalog.get('microcontroller/train')

Model configuration and training

# Train the model
cfg = get_cfg()
cfg.merge_from_file(model_zoo.get_config_file("COCO-Detection/faster_rcnn_R_101_FPN_3x.yaml"))
cfg.DATASETS.TRAIN = ('microcontroller/train',)
cfg.DATASETS.TEST = () # no metrics implemented for this dataset
cfg.DATALOADER.NUM_WORKERS = 2
cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-Detection/faster_rcnn_R_101_FPN_3x.yaml")
cfg.SOLVER.IMS_PER_BATCH = 2
cfg.SOLVER.MAX_ITER = 1000
cfg.MODEL.ROI_HEADS.NUM_CLASSES = 4

os.makedirs(cfg.OUTPUT_DIR, exist_ok=True)
trainer = DefaultTrainer(cfg)
trainer.resume_or_load(resume=False)
trainer.train()

/img/content-blog-raw-blog-detectron-2-untitled-10.png

/img/content-blog-raw-blog-detectron-2-untitled-11.png

Inference and Visualization

cfg.MODEL.WEIGHTS = os.path.join(cfg.OUTPUT_DIR, "model_final.pth")
cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.8 # set the testing threshold for this model
cfg.DATASETS.TEST = ('microcontroller/test', )
predictor = DefaultPredictor(cfg)

df_test = pd.read_csv('Microcontroller Detection/test_labels.csv')

dataset_dicts = DatasetCatalog.get('microcontroller/test')
for d in random.sample(dataset_dicts, 3):
im = cv2.imread(d["file_name"])
outputs = predictor(im)
v = Visualizer(im[:, :, ::-1],
metadata=microcontroller_metadata,
scale=0.8
)
v = v.draw_instance_predictions(outputs["instances"].to("cpu"))
cv2_imshow(v.get_image()[:, :, ::-1])

Real-time Webcam inference

from IPython.display import display, Javascript
from google.colab.output import eval_js
from base64 import b64decode

def take_photo(filename='photo.jpg', quality=0.8):
js = Javascript('''
async function takePhoto(quality) {
const div = document.createElement('div');
const capture = document.createElement('button');
capture.textContent = 'Capture';
div.appendChild(capture);

const video = document.createElement('video');
video.style.display = 'block';
const stream = await navigator.mediaDevices.getUserMedia({video: true});

document.body.appendChild(div);
div.appendChild(video);
video.srcObject = stream;
await video.play();

// Resize the output to fit the video element.
google.colab.output.setIframeHeight(document.documentElement.scrollHeight, true);

// Wait for Capture to be clicked.
await new Promise((resolve) => capture.onclick = resolve);

const canvas = document.createElement('canvas');
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
canvas.getContext('2d').drawImage(video, 0, 0);
stream.getVideoTracks()[0].stop();
div.remove();
return canvas.toDataURL('image/jpeg', quality);
}
''')
display(js)
data = eval_js('takePhoto({})'.format(quality))
binary = b64decode(data.split(',')[1])
with open(filename, 'wb') as f:
f.write(binary)
return filename

from IPython.display import Image
try:
filename = take_photo()
print('Saved to {}'.format(filename))

# Show the image which was just taken.
display(Image(filename))
except Exception as err:
# Errors will be thrown if the user does not have a webcam or if they do not
# grant the page permission to access it.
print(str(err))
model_path = '/content/output/model_final.pth'
config_path= model_zoo.get_config_file("COCO-Detection/faster_rcnn_R_101_FPN_3x.yaml")

# Create config
cfg = get_cfg()
cfg.merge_from_file(config_path)
cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.1
cfg.MODEL.WEIGHTS = model_path

predictor = DefaultPredictor(cfg)

im = cv2.imread('photo.jpg')
outputs = predictor(im)

v = Visualizer(im[:, :, ::-1], MetadataCatalog.get(cfg.DATASETS.TRAIN[0]), scale=1.2)
v = v.draw_instance_predictions(outputs["instances"].to("cpu"))
cv2_imshow(v.get_image()[:, :, ::-1])

Fine-tuning on Face dataset

The process is same. Here is the output.

/img/content-blog-raw-blog-detectron-2-untitled-12.png

/img/content-blog-raw-blog-detectron-2-untitled-13.png

/img/content-blog-raw-blog-detectron-2-untitled-14.png

Behind the scenes

/img/content-blog-raw-blog-detectron-2-untitled-15.png

References

· 12 min read
Sparsh Agarwal

/img/content-blog-raw-blog-tools-for-building-recommender-systems-untitled.png

Recombee - Recommendation as a service API

Recombee is a Recommender as a Service with easy integration and Admin UI. It can be used in many domains, for example in media (VoD, news …), e-commerce, job boards, aggregators or classifieds. Basically, it can be used in any domain with a catalog of items that can be interacted by users. The users can interact with the items in many ways: for example view them, rate them, bookmark them, purchase them, etc. Both items and users can have various properties (metadata) that are also used by the recommendation models.

/img/content-blog-raw-blog-tools-for-building-recommender-systems-untitled-1.png

Here is the official tutorial series to get started.

Amazon Personalize - Self-service Platform to build and serve recommenders

Amazon Personalize is a fully managed machine learning service that goes beyond rigid static rule based recommendation systems and trains, tunes, and deploys custom ML models to deliver highly customized recommendations to customers across industries such as retail and media and entertainment.

/img/content-blog-raw-blog-tools-for-building-recommender-systems-untitled-2.png

It covers 6 use-cases:

Popular Use-cases

Popular Use-cases

Following are the hands-on tutorials:

  1. Data Science on AWS Workshop - Personalize Recommendationsp
  2. https://aws.amazon.com/blogs/machine-learning/creating-a-recommendation-engine-using-amazon-personalize/
  3. https://aws.amazon.com/blogs/machine-learning/omnichannel-personalization-with-amazon-personalize/
  4. https://aws.amazon.com/blogs/machine-learning/using-a-b-testing-to-measure-the-efficacy-of-recommendations-generated-by-amazon-personalize/

Also checkout these resources:

  1. https://www.youtube.com/playlist?list=PLN7ADELDRRhiQB9QkFiZolioeJZb3wqPE

Azure Personalizer - An API based service with Reinforcement learning capability

Azure Personalizer is a cloud-based API service that helps developers create rich, personalized experiences for each user of your app. It learns from customer's real-time behavior, and uses reinforcement learning to select the best item (action) based on collective behavior and reward scores across all users. Actions are the content items, such as news articles, specific movies, or products. It takes a list of items (e.g. list of drop-down choices) and their context (e.g. Report Name, User Name, Time Zone) as input and returns the ranked list of items for the given context. While doing that, it also allows feedback submission regarding the relevance and efficiency of the ranking results returned by the service. The feedback (reward score) can be automatically calculated and submitted to the service based on the given personalization use case.

/img/content-blog-raw-blog-tools-for-building-recommender-systems-untitled-4.png

You can use the Personalizer service to determine what product to suggest to shoppers or to figure out the optimal position for an advertisement. After the content is shown to the user, your application monitors the user's reaction and reports a reward score back to the Personalizer service. This ensures continuous improvement of the machine learning model, and Personalizer's ability to select the best content item based on the contextual information it receives.

Following are some of the interesting use cases of Azure Personalizer:

  1. Blog Recommender [Video tutorial, GitHub]
  2. Food Personalizer [Video tutorial, Slideshare, Code Blog]
  3. Coffee Personalizer [GitHub, Video tutorial]
  4. News Recommendation
  5. Movie Recommendation
  6. Product Recommendation
  7. Intent clarification & disambiguation: help your users have a better experience when their intent is not clear by providing an option that is personalized.
  8. Default suggestions for menus & options: have the bot suggest the most likely item in a personalized way as a first step, instead of presenting an impersonal menu or list of alternatives.
  9. Bot traits & tone: for bots that can vary tone, verbosity, and writing style, consider varying these traits.
  10. Notification & alert content: decide what text to use for alerts in order to engage users more.
  11. Notification & alert timing: have personalized learning of when to send notifications to users to engage them more.
  12. Dropdown Options - Different users of an application with manager privileges would see a list of reports that they can run. Before Personalizer was implemented, the list of dozens of reports was displayed in alphabetical order, requiring most of the managers to scroll through the lengthy list to find the report they needed. This created a poor user experience for daily users of the reporting system, making for a good use case for Personalizer. The tooling learned from the user behavior and began to rank frequently run reports on the top of the dropdown list. Frequently run reports would be different for different users, and would change over time for each manager as they get assigned to different projects. This is exactly the situation where Personalizer’s reward score-based learning models come into play.
  13. Projects in Timesheet - Every employee in the company logs a daily timesheet listing all of the projects the user is assigned to. It also lists other projects, such as overhead. Depending upon the employee project allocations, his or her timesheet table could have few to a couple of dozen active projects listed. Even though the employee is assigned to several projects, particularly at lead and manager levels, they don’t log time in more than 2 to 3 projects for a few weeks to months.
    1. Reward Score Calculation

Google Recommendation - Recommender Service from Google

https://cloudx-bricks-prod-bucket.storage.googleapis.com/6a0d4afb1778e55d54cb7d66382a4b25f8748a50a93f3c3403d2a835aa166f3d.svg

Abacus.ai - Self-service Platform at cheaper price

It uses multi-objective, real-time recommendations models and provides 4 use-cases for fasttrack train-&-deploy process - Personalized recommendations, personalized search, related items and real-time feed recommendations.

/img/content-blog-raw-blog-tools-for-building-recommender-systems-untitled-5.png

Here is the hands-on video tutorial:

https://youtu.be/7hTKL73f2yA

Nvidia Merlin - Toolkit with GPU capabilities

Merlin empowers data scientists, machine learning engineers, and researchers to build high-performing recommenders at scale. Merlin includes tools that democratize building deep learning recommenders by addressing common ETL, training, and inference challenges. Each stage of the Merlin pipeline is optimized to support hundreds of terabytes of data, all accessible through easy-to-use APIs. With Merlin, better predictions than traditional methods and increased click-through rates are within reach.

End-to-end recommender system architecture. FE: feature engineering; PP: preprocessing; ETL: extract-transform-load.

End-to-end recommender system architecture. FE: feature engineering; PP: preprocessing; ETL: extract-transform-load.

/img/content-blog-raw-blog-tools-for-building-recommender-systems-untitled-7.png

TFRS - Open-source Recommender library built on top of Tensorflow

Built with TensorFlow 2.x, TFRS makes it possible to:

/img/content-blog-raw-blog-tools-for-building-recommender-systems-untitled-8.png

Following is a series of official tutorial notebooks:-

TensorFlow Recommenders: Quickstart

Elliot - An end-to-end framework good for recommender system experiments

Elliot is a comprehensive recommendation framework that aims to run and reproduce an entire experimental pipeline by processing a simple configuration file. The framework loads, filters, and splits the data considering a vast set of strategies (13 splitting methods and 8 filtering approaches, from temporal training-test splitting to nested K-folds Cross-Validation). Elliot optimizes hyperparameters (51 strategies) for several recommendation algorithms (50), selects the best models, compares them with the baselines providing intra-model statistics, computes metrics (36) spanning from accuracy to beyond-accuracy, bias, and fairness, and conducts statistical analysis (Wilcoxon and Paired t-test). The aim is to provide the researchers with a tool to ease (and make them reproducible) all the experimental evaluation phases, from data reading to results collection.

/img/content-blog-raw-blog-tools-for-building-recommender-systems-untitled-9.png

RecBole - Another framework good for recommender system model experiments

RecBole is developed based on Python and PyTorch for reproducing and developing recommendation algorithms in a unified, comprehensive and efficient framework for research purpose. It can be installed from pip, Conda and source, and easy to use. It includes 65 recommendation algorithms, covering four major categories: General Recommendation, Sequential Recommendation, Context-aware Recommendation, and Knowledge-based Recommendation, which can support the basic research in recommender systems.

/img/content-blog-raw-blog-tools-for-building-recommender-systems-untitled-10.png

Features:

  • General and extensible data structureWe deign general and extensible data structures to unify the formatting and usage of various recommendation datasets.
  • Comprehensive benchmark models and datasetsWe implement 65 commonly used recommendation algorithms, and provide the formatted copies of 28 recommendation datasets.
  • Efficient GPU-accelerated executionWe design many tailored strategies in the GPU environment to enhance the efficiency of our library.
  • Extensive and standard evaluation protocolsWe support a series of commonly used evaluation protocols or settings for testing and comparing recommendation algorithms.

The Microsoft Recommenders repository is an open source collection of python utilities and Jupyter notebooks to help accelerate the process of designing, evaluating, and deploying recommender systems. The repository was initially formed by data scientists at Microsoft to consolidate common tools and best practices developed from working on recommender systems in various industry settings. The goal of the tools and notebooks is to show examples of how to effectively build, compare, and then deploy the best recommender solution for a given scenario. Contributions from the community have brought in new algorithm implementations and code examples covering multiple aspects of working with recommendation algorithms.

/img/content-blog-raw-blog-tools-for-building-recommender-systems-untitled-11.png

Surprise - An open-source library with easy api and powerful models

Surprise is a Python scikit for building and analyzing recommender systems that deal with explicit rating data.

Surprise was designed with the following purposes in mind:

Spotlight - Another open-source library

Spotlight uses PyTorch to build both deep and shallow recommender models. By providing both a slew of building blocks for loss functions (various pointwise and pairwise ranking losses), representations (shallow factorization representations, deep sequence models), and utilities for fetching (or generating) recommendation datasets, it aims to be a tool for rapid exploration and prototyping of new recommender models.

/img/content-blog-raw-blog-tools-for-building-recommender-systems-untitled-12.png

Here is a series of hands-on tutorials to get started.

Vowpal Wabbit - library with reinforcement learning features

Vowpal Wabbit is an open source machine learning library, extensively used by industry, and is the first public terascale learning system. It provides fast, scalable machine learning and has unique capabilities such as learning to search, active learning, contextual memory, and extreme multiclass learning. It has a focus on reinforcement learning and provides production ready implementations of Contextual Bandit algorithms. It was developed originally at Yahoo! Research, and currently at Microsoft Research. Vowpal Wabbit sees significant innovation as a research to production vehicle for Microsoft Research.

/img/content-blog-raw-blog-tools-for-building-recommender-systems-untitled-13.png

For most applications, collaborative filtering yields satisfactory results for item recommendations; there are however several issues that arise that might make it difficult to scale up a recommender system.

  • The number of features can grow quite large, and given the usual sparsity of consumption datasets, collaborative filtering needs every single feature and datapoint available.
  • For new data points, the whole model has to be re-trained

Vowpal Wabbit’s matrix factorization capabilities can be used to build a recommender that is similar in spirit to collaborative filtering but that avoids the pitfalls that we mentioned before.

Following are the three introductory hands-on tutorials on building recommender systems with vowpal wabbit:

  1. Vowpal Wabbit Deep Dive - A Content-based Recommender System using Microsoft Recommender Library
  2. Simulating Content Personalization with Contextual Bandits
  3. Vowpal Wabbit, The Magic Recommender System!

DLRM - An open-source scalable model from Facebook's AI team, build on top of PyTorch

DLRM advances on other models by combining principles from both collaborative filtering and predictive analytics-based approaches, which enables it to work efficiently with production-scale data and provide state-of-art results.

In the DLRM model, categorical features are processed using embeddings, while continuous features are processed with a bottom multilayer perceptron (MLP). Then, second-order interactions of different features are computed explicitly. Finally, the results are processed with a top MLP and fed into a sigmoid function in order to give a probability of a click.

/img/content-blog-raw-blog-tools-for-building-recommender-systems-untitled-14.png

Following are the hands-on tutorials:

  1. https://nbviewer.jupyter.org/github/gotorehanahmad/Recommendation-Systems/blob/master/dlrm/dlrm_main.ipynb
  2. Training Facebook's DLRM on the digix dataset

References

  1. https://elliot.readthedocs.io/en/latest/
  2. https://vowpalwabbit.org/index.html
  3. https://abacus.ai/user_eng
  4. https://azure.microsoft.com/en-in/services/cognitive-services/personalizer/
  5. https://aws.amazon.com/personalize/
  6. https://github.com/facebookresearch/dlrm
  7. https://www.tensorflow.org/recommenders
  8. https://magento.com/products/product-recommendations
  9. https://cloud.google.com/recommendations
  10. https://www.recombee.com/
  11. https://recbole.io/
  12. https://github.com/microsoft/recommenders
  13. http://surpriselib.com/
  14. https://github.com/maciejkula/spotlight
  15. https://vowpalwabbit.org/tutorials/contextual_bandits.html
  16. https://github.com/VowpalWabbit/vowpal_wabbit/wiki
  17. https://vowpalwabbit.org/tutorials/cb_simulation.html
  18. https://vowpalwabbit.org/rlos/2021/projects.html
  19. https://vowpalwabbit.org/rlos/2020/projects.html
  20. https://getstream.io/blog/recommendations-activity-streams-vowpal-wabbit/
  21. https://samuel-guedj.medium.com/vowpal-wabbit-the-magic-58b7f1d8e39c
  22. https://vowpalwabbit.org/neurips2019/
  23. https://github.com/VowpalWabbit/neurips2019
  24. https://getstream.io/blog/introduction-contextual-bandits/
  25. https://www.youtube.com/watch?v=CeOcNK1xSSA&t=72s
  26. https://vowpalwabbit.org/blog/rlos-fest-2021.html
  27. https://github.com/VowpalWabbit/workshop
  28. https://github.com/VowpalWabbit/workshop/tree/master/aiNextCon2019
  29. Blog post by Nasir Mirza. Azure Cognitive Services Personalizer: Part One. Oct, 2019.
  30. Blog post by Nasir Mirza. Azure Cognitive Services Personalizer: Part Two. Oct, 2019.
  31. Blog post by Nasir Mirza. Azure Cognitive Services Personalizer: Part Three. Dec, 2019.
  32. Microsoft Azure Personalizer Official Documentation. Oct, 2020.
  33. Personalizer demo.
  34. Official Page.
  35. Blog Post by Jake Wong. Get hands on with the Azure Personalizer API. Aug, 2019.
  36. Medium Post.
  37. Blog Post.
  38. Git Repo.
  39. https://youtu.be/7hTKL73f2yA
  40. Deep-Learning Based Recommendation Systems — Learning AI
  41. Evaluating Deep Learning Models with Abacus.AI – Recommendation Systems
  42. https://aws.amazon.com/blogs/machine-learning/pioneering-personalized-user-experiences-at-stockx-with-amazon-personalize/
  43. https://aws.amazon.com/blogs/machine-learning/category/artificial-intelligence/amazon-personalize/
  44. https://d1.awsstatic.com/events/reinvent/2019/REPEAT_1_Build_a_content-recommendation_engine_with_Amazon_Personalize_AIM304-R1.pdf
  45. https://aws.amazon.com/blogs/aws/amazon-personalize-real-time-personalization-and-recommendation-for-everyone/
  46. https://d1.awsstatic.com/events/reinvent/2019/REPEAT_1_Accelerate_experimentation_with_personalization_models_AIM424-R1.pdf
  47. https://d1.awsstatic.com/events/reinvent/2019/REPEAT_1_Personalized_user_engagement_with_machine_learning_AIM346-R1.pdf
  48. https://github.com/aws-samples/amazon-personalize-samples
  49. https://github.com/aws-samples/amazon-personalize-automated-retraining
  50. https://github.com/aws-samples/amazon-personalize-ingestion-pipeline
  51. https://github.com/aws-samples/amazon-personalize-monitor
  52. https://github.com/aws-samples/amazon-personalize-data-conversion-pipeline
  53. https://github.com/james-jory/segment-personalize-workshop
  54. https://github.com/aws-samples/amazon-personalize-samples/tree/master/next_steps/workshops/POC_in_a_box
  55. https://github.com/Imagination-Media/aws-personalize-magento2
  56. https://github.com/awslabs/amazon-personalize-optimizer-using-amazon-pinpoint-events
  57. https://github.com/aws-samples/amazon-personalize-with-aws-glue-sample-dataset
  58. https://github.com/awsdocs/amazon-personalize-developer-guide
  59. https://github.com/chrisking/NetflixPersonalize
  60. https://github.com/aws-samples/retail-demo-store
  61. https://github.com/aws-samples/personalize-data-science-sdk-workflow
  62. https://github.com/apac-ml-tfc/personalize-poc
  63. https://github.com/dalacan/personalize-batch-recommendations
  64. https://github.com/harunobukameda/Amazon-Personalize-Handson
  65. https://www.sagemakerworkshop.com/personalize/
  66. https://github.com/lmorri/vodpocinabox
  67. https://github.com/awslabs/unicornflix
  68. https://www.youtube.com/watch?v=r9J3UZmddC4&t=966s
  69. https://www.youtube.com/watch?v=kTufCK76Yus&t=1436s
  70. https://www.youtube.com/watch?v=hY_XzglTkak&t=66s
  71. https://business.adobe.com/lv/summit/2020/adobe-sensei-powers-magento-product-recommendations.html
  72. https://magento.com/products/product-recommendations
  73. https://docs.magento.com/user-guide/marketing/product-recommendations.html
  74. https://vod.webqem.com/detail/videos/magento-commerce/video/6195503645001/magento-commerce---product-recommendations?autoStart=true&page=1
  75. https://blog.adobe.com/en/publish/2020/11/23/new-ai-capabilities-for-magento-commerce-improve-retail.html#gs.yw6mtq
  76. https://developers.google.com/recommender/docs/reference/rest
  77. https://www.youtube.com/watch?v=nY5U0uQZRyU&t=6s