Visual Recognition Tutorial with IBM Watson and Python

Date published: July 09, 2018
9 min read
Visual Recognition Tutorial with IBM Watson and Python
Introduction

In the era of digital cameras, with people sharing billions of photos and videos daily, it’s impossible to manage the content manually. Therefore the necessity of automatizing visual recognition has rapidly increased, proportionally with social networks. Image recognition can be used in numerous tasks, such as filtering out explicit content, labeling the content of images with meta-tags and performing image content search. Beyond social media, visual recognition can be used in various other domains: health, to trace visible symptoms on patients and contribute to the diagnostic, environment, to detect problematic areas, road traffic, to avoid accidents and build self-driving cars, and many others.

But while image recognition seems like a simple task for humans, a computer requires deep machine learning to perform this task. IBM Watson, a leader in cognitive computing, offers visual recognition service as API and uses deep learning algorithms to analyze images to give insights into visual content.

In this article, you will learn how to use Watson’s default classifiers for image recognition and create and manage custom classifiers which can analyze images according to the requirements of your application.

Installation

For this purpose you will first need:

  • An IBM Bluemix account (you can sign up here)
  • Python 2.7
  • Virtualenv
  • Pip

After creating the Bluemix account, you need to create a Visual Recognition service. To do this, you need to access Watson from the menu on the left side of the page. Then press the Browse all Watson services button to view the entire list of services. Select Visual Recognition from that list and you will be redirected to the service creation page. Once the service was created, you will be redirected to its dashboard, where you need to access the Service Credentials option on the left menu. After clicking the View Credentials button you will see the API key needed for performing operations through the API.

The next step is to set up your virtualenv and install Watson Developer Cloud using pip:

pip install --upgrade watson-developer-cloud

The watson-developer-cloud version used for this article is 1.4.1.

Standard Classifiers

According to the official documentation, Watson’s Visual Recognition comes with a number of default classification models:

- General model - Default classification from thousands of classes

  • Animals (including birds, reptiles, amphibians, etc.)
  • Person and people-oriented information and activities
  • Food (including cooked food and beverages)
  • Plants (including trees, shrubs, aquatic plants, vegetables)
  • Sports
  • Nature (including many types of natural formations, geological structures)
  • Transportation (land, water, air)
  • And many more, including furnishings, fruits, musical instruments, tools, colors, gadgets, devices, instruments, weapons, buildings, structures and man-made objects, clothing and garments, and flowers, among others.

- Face model - Facial analysis with age and gender
- Explicit model - Whether an image is inappropriate for general use
- Food model - Specifically for images of food items
- Text model - Text extraction from natural scene images

In order to analyze an image or a set of images using the general model criteria, we will use the classify() method.

import json
from watson_developer_cloud import VisualRecognitionV3, \
    WatsonApiException
visual_recognition = VisualRecognitionV3(
    '2016-05-20', api_key='<API key>')
with open('/home/Workspace/RoadSigns/Classify.zip', 'rb') as images_zip:
    try:
        response = visual_recognition.classify(images_zip, threshold=0.0)
        print(json.dumps(response, indent=1))
    except WatsonApiException as ex:
        print "Status code: {}\nError message: {}\nError info: \n{}" \
            .format(ex.code, ex.message, json.dumps(ex.info, indent=1))

First, you need to instantiate VisualRecognitionV3 with the version parameter and the API key. The version parameter is a date in the ‘YYYY-MM-DD’ format and is used to select the API version for that date or the one previous to that date. As for the API key, the version used in this article uses authentication based on the api_key parameter, but Watson is currently being migrated to IAM authentication.

Regarding error handling, for every unsuccessful HTTP response code received, the Python SDK will raise a WatsonApiException containing the HTTP code, the reason message and a dictionary containing further information on the error. For this reason, we will wrap the classifying code in a try except block, followed by printing the information provided by the exception instance.

The classify() method accepts either a JPG/PNG image or a zip file containing at most 20 images. The limit for an image is 10 MB, while a zip file must have less than 100 MB. The filenames must be UTF-8 encoded if they contain non-ASCII characters. The threshold argument is used to filter out classes with scores under the specified number and its default value is 0.5. In order to receive all the possible results, we will set it as 0.0.

Here you can see the output for each image after the default classification:

 


Road Sign

Source: https://secure.i.telegraph.co.uk


{
  "image": "/home/Workspace/RoadSigns/Classify.zip/Classify/give_way.jpg", 
  "classifiers": [
  {
   "classes": [
    {
     "score": 0.708, 
     "class": "no-parking zone"
    }, 
    {
     "score": 0.66, 
     "class": "divided highway", 
     "type_hierarchy": "/road/divided highway"
    }, 
    {
     "score": 0.661, 
     "class": "road"
    }, 
    {
     "score": 0.596, 
     "class": "intersection", 
     "type_hierarchy": "/junction/intersection"
    }, 
    {
     "score": 0.597, 
     "class": "junction"
    }, 
    {
     "score": 0.5, 
     "class": "street sign"
    }, 
    {
     "score": 0.712, 
     "class": "gray color"
    }, 
    {
     "score": 0.521, 
     "class": "maroon color"
    }
   ], 
   "classifier_id": "default", 
   "name": "default"
  }
 ]
}

 

 

Road Sign

Source: https://t4.ftcdn.net

{
  "image": "/home/Workspace/RoadSigns/Classify.zip/Classify/no_overtaking.jpg", 
  "classifiers": [
  {
   "classes": [
    {
     "score": 0.91, 
     "class": "signboard"
    }, 
    {
     "score": 0.538, 
     "class": "no-parking zone"
    }, 
    {
     "score": 0.5, 
     "class": "life buoy", 
     "type_hierarchy": "/rescue equipment/life preserver/life buoy"
    }, 
    {
     "score": 0.54, 
     "class": "life preserver"
    }, 
    {
     "score": 0.54, 
     "class": "rescue equipment"
    }, 
    {
     "score": 0.665, 
     "class": "dark red color"
    }, 
    {
     "score": 0.636, 
     "class": "azure color"
    }
   ], 
   "classifier_id": "default", 
   "name": "default"
  }
 ]
}

 

 

No stop road sign

Source: https://s.toptests.co.uk


{
  "image": "/home/Workspace/RoadSigns/Classify.zip/Classify/no_stopping.jpg",
  "classifiers": [
  {
  "classes": [
    {
    "score": 0.844,
    "class": "street sign"
    },
    {
    "score": 0.766,
    "class": "signboard"
    },
    {
    "score": 0.5,
    "class": "tetraskelion"
    },
    {
    "score": 0.963,
    "class": "reddish orange color"
    }
   ],
   "classifier_id": "default",
   "name": "default"
  }
 ]
}

 

 

 

No waiting except loading and unloading - road sign

 

Source: http://www.asiaone.com

{​
  "image": "/home/Workspace/RoadSigns/Classify.zip/Classify/no_waiting.jpg",
  "classifiers": [
  {
  "classes": [
    {
    "score": 0.592,
    "class": "movie theater",
    "type_hierarchy": "/building/theatre/movie theater"
    },
    {
    "score": 0.68,
    "class": "theatre"
    },
    {
    "score": 0.76,
    "class": "building"
    },
    {
    "score": 0.559,
    "class": "Theater Building"
    },
    {
    "score": 0.526,
    "class": "headquarters",
    "type_hierarchy": "/building/office/headquarters"
    },
    {
    "score": 0.529,
    "class": "office"
    },
    {
    "score": 0.5,
    "class": "signboard"
    },
    {
    "score": 0.721,
    "class": "reddish orange color"
    },
    {
    "score": 0.713,
    "class": "alizarine red color"
    }
  ],
  "classifier_id": "default",
  "name": "default"
  }
 ]
}

As you may have noticed, the results are accurate but they omit the point of interest: recognizing the type of road sign. For this purpose, we will next create a custom classifier containing a class for each type of road sign.

Custom Classifiers

In order to create a custom classifier we are going to use the create_classifier() method.

with open('/home/Workspace/RoadSigns/GiveWay.zip', 'rb') as giveway, \
     open('/home/Workspace/RoadSigns/NoOvertaking.zip', 'rb') as noovertaking,\
     open('/home/Workspace/RoadSigns/NoStopping.zip', 'rb') as nostopping,\
     open('/home/Workspace/RoadSigns/NoWaiting.zip', 'rb') as nowaiting:
    try:
        response = visual_recognition.create_classifier(
            'road_signs',
            giveway_positive_examples=giveway,
            noovertaking_positive_examples=noovertaking,
            nostopping_positive_examples=nostopping,
            nowaiting_positive_examples=nowaiting)
        print(json.dumps(response, indent=2))
    except WatsonApiException as ex:
        print "Status code: {}\nError message: {}\nError info: \n{}" \
            .format(ex.code, ex.message, json.dumps(ex.info, indent=1))

This method requires a string representing the classifier name and a zip with examples of images containing the defined object for each class. The argument name for positive examples will have the following pattern: <class name>_positive_examples. This method also accepts a compressed file containing negative examples, images that do not depict the visual subject of any of the classes of the new classifier. The zip files used for retraining must contain a minimum of 10 images with the minimum recommended resolution 32x32 pixels. The maximum limits for these files are 10.000 images or 100 MB and their names must be UTF-8 encoded if there are any non-ASCII characters.

As a response, we have the following json containing information like the classifier availability status, the created and updated datetimes, the classifier name and ID, which will be later used for classifying images and managing the classifier, and the created classes:


{
  "status": "training",
  "updated": "2018-07-04T23:26:47.806Z",
  "name": "road_signs",
  "created": "2018-07-04T23:26:47.806Z",
  "core_ml_enabled": true,
  "classes": [
	{
  	"class": "nowaiting"
	},
	{
  	"class": "giveway"
	},
	{
  	"class": "nostopping"
	},
	{
  	"class": "noovertaking"
	}
  ],
  "owner": "dff5b9c5-5747-4394-90bf-f637a2cce066",
  "classifier_id": "road_signs_294439632"
}

To get an update on this information, you can use the get_classifier() method, which requires as a parameter the classifier ID and returns the current information about it. This is useful in both classifying images and retraining the classifier to check the classifier status before performing an operation. If the status is still “retraining” the classifying process will not take into account the new retrain data and a new retrain request will fail, as the expected status for this is “ready”.


try:
    response = visual_recognition.get_classifier('road_signs_294439632')
    print (json.dumps(response, indent=1))
except WatsonApiException as ex:
    print "Status code: {}\nError message: {}\nError info: \n{}" \
        .format(ex.code, ex.message, json.dumps(ex.info, indent=1))

You can also use the list_classifiers() method to get an update on the status of all your classifiers.


try:
    response = visual_recognition.list_classifiers()
    print (json.dumps(response, indent=1))
except WatsonApiException as ex:
    print "Status code: {}\nError message: {}\nError info: \n{}" \
        .format(ex.code, ex.message, json.dumps(ex.info, indent=1))
{
 "classifiers": [
  {
   "status": "ready",
   "classifier_id": "road_signs_294439632",
   "name": "road_signs"
  }
 ]
}

If you wish to retrieve the complete information on every classifier, set the verbose argument for this method to True, as it will return the brief version by default. 

The retraining can be done using the update_classifier() method, which is very similar to create_classifier(), except it expects an existing classifier ID instead of the name of a new one.


with open('/home/Workspace/RoadSigns/GiveWay.zip', 'rb') as giveway, \
     open('/home/Workspace/RoadSigns/NoOvertaking.zip', 'rb') as noovertaking,\
     open('/home/Workspace/RoadSigns/NoStopping.zip', 'rb') as nostopping,\
     open('/home/Workspace/RoadSigns/NoWaiting.zip', 'rb') as nowaiting:
    try:
        response = visual_recognition.update_classifier(
            classifier_id='road_signs_294439632',
            giveway_positive_examples=giveway,
            noovertaking_positive_examples=noovertaking,
            nostopping_positive_examples=nostopping,
            nowaiting_positive_examples=nowaiting)
        print(json.dumps(response, indent=2))
   except WatsonApiException as ex:
       print "Status code: {}\nError message: {}\nError info: \n{}" \
           .format(ex.code, ex.message, json.dumps(ex.info, indent=1))

An important aspect to take into account when retraining a classifier is that deep learning models learn through observation, therefore everything they know is based on the retrain data they receive. That’s why the size of the data set and its diversity are essential for a higher accuracy. Images with different lighting, angle, focus, color, shape, distance from subject, and presence of other objects are recommended for a better learning.

If we repeat the classification made previously using the general model, but this time using the classifier we just created, we will notice that the results are focused on the subject we need to identify - road signs in this case.  

with open('/home/Workspace/RoadSigns/Classify.zip', 'rb') as images_zip:
    try:
        response = visual_recognition.classify(
            images_zip, threshold=0.0,
            classifier_ids='road_signs_294439632')
    except WatsonApiException as ex:
       print "Status code: {}\nError message: {}\nError info: \n{}" \
           .format(ex.code, ex.message, json.dumps(ex.info, indent=1))
print (json.dumps(response, indent=1))

 

 

Road sign

Source:https://secure.i.telegraph.co.uk

{
 "image": "/home/Workspace/RoadSigns/Classify.zip/Classify/give_way.jpg", 
 "classifiers": [
  {
   "classes": [
    {
     "score": 0.905, 
     "class": "giveway"
    }
   ], 
   "classifier_id": "road_signs_294439632", 
   "name": "road_signs"
  }
 ]
}

 

 

 

No stopping - road sign

Source: https://s.toptests.co.uk

 

{
  "image": "/home/Workspace/RoadSigns/Classify.zip/Classify/no_stopping.jpg",
  "classifiers": [
    {
      "classes": [
      {
        "score": 0.904,
        "class": "nostopping"
      }
      ],
      "classifier_id": "road_signs_294439632",
      "name": "road_signs"
    }
  ]
}

 

 

Road sign

Source: https://t4.ftcdn.net

{
  "image": "/home/Workspace/RoadSigns/Classify.zip/Classify/no_overtaking.jpg",
  "classifiers": [
    {
      "classes": [
      {
        "score": 0.903,
        "class": "noovertaking"
      }
      ],
      "classifier_id": "road_signs_294439632",
      "name": "road_signs"
    }
 ]
}
Road sign

Source: http://www.asiaone.com

{
  "image": "/home/Workspace/RoadSigns/Classify.zip/Classify/no_waiting.jpg",
  "classifiers": [
    {
      "classes": [
        {
          "score": 0.902,
          "class": "nowaiting"
        }
      ],
      "classifier_id": "road_signs_294439632",
      "name": "road_signs"
    }
   ]
}

If you no longer need a certain classifier, you can delete it using the delete_classifier() method.

try:
    visual_recognition.delete_classifier(
        'road_signs_294439632')
except WatsonApiException as ex:
    print "Status code: {}\nError message: {}\nError info: \n{}" \
        .format(ex.code, ex.message, json.dumps(ex.info, indent=1))
Conclusion

The Watson Visual Recognition service is a powerful business tool, as it facilitates the creation of smart apps that can extract information from visual data without the need to develop AI software. In this tutorial, you learned how to use it with the Watson Python SDK using both the default classifiers and newly created custom ones.

If you want to see a preview of this service’s abilities you can check the live demo or the API explorer. Also, if you want to learn more about the Python SDK, you can check the official documentation.

Share on:

I have read and understood the ASSIST Software website's Terms of Use and Privacy Policy.

Want to stay on top of everything?

Get updates on industry developments and the software solutions we can now create for a smooth digital transformation.

Frequently Asked Questions

1. Can you integrate AI into an existing software product?

Absolutely. Our team can assess your current system and recommend how artificial intelligence features, such as automation, recommendation engines, or predictive analytics, can be integrated effectively. Whether it's enhancing user experience or streamlining operations, we ensure AI is added where it delivers real value without disrupting your core functionality.

2. What types of AI projects has ASSIST Software delivered?

We’ve developed AI solutions across industries, from natural language processing in customer support platforms to computer vision in manufacturing and agriculture. Our expertise spans recommendation systems, intelligent automation, predictive analytics, and custom machine learning models tailored to specific business needs.

3. What is ASSIST Software's development process?  

The Software Development Life Cycle (SDLC) we employ defines the stages for a software project. Our SDLC phases include planning, requirement gathering, product design, development, testing, deployment, and maintenance.

4. What software development methodology does ASSIST Software use?  

ASSIST Software primarily leverages Agile principles for flexibility and adaptability. This means we break down projects into smaller, manageable sprints, allowing continuous feedback and iteration throughout the development cycle. We also incorporate elements from other methodologies to increase efficiency as needed. For example, we use Scrum for project roles and collaboration, and Kanban boards to see workflow and manage tasks. As per the Waterfall approach, we emphasize precise planning and documentation during the initial stages.

5. I'm considering a custom application. Should I focus on a desktop, mobile or web app?  

We can offer software consultancy services to determine the type of software you need based on your specific requirements. Please explore what type of app development would suit your custom build product.   

  • A web application runs on a web browser and is accessible from any device with an internet connection. (e.g., online store, social media platform)   
  • Mobile app developers design applications mainly for smartphones and tablets, such as games and productivity tools. However, they can be extended to other devices, such as smartwatches.    
  • Desktop applications are installed directly on a computer (e.g., photo editing software, word processors).   
  • Enterprise software manages complex business functions within an organization (e.g., Customer Relationship Management (CRM), Enterprise Resource Planning (ERP)).

6. My software product is complex. Are you familiar with the Scaled Agile methodology?

We have been in the software engineering industry for 30 years. During this time, we have worked on bespoke software that needed creative thinking, innovation, and customized solutions. 

Scaled Agile refers to frameworks and practices that help large organizations adopt Agile methodologies. Traditional Agile is designed for small, self-organizing teams. Scaled Agile addresses the challenges of implementing Agile across multiple teams working on complex projects.  

SAFe provides a structured approach for aligning teams, coordinating work, and delivering value at scale. It focuses on collaboration, communication, and continuous delivery for optimal custom software development services. 

7. How do I choose the best collaboration model with ASSIST Software?  

We offer flexible models. Think about your project and see which model would be right for you.   

  • Dedicated Team: Ideal for complex, long-term projects requiring high continuity and collaboration.   
  • Team Augmentation: Perfect for short-term projects or existing teams needing additional expertise.   
  • Project-Based Model: Best for well-defined projects with clear deliverables and a fixed budget.   

Contact us to discuss the advantages and disadvantages of each model. 

1. Is ASSIST Software a reliable company for custom engineering?

Absolutely. Our partners have given us great recommendations and reviews, leading us to win The Manifest Award for Most Reviewed Software Developers. Further proof comes from our 97% employee retention rate and ongoing client partnerships for over 8 years.  

2. Are the ASSIST Software Romanian software engineers certified?

Yes. 85% of our software programmers are certified.  

At a company level, ASSIST Software is certified and recognized by industry players such as Microsoft, AWS, Google Cloud, Adobe, Drupal, Fujitsu, ISTQB, and others.  

Our employee certifications are tremendously important as they reflect the shared commitment to long-term growth.

3. Why should I choose Romania for custom software development? 

Romania has become a significant player in custom software development, attracting businesses worldwide. Romania boasts the highest number of certified IT specialists in Europe and ranks sixth globally, surpassing even the US in tech specialists per capita.  

At ASSIST Software, what sets us apart is our team and our location: our engineers are certified, experienced, and flexible, while being in the +2 GMT time zone allows us to easily facilitate meetings with clients all over the world.

4. What team will work on my project, and where will it be located?

ASSIST Software's headquarters is in Romania, a prime country for software development outsourcing. Our 350+ software engineers speak English and have a deep passion for innovation.  

We provide regular project updates through reports, meetings, and online dashboards. Generally, you'll have access to a dedicated project manager who will be your point of contact for any questions or concerns.  

5. How much will my project cost me?

Our prices are competitive, and as per our working model, we guarantee you will be satisfied with the result. Frequent meetings, check-ins, and a great communication structure will ensure this outcome.   

Project costs depend on various factors, including complexity, scope, required technologies, and team size. We'll gather detailed information about your project during the initial consultation to provide a customized quote and we guarantee that you will be able to see the benefits of bespoke software.  

1. What technologies do you work with?

ASSIST Software tackles your projects with a robust tech stack. We build native and cross-platform mobile apps, craft user-friendly web experiences, and create stunning visuals. 

Our wide-ranging expertise starts from Java, Python, and JavaScript frameworks to cutting-edge solutions like AR/VR, blockchain, and AI/ML. We also manage databases, leverage cloud platforms, and ensure flawless project execution. We're your one-stop shop for exceptional software development from concept to deployment. You can view our expertise for more details.   

2. Are you experienced in AI/ML development?

Yes. We have extensive experience in data engineering and machine learning operations (MLOps). We can employ neural networks, computer vision, and AI models to benefit your ideas.   

You can trust our long-term experience with big data, NLP, and sentiment analysis, as over the past three years, we led a European security project with 15 partners focused on detecting radicalization on social media and the dark web.

3. Do you have a research and development department and work on European Projects?

We know R&D is crucial for businesses to stay competitive and thrive in dynamic markets. Successful R&D efforts lead to developing exceptional products or services, improved efficiency and effectiveness in operations, and enhanced market positioning.   

We have established solid partnerships with 160+ European research companies, universities, and research centers (e.g., Fraunhofer, TWI, University of Heidelberg, REWE Group, SINTEF, etc.) and have participated as technical partners in over 25 EU-funded projects.  

4. Besides custom software solutions, what other services do you offer?

  • Design Thinking for Breakthrough Products:  

    We craft user experiences that resonate. Our design process is an immersive collaboration, starting with workshops to uncover your vision and user needs. We conduct market research, analyze the competition, and guide you toward cutting-edge solutions in accordance with your business requirements.  

  • Digital Transformation to Reimagine Your Business:

    Digital transformation is nothing less than a strategic shift. We empower you to become more agile and data-driven, optimizing core processes for the digital age.  

  • Scale with Confidence as We Build for Growth:  

    We understand that business success and development mean new challenges. Our solutions are built to scale seamlessly, accommodating increasing user bases and data volumes without sacrificing performance or security.  

5. As a company, does ASSIST have its own software products?

Yes, ASSIST Software teams have been involved in designing and developing innovative products that address community needs. One such example is the web and mobile platform Autisma. This therapy assistant enables continued learning for children diagnosed with autism spectrum disorder.   

Our extensive knowledge of the Unity and Unreal engines has allowed us to develop two mobile games, Elly and the Ruby Atlas and Hooman Invaders, as well as various Unity Assets, such as the Real-Time Weather PRO and Easy Sky. These two Unity assets allow Unity developers to control the weather and sky in their projects.   

1. Is ASSIST Software hiring right now?

We are always looking for great people to join our team, whether you're a senior software engineer or a new talent seeking an IT career. Please check our careers page and contact us. Our HR department will contact you as soon as possible.   

2. Is ASSIST Software organizing internships?

Yes. Each year, we organize individual and group internships for students. Our long-term partnership with the Stefan cel Mare University of Suceava allows us to put together great events for students and help them get started in the industry. 

3. What type of learning culture does ASSIST Software encourage?

Our focus on innovation comes from a 'can do' attitude and the continuous learning we encourage our colleagues to pursue. We frequently organize workshops, learning sessions, presentations, and masterclasses. All these events are free and open to our colleagues and aim to support their professional and personal development. 

4. How does ASSIST Software focus on teamwork?

The key to stellar teamwork is the quality time we spend together. ASSIST employees and their families are frequently invited to participate in all activities. We encourage a healthy lifestyle by promoting and organizing hikes, bike riding sessions, marathons, volleyball, football and tennis matches, ping-pong championships, and many more.   

We show our care for the environment through reforestation campaigns and forest cleaning activities.   

We also have an English-speaking club, e-sports gaming nights, tech discussions, networking parties, and board game sessions.   

5. How does ASSIST Software give back to the community?

Volunteering and charity are essential to us, which is why we founded the ASSIST Humanitarian Foundation. We genuinely care about our community and want to improve the future. We invest in IT equipment for schools and award excellent teachers. We also help hospitals and fire departments enter the 21st century.   

We sponsor cultural events and deliver humanitarian aid to those in need. If you agree with our views, you can also donate.   

ASSIST Software Team Members