{"id":8073,"date":"2023-11-02T09:28:35","date_gmt":"2023-11-02T17:28:35","guid":{"rendered":"https:\/\/live-cometml.pantheonsite.io\/?p=8073"},"modified":"2025-04-24T17:04:55","modified_gmt":"2025-04-24T17:04:55","slug":"monitoring-your-cv-model-a-beginners-guide-using-kangas-and-comet","status":"publish","type":"post","link":"https:\/\/www.comet.com\/site\/blog\/monitoring-your-cv-model-a-beginners-guide-using-kangas-and-comet\/","title":{"rendered":"Monitoring Your CV Model: A Beginner\u2019s Guide Using Kangas and Comet"},"content":{"rendered":"\n<div class=\"fk fl fm fn fo\">\n<div class=\"ab ca\">\n<div class=\"ch bg ew ex ey ez\">\n<figure class=\"ly lz ma mb mc md lv lw paragraph-image\">\n<div class=\"me mf ee mg bg mh\" tabindex=\"0\" role=\"button\">\n<figure><img loading=\"lazy\" decoding=\"async\" class=\"bg mi mj c\" role=\"presentation\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:700\/1*LvCz2FaojU7W9-fPfXfUkA.png\" alt=\"\" width=\"700\" height=\"350\"><\/figure><div class=\"lv lw lx\"><picture><\/picture><\/div>\n<\/div>\n<\/figure>\n<p id=\"49ab\" class=\"pw-post-body-paragraph mk ml fr be b mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng fk bj\" data-selectable-paragraph=\"\">Computer Vision (CV) is a rapidly growing field that is transforming the way we interact with technology. As more and more companies adopt computer vision models for various applications, it has become increasingly important to monitor the performance of these models over time to ensure they continue to deliver accurate results.<\/p>\n<p id=\"f60d\" class=\"pw-post-body-paragraph mk ml fr be b mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng fk bj\" data-selectable-paragraph=\"\">In this article, we\u2019ll introduce you to the basics of monitoring your CV models using Kangas and Comet, two powerful tools that make it easy to track and analyze the performance of your models. Whether you\u2019re new to computer vision or have some experience under your belt, this beginner\u2019s guide will help you gain a better understanding of the importance of monitoring your models and how to get started with these powerful monitoring tools.<\/p>\n<p id=\"8f7a\" class=\"pw-post-body-paragraph mk ml fr be b mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng fk bj\" data-selectable-paragraph=\"\">We\u2019ll cover everything from setting up your environment to tracking key metrics and analyzing the results. By the end of this article, you\u2019ll have a solid understanding of how to monitor your CV models using Kangas and Comet, and be well on your way to delivering more accurate and reliable results.<\/p>\n<h2 id=\"200d\" class=\"nh ni fr be nj nk nl nm nn no np nq nr mu ns nt nu my nv nw nx nc ny nz oa ob bj\" data-selectable-paragraph=\"\"><strong class=\"al\">About Comet<\/strong><\/h2>\n<p id=\"6bf0\" class=\"pw-post-body-paragraph mk ml fr be b mm oc mo mp mq od ms mt mu oe mw mx my of na nb nc og ne nf ng fk bj\" data-selectable-paragraph=\"\">Comet is a powerful tool for monitoring and analyzing machine learning experiments. It allows users to track their experiments in real time, visualize the results, and share their findings with others. With Comet, users can quickly identify issues with their models, optimize performance, and collaborate with team members. It\u2019s particularly useful for CV models, where accuracy and performance are critical to success.<\/p>\n<h2 id=\"416b\" class=\"nh ni fr be nj nk nl nm nn no np nq nr mu ns nt nu my nv nw nx nc ny nz oa ob bj\" data-selectable-paragraph=\"\"><strong class=\"al\">About Kangas<\/strong><\/h2>\n<p id=\"eb3a\" class=\"pw-post-body-paragraph mk ml fr be b mm oc mo mp mq od ms mt mu oe mw mx my of na nb nc og ne nf ng fk bj\" data-selectable-paragraph=\"\">Kangas is a robust platform for monitoring and analyzing structured and unstructured data. By using Kangas and Comet together, users can get a complete picture of their models\u2019 performance, identify issues quickly, and collaborate with team members to optimize results.<\/p>\n<h1 id=\"1316\" class=\"oh ni fr be nj oi oj ok nn ol om on nr oo op oq or os ot ou ov ow ox oy oz pa bj\" data-selectable-paragraph=\"\">How to Use Kangas and Comet Together<\/h1>\n<p id=\"41d1\" class=\"pw-post-body-paragraph mk ml fr be b mm oc mo mp mq od ms mt mu oe mw mx my of na nb nc og ne nf ng fk bj\" data-selectable-paragraph=\"\">Using Kangas and Comet together provides users with a complete picture of their models\u2019 performance. By tracking key metrics and visualizing the results, users can quickly identify issues that may impact accuracy and optimize performance over time.<\/p>\n<p id=\"452c\" class=\"pw-post-body-paragraph mk ml fr be b mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng fk bj\" data-selectable-paragraph=\"\">To get started, you\u2019ll need to set up your environment. Then, you can start tracking metrics and visualizing the results using the intuitive user interfaces of both tools. This makes it easy to identify trends and patterns that may impact performance, and collaborate with team members to optimize results.<\/p>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"fk fl fm fn fo\">\n<div class=\"ab ca\">\n<div class=\"ch bg ew ex ey ez\">\n<blockquote class=\"pj\"><p id=\"6998\" class=\"pk pl fr be pm pn po pp pq pr ps ng dw\" data-selectable-paragraph=\"\">The most important thing to keep in mind when building and deploying your model? Understanding your end-goal. <a class=\"af pt\" href=\"https:\/\/www.comet.com\/site\/blog\/industry-qa-where-most-machine-learning-projects-fail\/?utm_source=heartbeat&amp;utm_medium=referral&amp;utm_campaign=AMS_US_EN_AWA_heartbeat_CTA\" target=\"_blank\" rel=\"noopener ugc nofollow\">Read our interview with ML experts from Stanford, Google, and HuggingFace to learn more<\/a>.<\/p><\/blockquote>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"fk fl fm fn fo\">\n<div class=\"ab ca\">\n<div class=\"ch bg ew ex ey ez\">\n<h2 id=\"34c7\" class=\"nh ni fr be nj nk nl nm nn no np nq nr mu ns nt nu my nv nw nx nc ny nz oa ob bj\" data-selectable-paragraph=\"\"><strong class=\"al\">About The Dataset<\/strong><\/h2>\n<p id=\"7ca8\" class=\"pw-post-body-paragraph mk ml fr be b mm oc mo mp mq od ms mt mu oe mw mx my of na nb nc og ne nf ng fk bj\" data-selectable-paragraph=\"\">Today, we\u2019re using the bean dataset, which is a collection of pictures of beans that were captured outdoors with smartphones. It has three classes: two for diseases and one for healthy bean plants. In this blog, we\u2019ll attempt to differentiate between healthy and unhealthy bean leaves. You can get the data <a class=\"af pt\" href=\"http:\/\/huggingface.co\/datasets\/nateraw\/beans\" target=\"_blank\" rel=\"noopener ugc nofollow\">here<\/a>.<\/p>\n<h2 id=\"ce85\" class=\"nh ni fr be nj nk nl nm nn no np nq nr mu ns nt nu my nv nw nx nc ny nz oa ob bj\" data-selectable-paragraph=\"\"><strong class=\"al\">Getting Started<\/strong><\/h2>\n<p id=\"2f26\" class=\"pw-post-body-paragraph mk ml fr be b mm oc mo mp mq od ms mt mu oe mw mx my of na nb nc og ne nf ng fk bj\" data-selectable-paragraph=\"\">The first step is to install all the needed libraries.<\/p>\n<pre class=\"pu pv pw px py pz qa qb bo qc ba bj\"><span id=\"daeb\" class=\"qd ni fr qa b bf qe qf l qg qh\" data-selectable-paragraph=\"\">!pip3 install comet_ml --q\n<span class=\"hljs-keyword\">from<\/span> comet_ml <span class=\"hljs-keyword\">import<\/span> Experiment\n\ncomet_ml.login(api_key= <span class=\"hljs-string\">\"YOUR-COMET-API-KEY\"<\/span>,\n              project_name= <span class=\"hljs-string\">\"my-project\"<\/span>)\nexperiment = comet_ml.Experiment()\n\n!pip install kangas torch datasets transformers scikit-learn --q\n<span class=\"hljs-keyword\">import<\/span> kangas <span class=\"hljs-keyword\">as<\/span> kg\n<span class=\"hljs-keyword\">import<\/span> tensorflow <span class=\"hljs-keyword\">as<\/span> tf\n<span class=\"hljs-keyword\">import<\/span> matplotlib.pyplot <span class=\"hljs-keyword\">as<\/span> plt\n<span class=\"hljs-keyword\">import<\/span> numpy <span class=\"hljs-keyword\">as<\/span> np\n<span class=\"hljs-keyword\">from<\/span> tqdm <span class=\"hljs-keyword\">import<\/span> tqdm\n<span class=\"hljs-keyword\">from<\/span> tensorflow <span class=\"hljs-keyword\">import<\/span> keras\n<span class=\"hljs-keyword\">from<\/span> tensorflow.keras <span class=\"hljs-keyword\">import<\/span> datasets, layers, models\n<span class=\"hljs-keyword\">from<\/span> datasets <span class=\"hljs-keyword\">import<\/span> load_dataset<\/span><\/pre>\n<p id=\"05cb\" class=\"pw-post-body-paragraph mk ml fr be b mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng fk bj\" data-selectable-paragraph=\"\">Next we load the dataset:<\/p>\n<pre class=\"pu pv pw px py pz qa qb bo qc ba bj\"><span id=\"69d4\" class=\"qd ni fr qa b bf qe qf l qg qh\" data-selectable-paragraph=\"\">dataset = load_dataset(<span class=\"hljs-string\">\"beans\"<\/span>, split=<span class=\"hljs-string\">\"train\"<\/span>)<\/span><\/pre>\n<p id=\"2326\" class=\"pw-post-body-paragraph mk ml fr be b mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng fk bj\" data-selectable-paragraph=\"\">We then instantiate a Kangas DataGrid using our dataset:<\/p>\n<pre class=\"pu pv pw px py pz qa qb bo qc ba bj\"><span id=\"441c\" class=\"qd ni fr qa b bf qe qf l qg qh\" data-selectable-paragraph=\"\">dg = kg.DataGrid(dataset)<\/span><\/pre>\n<p id=\"d3df\" class=\"pw-post-body-paragraph mk ml fr be b mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng fk bj\" data-selectable-paragraph=\"\">To show what\u2019s in our DataGrid, we use the <code class=\"cw qi qj qk qa b\">.show()<\/code> method:<\/p>\n<pre class=\"pu pv pw px py pz qa qb bo qc ba bj\"><span id=\"8664\" class=\"qd ni fr qa b bf qe qf l qg qh\" data-selectable-paragraph=\"\">dg.show()<\/span><\/pre>\n<figure class=\"pu pv pw px py md lv lw paragraph-image\">\n<div class=\"me mf ee mg bg mh\" tabindex=\"0\" role=\"button\">\n<figure><img loading=\"lazy\" decoding=\"async\" class=\"bg mi mj c\" role=\"presentation\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:700\/1*rpbzT85t3jiyqIYbILoVww.jpeg\" alt=\"\" width=\"700\" height=\"271\"><\/figure><div class=\"lv lw ql\"><picture><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/format:webp\/1*rpbzT85t3jiyqIYbILoVww.jpeg 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*rpbzT85t3jiyqIYbILoVww.jpeg 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/format:webp\/1*rpbzT85t3jiyqIYbILoVww.jpeg 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/format:webp\/1*rpbzT85t3jiyqIYbILoVww.jpeg 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/format:webp\/1*rpbzT85t3jiyqIYbILoVww.jpeg 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/format:webp\/1*rpbzT85t3jiyqIYbILoVww.jpeg 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/format:webp\/1*rpbzT85t3jiyqIYbILoVww.jpeg 1400w\" type=\"image\/webp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\"><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/1*rpbzT85t3jiyqIYbILoVww.jpeg 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/1*rpbzT85t3jiyqIYbILoVww.jpeg 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/1*rpbzT85t3jiyqIYbILoVww.jpeg 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/1*rpbzT85t3jiyqIYbILoVww.jpeg 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/1*rpbzT85t3jiyqIYbILoVww.jpeg 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/1*rpbzT85t3jiyqIYbILoVww.jpeg 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*rpbzT85t3jiyqIYbILoVww.jpeg 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" data-testid=\"og\"><\/picture><\/div>\n<\/div>\n<\/figure>\n<p id=\"aa90\" class=\"pw-post-body-paragraph mk ml fr be b mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng fk bj\" data-selectable-paragraph=\"\">Once the dataset is loaded, we begin to investigate its filtering and group-by capabilities. In particular, we examine the bean leaf images to identify any discernible differences. We observe that the leaves labeled 0 and 1 exhibit signs of disease, while the leaves labeled 2 appear to be healthy.<\/p>\n<figure class=\"pu pv pw px py md lv lw paragraph-image\">\n<div class=\"me mf ee mg bg mh\" tabindex=\"0\" role=\"button\">\n<figure><img loading=\"lazy\" decoding=\"async\" class=\"bg mi mj c\" role=\"presentation\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:700\/1*1Yv3U95DjKtPH6am5JjUZA.jpeg\" alt=\"\" width=\"700\" height=\"272\"><\/figure><div class=\"lv lw qm\"><picture><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/format:webp\/1*1Yv3U95DjKtPH6am5JjUZA.jpeg 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*1Yv3U95DjKtPH6am5JjUZA.jpeg 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/format:webp\/1*1Yv3U95DjKtPH6am5JjUZA.jpeg 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/format:webp\/1*1Yv3U95DjKtPH6am5JjUZA.jpeg 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/format:webp\/1*1Yv3U95DjKtPH6am5JjUZA.jpeg 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/format:webp\/1*1Yv3U95DjKtPH6am5JjUZA.jpeg 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/format:webp\/1*1Yv3U95DjKtPH6am5JjUZA.jpeg 1400w\" type=\"image\/webp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\"><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/1*1Yv3U95DjKtPH6am5JjUZA.jpeg 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/1*1Yv3U95DjKtPH6am5JjUZA.jpeg 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/1*1Yv3U95DjKtPH6am5JjUZA.jpeg 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/1*1Yv3U95DjKtPH6am5JjUZA.jpeg 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/1*1Yv3U95DjKtPH6am5JjUZA.jpeg 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/1*1Yv3U95DjKtPH6am5JjUZA.jpeg 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*1Yv3U95DjKtPH6am5JjUZA.jpeg 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" data-testid=\"og\"><\/picture><\/div>\n<\/div>\n<\/figure>\n<p id=\"063b\" class=\"pw-post-body-paragraph mk ml fr be b mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng fk bj\" data-selectable-paragraph=\"\">The photographs are then organized into each label using the \u201cgroup-by\u201d feature of the Kangas UI.<\/p>\n<p id=\"9da1\" class=\"pw-post-body-paragraph mk ml fr be b mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng fk bj\" data-selectable-paragraph=\"\">We then go to building the ML model so we can track using Comet.<\/p>\n<pre class=\"pu pv pw px py pz qa qb bo qc ba bj\"><span id=\"7c48\" class=\"qd ni fr qa b bf qe qf l qg qh\" data-selectable-paragraph=\"\">df = pd.DataFrame(dataset)\nselected_columns = df.columns[:<span class=\"hljs-number\">100<\/span>] <span class=\"hljs-comment\"># Select the first 100 columns<\/span>\ndf = df[selected_columns] <span class=\"hljs-comment\"># Subset the dataframe to include only the selected columns<\/span>\ny_train = y_train.reshape(-<span class=\"hljs-number\">1<\/span>)\ny_train[:<span class=\"hljs-number\">5<\/span>]<\/span><\/pre>\n<p id=\"7bfc\" class=\"pw-post-body-paragraph mk ml fr be b mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng fk bj\" data-selectable-paragraph=\"\">In the above code block, <code class=\"cw qi qj qk qa b\">y_train = y_train.reshape(-1)<\/code> reshapes the array <code class=\"cw qi qj qk qa b\">y_train<\/code> to a one-dimensional array.<\/p>\n<p id=\"6aa0\" class=\"pw-post-body-paragraph mk ml fr be b mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng fk bj\" data-selectable-paragraph=\"\">The second line of code <code class=\"cw qi qj qk qa b\">y_train[:5]<\/code> selects the first five elements of the newly reshaped <code class=\"cw qi qj qk qa b\">y_train<\/code> array and returns them.<\/p>\n<p id=\"6b36\" class=\"pw-post-body-paragraph mk ml fr be b mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng fk bj\" data-selectable-paragraph=\"\">We then divide the beans dataset into classes.<\/p>\n<pre class=\"pu pv pw px py pz qa qb bo qc ba bj\"><span id=\"90ce\" class=\"qd ni fr qa b bf qe qf l qg qh\" data-selectable-paragraph=\"\">classes = [ <span class=\"hljs-string\">'angular leaf spot'<\/span>, <span class=\"hljs-string\">'bean rust'<\/span>, <span class=\"hljs-string\">'healthy'<\/span>]<\/span><\/pre>\n<p id=\"bbdc\" class=\"pw-post-body-paragraph mk ml fr be b mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng fk bj\" data-selectable-paragraph=\"\">The code below defines a function called <code class=\"cw qi qj qk qa b\">plot_sample<\/code> that takes three arguments: a numpy array containing image data samples <code class=\"cw qi qj qk qa b\">X<\/code>, a numpy array containing labels for each sample in <code class=\"cw qi qj qk qa b\">y<\/code>, and an integer index <code class=\"cw qi qj qk qa b\">index<\/code> indicating which sample to plot. The function converts the index to an integer, rounds it, and creates a new figure with dimensions 15&#215;2. It then displays the image corresponding to the selected sample and sets the x-axis label to the class label of the selected sample. The class labels are obtained from a dictionary called <code class=\"cw qi qj qk qa b\">classes<\/code>.<\/p>\n<pre class=\"pu pv pw px py pz qa qb bo qc ba bj\"><span id=\"7eaa\" class=\"qd ni fr qa b bf qe qf l qg qh\" data-selectable-paragraph=\"\"><span class=\"hljs-keyword\">def<\/span> <span class=\"hljs-title.function\">plot_sample<\/span>(<span class=\"hljs-params\">X, y, index<\/span>):\n    index = np.<span class=\"hljs-built_in\">round<\/span>(index).astype(<span class=\"hljs-built_in\">int<\/span>)\n    plt.figure(figsize = (<span class=\"hljs-number\">15<\/span>,<span class=\"hljs-number\">2<\/span>))\n    plt.imshow(X[index])\n    plt.xlabel(classes[y[index]])<\/span><\/pre>\n<figure class=\"pu pv pw px py md lv lw paragraph-image\">\n<figure><img loading=\"lazy\" decoding=\"async\" class=\"bg mi mj c\" role=\"presentation\" src=\"https:\/\/miro.medium.com\/v2\/resize:fit:148\/1*iwEIEp5vlAqfhImEIQXMpA.png\" alt=\"\" width=\"148\" height=\"155\"><\/figure><div class=\"lv lw qn\"><picture><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/format:webp\/1*iwEIEp5vlAqfhImEIQXMpA.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*iwEIEp5vlAqfhImEIQXMpA.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/format:webp\/1*iwEIEp5vlAqfhImEIQXMpA.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/format:webp\/1*iwEIEp5vlAqfhImEIQXMpA.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/format:webp\/1*iwEIEp5vlAqfhImEIQXMpA.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/format:webp\/1*iwEIEp5vlAqfhImEIQXMpA.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:296\/format:webp\/1*iwEIEp5vlAqfhImEIQXMpA.png 296w\" type=\"image\/webp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 148px\"><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/1*iwEIEp5vlAqfhImEIQXMpA.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/1*iwEIEp5vlAqfhImEIQXMpA.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/1*iwEIEp5vlAqfhImEIQXMpA.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/1*iwEIEp5vlAqfhImEIQXMpA.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/1*iwEIEp5vlAqfhImEIQXMpA.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/1*iwEIEp5vlAqfhImEIQXMpA.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:296\/1*iwEIEp5vlAqfhImEIQXMpA.png 296w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 148px\" data-testid=\"og\"><\/picture><\/div><figcaption class=\"qo qp qq lv lw qr qs be b bf z dw\" data-selectable-paragraph=\"\">Fig 1<\/figcaption><\/figure>\n<p id=\"34d9\" class=\"pw-post-body-paragraph mk ml fr be b mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng fk bj\" data-selectable-paragraph=\"\">After viewing the various categories of leaves we then start building our ML model.<\/p>\n<pre class=\"pu pv pw px py pz qa qb bo qc ba bj\"><span id=\"88d9\" class=\"qd ni fr qa b bf qe qf l qg qh\" data-selectable-paragraph=\"\"><span class=\"hljs-keyword\">from<\/span> tensorflow <span class=\"hljs-keyword\">import<\/span> keras\n<span class=\"hljs-keyword\">from<\/span> tensorflow.keras <span class=\"hljs-keyword\">import<\/span> layers\n\nmodel = keras.Sequential([\n    layers.Conv2D(filters=<span class=\"hljs-number\">32<\/span>, kernel_size=(<span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">3<\/span>), activation=<span class=\"hljs-string\">'relu'<\/span>, input_shape=(<span class=\"hljs-number\">500<\/span>, <span class=\"hljs-number\">500<\/span>, <span class=\"hljs-number\">3<\/span>)),\n    layers.MaxPooling2D((<span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">2<\/span>)),\n\n    layers.Conv2D(filters=<span class=\"hljs-number\">64<\/span>, kernel_size=(<span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">3<\/span>), activation=<span class=\"hljs-string\">'relu'<\/span>),\n    layers.MaxPooling2D((<span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">2<\/span>)),\n\n    layers.Conv2D(filters=<span class=\"hljs-number\">128<\/span>, kernel_size=(<span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">3<\/span>), activation=<span class=\"hljs-string\">'relu'<\/span>),\n    layers.MaxPooling2D((<span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">2<\/span>)),\n\n    layers.Flatten(),\n    layers.Dense(<span class=\"hljs-number\">256<\/span>, activation=<span class=\"hljs-string\">'relu'<\/span>),\n    layers.Dense(<span class=\"hljs-number\">3<\/span>, activation=<span class=\"hljs-string\">'softmax'<\/span>)\n])<span class=\"hljs-keyword\">from<\/span> tensorflow <span class=\"hljs-keyword\">import<\/span> keras\n<span class=\"hljs-keyword\">from<\/span> tensorflow.keras <span class=\"hljs-keyword\">import<\/span> layers\n\nmodel = keras.Sequential([\n    layers.Conv2D(filters=<span class=\"hljs-number\">32<\/span>, kernel_size=(<span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">3<\/span>), activation=<span class=\"hljs-string\">'relu'<\/span>, input_shape=(<span class=\"hljs-number\">500<\/span>, <span class=\"hljs-number\">500<\/span>, <span class=\"hljs-number\">3<\/span>)),\n    layers.MaxPooling2D((<span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">2<\/span>)),\n\n    layers.Conv2D(filters=<span class=\"hljs-number\">64<\/span>, kernel_size=(<span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">3<\/span>), activation=<span class=\"hljs-string\">'relu'<\/span>),\n    layers.MaxPooling2D((<span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">2<\/span>)),\n\n    layers.Conv2D(filters=<span class=\"hljs-number\">128<\/span>, kernel_size=(<span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">3<\/span>), activation=<span class=\"hljs-string\">'relu'<\/span>),\n    layers.MaxPooling2D((<span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">2<\/span>)),\n\n    layers.Flatten(),\n    layers.Dense(<span class=\"hljs-number\">256<\/span>, activation=<span class=\"hljs-string\">'relu'<\/span>),\n    layers.Dense(<span class=\"hljs-number\">3<\/span>, activation=<span class=\"hljs-string\">'softmax'<\/span>)\n])<\/span><\/pre>\n<p id=\"5553\" class=\"pw-post-body-paragraph mk ml fr be b mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng fk bj\" data-selectable-paragraph=\"\">To extract important features from input images, the model starts with a convolutional layer that uses 32 filters of size 3&#215;3. ReLU activation function is used to deal with non-linearity. The input shape is set to (500, 500, 3), which indicates that the input image is 500&#215;500 pixels with 3 color channels.<\/p>\n<p id=\"dcd4\" class=\"pw-post-body-paragraph mk ml fr be b mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng fk bj\" data-selectable-paragraph=\"\">To reduce the input image size, a max pooling layer with a pool size of 2&#215;2 is added to the model.<\/p>\n<p id=\"76fc\" class=\"pw-post-body-paragraph mk ml fr be b mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng fk bj\" data-selectable-paragraph=\"\">This process is then repeated two more times, with 64 and 128 filters in each convolutional layer. A max pooling layer with a pool size of 2&#215;2 is added after each convolutional layer.<\/p>\n<p id=\"b083\" class=\"pw-post-body-paragraph mk ml fr be b mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng fk bj\" data-selectable-paragraph=\"\">The output from the convolutional layers is then converted into a 1D feature vector using a flatten layer. Then, two fully connected layers (Dense) are added to the model, with the first layer having 256 nodes and the second layer having 3 nodes. ReLU activation function is used for the first dense layer, and softmax activation function is used for the last layer.<\/p>\n<p id=\"9dc3\" class=\"pw-post-body-paragraph mk ml fr be b mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng fk bj\" data-selectable-paragraph=\"\">In multi-class classification problems, the softmax function helps normalize the output and gives a probability distribution across all classes.<\/p>\n<p id=\"0b8f\" class=\"pw-post-body-paragraph mk ml fr be b mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng fk bj\" data-selectable-paragraph=\"\">The next step involves compiling the model. This is where the network architecture is configured, and the learning process is initialized with parameters such as the loss function, optimizer, and performance metrics.<\/p>\n<pre class=\"pu pv pw px py pz qa qb bo qc ba bj\"><span id=\"238d\" class=\"qd ni fr qa b bf qe qf l qg qh\" data-selectable-paragraph=\"\">model.<span class=\"hljs-built_in\">compile<\/span>(loss=<span class=\"hljs-string\">'categorical_crossentropy'<\/span>,\n              optimizer=<span class=\"hljs-string\">'adam'<\/span>,\n              metrics=[<span class=\"hljs-string\">'accuracy'<\/span>])<\/span><\/pre>\n<p id=\"51e4\" class=\"pw-post-body-paragraph mk ml fr be b mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng fk bj\" data-selectable-paragraph=\"\">The above code is a crucial step in configuring a neural network model for training and evaluation. It specifies the loss function, optimizer, and performance metrics that will be used during the learning process, and helps to ensure that the model is optimized for the specific problem at hand.<\/p>\n<pre class=\"pu pv pw px py pz qa qb bo qc ba bj\"><span id=\"57f8\" class=\"qd ni fr qa b bf qe qf l qg qh\" data-selectable-paragraph=\"\"><span class=\"hljs-keyword\">from<\/span> datasets <span class=\"hljs-keyword\">import<\/span> load_dataset\n<span class=\"hljs-keyword\">from<\/span> tensorflow.keras.utils <span class=\"hljs-keyword\">import<\/span> to_categorical\n\n<span class=\"hljs-comment\"># Load the \"beans\" dataset<\/span>\ndataset = load_dataset(<span class=\"hljs-string\">\"beans\"<\/span>, split=<span class=\"hljs-string\">\"train[:80%]\"<\/span>)\nval_dataset = load_dataset(<span class=\"hljs-string\">\"beans\"<\/span>, split=<span class=\"hljs-string\">\"train[80%:]\"<\/span>)\n\n<span class=\"hljs-comment\"># Convert the input images to NumPy arrays<\/span>\nX_train = np.array([np.array(image) <span class=\"hljs-keyword\">for<\/span> image <span class=\"hljs-keyword\">in<\/span> dataset[<span class=\"hljs-string\">'image'<\/span>]])\nX_val = np.array([np.array(image) <span class=\"hljs-keyword\">for<\/span> image <span class=\"hljs-keyword\">in<\/span> val_dataset[<span class=\"hljs-string\">'image'<\/span>]])\n\n<span class=\"hljs-comment\"># Convert the target labels to NumPy arrays and one-hot encode them<\/span>\ny_train = to_categorical(np.array(dataset[<span class=\"hljs-string\">'labels'<\/span>]))\ny_val = to_categorical(np.array(val_dataset[<span class=\"hljs-string\">'labels'<\/span>]))\n\n<span class=\"hljs-comment\"># Compile the model<\/span>\nmodel.<span class=\"hljs-built_in\">compile<\/span>(loss=<span class=\"hljs-string\">'categorical_crossentropy'<\/span>,\n              optimizer=<span class=\"hljs-string\">'adam'<\/span>,\n              metrics=[<span class=\"hljs-string\">'accuracy'<\/span>])\n\n<span class=\"hljs-comment\"># Train the model<\/span>\nhistory = model.fit(X_train, y_train, batch_size=<span class=\"hljs-number\">32<\/span>, epochs=<span class=\"hljs-number\">10<\/span>, validation_data=(X_val, y_val))<\/span><\/pre>\n<p id=\"565d\" class=\"pw-post-body-paragraph mk ml fr be b mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng fk bj\" data-selectable-paragraph=\"\">The above code loads the dataset, splits it into training and validation data, converts the input images and target labels to NumPy arrays, compiles the model with the chosen optimizer, loss function, and metrics, and finally trains the model using the training data and validates it on the validation data. The training process is saved to the \u2018history\u2019 variable. This code demonstrates how to train a machine learning model on the \u201cbeans\u201d dataset using the Keras library. It loads the dataset, splits it into training and validation data, converts the input images and target labels to NumPy arrays, compiles the model with the chosen optimizer, loss function, and metrics, and finally trains the model using the training data and validates it on the validation data. The training process is saved to the \u2018history\u2019 variable.<\/p>\n<p id=\"ab47\" class=\"pw-post-body-paragraph mk ml fr be b mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng fk bj\" data-selectable-paragraph=\"\">The next step involves evaluating the performance of a machine learning model on a validation dataset and logging the evaluation metrics<\/p>\n<pre class=\"pu pv pw px py pz qa qb bo qc ba bj\"><span id=\"6dee\" class=\"qd ni fr qa b bf qe qf l qg qh\" data-selectable-paragraph=\"\">loss, accuracy = model.evaluate(X_val,y_val)\n<span class=\"hljs-built_in\">print<\/span>(<span class=\"hljs-string\">\"Loss: \"<\/span>, loss)\n<span class=\"hljs-built_in\">print<\/span>(<span class=\"hljs-string\">\"Accuracy: \"<\/span>, accuracy)\n\nexperiment.log_metric(<span class=\"hljs-string\">\"Loss\"<\/span>, loss, step=<span class=\"hljs-literal\">None<\/span>, include_context=<span class=\"hljs-literal\">True<\/span>)\nexperiment.log_metric(<span class=\"hljs-string\">\"Accuracy\"<\/span>, accuracy, step=<span class=\"hljs-literal\">None<\/span>, include_context=<span class=\"hljs-literal\">True<\/span>)<\/span><\/pre>\n<p id=\"1908\" class=\"pw-post-body-paragraph mk ml fr be b mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng fk bj\" data-selectable-paragraph=\"\">The above code logs the evaluation metrics using a library called Comet for experiment tracking. The <code class=\"cw qi qj qk qa b\">model.evaluate()<\/code> function calculates the loss and accuracy of the model on the validation dataset. The calculated loss and accuracy values are then logged using the <code class=\"cw qi qj qk qa b\">experiment.log_metric()<\/code> function of the Comet library. This function logs the metric name, value, and context of the current experiment if required. Overall, the code evaluates the model&#8217;s performance, prints the results, and logs them using a library for experiment tracking.<\/p>\n<p id=\"9672\" class=\"pw-post-body-paragraph mk ml fr be b mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng fk bj\" data-selectable-paragraph=\"\">We then save our model and log it to Comet.<\/p>\n<pre class=\"pu pv pw px py pz qa qb bo qc ba bj\"><span id=\"afa2\" class=\"qd ni fr qa b bf qe qf l qg qh\" data-selectable-paragraph=\"\">model.save(<span class=\"hljs-string\">'model'<\/span>)\nexperiment.log_model(model, <span class=\"hljs-string\">'model'<\/span>)<\/span><\/pre>\n<p id=\"baa4\" class=\"pw-post-body-paragraph mk ml fr be b mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng fk bj\" data-selectable-paragraph=\"\">Finally, we view our logged model in comet.<\/p>\n<figure class=\"pu pv pw px py md\">\n<div class=\"qt ii l ee\">\n<div class=\"qu qv l\"><iframe loading=\"lazy\" class=\"eo n ff dy bg\" title=\"Kangas vs Comet\" src=\"https:\/\/cdn.embedly.com\/widgets\/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FPtMjE69vYdc%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DPtMjE69vYdc&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube\" width=\"854\" height=\"480\" frameborder=\"0\" scrolling=\"no\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/div>\n<\/div>\n<\/figure>\n<h1 id=\"17fc\" class=\"oh ni fr be nj oi oj ok nn ol om on nr oo op oq or os ot ou ov ow ox oy oz pa bj\" data-selectable-paragraph=\"\">Conclusion<\/h1>\n<p id=\"9e75\" class=\"pw-post-body-paragraph mk ml fr be b mm oc mo mp mq od ms mt mu oe mw mx my of na nb nc og ne nf ng fk bj\" data-selectable-paragraph=\"\">In conclusion, monitoring the performance of machine learning models is crucial for ensuring accuracy and reliability. Kangas and Comet are two popular tools that can be used to monitor and visualize the performance of your models. These tools allow developers and data scientists to track various performance metrics, analyze model predictions, and identify potential issues or errors. With Kangas and Comet, even beginners can easily monitor their models and make informed decisions to improve their performance. By adopting these tools, developers can ensure that their models perform optimally and provide accurate and reliable results for various tasks.<\/p>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Computer Vision (CV) is a rapidly growing field that is transforming the way we interact with technology. As more and more companies adopt computer vision models for various applications, it has become increasingly important to monitor the performance of these models over time to ensure they continue to deliver accurate results. In this article, we\u2019ll [&hellip;]<\/p>\n","protected":false},"author":99,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"customer_name":"","customer_description":"","customer_industry":"","customer_technologies":"","customer_logo":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[9,7],"tags":[],"coauthors":[197],"class_list":["post-8073","post","type-post","status-publish","format-standard","hentry","category-product","category-tutorials"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Monitoring Your CV Model: A Beginner\u2019s Guide Using Kangas and Comet - Comet<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.comet.com\/site\/blog\/monitoring-your-cv-model-a-beginners-guide-using-kangas-and-comet\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Monitoring Your CV Model: A Beginner\u2019s Guide Using Kangas and Comet\" \/>\n<meta property=\"og:description\" content=\"Computer Vision (CV) is a rapidly growing field that is transforming the way we interact with technology. As more and more companies adopt computer vision models for various applications, it has become increasingly important to monitor the performance of these models over time to ensure they continue to deliver accurate results. In this article, we\u2019ll [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.comet.com\/site\/blog\/monitoring-your-cv-model-a-beginners-guide-using-kangas-and-comet\" \/>\n<meta property=\"og:site_name\" content=\"Comet\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/cometdotml\" \/>\n<meta property=\"article:published_time\" content=\"2023-11-02T17:28:35+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-04-24T17:04:55+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/miro.medium.com\/v2\/resize:fit:700\/1*LvCz2FaojU7W9-fPfXfUkA.png\" \/>\n<meta name=\"author\" content=\"Jeremiah Oluseye\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@Cometml\" \/>\n<meta name=\"twitter:site\" content=\"@Cometml\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jeremiah Oluseye\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Monitoring Your CV Model: A Beginner\u2019s Guide Using Kangas and Comet - Comet","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.comet.com\/site\/blog\/monitoring-your-cv-model-a-beginners-guide-using-kangas-and-comet","og_locale":"en_US","og_type":"article","og_title":"Monitoring Your CV Model: A Beginner\u2019s Guide Using Kangas and Comet","og_description":"Computer Vision (CV) is a rapidly growing field that is transforming the way we interact with technology. As more and more companies adopt computer vision models for various applications, it has become increasingly important to monitor the performance of these models over time to ensure they continue to deliver accurate results. In this article, we\u2019ll [&hellip;]","og_url":"https:\/\/www.comet.com\/site\/blog\/monitoring-your-cv-model-a-beginners-guide-using-kangas-and-comet","og_site_name":"Comet","article_publisher":"https:\/\/www.facebook.com\/cometdotml","article_published_time":"2023-11-02T17:28:35+00:00","article_modified_time":"2025-04-24T17:04:55+00:00","og_image":[{"url":"https:\/\/miro.medium.com\/v2\/resize:fit:700\/1*LvCz2FaojU7W9-fPfXfUkA.png","type":"","width":"","height":""}],"author":"Jeremiah Oluseye","twitter_card":"summary_large_image","twitter_creator":"@Cometml","twitter_site":"@Cometml","twitter_misc":{"Written by":"Jeremiah Oluseye","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.comet.com\/site\/blog\/monitoring-your-cv-model-a-beginners-guide-using-kangas-and-comet#article","isPartOf":{"@id":"https:\/\/www.comet.com\/site\/blog\/monitoring-your-cv-model-a-beginners-guide-using-kangas-and-comet\/"},"author":{"name":"Jeremiah Oluseye","@id":"https:\/\/www.comet.com\/site\/#\/schema\/person\/73f233b4e35ab400cb753ebd29e58621"},"headline":"Monitoring Your CV Model: A Beginner\u2019s Guide Using Kangas and Comet","datePublished":"2023-11-02T17:28:35+00:00","dateModified":"2025-04-24T17:04:55+00:00","mainEntityOfPage":{"@id":"https:\/\/www.comet.com\/site\/blog\/monitoring-your-cv-model-a-beginners-guide-using-kangas-and-comet\/"},"wordCount":1345,"publisher":{"@id":"https:\/\/www.comet.com\/site\/#organization"},"image":{"@id":"https:\/\/www.comet.com\/site\/blog\/monitoring-your-cv-model-a-beginners-guide-using-kangas-and-comet#primaryimage"},"thumbnailUrl":"https:\/\/miro.medium.com\/v2\/resize:fit:700\/1*LvCz2FaojU7W9-fPfXfUkA.png","articleSection":["Product","Tutorials"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.comet.com\/site\/blog\/monitoring-your-cv-model-a-beginners-guide-using-kangas-and-comet\/","url":"https:\/\/www.comet.com\/site\/blog\/monitoring-your-cv-model-a-beginners-guide-using-kangas-and-comet","name":"Monitoring Your CV Model: A Beginner\u2019s Guide Using Kangas and Comet - Comet","isPartOf":{"@id":"https:\/\/www.comet.com\/site\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.comet.com\/site\/blog\/monitoring-your-cv-model-a-beginners-guide-using-kangas-and-comet#primaryimage"},"image":{"@id":"https:\/\/www.comet.com\/site\/blog\/monitoring-your-cv-model-a-beginners-guide-using-kangas-and-comet#primaryimage"},"thumbnailUrl":"https:\/\/miro.medium.com\/v2\/resize:fit:700\/1*LvCz2FaojU7W9-fPfXfUkA.png","datePublished":"2023-11-02T17:28:35+00:00","dateModified":"2025-04-24T17:04:55+00:00","breadcrumb":{"@id":"https:\/\/www.comet.com\/site\/blog\/monitoring-your-cv-model-a-beginners-guide-using-kangas-and-comet#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.comet.com\/site\/blog\/monitoring-your-cv-model-a-beginners-guide-using-kangas-and-comet"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.comet.com\/site\/blog\/monitoring-your-cv-model-a-beginners-guide-using-kangas-and-comet#primaryimage","url":"https:\/\/miro.medium.com\/v2\/resize:fit:700\/1*LvCz2FaojU7W9-fPfXfUkA.png","contentUrl":"https:\/\/miro.medium.com\/v2\/resize:fit:700\/1*LvCz2FaojU7W9-fPfXfUkA.png"},{"@type":"BreadcrumbList","@id":"https:\/\/www.comet.com\/site\/blog\/monitoring-your-cv-model-a-beginners-guide-using-kangas-and-comet#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.comet.com\/site\/"},{"@type":"ListItem","position":2,"name":"Monitoring Your CV Model: A Beginner\u2019s Guide Using Kangas and Comet"}]},{"@type":"WebSite","@id":"https:\/\/www.comet.com\/site\/#website","url":"https:\/\/www.comet.com\/site\/","name":"Comet","description":"Build Better Models Faster","publisher":{"@id":"https:\/\/www.comet.com\/site\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.comet.com\/site\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.comet.com\/site\/#organization","name":"Comet ML, Inc.","alternateName":"Comet","url":"https:\/\/www.comet.com\/site\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.comet.com\/site\/#\/schema\/logo\/image\/","url":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/01\/logo_comet_square.png","contentUrl":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/01\/logo_comet_square.png","width":310,"height":310,"caption":"Comet ML, Inc."},"image":{"@id":"https:\/\/www.comet.com\/site\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/cometdotml","https:\/\/x.com\/Cometml","https:\/\/www.youtube.com\/channel\/UCmN63HKvfXSCS-UwVwmK8Hw"]},{"@type":"Person","@id":"https:\/\/www.comet.com\/site\/#\/schema\/person\/73f233b4e35ab400cb753ebd29e58621","name":"Jeremiah Oluseye","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.comet.com\/site\/#\/schema\/person\/image\/5534a0faf067d6eb66a7f0c328629fbf","url":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2023\/10\/cropped-mBj9qH7g_400x400-96x96.jpg","contentUrl":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2023\/10\/cropped-mBj9qH7g_400x400-96x96.jpg","caption":"Jeremiah Oluseye"},"url":"https:\/\/www.comet.com\/site\/blog\/author\/oluseyejeremiahgmail-com\/"}]}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/posts\/8073","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/users\/99"}],"replies":[{"embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/comments?post=8073"}],"version-history":[{"count":1,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/posts\/8073\/revisions"}],"predecessor-version":[{"id":15472,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/posts\/8073\/revisions\/15472"}],"wp:attachment":[{"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/media?parent=8073"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/categories?post=8073"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/tags?post=8073"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/coauthors?post=8073"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}