オリジナルのジェフリーテクノロジー
1.背景
AIは、現在のインターネットのさまざまなビジネスにすでに浸透していると言えます。検索、予測、画像認識、音声認識などは長い間成功裏に使用されてきました。
Dewuが若い消費者によく知られている理由の1つは、その強力な品質と本物の製品保証システムであり、その背後に必要なのはDewuサプライチェーンシステムのハードワークです。
このアルゴリズムは、モデルの中間段階のソリューションを導入して、手動の欠陥検出と整合性の識別を支援します。同時に、一部のAI機能をエンドサイドに割り当てる必要があります。これにより、モデルのミドルエンドが効率的な欠陥検出と整合性識別をより正確かつ効率的に実現できるようになります。そこで、撮影した写真の予備審査と部品分類を行うために、デバイス側にAI標準化エンジンを導入することを考えています。
ピンクのクライアントは、Dewuサプライチェーンシステムの品質検査、識別、およびその他のプロセスの入り口であり、スタッフが各製品の品質を検査および識別するための入り口でもあります。これは、 Dewuシステム全体。Dewuプラットフォームで購入したすべての注文から、Pinkクライアントを経由します。
標準化されたエンジンはTianyanシステムの一部であり、ピンク色のクライアントに統合されているため、現場の担当者にリアルタイムで迅速に対応し、スタッフが品質検査、識別、ファイル保持を完了するのを支援します。
2.目標
Tianyanシステムは、従来の手動による品質検査と識別システムの破壊に取り組んでおり、理論的には自動品質検査と識別を実現しています。
システムの目標:
- 適時性の経験:注文品質検査、識別時間の改善
- 契約履行のコスト:品質検査と識別のコストの削減
3.スカイアイシステムの紹介
全体の構造は次のとおりです。
- 標準化エンジン:入力を保証する標準化されたプラットフォーム。モデルセンターに入力される画像の精度と明瞭さを確保するために、画質検査と部品識別機能を提供します。
- アルゴリズムモデルサービス:正確なモデルアルゴリズムサービスを提供し、品質検査、識別、およびその他のサービスのための欠陥検出や整合性識別などのアルゴリズムサービスを提供します。
- 動的モデルサービス:標準化されたエンジンプロビジョニングとアルゴリズムモデルサービスに動的モデル機能を提供し、ビジネスとアルゴリズムモデルサービスを接続するハブです。
クライアントの焦点は標準化エンジンです。
4.標準化エンジン
分解すると、モデルAI認識モジュール、動的モデルモジュール、画質認識モジュールに分割できます。
- モデルAI認識モジュール:モデル実行エンジン
- 動的モデルモジュール:動的置換モデル、動的最適化モデルなど。
- 画質認識モジュール:画質認識
4.1動的モデル
- AI標準化された構成サブシステム:モデルへのカテゴリーのマッピング、各カテゴリーの識別結果の構成など。
- モデル管理サブシステム:部品間のマッピング、各部品の欠陥検出、整合性識別のためのスイッチ構成
- スイッチ構成サブシステム:AI認識能力スイッチ、必須AIスイッチなど。
これは主に、商品カテゴリに従ってモデルをロードしたり、識別部分に従って構成でアルゴリズムモデルを呼び出したりするなど、特定のビジネスシナリオと組み合わされます。この記事では、モデルAI認識モジュールでいくつかの例を示します。
4.2モデルAI認識モジュール
4.2.1基本的な知識
最初に基本を復習しましょう。多くの人は機械学習について誤解していて、比較的高度なものだと思っているかもしれません。機械学習を理解し、有名なIanGoodfellowの「DeepLearning」や国内のZhouZhihuaの「MachineLearning」など、より体系的な本から始めたいからかもしれません。
もちろん、これらは非常に有名な本です。機械学習の理論に興味がある場合は、それらを読むこともお勧めします。ただし、初心者として、また会社もできるだけ早くプロジェクトを実施する必要があります。実際、ユーザーの視点から機械学習の基本的な概念と対話方法を完全に理解することは可能です。目的はできるだけ早く着陸することです。時間があるとき、またはより深いニーズがある場合は、戻って深く掘り下げてください。
機械学習の現在の主な開発プロセスは次のとおりです。
- アルゴリズムモデルチームは、特定の機械学習フレームワークを使用して、多数のトレーニングセットを通じてモデルをトレーニングし、モデルが期待される期待に応え、特定のプラットフォームフレームワークで使用できるモデルに転送します。
- エンドツーエンドモデルが取得され、特定のフレームエンジンと組み合わせてエンドに統合されます。
- ビジネスに応じて、参照を呼び出してモデルをロードし、データを渡して認識結果を取得します。
この記事では、主に上記の開発プロセスのエンドサイドに関連する基本的な概念を紹介します。
4.2.1.1モデル
簡単に理解すれば、アルゴリズムモデルを関数として理解でき、深層学習におけるニューラルネットワークの概念を例として取り上げる必要はありません。訓練されたモデルは、適切に実装された関数です。
パラメータを受け入れ、さまざまなパラメータに従って推論エンジンを実行することで、予測可能な結果を生成できます。
4.2.1.2推論エンジン
モデルを関数と比較する場合、推論エンジンは関数の実行者です。もちろん、特定のエンジンを認識するには特定のモデルが必要であり、フレームワークが異なれば異なる演算子が定義され、非互換性が生じる可能性があります。
具体的には、使用するMNNを例にとると、アルゴリズムチームの小規模なパートナーも、mnnフレームワークエンジンが実行できるモデルを提供する必要があります。
4.2.1.3技術的選択
現段階でより人気のあるフレームワークが調査され、予備審査の後、主にAppleのCore ML、TencentのNCNN、GoogleのTensorFlow Lite、AlibabaのMNNがあります。ビジネスシナリオ、機器、現在の技術チームのリソース、およびダブルエンドサポートと組み合わせて、 AlibabaのMNN推論フレームワークを選択しました。
しかし、これは将来がこのフレームワークに限定されることを意味するものではありません。上記の動的モデルサブシステムは現在計画段階にあります。将来的には、モデルの発行時にフレームワークのオプションを追加し、動的に使用して推論を実行するフレームワークを動的に指定できます。
適切なフレームワークを選択した後、アクセスを開始します。ここでは、アクセスとカプセル化について簡単に紹介します。
4.2.2エンジンのカプセル化
4.2.2.1推論エンジンへのアクセス
アクセスの難しさは、Android、iOSのシステムアーキテクチャ、およびCPU命令セットアーキテクチャ用にmacOSでクロスコンパイルする必要があることです。この作業は比較的面倒で機械化されています。スペースに限りがあるため、繰り返しません。興味のあるパートナーは、MNNアクセスガイド[1]を参照して操作できます。問題が発生した場合は、プライベートでチャットしてお互いに学ぶことができます。
4.2.2.2エンジンのカプセル化
モデル自体は、人間のニューロンの結合された接続と同じように、トレーニングされた各特徴ベクトルの結合された接続にすぎません。実行できない場合は、実行エンジンを使用して実行する必要があります。完全なプロセスは次のとおりです。
- セッションを作成する:推論エンジンを起動し、モデルをロードします
- 入力データ:入力パラメータ
- セッションの実行:モデルを実行します
- 出力を取得:出力を取得
上記のプロセスと組み合わせて、Androidを例として取り上げます。
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();
}
上記のインターフェースはビジネスで使用するために提供されています。推論プロセスは時間のかかるプロセスであるため、実装のために別のスレッドにカプセル化されます。例としてAndroidを取り上げます。
別のスレッドで実装するには、例としてAndroidを取り上げます。
private var mThread: HandlerThread? = null
private var mMainHandler: Handler? = null
runSession() {
mHandler?.post {
val response = runSession(); // 伪代码
mMainHandler?.post {
callback?.onSuccess(response)
}
}
サードパーティの推論フレームワークがカプセル化された後、それは自然にビジネスに統合されて使用されます。
4.2.2.3統合サービス、アクセスモデル
(1)モデルを起動します
写真ビジネスを例にとると、ビジネスは構成に従ってモデルをロードする必要があり、ビジネスはモデルとのマッピング関係を持っている必要があります。動的構成モジュールは、次の一連の関係を維持します。
{
"1": {
"model": "shoes.mnn",
"label": "shoes.txt"
},
"2": {
"model": "clothes.mnn",
"label": "clothes.txt"
},
"3": {
"model": "clothes.mnn",
"label": "clothes.txt"
}
}
たとえば、靴のIDは1で、対応するモデルとラベルはそれぞれ、shoes.mnn
shoes.txt
動的構成モジュールによって発行された関係に従って、靴に対応するモデルがアクティブ化shoes.mnn
され、メモリにロードされます。
(2)入力処理
モデルに必要な入力は224x224の3チャンネル画像であり、処理のために入力データを(アルゴリズムモデルに必要な入力と一致して)位置合わせする必要があります。
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)モデルの実行
上記のエンジンが接続されると、パッケージ化されたAPIが呼び出され、時間のかかる監視が追加されます
run() {
val start = System.nanoTime()
// 调用api
targetSession.run()
val end = System.nanoTime()
val cost = (end - start) / 1000000.0f
}
(4)結果を得る
モデルの出力形式は、事前に決定されたシーケンスの確率の配列です。
// 第一个位置为鞋子主图、第二位鞋标、第三个为中低走线
[0.3, 0.8, 0.5]
最高確率の添え字1から最高確率を取り出し、動的構成モジュールによって発行されたラベルファイルshoes.txt の各フィールドに対応する必要があります。
[
{
"code": 1,
"name": "主图"
},
{
"code": 2,
"name": "鞋标"
},
{
"code": 3,
"name": "中底"
}
]
つまり、「靴のラベル」であり、対応するコードは2です。この情報はビジネスにコールバックされ、ビジネスはフォローアップ処理を行います。
(5)全体的なプロセス
標準化されたエンジンの重要なプロセスである1000語に相当する写真を、フローチャートの形式に分類しました。
(6)まとめ
動的構成モジュールとモデルAI認識モジュール により、すべてのカテゴリとすべてのビットの画像認識が実現されます。AIが十分に「スマート」であれば、設計作業はより簡単になります。
モデルは、各カテゴリの各部分を識別します。
その場で写真を撮ると、AIは、写真のオブジェクトがAJ1のxxx限定版のスニーカーであり、スニーカーの前面に汚れがある可能性があることを示します。識別されたアイテム番号はxxxx、バッチ番号xxxxです。
このように、アルゴリズムチームは間違いなくより高いデータ要件を持つことになります。また、認識効率が低下する場合があります。アルゴリズムモデルと組み合わせた現在のエンジニアリング方法は、アルゴリズムチームの認識率とデータ要件をカテゴリで分割された小さなセットに減らします。この組み合わせの作り方は、人々の目を輝かせるしかないのです。
4.3画質認識モジュール
4.3.1 opencv
フルネームは次のとおりです。オープンソースコンピュータビジョンライブラリ
OpenCVは、Intelのオープンソースコンピュータビジョンライブラリです。これは、一連のC関数と、画像処理およびコンピュータービジョンで多くの一般的なアルゴリズムを実装するいくつかのC++クラスで構成されています。
OpenGLと組み合わせると、OpenGLはデータをビジョンにレンダリングするためのライブラリです。つまり、私の単純な理解は、ビジョンをデータに処理するライブラリです。
4.3.2画質認識
このモジュールの主な目的は、ぼやけている、露出オーバーで、暗すぎる写真を特定することです。
4.3.2.1ぼかし
OpenCVのSobel演算子を使用して実装します。ソーベル演算子は画像の勾配を計算できます。ぼやけた写真の隣接するピクセルの灰色の勾配は非常に近く、ソーベル演算子はこの1次勾配を計算できます。
ラプラシアン演算子の代わりにソーベル演算子を使用するのはなぜですか?
ファジー認識のシーンでは、ラプラシアン演算子によって計算された2次勾配は必要ありません.2次勾配を使用すると、同様のグレー値を持つ一部のポイントが失われます。
完全なコード:
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過度の露出と暗さ
露出オーバーと暗闇、現在、私たちは皆、画像をグレースケールに変換してから、グレースケールの平均を取りたいと思っています。平均値が一定のしきい値を超えていると判断すると、露出オーバーになり、一定の平均値よりも低い場合は暗すぎます。
完全なコード:
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;
}
上記は、標準化エンジンのグローバルな実践です。実践の過程では、ピットを踏むことは避けられません。技術にとっては、実現に投資するだけでなく、製品事業側との絶え間ない議論の中で方向性をゆっくりと明確にすることが重要です。私たちは目標を達成するための道を進んでいるだけなので、小さな一歩を踏み出し、私たちが行ったことに基づいて前進することは、間違いなく私たちの目標を達成するための手段です。現在の問題のいくつかの場合のように。
5、最適化と改善
5.1複数のAI推論フレームワークへのアクセス
これは、特定のAIフレームワークでトレーニングされた一部のモデルを回避するために使用され、他のフレームワークモデルに変換すると、歪んだり、誤って判断されたりする可能性があります。
5.2opencvの最適化
現在、明るい認識は、それ自体が黒い製品の認識精度に問題があります。この種のシーンの後続の処理では、平均値を使用して一般化することはできません。
5.3閉ループ
現在、全体的なAI参加モードは、モデルトレーニングをオフラインで完了し、それをオンラインで展開してモデルを使用して推論を実行することです。負帰還メカニズム、真の閉ループはありません。将来、このプロセスをオンラインに移行できる場合は、欠陥検出全体と整合性認識の精度が大幅に向上します。
6.考える
AIテクノロジーの開発に伴い、ますます多くの企業がAIアプリケーションをビジネスに統合するようになります。AI技術の応用ポイントには、現在、認識(画像認識、音声認識、感情認識)、自然言語処理、自然言語生成、仮想アシスタント、予測(トレンド予測、在庫予測)などがあります。AIの現在の段階は、依然としてドメイン固有です。プロジェクトの設計と組み合わせることで、さまざまな商品カテゴリのパーツの識別や特定の商品パーツの特定の欠陥の識別などの手動タスクを支援または置き換えることができます。これらの補助AIを使用すると、作業者のしきい値と作業のエラー率が大幅に低下します。建設の過程で、私たちは常にテクノロジースタックの拡大、ビジネスシナリオの理解、常に問題の予測、問題の解決について考えるように促しています。私たちにとって、それは継続的な成長のプロセスです。
もちろん、ビジネスやテクノロジーと組み合わせて発見する必要のある他のアプリケーションもあります。この分野でアイデアを持っている学生は、お互いにコミュニケーションをとることができます。
参照リンク:
【1】https://www.yuque.com/mnn/cn