掌握這個開源工具,更快速地構建計算機視覺模型

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"italic"},{"type":"strong"}],"text":"本文最初發表於 Towards Data Science 博客,經原作者 Eric Hofesmann 授權,InfoQ 中文站翻譯並分享。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"最近幾年,開源工具在滿足端到端平臺的許多需求方面取得了很大進步。從模型架構開發到數據集管護(Dataset curation),再到模型訓練和部署,它們都可以扮演一個不可思議的角色。有了充分的挖掘,你就能發現一個開源的工具,可以支持大量的數據和模型生命週期。"},{"type":"text","marks":[{"type":"strong"}],"text":"工具間的緊密集成是實現近乎無縫工作流的最好方法"},{"type":"text","text":"。本文將對"},{"type":"link","attrs":{"href":"https:\/\/github.com\/PyTorchLightning\/lightning-flash","title":"","type":null},"content":[{"type":"text","text":"PyTorch Lightning Flash"}]},{"type":"text","text":"與數據集可視化和模型分析工具"},{"type":"link","attrs":{"href":"https:\/\/fiftyone.ai\/","title":"","type":null},"content":[{"type":"text","text":"FiftyOne"}]},{"type":"text","text":"之間的集成進行了深入研究。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Lightning Flash 是一個在 PyTorch Lighting 基礎上構建的新框架,它提供了快速原型、基線、微調和深度學習解決業務和科學問題的任務集合。儘管 Flash 很容易上手,但是不管你有多少深度學習經驗,你都可以通過 Lightning 和 PyTorch 修改已有的任務來尋找適合你的抽象層次。爲更快地推進,Flash 的代碼是"},{"type":"link","attrs":{"href":"https:\/\/github.com\/PyTorchLightning\/lightning-flash#scalability","title":"","type":null},"content":[{"type":"text","text":"可擴展的"}]},{"type":"text","text":",內建支持任何硬件的分佈式訓練和推理。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Flash 可以讓你的第一個模型變得非常簡單,但是要繼續改進,你需要知道你的模型的性能和改進方法。FiftyOne 是一個開源工具,由 Voxel51 開發,用來建立高質量數據集和計算機視覺模型。它提供了優化數據集分析管道的構件,允許你親自操作數據,包括可視化複雜的標籤、評估模型、探索感興趣的場景、確定失敗模式、查找註釋錯誤、管護訓練數據集等。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"有了 Flash+ FiftyOne,你就可以加載資料集,訓練模型,然後分析下列所有計算機視覺任務的結果:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/voxel51.com\/docs\/fiftyone\/integrations\/lightning_flash.html#model-training","title":"","type":null},"content":[{"type":"text","text":"圖像分類"}]}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/voxel51.com\/docs\/fiftyone\/integrations\/lightning_flash.html#model-training","title":"","type":null},"content":[{"type":"text","text":"圖像目標檢測"}]}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/voxel51.com\/docs\/fiftyone\/integrations\/lightning_flash.html#model-training","title":"","type":null},"content":[{"type":"text","text":"圖像語義分割"}]}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/voxel51.com\/docs\/fiftyone\/integrations\/lightning_flash.html#model-training","title":"","type":null},"content":[{"type":"text","text":"視頻分類"}]}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/voxel51.com\/docs\/fiftyone\/integrations\/lightning_flash.html#image-embeddings","title":"","type":null},"content":[{"type":"text","text":"嵌入式可視化"}]}]}]}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"概述"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Flash 和 FiftyOne 之間的緊密集成允許你執行端到端的工作流,加載數據集,訓練它的模型,以及可視化 \/ 分析它的預測,所有這些都只需要幾個簡單的代碼塊。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"將 FiftyOne 數據集加載到 Flash"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"儘管使用 FiftyOne 開發數據集一直都很容易,但是與 PyTorch Lightning Flash 集成後,你就可以將這些數據加載到 Flash 中,直接完成訓練任務。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"from flash.image import ImageClassificationData\nimport fiftyone as fo\ntrain_dataset = fo.Dataset.from_dir(\n\"\/path\/to\/train\",\nfo.types.ImageClassificationDirectoryTree,\nlabel_field=\"ground_truth\",\n)\nval_dataset = fo.Dataset.from_dir(\n\"\/path\/to\/val\",\nfo.types.ImageClassificationDirectoryTree,\nlabel_field=\"ground_truth\",\n)\ndatamodule = ImageClassificationData.from_fiftyone(\ntrain_dataset=train_dataset,\nval_dataset=val_dataset,\nlabel_field=\"ground_truth\",\n)\n"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"訓練 Flash 任務"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Flash 提供了你需要的工具,你可以用盡可能少的代碼抓取任務的模型,然後從數據上進行微調,最重要的是,不需要成爲該領域的專家。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"import flash\nfrom flash.core.data.utils import download_data\nfrom flash.image import ImageClassificationData, ImageClassifier\n# 1. Download the data\ndownload_data(\"https:\/\/pl-flash-data.s3.amazonaws.com\/hymenoptera_data.zip\", 'data\/')\n# 2. Load the data\ndatamodule = ImageClassificationData.from_folders(\ntrain_folder=\"data\/hymenoptera_data\/train\/\",\nval_folder=\"data\/hymenoptera_data\/val\/\",\ntest_folder=\"data\/hymenoptera_data\/test\/\",\n)\n# 3. Build the model\nmodel = ImageClassifier(num_classes=datamodule.num_classes, backbone=\"resnet18\")\n# 4. Create the trainer. Run once on data\ntrainer = flash.Trainer(max_epochs=1)\n# 5. Finetune the model\ntrainer.finetune(model, datamodule=datamodule, strategy=\"freeze\")\n# 6. Save it!\ntrainer.save_checkpoint(\"image_classification_model.pt\")\n"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.infoq.cn\/resource\/image\/6b\/5c\/6b694e06a71213ee056a6d10a928c45c.gif","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":"center","origin":null},"content":[{"type":"text","text":"使用 FiftyOne 可視化 Flash 預測"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"隨着現代數據集的複雜性和規模的增加,圖像和視頻數據的可視化一直是一個挑戰。FiftyOne 的設計目的是提供對數據集和標籤的用戶友好的視圖 (包括註釋和模型預測),現在 Flash 模型可以通過一行額外的代碼訪問這些數據集和標籤。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"from flash import Trainer\nfrom flash.core.classification import FiftyOneLabels\nfrom flash.core.integrations.fiftyone import visualize\nfrom flash.video import VideoClassificationData, VideoClassifier\nclassifier = VideoClassifier.load_from_checkpoint(...)\n# Option 1: Generate predictions using a Trainer and datamodule\ndatamodule = VideoClassificationData.from_folders(\npredict_folder=\"\/path\/to\/folder\",\n...\n)\ntrainer = Trainer()\nclassifier.serializer = FiftyOneLabels(return_filepath=True)\npredictions = trainer.predict(classifier, datamodule=datamodule)\nsession = visualize(predictions) # Launch FiftyOne\n# Option 2: Generate predictions from model using filepaths\nfilepaths = [\"list\", \"of\", \"filepaths\"]\npredictions = classifier.predict(filepaths)\nclassifier.serializer = FiftyOneLabels()\nsession = visualize(predictions, filepaths=filepaths) # Launch FiftyOne\n"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/resource\/image\/bb\/18\/bbf45cd2db5210bb8a6285b88c7f1e18.jpg","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":"center","origin":null},"content":[{"type":"text","text":"用 FiftyOne 進行可視化 Flash 視頻分類預測。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"示例工作流"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"安裝"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"要跟上本文的示例,你需要安裝相關的軟件包。首先,你需要安裝 PyTorch Lightning Flash 和 FiftyOne:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"bash"},"content":[{"type":"text","text":"pip install fiftyone lightning-flash\n"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"對於嵌入可視化工作流,你還需要安裝降維軟件包 umap-learn:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"bash"},"content":[{"type":"text","text":"pip install umap-learn\n"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"通用工作流"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"使用這些工具的大多數模型開發工作流遵循相同的通用結構:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/voxel51.com\/docs\/fiftyone\/user_guide\/dataset_creation\/index.html","title":"","type":null},"content":[{"type":"text","text":"將數據集加載到 FiftyOne"}]},{"type":"text","text":"。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"從數據集創建 Flash"},{"type":"link","attrs":{"href":"https:\/\/lightning-flash.readthedocs.io\/en\/latest\/integrations\/fiftyone.html#datamodule-from-fiftyone","title":"","type":null},"content":[{"type":"text","text":"數據模塊"}]},{"type":"text","text":"。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/github.com\/PyTorchLightning\/lightning-flash#finetuning","title":"","type":null},"content":[{"type":"text","text":"對任務進行微調"}]},{"type":"text","text":"。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/github.com\/PyTorchLightning\/lightning-flash#predictions","title":"","type":null},"content":[{"type":"text","text":"從模型生成預測"}]},{"type":"text","text":"。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"向數據集中添加預測結果並"},{"type":"link","attrs":{"href":"https:\/\/voxel51.com\/docs\/fiftyone\/user_guide\/app.html","title":"","type":null},"content":[{"type":"text","text":"將其可視化"}]}]}]}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"圖像目標檢測"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"本節展示了使用 PyTorch Lightning Flash 和 FiftyOne 之間的這種集成,以訓練和評估一個圖像目標檢測模型的具體示例。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"from itertools import chain\nimport fiftyone as fo\nimport fiftyone.zoo as foz\nfrom flash import Trainer\nfrom flash.image import ObjectDetectionData, ObjectDetector\nfrom flash.image.detection.serialization import FiftyOneDetectionLabels\n# 1. Load your FiftyOne dataset\n# Here we use views into one dataset, but you can also create a\n# different dataset for each split\ndataset = foz.load_zoo_dataset(\"quickstart\", max_samples=40)\ntrain_dataset = dataset.shuffle(seed=51)[:20]\ntest_dataset = dataset.shuffle(seed=51)[20:25]\nval_dataset = dataset.shuffle(seed=51)[25:30]\npredict_dataset = dataset.shuffle(seed=51)[30:40]\n# 2. Load the Datamodule\ndatamodule = ObjectDetectionData.from_fiftyone(\ntrain_dataset = train_dataset,\ntest_dataset = test_dataset,\nval_dataset = val_dataset,\npredict_dataset = predict_dataset,\nlabel_field = \"ground_truth\",\nbatch_size=4,\nnum_workers=4,\n)\n# 3. Build the model\nmodel = ObjectDetector(\nmodel=\"retinanet\",\nnum_classes=datamodule.num_classes,\nserializer=FiftyOneDetectionLabels(),\n)\n# 4. Create the trainer\ntrainer = Trainer(max_epochs=1, limit_train_batches=1, limit_val_batches=1)\n# 5. Finetune the model\ntrainer.finetune(model, datamodule=datamodule)\n# 6. Save it!\ntrainer.save_checkpoint(\"object_detection_model.pt\")\n# 7. Generate predictions\nmodel = ObjectDetector.load_from_checkpoint(\n\"https:\/\/flash-weights.s3.amazonaws.com\/object_detection_model.pt\"\n)\nmodel.serializer = FiftyOneDetectionLabels()\npredictions = trainer.predict(model, datamodule=datamodule)\npredictions = list(chain.from_iterable(predictions)) # flatten batches\n# 8. Add predictions to dataset and analyze\npredict_dataset.set_values(\"flash_predictions\", predictions)\nsession = fo.launch_app(view=predict_dataset)\n"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":"center","origin":null},"content":[{"type":"text","text":"在 FiftyOne 中可視化的 Flash 目標檢測預測"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在此之後,你可以將預測返回到數據集中,並且可以運行評估來"},{"type":"link","attrs":{"href":"https:\/\/voxel51.com\/docs\/fiftyone\/user_guide\/plots.html#confusion-matrices","title":"","type":null},"content":[{"type":"text","text":"生成混淆矩陣"}]},{"type":"text","text":"、"},{"type":"link","attrs":{"href":"https:\/\/voxel51.com\/docs\/fiftyone\/user_guide\/evaluation.html#map-and-pr-curves","title":"","type":null},"content":[{"type":"text","text":"PR 曲線"}]},{"type":"text","text":",以及"},{"type":"link","attrs":{"href":"https:\/\/voxel51.com\/docs\/fiftyone\/user_guide\/evaluation.html","title":"","type":null},"content":[{"type":"text","text":"準確率和 mAP 等指標"}]},{"type":"text","text":"。尤其是,你可以"},{"type":"link","attrs":{"href":"(https:\/\/voxel51.com\/docs\/fiftyone\/user_guide\/using_views.html#evaluation-patches)","title":"","type":null},"content":[{"type":"text","text":"識別並查看個別的真 \/ 假正類 \/ 負類結果"}]},{"type":"text","text":",讓你瞭解你的模型在哪些方面表現良好,哪些方面表現不佳。基於常見失敗模式改進模型是開發更好模型的更加可靠的方法。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.infoq.cn\/resource\/image\/97\/7c\/9717356d4aeeb99fab5eef03443e297c.gif","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":"center","origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"FiftyOne 中的交互式混淆矩陣"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"嵌入式可視化"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這個工作流的獨特之處在於,它採用預訓練模型,並使用它們來生成數據集中的每一張圖片的嵌入向量。然後,你就可以"},{"type":"link","attrs":{"href":"https:\/\/voxel51.com\/docs\/fiftyone\/tutorials\/image_embeddings.html","title":"","type":null},"content":[{"type":"text","text":"在低維空間中計算這些嵌入的可視化"}]},{"type":"text","text":",以查找數據集羣。這一功能可以爲硬樣本挖掘、數據註釋、註釋樣本推薦等提供有價值的發現。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/resource\/image\/6c\/5a\/6c8d57a6522401cc1940190dd6271d5a.jpg","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"有了"},{"type":"link","attrs":{"href":"https:\/\/voxel51.com\/docs\/fiftyone\/user_guide\/plots.html#visualizing-embeddings","title":"","type":null},"content":[{"type":"text","text":"交互圖"}]},{"type":"text","text":"的概念,你可以點擊或圈出這些嵌入的區域,並自動更新你的會話,查看和"},{"type":"link","attrs":{"href":"https:\/\/voxel51.com\/docs\/fiftyone\/user_guide\/app.html#tags-and-tagging","title":"","type":null},"content":[{"type":"text","text":"標記相應的示例"}]},{"type":"text","text":"。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"其他任務"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"你可以在這裏查看其他任務的類似工作流,例如"},{"type":"link","attrs":{"href":"https:\/\/voxel51.com\/docs\/fiftyone\/integrations\/lightning_flash.html#model-training","title":"","type":null},"content":[{"type":"text","text":"分類和分割"}]},{"type":"text","text":"。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"總結"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"開源社區多年來的發展令人矚目,特別是在機器學習領域。儘管單獨的工具可以很好地解決一個特定的問題,但是它們之間的緊密結合形成了一個強大的工作流。PyTorch Lightning Flash 與 FiftyOne 之間的新集成爲開發數據集、訓練模型和分析結果提供了一種新的簡便方法。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"作者介紹:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Eric Hofesmann,Voxel51 機器學習工程師,密歇根大學(University of Michigan)計算機科學碩士。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"原文鏈接:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"https:\/\/towardsdatascience.com\/open-source-tools-for-fast-computer-vision-model-building-b39755aab490"}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章