一犀呼、前言
如何以最低成本開發(fā)自定義深度學(xué)習(xí)模型洲押?可以使用華為機(jī)器學(xué)習(xí)最近推出的自定義模型服務(wù),該服務(wù)制作的模型大小可控圆凰,能夠以最小成本運(yùn)行到端側(cè)杈帐。僅需要簡單的接口調(diào)用就可以進(jìn)行推斷,主要支持圖片分類和文本分類處理自己定義的特定場景分類专钉。下面以圖片分類為例讓我們來看看自定義模型的訓(xùn)練和使用方法挑童。
二、訓(xùn)練和使用
1跃须、首先通過Android Studio的Marketplace安裝HMS Toolkit站叼,安裝完成后需重啟Android Studio.
2、通過AI Create功能完成遷移
(1)基礎(chǔ)配置
AI Create訓(xùn)練框架采用MindSpore菇民,推理框架采用MindSpore
Lite尽楔。在Coding Assistant中,選擇“AI > AI Create”第练。使用遷移學(xué)習(xí)則選擇“Image”或“Text”阔馋,點(diǎn)擊“Confirm”。需提前安裝python環(huán)境娇掏,然后重啟IDE呕寝。再次選擇“Image”或“Text”,點(diǎn)擊“Confirm”婴梧,會自動(dòng)安裝MindSpore工具下梢。HMS Toolkit還提供一鍵生成模型調(diào)用的API文件和模型調(diào)用Demo示例工程的功能客蹋,方便開發(fā)者在應(yīng)用程序中快速驗(yàn)證和調(diào)用圖像分類AI模型。使用圖像分類遷移學(xué)習(xí)能力前孽江,需要按照要求準(zhǔn)備用于訓(xùn)練的圖像資源讶坯。訓(xùn)練圖像需要按照圖像進(jìn)行分類,在每個(gè)分類的目錄下岗屏,放入合適的清晰圖像闽巩。
(2)模型訓(xùn)練
圖像分類針對特定領(lǐng)域(如汽車、動(dòng)物等)百張級數(shù)據(jù)進(jìn)行分鐘級的學(xué)習(xí)訓(xùn)練担汤,自動(dòng)生成圖像分類識別的新模型涎跨,該生成的新模型可以自動(dòng)識別圖像所屬的類別。在Coding Assistant中崭歧,選擇“AI > AI Create > Image”隅很,設(shè)置圖像訓(xùn)練模型的操作類型和模型部署位置,然后點(diǎn)擊“Confirm”率碾。Operation type(操作類型)部分固定選擇“New Model”叔营。Model Deployment Location(模型部署位置)固定選擇“Deployment
Cloud”。將分類好的圖像文件夾拖入或添加到“Please select train image folder”所宰,并設(shè)置生成的模型的存儲路徑(Output
model file path)和訓(xùn)練參數(shù)(Train parameter)绒尊。訓(xùn)練參數(shù)保持默認(rèn)值即可。Iteration count:迭代次數(shù)仔粥,默認(rèn)值為100婴谱。Learning rate:學(xué)習(xí)速率,默認(rèn)值為0.01躯泰。點(diǎn)擊“Create Model”開始進(jìn)行訓(xùn)練谭羔,生成圖像分類識別模型。等待模型生成后麦向,查看模型學(xué)習(xí)的結(jié)果(訓(xùn)練精度和驗(yàn)證精度)瘟裸、對應(yīng)的學(xué)習(xí)參數(shù)和訓(xùn)練數(shù)據(jù)等信息。
(3)模型驗(yàn)證
模型訓(xùn)練完成后诵竭,在“Add test image”的“Please select test image folder”加入需要測試的圖像文件夾進(jìn)行模型驗(yàn)證话告。工具會自動(dòng)利用訓(xùn)練好的模型進(jìn)行測試,并顯示測試結(jié)果卵慰。在模型訓(xùn)練結(jié)果中點(diǎn)擊“Generate Demo”沙郭,HMS Toolkit會自動(dòng)生成Demo工程,該工程自動(dòng)集成了該訓(xùn)練后的圖像分類識別模型呵燕,可以直接運(yùn)行和編譯該Demo工程棠绘,生成APK文件在模擬器或者真實(shí)設(shè)備上運(yùn)行件相,查看圖像分類識別的應(yīng)用效果再扭。
3氧苍、使用模型
(1)上傳模型
通過對圖片中的實(shí)體對象進(jìn)行分類和添加標(biāo)注信息,如:人泛范、物让虐、環(huán)境、活動(dòng)罢荡、藝術(shù)形式等信息赡突,幫助定義圖片題材和適用場景等。圖片分類支持端側(cè)識別和云側(cè)識別区赵。同時(shí)惭缰,該服務(wù)提供了預(yù)置模型能力。在華為開發(fā)者聯(lián)盟網(wǎng)站上笼才,進(jìn)入“我的項(xiàng)目”漱受,選擇“機(jī)器學(xué)習(xí)服務(wù) > Custom ML”進(jìn)入模型上傳界面,把模型上傳到云側(cè)骡送。另外也可以通過該界面對已有模型進(jìn)行更新昂羡。
(2)加載遠(yuǎn)程模型
先判斷遠(yuǎn)程模型是否已經(jīng)下載完成,然后加載模型摔踱,當(dāng)遠(yuǎn)程模型未下載時(shí)加載本地模型虐先。
localModel = new MLCustomLocalModel.Factory("localModelName")
???????.setAssetPathFile("assetpathname")
??????? .create();
??? remoteModel =newMLCustomRemoteModel.Factory("yourremotemodelname").create();
???MLLocalModelManager.getInstance()
??????? //判斷遠(yuǎn)程模型是否存在。
??????? .isModelExist(remoteModel)
???????.addOnSuccessListener(new OnSuccessListener() {
??????????? @Override
??????????? public voidonSuccess(Boolean isDownloaded) {
???????????????MLModelExecutorSettings settings;
??????????????? //如果遠(yuǎn)程模型存在派敷,優(yōu)先加載本地已有的遠(yuǎn)程模型蛹批,否則加載本地已有的本地模型。
??????????????? if(isDownloaded) {
??????????????????? settings =new MLModelExecutorSettings.Factory(remoteModel).create();
??????????????? } else {
??????????????????? settings =new MLModelExecutorSettings.Factory(localModel).create();
????? ??????????}
??????????????? finalMLModelExecutor modelExecutor = MLModelExecutor.getInstance(settings);
???????????????executorImpl(modelExecutor, bitmap);
??????????? }
??????? })
???????.addOnFailureListener(new OnFailureListener() {
??????????? @Override
??????????? public voidonFailure(Exception e) {
??????????????? //異常處理篮愉。
??????????? }
??????? });
(3)使用模型推理器推理
設(shè)置輸入輸出格式般眉,把圖片數(shù)據(jù)輸入到推理器,然后使用加載好的modelExecutor(MLModelExecutor) 進(jìn)行推理潜支。
private void executorImpl(final MLModelExecutor modelExecutor,Bitmap bitmap){
??? //準(zhǔn)備輸入數(shù)據(jù)甸赃。
??? final Bitmap inputBitmap =Bitmap.createScaledBitmap(srcBitmap, 224, 224, true);
??? final float[][][][] input= new float[1][224][224][3];
??? for (int i = 0; i <224; i++) {
??????? for (int j = 0; j <224; j++) {
??????????? int pixel =inputBitmap.getPixel(i, j);
???????????input[batchNum][j][i][0] = (Color.red(pixel) - 127) / 128.0f;
???????????input[batchNum][j][i][1] = (Color.green(pixel) - 127) / 128.0f;
???????????input[batchNum][j][i][2] = (Color.blue(pixel) - 127) / 128.0f;
??????? }
??? }
??? MLModelInputs inputs =null;
??? try {
??????? inputs = newMLModelInputs.Factory().add(input).create();
??????? //若模型需要多路輸入,您需要多次調(diào)用add()以便圖片數(shù)據(jù)能夠一次輸入到推理器冗酿。
??? } catch (MLException e) {
??????? //處理輸入數(shù)據(jù)格式化異常埠对。
??? }
// 執(zhí)行推理。您可以通過“addOnSuccessListener”來監(jiān)聽推理成功裁替,在“onSuccess”回調(diào)中處理推理成功项玛。同時(shí),可以通過“addOnFailureListener”來監(jiān)聽推理失敗弱判,在“onFailure”中處理推理失敗襟沮。
??? modelExecutor.exec(inputs,inOutSettings).addOnSuccessListener(newOnSuccessListener() {
??????? @Override
??????? public voidonSuccess(MLModelOutputs mlModelOutputs) {
??????????? float[][] output =mlModelOutputs.getOutput(0);
??????????????? //這里推理的返回結(jié)果在output數(shù)組里,可以進(jìn)一步處理。
??????????????? }
???????}).addOnFailureListener(new OnFailureListener() {
??????? @Override
??????? public voidonFailure(Exception e) {
??????????? //推理異常开伏。
??????? }
??? });
}
三膀跌、總結(jié)
綜上所述,利用華為的深度學(xué)習(xí)框架固灵,通過簡單幾個(gè)步驟就可以創(chuàng)建和使用屬于自己業(yè)務(wù)的深度學(xué)習(xí)模型捅伤,是不是十分高效?同時(shí)巫玻,華為機(jī)器學(xué)習(xí)服務(wù)自定義模型支持包括MindSpore丛忆、TensorFlow Lite、Caffe仍秤、Onnx在內(nèi)的全部主流的模型推理熄诡,轉(zhuǎn)換成MS格式后可以在端側(cè)推理框架運(yùn)行。另外通過量化壓縮诗力,可以采用更小的體積在端側(cè)部署粮彤,如果想進(jìn)一步降低APK體積,也可以直接托管到云端姜骡,通過這種方式即使不了解深度學(xué)習(xí)导坟,也能夠快速構(gòu)建特定領(lǐng)域的AI應(yīng)用。