Pratique et réflexion sur le moteur de normalisation de l'IA dans le client Pink

Technologie Jeffrey originale 

1. Origines

On peut dire que l'IA a déjà pénétré dans diverses entreprises de l'Internet actuel. La recherche, la prédiction, la reconnaissance d'images, la reconnaissance vocale, etc. sont utilisées depuis longtemps avec succès.

L'une des raisons pour lesquelles Dewu est bien connue des jeunes consommateurs est son solide système d'assurance de la qualité et de l'authenticité des produits , et ce qui est nécessaire derrière cela, c'est le travail acharné du système de chaîne d'approvisionnement Dewu.

L'algorithme introduit un modèle de solution intermédiaire pour faciliter la détection manuelle des défauts et l'identification de la cohérence. Dans le même temps, il est nécessaire d'attribuer certaines fonctions d'intelligence artificielle au côté final, afin qu'il puisse aider le milieu de gamme du modèle à réaliser une détection efficace des défauts et une identification de la cohérence de manière plus précise et efficace . Nous pensons donc à déployer un moteur de standardisation de l'IA côté appareil pour faire un tri préliminaire et une classification partielle des photos prises.

Le client rose est l'entrée pour l'inspection de la qualité, l'identification et d'autres processus dans le système de chaîne d'approvisionnement Dewu, et c'est également l'entrée pour le personnel d'inspecter et d'identifier la qualité de chaque produit. Il porte une partie importante de la chaîne d'approvisionnement dans le l'ensemble du système Dewu À partir de Chaque commande achetée sur la plateforme Dewu passera par le client Pink.
Le moteur standardisé fait partie du système Tianyan. Il est intégré au client rose pour répondre rapidement au personnel sur site en temps réel et assister le personnel pour l'aider à effectuer l'inspection de la qualité, l'identification et la conservation des fichiers.

2. Objectifs

Le système Tianyan s'engage à subvertir le système traditionnel d'inspection et d'identification manuelle de la qualité et réalise théoriquement une inspection et une identification automatiques de la qualité.

Objectifs du système :

  • Faites l'expérience de la rapidité d'exécution : inspection de la qualité des commandes, amélioration du temps d'identification
  • Coût d'exécution du contrat : réduction des coûts d'inspection et d'identification de la qualité

3. Introduction au système Sky Eye

La structure globale est la suivante :

 

  • Standardization Engine : Une plate-forme standardisée qui garantit la saisie. Fournir des capacités d'inspection de la qualité de l'image et d'identification des pièces pour garantir l'exactitude et la clarté des images entrées dans le centre de modèles ;
  • Services de modèle d'algorithme : fournir des services d'algorithme de modèle précis et fournir des services d'algorithme tels que la détection des défauts et l'identification de la cohérence pour l'inspection de la qualité, l'identification et d'autres services ;
  • Service de modèle dynamique : Fournit une capacité de modèle dynamique pour la fourniture de moteur standardisé et un service de modèle d'algorithme, et est le hub reliant le service de modèle d'entreprise et d'algorithme.

Le client se concentre sur le moteur de standardisation.

4. Moteur de normalisation

Une fois démonté, il peut être divisé en module de reconnaissance de modèle AI, module de modèle dynamique et module de reconnaissance de qualité d'image. 

  • Module de reconnaissance de modèle AI : moteur d'exécution de modèle
  • Module modèle dynamique : modèle de remplacement dynamique, modèle d'optimisation dynamique, etc.
  • Module de reconnaissance de la qualité d'image : Reconnaissance de la qualité d'image

4.1 Modèle dynamique

  • Sous-système de configuration normalisé AI : mappage des catégories aux modèles, configuration des résultats d'identification de chaque catégorie, etc.
  • Sous-système de gestion des modèles : cartographie pièce-modèle, détection des défauts pour chaque pièce, configuration des commutateurs pour l'identification de la cohérence
  • Sous-système de configuration de commutateur : commutateur de capacité de reconnaissance d'IA, commutateur d'IA obligatoire, etc.

Il est principalement associé à des scénarios métier spécifiques, tels que le chargement du modèle en fonction de la catégorie de marchandise et l'appel du modèle d'algorithme dans la configuration en fonction de la partie identification. Cet article fera quelques exemples dans le module de reconnaissance de modèle AI .

4.2 Module de reconnaissance du modèle AI

4.2.1 Connaissances de base

Passons d'abord en revue les bases. Beaucoup de gens peuvent avoir une mauvaise compréhension de l'apprentissage automatique et penser que c'est une chose relativement avancée. C'est peut-être parce que vous voulez comprendre l'apprentissage automatique et commencer par des livres plus systématiques, tels que "Deep Learning" du célèbre Ian Goodfellow et "Machine Learning" du domestique Zhou Zhihua.

Bien sûr, ce sont des livres très connus, si vous vous intéressez à la théorie de l'apprentissage automatique, il est également recommandé de les lire. Cependant, en tant que débutant, et l'entreprise doit également mettre en œuvre le projet le plus tôt possible dans l'entreprise, en fait, il est tout à fait possible de comprendre certains concepts de base de l'apprentissage automatique du point de vue de l'utilisateur et comment interagir avec Le but est d'atterrir le plus tôt possible. Revenez en arrière et creusez plus profondément lorsque vous avez le temps ou si vous avez un besoin plus profond.

Les principaux processus de développement actuels pour l'apprentissage automatique sont :

  1. L'équipe du modèle d'algorithme utilise un cadre d'apprentissage automatique spécifique pour former le modèle à travers un grand nombre d'ensembles de formation, afin que le modèle réponde aux attentes attendues, et le transfère vers un modèle pouvant être utilisé par un cadre de plate-forme spécifique.
  2. Le modèle de bout en bout est obtenu et intégré à la fin en combinaison avec un moteur de trame spécifique.
  3. Selon le métier, appelez la référence pour charger le modèle, et transmettez les données pour obtenir le résultat de la reconnaissance.

Dans cet article, j'introduis principalement les concepts de base liés au côté final dans le processus de développement ci-dessus.

4.2.1.1 Modèle

Une compréhension simple peut comprendre le modèle d'algorithme en tant que fonction, et nous n'avons pas besoin de prendre comme exemple le concept de réseau de neurones dans l'apprentissage en profondeur. Un modèle formé est une fonction bien implémentée.

Il peut accepter des paramètres et produire un résultat prévisible sous l'exécution du moteur d'inférence selon différents paramètres .

4.2.1.2 Moteur d'inférence

Si le modèle est comparé à une fonction , alors le moteur d'inférence est l'exécuteur de la fonction . Bien sûr, un moteur spécifique a besoin d'un modèle spécifique pour être reconnu, et différents cadres peuvent définir différents opérateurs, ce qui entraîne une incompatibilité.

Plus précisément, en prenant le MNN que nous utilisons comme exemple, il est nécessaire que les petits partenaires de l'équipe d'algorithmes fournissent également un modèle que le moteur de framework mnn peut exécuter.

4.2.1.3 Sélection technique

Les frameworks les plus populaires au stade actuel sont étudiés, et après un examen préliminaire, il y a principalement Core ML d'Apple, NCNN de Tencent , TensorFlow Lite de Google et MNN d'Alibaba . En combinaison avec nos scénarios commerciaux, nos équipements, les ressources de l'équipe technique actuelle et le support à double extrémité, nous avons choisi le cadre d'inférence MNN d'Alibaba.

Mais cela ne signifie pas que l'avenir se limite à ce cadre. Le sous- système de modèle dynamique ci-dessus est actuellement en phase de planification. À l'avenir, l'option de cadre peut être ajoutée lorsque le modèle est publié, et la dynamique peut être utilisée pour spécifier dynamiquement le cadre pour effectuer l'inférence.

Après avoir sélectionné un cadre approprié, nous commençons à accéder aux choses. Je vais brièvement présenter l'accès et l'encapsulation ici.

4.2.2 Encapsulation du moteur

4.2.2.1 Accès au moteur d'inférence

La difficulté d'accès est qu'il doit être compilé de manière croisée sur macOS pour l'architecture système d'Android, iOS et l'architecture du jeu d'instructions du processeur. Ce travail est relativement lourd et mécanisé. Faute d'espace, je ne le répéterai pas. Les partenaires intéressés peuvent se référer au guide d'accès MNN [1] pour opérer. Si vous rencontrez des problèmes, vous pouvez discuter en privé et apprendre les uns des autres.

4.2.2.2 Encapsulation du moteur

Le modèle lui-même n'est que la connexion combinée de chaque vecteur de caractéristiques formé, tout comme la connexion combinée des neurones humains. S'il ne peut pas être exécuté, il doit être exécuté à l'aide d'un moteur d'exécution. Voici le processus complet :

  1. Créer une session : démarrer le moteur d'inférence, charger le modèle
  2. données d'entrée : paramètres d'entrée
  3. session d'exécution : exécutez le modèle
  4. obtenir la sortie : obtenir la sortie

Combiné avec le processus ci-dessus, prenons Android comme exemple :

interface DuFriday {
    // 初始化标准化引擎
    fun init();
    // 加载特定模型
    fun createInstance(model: String?, callback: Callback<Map<String, Any?>>?);;
    // 创建会话
    fun createSession(id: Long?, callback: Callback<Map<String, Any?>>?);
    // 运行会话    
    fun runSession(imagePath: String, type: Int?, callback: Callback<Map<String, Any?>>?);
    // 释放单个会话
    fun releaseSession(sessiondId: Long?);
    // 释放所有会话    
    fun releaseAllSession();
    // 释放单个模型
    fun releaseInstance(id: Long?);
    // 释放所有模型    
    fun releaseAllInstance();
    // 退出
    fun quit();
}

L'interface ci-dessus est fournie pour une utilisation professionnelle. Considérant que le processus de raisonnement est un processus qui prend du temps, il est encapsulé dans un thread séparé pour la mise en œuvre. Prenons Android comme exemple :

Pour implémenter dans un thread séparé, prenez Android comme exemple :

private var mThread: HandlerThread? = null
private var mMainHandler: Handler? = null

runSession() {
    
mHandler?.post {
    val response = runSession(); // 伪代码
    mMainHandler?.post {
        callback?.onSuccess(response)
    }
}

Une fois le cadre de raisonnement tripartite encapsulé, il sera naturellement intégré à l'entreprise pour être utilisé.

4.2.2.3 Services intégrés, modèle d'accès

(1) Démarrer le modèle

Prenons l'exemple de l'entreprise photo : l'entreprise doit charger le modèle en fonction de la configuration, et l'entreprise doit avoir une relation de mappage avec le modèle. Le module de configuration dynamique maintiendra cet ensemble de relations :

{
    "1": {
        "model": "shoes.mnn",
        "label": "shoes.txt"
    },
    "2": {
        "model": "clothes.mnn",
        "label": "clothes.txt"
    },
    "3": {
        "model": "clothes.mnn",
        "label": "clothes.txt"
    }
}

Par exemple, l'identifiant d'une chaussure est 1, et son modèle et son étiquette correspondants sont respectivement ,shoes.mnn shoes.txt 

Selon la relation émise par le module de configuration dynamique , le modèle correspondant à la chaussure sera activé et shoes.mnnchargé en mémoire.

(2) Traitement des entrées

 L'entrée requise par le modèle est une image à trois canaux 224x224, où les données d'entrée doivent être alignées (conformément à l'entrée requise par le modèle d'algorithme) pour le traitement.

buildInput() {
    val bitmap = BitmapFactory.decodeFile(imagePath)  
    // 缩放至224
    val matrix = Matrix()
    matrix.postScale(224.0f / bitmap.width, 224.0f / bitmap.height)
    matrix.invert(matrix)
    // 4通道转为3通道 ARGB=> BGR
    val config = MNNImageProcess.Config()
    config.mean = floatArrayOf(103.94f, 116.78f, 123.68f)
    config.normal = floatArrayOf(0.017f, 0.017f, 0.017f)
    config.dest = MNNImageProcess.Format.BGR
    // inputTensor为输入缓冲区,下面这个方法意为将bitmap通过matrix转化,以及 通道配置转化,放入inputTensor
    MNNImageProcess.convertBitmap(bitmap, inputTensor, config, matrix)
}

(3) Exécution du modèle

Lorsque le moteur ci-dessus est connecté, l'API packagée est appelée et une surveillance chronophage y est ajoutée

run() {
    val start = System.nanoTime()
    // 调用api
    targetSession.run()
    val end = System.nanoTime()
    val cost = (end - start) / 1000000.0f
}

(4) Obtenir le résultat

Le format de sortie du modèle est un tableau de probabilités d'une séquence prédéterminée :

// 第一个位置为鞋子主图、第二位鞋标、第三个为中低走线
[0.3, 0.8, 0.5]

Nous devons retirer la probabilité la plus élevée de l'indice de probabilité la plus élevée 1 , et doit correspondre à chaque champ du fichier d'étiquettes shoes.txt émis par le module de configuration dynamique . 

[
    {
        "code": 1,
        "name": "主图"
    }, 
    {
        "code": 2,
        "name": "鞋标"
    }, 
    {
        "code": 3,
        "name": "中底"
    }
]

Soit : « étiquette chaussure », et le code correspondant est 2, cette information sera rappelée à l'entreprise, et l'entreprise fera son traitement de suivi.

(5) Processus global

Une image vaut mille mots, le processus clé du moteur standardisé, je l'ai trié sous forme d'organigramme.

image

image(6) Résumé

        Grâce au module de configuration dynamique et au module de reconnaissance du modèle AI , la reconnaissance d'image de toutes les catégories et de tous les bits sera réalisée. Si l'IA est suffisamment "intelligente", le travail de conception devient plus simple.

 

Un modèle identifie chaque partie de chaque catégorie :

Prenez n'importe quelle photo sur place, AI vous dira que l'objet sur la photo est les baskets en édition limitée xxx d'AJ1, il peut y avoir des taches sur le devant des baskets, le numéro d'article identifié est xxxx, numéro de lot xxxx.

De cette façon, l'équipe d'algorithmes aura certainement des exigences de données plus élevées. Cela peut également réduire l'efficacité de la reconnaissance. La méthode d'ingénierie actuelle combinée à des modèles d'algorithmes réduit le taux de reconnaissance et les besoins en données de l'équipe d'algorithmes à un petit ensemble divisé par catégorie. La façon dont cette combinaison est faite ne peut que faire briller les yeux des gens.

 

4.3 Module de reconnaissance de la qualité d'image

4.3.1 opencv

Le nom complet est : Open Source Computer Vision Library

OpenCV est la bibliothèque open source de vision par ordinateur d'Intel. Il se compose d'une série de fonctions C et de quelques classes C++ qui implémentent de nombreux algorithmes courants dans le traitement d'images et la vision par ordinateur.

Combiné avec OpenGL, OpenGL est une bibliothèque pour rendre les données à la vision. Donc ma compréhension simple : une bibliothèque qui transforme la vision en données.

4.3.2 Reconnaissance de la qualité d'image

L'objectif principal de ce module est d'identifier les photos floues, surexposées et trop sombres.

4.3.2.1 Flou

 

Nous l'implémentons en utilisant l'opérateur Sobel dans OpenCV. L'opérateur Sobel peut calculer le gradient de l'image, le gradient de gris des pixels adjacents de la photo floue est très proche, et l'opérateur Sobel peut juste calculer ce gradient de premier ordre.

Pourquoi utiliser l'opérateur de Sobel au lieu de l'opérateur laplacien ?
Pour la scène de reconnaissance floue, le gradient de second ordre calculé par l'opérateur laplacien n'est pas nécessaire.Si le gradient de second ordre est utilisé, certains points avec des valeurs de gris similaires seront perdus.

Code complet :

boolean hasBlur(String imagePath, double threshold) {
    Mat img = Imgcodecs.imread(imagePath);
    int height = img.height();
    int width = img.width();
    Mat cropImg = new Mat(img, new Range(height / 4, height / 4 * 3), new Range(width / 4, width / 4 * 3));
    
    // 转为灰度图
    Mat imageCropGray = new Mat();
    Imgproc.cvtColor(cropImg, imageCropGray, Imgproc.COLOR_BGR2GRAY);
    
    // 计算灰度图的梯度
    Mat imageSobel = new Mat();
    Imgproc.Sobel(imageCropGray, imageSobel, Core.CV_16U, 1, 1);
    
    // 计算梯度的平均值
    MatOfDouble meanStdValueImage = new MatOfDouble();
    Core.meanStdDev(imageSobel, meanStdValueImage, meanStdValueImage);
    double meanValue = meanStdValueImage.at(Double.class, 0, 0).getV();
    // 当整张图片平均梯度小于某个值, 那就认定为模糊
    return meanValue < threshold;
}

4.3.2.2 Surexposition et obscurité

Surexposition et sur-obscurité, à l'heure actuelle, nous voulons tous convertir l'image en niveaux de gris, puis prendre la moyenne des niveaux de gris. Jugeant que la valeur moyenne dépasse un certain seuil, elle est surexposée, et si elle est inférieure à une certaine valeur moyenne, elle est trop sombre.

Code complet :

boolean hasOverLight(String imagePath, double threshold) {
    Mat img = Imgcodecs.imread(imagePath);
    int height = img.height();
    int width = img.width();
    Mat cropImg = new Mat(img, new Range(height / 4, height / 4 * 3), new Range(width / 4, width / 4 * 3));
    
    // 转为灰度图
    Mat imageCropGray = new Mat();
    Imgproc.cvtColor(cropImg, imageCropGray, Imgproc.COLOR_BGR2GRAY);
    
    // 计算灰度图的平均值
    MatOfDouble meanStdValueImage = new MatOfDouble();
    Core.meanStdDev(imageCropGray, meanStdValueImage, meanStdValueImage);
    double meanValue = meanStdValueImage.at(Double.class, 0, 0).getV();
    // 当整张图片平均大于某个值, 那就认定为过亮
    return meanValue > threshold;
}

boolean hasOverDark(String imagePath, double threshold) {
    Mat img = Imgcodecs.imread(imagePath);
    int height = img.height();
    int width = img.width();
    Mat cropImg = new Mat(img, new Range(height / 4, height / 4 * 3), new Range(width / 4, width / 4 * 3));
    
    // 转为灰度图
    Mat imageCropGray = new Mat();
    Imgproc.cvtColor(cropImg, imageCropGray, Imgproc.COLOR_BGR2GRAY);
    
    // 计算梯度的平均值
    MatOfDouble meanStdValueImage = new MatOfDouble();
    Core.meanStdDev(imageCropGray, meanStdValueImage, meanStdValueImage);
    double meanValue = meanStdValueImage.at(Double.class, 0, 0).getV();
    // 当整张图片平均小于某个值, 那就认定为过暗
    return meanValue < threshold;
}

Ce qui précède est une pratique globale du moteur de standardisation . Dans le processus de pratique, il est inévitable de marcher sur la fosse.Pour la technologie, il est non seulement nécessaire d'investir dans la réalisation, mais plus important encore, de clarifier lentement la direction dans des discussions constantes avec le côté commercial du produit. Parce que nous n'avons été sur la route que pour atteindre nos objectifs , faire de petits pas et avancer en fonction de ce que nous avons fait est sans aucun doute un moyen d'atteindre nos objectifs. Comme c'est le cas avec certains des problèmes actuels.

Cinq, optimisation et amélioration

5.1 Accès à plusieurs cadres de raisonnement de l'IA

Il est utilisé pour éviter certains modèles qui sont entraînés avec un cadre d'IA spécifique et qui peuvent être déformés ou même mal jugés lorsqu'ils sont convertis en d'autres modèles de cadre.

5.2 optimisation opencv

A l'heure actuelle, la reconnaissance lumineuse aura des problèmes de précision de reconnaissance pour les produits qui sont noirs en eux-mêmes.Dans le traitement ultérieur de ce genre de scène, il n'est pas possible d'utiliser une valeur moyenne pour généraliser.

5.3 Boucle fermée

À l'heure actuelle, le mode de participation global de l'IA consiste à terminer la formation du modèle hors ligne, puis à la déployer en ligne pour utiliser le modèle pour effectuer des inférences. Pas de mécanisme de rétroaction négative, pas de véritable boucle fermée. Si ce processus peut être migré en ligne à l'avenir, la précision de l'ensemble de la détection des défauts et de la reconnaissance de la cohérence sera grandement améliorée.

6. Penser

Avec le développement de la technologie de l'IA, de plus en plus d'entreprises intégreront des applications d'IA dans leur activité. Les points d'application de la technologie de l'IA incluent actuellement la reconnaissance (reconnaissance d'images, reconnaissance de la parole, reconnaissance des émotions), le traitement du langage naturel, la génération du langage naturel, les assistants virtuels, la prévision (prévision des tendances, prévision des stocks), etc. L'étape actuelle de l'IA est encore spécifique à un domaine Combinée à la conception du projet, elle peut aider ou remplacer les tâches manuelles, telles que l'identification de pièces de différentes catégories de produits et l'identification de défauts spécifiques dans des pièces de produits spécifiques. Avec ces IA auxiliaires, le seuil pour les travailleurs et le taux d'erreur de travail seront considérablement réduits. Dans le processus de construction, nous nous inspirons constamment pour réfléchir à l'expansion de la pile technologique, à la compréhension des scénarios commerciaux, à la prévision constante des problèmes et à la résolution des problèmes.Pour nous, c'est un processus de croissance continue.

Bien sûr, il existe d'autres applications qui doivent être découvertes en combinaison avec les affaires et la technologie.Les étudiants qui ont des idées dans ce domaine sont invités à communiquer entre eux.

Lien de référence :

【1】https://www.yuque.com/mnn/cn

{{o.name}}
{{m.name}}

Je suppose que tu aimes

Origine my.oschina.net/u/5783135/blog/5553391
conseillé
Classement