À chaque fois je pense magasiner une couverture d'assurance, je pense tout de suite au fait que je dois me répéter au téléphone à donner le numéro d'identification du véhicule (vehicle identification number VIN). Ce dernier est composé d’un mélange de lettres et chiffres, donc on risque de se répéter en cas d'erreur, pensons seulement au nombre de fois qu'on nous demande "N comme Nthalie ou M comme Maman?".

Après avoir réussi de transmettre le bon VIN, la gentille personne à l'autre bout du téléphone nous demande aussi les informations du véhicule comme le modèle, la série, le nombre de portes ...etc.

Dans ce tutoriel, nous allons proposer deux solutions:

  • la première est de lire le VIN à partir d'une image (recadrée). Pour ce faire, nous utilisons OCR open source de Google pytesseract.

  • La deuxième, est d'aller chercher le maximum d'informations contenues dans le VIN à partir d'une interface de programmation d'application (API) de la National Highway Traffic Safety Administration

Tout d'abord, nous importons la bibliothèque Image qui nous permettra d'ouvrir une image de type .png en lui passant comme argument le path cette dernière.

In [1]:
try:
    from PIL import Image
except ImportError:
    import Image
import pytesseract

Ensuite, nous utilisons la fonction image_to_string afin de convertir les caractères contenus dans l'image en texte qui sera notre VIN.

In [2]:
vin=pytesseract.image_to_string(Image.open('IMG_5496_copy.png'))

Vérifions si la conversion s'est bien effectuée:

In [3]:
print(vin)
4T1BE32K15U966167

Voilà! on voit que nous avons réussi d'extraire le texte de notre vin!

Maintenant, allons chercher quelques informations supplémentaires contenues dans le VIN. Nous nous connectons à l'API de NHTSA Product Information Catalog Vehicle Listing (vPIC) en utilisant la bibliothèque urllib.request afin de faire des requêtes sur le site.

In [4]:
import urllib.request

Ensuite, nous allons sauvegarder le tout sous format de json.

In [5]:
import json

Ensuite, joignons le vin à l'url de l'api et enlevons les espaces qui peuvent être contenus dans l'url;

In [8]:
url='https://vpic.nhtsa.dot.gov/api/vehicles/decodevin/%s?format=json' % vin
url=url.strip()
url=url.replace(" ", "")

Regardons maintenant le résultat de l'url lié au vin concerné;

In [9]:
print(url)
https://vpic.nhtsa.dot.gov/api/vehicles/decodevin/4T1BE32K15U966167?format=json

Si vous cliquez sur l'url ci-dessus, cela nous dirige vers une page web qui contient toutes les informations que nous cherchons sous format json, et c'est exactement ça ce que nous cherchons!

Une fois que nous avons notre url, nous devons ouvrir l'url, le lire et finalement conserver le tout dans un objet que nous appelons obj.

In [10]:
req= urllib.request.Request(url)
res=urllib.request.urlopen(req)
res=res.read()
obj=json.loads(res)

Cet url contient un maximum de 136 informations sur le véhicule, de la marque de ce dernier jusqu'au type de système de freinage. Toutefois, ça ne veut pas dire que toutes informations sont disponibles, car cela dépend de l'année et du modèle. Par exemple, dans mon vieux bazou, je n'ai certainement pas un Parking Assist... ;)

Regardons quelques informations que nous puisons extraire tel que:

  • make
  • model
  • Series
  • year
  • BodyClass
  • Doors
  • TransmissionStyle
  • cyl
In [19]:
if 'Results' in obj:
    o = obj['Results']
    for i in o:
        if i['Variable'] == 'Model Year':
            year = i['Value']
        if i['Variable'] == 'Make':
            make = i['Value']
        if i['Variable'] == 'Model':
            model = i['Value']
        if i['Variable'] == 'Displacement (L)':
            disp = i['Value']
        if i['VariableId'] == 9:
            cyl = i['Value']
        if i['Variable'] == 'Doors':
            Doors = i['Value']
        if i['Variable'] == 'Vehicle Type':
            VehicleType = i['Value']
        if i['VariableId'] == 37:
            TransmissionStyle = i['Value'] 
        if i['VariableId'] == 5:
            BodyClass = i['Value']
        if i['VariableId'] == 34:
            Series = i['Value']
        if i['VariableId'] == 77:
            PlantState = i['Value']
In [22]:
print("""vin: %s 
        make: %s 
        model: %s 
        Series:%s
        year: %s 
        Body Class: %s
        Doors: %s
        TransmissionStyle: %s
        Cyl: %s
        PlantState: %s
        """ \
% (vin, make, model, Series, year, BodyClass, Doors, TransmissionStyle, cyl, PlantState))
vin: 4T1BE32K15U966167 
        make: TOYOTA 
        model: Camry 
        Series:ACV30L/MCV30L/MCV31L
        year: 2005 
        Body Class: Sedan/Saloon
        Doors: 4
        TransmissionStyle: None
        Cyl: 4
        PlantState: KENTUCKY
        

Bien évidemment, nous pouvons améliorer le tout en créant une application mobile qui prend une photo d’un objet contenant un VIN (sans avoir à recadrer l'image comme nous l'avons fait ici).

Prochaine étape:

Mon idée est d'entraîner un modèle d'apprentissage profond capable de situer le texte du vin sans avoir à recadrer l'image.



Comments

comments powered by Disqus