Note
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãµã€ã³ã€ã³ãŸãã¯ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
転移åŠç¿ãäºåãã¬ãŒãã³ã°æžã¿ã® TensorFlow ã¢ãã«ãããã³ ML.NET ç»ååé¡ API ã䜿çšããŠã«ã¹ã¿ã ãã£ãŒã ã©ãŒãã³ã° ã¢ãã«ããã¬ãŒãã³ã°ããã³ã³ã¯ãªãŒããµãŒãã§ã¹ã®ç»åãå²ããããŸãã¯å²ããŠããªããã®ãšããŠåé¡ããæ¹æ³ã«ã€ããŠèª¬æããŸãã
ãã®ãã¥ãŒããªã¢ã«ã§ã¯ã以äžã®å 容ãåŠç¿ããŸãã
- åé¡ãçè§£ãã
- ML.NET ç»ååé¡ API ã«ã€ããŠåŠç¿ãã
- äºåãã¬ãŒãã³ã°æžã¿ã¢ãã«ãçè§£ãã
- 転éåŠç¿ã䜿çšããŠã«ã¹ã¿ã TensorFlow ç»ååé¡ã¢ãã«ããã¬ãŒãã³ã°ãã
- ã«ã¹ã¿ã ã¢ãã«ã䜿çšããŠç»åãåé¡ãã
[åææ¡ä»¶]
åé¡ãçè§£ãã
ç»ååé¡ã¯ãã³ã³ãã¥ãŒã¿ãŒ ããžã§ã³ã®åé¡ã§ãã ç»ååé¡ã§ã¯ãç»åãå ¥åãšããŠåãåãããæå®ã®ã¯ã©ã¹ã«åé¡ãããŸãã ç»ååé¡ã¢ãã«ã¯ãäžè¬çã«ãã£ãŒã ã©ãŒãã³ã°ãšãã¥ãŒã©ã« ãããã¯ãŒã¯ã䜿çšããŠãã¬ãŒãã³ã°ãããŸãã 詳现ã«ã€ããŠã¯ãã ãã£ãŒã ã©ãŒãã³ã°ã𿩿¢°åŠç¿ããåç §ããŠãã ããã
ç»ååé¡ã圹ç«ã€ã·ããªãªã«ã¯ã次ã®ãããªãã®ããããŸãã
- é¡èªè
- ææ æ€åº
- å»ç蚺æ
- ã©ã³ãããŒã¯ã®æ€åº
ãã®ãã¥ãŒããªã¢ã«ã§ã¯ãæ©ã®ãããã®èªåèŠèŠçæ€æ»ãå®è¡ããŠãäºè£ã«ãã£ãŠæå·ãåããæ§é ãèå¥ããã«ã¹ã¿ã ç»ååé¡ã¢ãã«ããã¬ãŒãã³ã°ããŸãã
ML.NET ç»ååé¡ API
ML.NET ã§ã¯ãããŸããŸãªæ¹æ³ã§ç»ååé¡ãå®è¡ã§ããŸãã ãã®ãã¥ãŒããªã¢ã«ã§ã¯ãç»ååé¡ API ã䜿çšããŠè»¢ç§»åŠç¿ãé©çšããŸãã Image Classification API ã§ã¯ ãTensorFlow C++ API ã® C# ãã€ã³ããæäŸããäœã¬ãã«ã©ã€ãã©ãªã§ãã TensorFlow.NET ãå©çšããŸãã
転移åŠç¿ãšã¯äœã
転移åŠç¿ã¯ãããåé¡ã®è§£æ±ºããåŸãç¥èãå¥ã®é¢é£ããåé¡ã«é©çšããŸãã
ãã£ãŒã ã©ãŒãã³ã° ã¢ãã«ããŒããããã¬ãŒãã³ã°ããã«ã¯ãããã€ãã®ãã©ã¡ãŒã¿ãŒãã©ãã«ä»ãããã倧éã®ãã¬ãŒãã³ã° ããŒã¿ãèšå€§ãªéã®ã³ã³ãã¥ãŒãã£ã³ã° ãªãœãŒã¹ (æ°çŸ GPU æé) ãèšå®ããå¿ èŠããããŸãã äºåãã¬ãŒãã³ã°æžã¿ã¢ãã«ãšè»¢ç§»åŠç¿ã䜿çšãããšããã¬ãŒãã³ã° ããã»ã¹ãã·ã§ãŒãã«ããã§ããŸãã
ãã¬ãŒãã³ã° ããã»ã¹
Image Classification API ã¯ãäºåãã¬ãŒãã³ã°æžã¿ã® TensorFlow ã¢ãã«ãèªã¿èŸŒãããšã§ãã¬ãŒãã³ã° ããã»ã¹ãéå§ããŸãã ãã¬ãŒãã³ã° ããã»ã¹ã¯ã次㮠2 ã€ã®æé ã§æ§æãããŸãã
- ããã«ããã¯ãã§ãŒãºã
- ãã¬ãŒãã³ã° ãã§ãŒãºã
ããã«ããã¯ãã§ãŒãº
ããã«ããã¯ã®ãã§ãŒãºã§ã¯ããã¬ãŒãã³ã°ã€ã¡ãŒãžã®ã»ãããèªã¿èŸŒãŸããäºåãã¬ãŒãã³ã°æžã¿ã¢ãã«ã®åºå®ã¬ã€ã€ãŒã®å ¥åãŸãã¯ç¹åŸŽãšããŠãã¯ã»ã«å€ã䜿çšãããŸãã åçµå±€ã«ã¯ãããã«ããã¯å±€ãšããŠéå ¬åŒã«ç¥ãããŠããæåŸã®å±€ãŸã§ããã¥ãŒã©ã« ãããã¯ãŒã¯å ã®ãã¹ãŠã®ã¬ã€ã€ãŒãå«ãŸããŸãã ãããã®ã¬ã€ã€ãŒã§ã¯ãã¬ãŒãã³ã°ãè¡ããããæäœããã¹ã¹ã«ãŒãããããããããã®ã¬ã€ã€ãŒã¯åºå®ãšåŒã°ããŸãã ãããã®åºå®ã¬ã€ã€ãŒã§ã¯ãã¢ãã«ãç°ãªãã¯ã©ã¹ãåºå¥ããã®ã«åœ¹ç«ã€äžäœã¬ãã«ã®ãã¿ãŒã³ãèšç®ãããŸãã ã¬ã€ã€ãŒã®æ°ãå€ãã»ã©ããã®æé ã¯èšç®è² è·ãé«ããªããŸãã 幞ãããã㯠1 åéãã®èšç®ã§ãããããç°ãªããã©ã¡ãŒã¿ãŒã詊ããšãã«ãçµæããã£ãã·ã¥ããåŸã®å®è¡ã§äœ¿çšã§ããŸãã
ãã¬ãŒãã³ã° ãã§ãŒãº
ããã«ããã¯ãã§ãŒãºããã®åºåå€ãèšç®ããããšãã¢ãã«ã®æçµã¬ã€ã€ãŒãåãã¬ãŒãã³ã°ããããã®å
¥åãšããŠäœ¿çšãããŸãã ãã®ããã»ã¹ã¯å埩çã§ãããã¢ãã« ãã©ã¡ãŒã¿ãŒã§æå®ãããåæ°ã ãå®è¡ãããŸãã åå®è¡äžã«ãæå€±ãšç²ŸåºŠãè©äŸ¡ãããŸãã æ¬¡ã«ãæå€±ãæå°éã«æãã粟床ãæå€§åããããšãç®çãšããŠãã¢ãã«ãæ¹åããããã«é©åãªèª¿æŽãè¡ãããŸãã ãã¬ãŒãã³ã°ãå®äºãããšã2 ã€ã®ã¢ãã«åœ¢åŒãåºåãããŸãã ãã®ãã¡ã® 1 ã€ã¯ã¢ãã«ã® .pb ããŒãžã§ã³ã§ããããã 1 ã€ã¯ã¢ãã«ã®ã·ãªã¢ã«åãããããŒãžã§ã³ .zip ML.NET ã§ãã ML.NET ã§ãµããŒããããŠããç°å¢ã§äœæ¥ããå Žåã¯ã .zip ããŒãžã§ã³ã®ã¢ãã«ã䜿çšããããšããå§ãããŸãã ãã ããML.NET ããµããŒããããŠããªãç°å¢ã§ã¯ã .pb ããŒãžã§ã³ã䜿çšããããšãã§ããŸãã
äºåãã¬ãŒãã³ã°æžã¿ã¢ãã«ãçè§£ãã
ãã®ãã¥ãŒããªã¢ã«ã§äœ¿çšãããäºåãã¬ãŒãã³ã°æžã¿ã¢ãã«ã¯ãæ®å·®ãããã¯ãŒã¯ (ResNet) v2 ã¢ãã«ã® 101 å±€ããªã¢ã³ãã§ãã å ã®ã¢ãã«ã¯ãç»åã 1000 ã®ã«ããŽãªã«åé¡ããããã«ãã¬ãŒãã³ã°ãããŸãã ã¢ãã«ã¯ããµã€ãº 224 x 224 ã®ç»åãå ¥åãšããŠåãåãããã¬ãŒãã³ã°å¯Ÿè±¡ã®åã¯ã©ã¹ã®ã¯ã©ã¹ç¢ºçãåºåããŸãã ãã®ã¢ãã«ã®äžéšã䜿çšããŠãã«ã¹ã¿ã ã€ã¡ãŒãžã䜿çšããŠæ°ããã¢ãã«ããã¬ãŒãã³ã°ãã2 ã€ã®ã¯ã©ã¹éã§äºæž¬ãè¡ããŸãã
ã³ã³ãœãŒã« ã¢ããªã±ãŒã·ã§ã³ãäœæãã
ããã§ã転移åŠç¿ãšç»ååé¡ API ã«é¢ããäžè¬çãªçè§£ãåŸãããæ¬¡ã¯ã¢ããªã±ãŒã·ã§ã³ããã«ãããŸãã
"DeepLearning_ImageClassification_Binary" ãšããååã® C# ã³ã³ãœãŒã« ã¢ããªã±ãŒã·ã§ã³ ãäœæããŸãã [ 次㞠] ãã¿ã³ãã¯ãªãã¯ããŸãã
䜿çšãããã¬ãŒã ã¯ãŒã¯ãšã㊠[.NET 8] ãéžæãã[ äœæ] ãéžæããŸãã
Microsoft.ML NuGet ããã±ãŒãžãã€ã³ã¹ããŒã«ããŸãã
泚
ãã®ãµã³ãã«ã§ã¯ãç¹ã«æèšãããŠããªãéããèšèŒãããŠããææ°ã®å®å®ããŒãžã§ã³ã® NuGet ããã±ãŒãžã䜿çšããŸãã
- ãœãªã¥ãŒã·ã§ã³ ãšã¯ã¹ãããŒã©ãŒã§ããããžã§ã¯ããå³ã¯ãªãã¯ãã[ NuGet ããã±ãŒãžã®ç®¡ç] ãéžæããŸãã
- ããã±ãŒãž ãœãŒã¹ãšã㊠[nuget.org] ãéžæããŸãã
- ãBrowseãã¿ããéžæããŸãã
- [ ãã¬ãªãªãŒã¹ãå«ãã ] ãã§ãã¯ããã¯ã¹ããªã³ã«ããŸãã
- Microsoft.ML ãæ€çŽ¢ããŸãã
- [ã€ã³ã¹ããŒã«] ãã¿ã³ãéžæããŸãã
- äžèŠ§è¡šç€ºãããŠããããã±ãŒãžã®ã©ã€ã»ã³ã¹æ¡é ã«åæããå Žåã¯ã[ã©ã€ã»ã³ã¹ã®åæ] ãã€ã¢ãã°ã§ [åæãã] ãã¿ã³ãéžæããŸãã
- Microsoft.ML.VisionãSciSharp.TensorFlow.Redist (ããŒãžã§ã³ 2.3.1)ãããã³ Microsoft.ML.ImageAnalytics NuGet ããã±ãŒãžã«å¯ŸããŠããããã®æé ãç¹°ãè¿ããŸãã
ããŒã¿ãæºåããŠçè§£ãã
泚
ãã®ãã¥ãŒããªã¢ã«ã®ããŒã¿ã»ããã¯ãããŒã¯ã»ãã°ã¯ã€ã¢ããµã¿ãŒã»ãã©ãã·ã£ã³ããããŒãã»Jã»ããŒãã¹ã®"SDNET2018: æ©æ¢°åŠç¿çšéã®ã³ã³ã¯ãªãŒãã¯ã©ãã¯ç»åããŒã¿ã»ãã" (2018幎) ããã®ãã®ã§ãã ãã¹ãŠã®ããŒã¿ã»ãããåç §ããŸãã çšçŽ 48. https://digitalcommons.usu.edu/all_datasets/48
SDNET2018ã¯ãã³ã³ã¯ãªãŒãæ§é ç© (æ©ã®ããããå£ãèè£ ) ã®æ³šéãå«ãç»åããŒã¿ã»ããã§ãã
ããŒã¿ã¯ã次㮠3 ã€ã®ãµããã£ã¬ã¯ããªã«ç·šæãããŸãã
- D ã«ã¯ããªããž ãããã€ã¡ãŒãžãå«ãŸããŠããŸã
- P ã«ã¯èè£ ç»åãå«ãŸããŠããŸã
- W ã«ã¯å£ã®ç»åãå«ãŸããŠããŸã
ãããã®åãµããã£ã¬ã¯ããªã«ã¯ããã¬ãã£ãã¯ã¹ä»ããµããã£ã¬ã¯ããªã 2 ã€è¿œå ãããŠããŸãã
- C ã¯ãå²ãã衚é¢ã«äœ¿çšããããã¬ãã£ãã¯ã¹ã§ã
- U ã¯ãåè§£ãããŠããªããµãŒãã§ã¹ã«äœ¿çšããããã¬ãã£ãã¯ã¹ã§ãã
ãã®ãã¥ãŒããªã¢ã«ã§ã¯ãããªããž ãããã€ã¡ãŒãžã®ã¿ã䜿çšããŸãã
- ããŒã¿ã»ãããããŠã³ããŒãããŠè§£åããŸãã
- ãããžã§ã¯ãã« "Assets" ãšããååã®ãã£ã¬ã¯ããªãäœæããŠãããŒã¿ã»ãã ãã¡ã€ã«ãä¿åããŸãã
- æè¿è§£åãããã£ã¬ã¯ããªã® CD ããã³ UD ãµããã£ã¬ã¯ããªã Assets ãã£ã¬ã¯ããªã«ã³ããŒããŸãã
å ¥åã¯ã©ã¹ãšåºåã¯ã©ã¹ãäœæãã
Program.cs ãã¡ã€ã«ãéããæ¢åã®ã³ã³ãã³ããæ¬¡ã®
usingãã£ã¬ã¯ãã£ãã«çœ®ãæããŸããusing Microsoft.ML; using Microsoft.ML.Vision; using static Microsoft.ML.DataOperationsCatalog;ImageDataãšããã¯ã©ã¹ãäœæããŸãã ãã®ã¯ã©ã¹ã¯ãæåã«èªã¿èŸŒãŸããããŒã¿ã衚ãããã«äœ¿çšãããŸããclass ImageData { public string? ImagePath { get; set; } public string? Label { get; set; } }ImageDataã«ã¯ã次ã®ããããã£ãå«ãŸããŠããŸãã-
ImagePathã¯ãã€ã¡ãŒãžãæ ŒçŽãããå®å šä¿®é£Ÿãã¹ã§ãã -
Labelã¯ãç»åãå±ããã«ããŽãªã§ãã ããã¯äºæž¬ããå€ã§ãã
-
å ¥åããŒã¿ãšåºåããŒã¿ã®ã¯ã©ã¹ãäœæããŸãã
ImageDataã¯ã©ã¹ã®äžã§ãModelInputãšããæ°ããã¯ã©ã¹ã§å ¥åããŒã¿ã®ã¹ããŒããå®çŸ©ããŸããclass ModelInput { public byte[]? Image { get; set; } public uint LabelAsKey { get; set; } public string? ImagePath { get; set; } public string? Label { get; set; } }ModelInputã«ã¯ã次ã®ããããã£ãå«ãŸããŠããŸãã-
Imageã¯ãã€ã¡ãŒãžã®byte[]衚çŸã§ãã ã¢ãã«ã§ã¯ããã¬ãŒãã³ã°çšã«ç»åããŒã¿ããã®çš®é¡ã§ããããšãæ³å®ãããŠããŸãã -
LabelAsKeyã¯ãLabelã®æ°å€è¡šçŸã§ãã -
ImagePathã¯ãã€ã¡ãŒãžãæ ŒçŽãããå®å šä¿®é£Ÿãã¹ã§ãã -
Labelã¯ãç»åãå±ããã«ããŽãªã§ãã ããã¯äºæž¬ããå€ã§ãã
ã¢ãã«ã®ãã¬ãŒãã³ã°ãšäºæž¬ã«ã¯ã
ImageãšLabelAsKeyã®ã¿ã䜿çšãããŸããImagePathããããã£ãšLabelããããã£ã¯ãå ã®ã€ã¡ãŒãž ãã¡ã€ã«åãšã«ããŽãªã«ã¢ã¯ã»ã¹ããããã«ä¿æãããŸãã-
次ã«ã
ModelInputã¯ã©ã¹ã®äžã§ãModelOutputãšããæ°ããã¯ã©ã¹ã§åºåããŒã¿ã®ã¹ããŒããå®çŸ©ããŸããclass ModelOutput { public string? ImagePath { get; set; } public string? Label { get; set; } public string? PredictedLabel { get; set; } }ModelOutputã«ã¯ã次ã®ããããã£ãå«ãŸããŠããŸãã-
ImagePathã¯ãã€ã¡ãŒãžãæ ŒçŽãããå®å šä¿®é£Ÿãã¹ã§ãã -
Labelã¯ãç»åãå±ããå ã®ã«ããŽãªã§ãã ããã¯äºæž¬ããå€ã§ãã -
PredictedLabelã¯ãã¢ãã«ã«ãã£ãŠäºæž¬ãããå€ã§ãã
ModelInputãšåæ§ã«ãã¢ãã«ã«ãã£ãŠè¡ãããäºæž¬ãå«ãŸãããããäºæž¬ãè¡ãããã«å¿ èŠãªã®ã¯PredictedLabelã ãã§ããImagePathããããã£ãšLabelããããã£ã¯ãå ã®ã€ã¡ãŒãž ãã¡ã€ã«åãšã«ããŽãªã«ã¢ã¯ã»ã¹ããããã«ä¿æãããŸãã-
ãã¹ã®å®çŸ©ãšå€æ°ã®åæå
usingãã£ã¬ã¯ãã£ãã®äžã«ã次ã®ã³ãŒãã远å ããŸããè³ç£ã®å Žæãå®çŸ©ããŸãã
mlContextã®æ°ããã€ã³ã¹ã¿ã³ã¹ã䜿çšããŠã倿°ãåæåããŸããMLContext ã¯ã©ã¹ã¯ããã¹ãŠã® ML.NET æäœã®éå§ç¹ã§ãããmlContext ãåæåãããšãã¢ãã«äœæã¯ãŒã¯ãã㌠ãªããžã§ã¯ãéã§å ±æã§ããæ°ãã ML.NET ç°å¢ãäœæãããŸãã æŠå¿µçã«ã¯ãEntity Framework ã®
DbContextã«äŒŒãŠããŸãã
var projectDirectory = Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, "../../../")); var assetsRelativePath = Path.Combine(projectDirectory, "Assets"); MLContext mlContext = new();
ããŒã¿ãèªã¿èŸŒã
ããŒã¿èªã¿èŸŒã¿ãŠãŒãã£ãªã㣠ã¡ãœãããäœæãã
ã€ã¡ãŒãžã¯ 2 ã€ã®ãµããã£ã¬ã¯ããªã«æ ŒçŽãããŸãã ããŒã¿ãèªã¿èŸŒãåã«ã ImageData ãªããžã§ã¯ãã®äžèŠ§ã«æžåŒèšå®ããå¿
èŠããããŸãã ãããè¡ãã«ã¯ã LoadImagesFromDirectory ã¡ãœãããäœæããŸãã
static IEnumerable<ImageData> LoadImagesFromDirectory(string folder, bool useFolderNameAsLabel = true)
{
var files = Directory.GetFiles(folder, "*",
searchOption: SearchOption.AllDirectories);
foreach (var file in files)
{
if ((Path.GetExtension(file) != ".jpg") && (Path.GetExtension(file) != ".png"))
continue;
var label = Path.GetFileName(file);
if (useFolderNameAsLabel)
label = Directory.GetParent(file)?.Name;
else
{
for (int index = 0; index < label.Length; index++)
{
if (!char.IsLetter(label[index]))
{
label = label[..index];
break;
}
}
}
yield return new ImageData()
{
ImagePath = file,
Label = label
};
}
}
LoadImagesFromDirectory ã¡ãœãã:
- ãµããã£ã¬ã¯ããªãããã¹ãŠã®ãã¡ã€ã« ãã¹ãååŸããŸãã
-
foreachã¹ããŒãã¡ã³ãã䜿çšããŠåãã¡ã€ã«ãå埩åŠçãããã¡ã€ã«æ¡åŒµåããµããŒããããŠããããšã確èªããŸãã ç»ååé¡ API ã§ã¯ãJPEG 圢åŒãš PNG 圢åŒããµããŒããããŠããŸãã - ãã¡ã€ã«ã®ã©ãã«ãååŸããŸãã
useFolderNameAsLabelãã©ã¡ãŒã¿ãŒãtrueã«èšå®ãããŠããå Žåããã¡ã€ã«ãä¿åãããŠãã芪ãã£ã¬ã¯ããªãã©ãã«ãšããŠäœ¿çšãããŸãã ãã以å€ã®å Žåã¯ãã©ãã«ããã¡ã€ã«åãŸãã¯ãã¡ã€ã«åèªäœã®ãã¬ãã£ãã¯ã¹ã§ããããšãæ³å®ãããŸãã -
ModelInputã®æ°ããã€ã³ã¹ã¿ã³ã¹ãäœæããŸãã
ããŒã¿ãæºåãã
MLContextã®æ°ããã€ã³ã¹ã¿ã³ã¹ãäœæããè¡ã®åŸã«ã次ã®ã³ãŒãã远å ããŸãã
IEnumerable<ImageData> images = LoadImagesFromDirectory(folder: assetsRelativePath, useFolderNameAsLabel: true);
IDataView imageData = mlContext.Data.LoadFromEnumerable(images);
IDataView shuffledData = mlContext.Data.ShuffleRows(imageData);
var preprocessingPipeline = mlContext.Transforms.Conversion.MapValueToKey(
inputColumnName: "Label",
outputColumnName: "LabelAsKey")
.Append(mlContext.Transforms.LoadRawImageBytes(
outputColumnName: "Image",
imageFolder: assetsRelativePath,
inputColumnName: "ImagePath"));
IDataView preProcessedData = preprocessingPipeline
.Fit(shuffledData)
.Transform(shuffledData);
TrainTestData trainSplit = mlContext.Data.TrainTestSplit(data: preProcessedData, testFraction: 0.3);
TrainTestData validationTestSplit = mlContext.Data.TrainTestSplit(trainSplit.TestSet);
IDataView trainSet = trainSplit.TrainSet;
IDataView validationSet = validationTestSplit.TrainSet;
IDataView testSet = validationTestSplit.TestSet;
åã®ã³ãŒã:
LoadImagesFromDirectoryãŠãŒãã£ãªã㣠ã¡ãœãããåŒã³åºããŠãmlContext倿°ã®åæååŸã«ãã¬ãŒãã³ã°ã«äœ¿çšãããã€ã¡ãŒãžã®äžèЧãååŸããŸããIDataViewã¡ãœããã䜿çšããŠãã€ã¡ãŒãžãLoadFromEnumerableã«èªã¿èŸŒã¿ãŸããShuffleRowsã¡ãœããã䜿çšããŠããŒã¿ãã·ã£ããã«ããŸãã ããŒã¿ã¯ããã£ã¬ã¯ããªããèªã¿åãããé åºã§èªã¿èŸŒãŸããŸãã ã·ã£ããã«ã¯ãã©ã³ã¹ãåãããã«å®è¡ãããŸãããã¬ãŒãã³ã°ã®åã«ããŒã¿ã«å¯ŸããŠããã€ãã®ååŠçãå®è¡ããŸãã ããã¯ãæ©æ¢°åŠç¿ã¢ãã«ã§ã¯å ¥åãæ°å€åœ¢åŒã§ããããšãæ³å®ãããŠããããã§ãã ååŠçã³ãŒãã¯ã
EstimatorChainãšMapValueToKeyå€æã§æ§æãããLoadRawImageBytesãäœæããŸããMapValueToKey倿ã¯ãLabelåã®ã«ããŽãªå€ãåãåããæ°å€KeyTypeå€ã«å€æããLabelAsKeyãšããæ°ããåã«æ ŒçŽããŸããLoadImagesã¯ããã¬ãŒãã³ã°çšã®ç»åãèªã¿èŸŒãããã®ImagePathãã©ã¡ãŒã¿ãŒãšå ±ã«ãimageFolderåã®å€ãåãåããŸããFitã¡ãœããã䜿çšããŠããŒã¿ãpreprocessingPipelineEstimatorChainã«é©çšãããã®åŸã«ååŠçãããããŒã¿ãå«ãTransformãè¿ãIDataViewã¡ãœããã䜿çšããŸããããŒã¿ããã¬ãŒãã³ã°ãæ€èšŒãããã³ãã¹ã ã»ããã«åå²ããŸãã
ã¢ãã«ããã¬ãŒãã³ã°ããã«ã¯ããã¬ãŒãã³ã° ããŒã¿ã»ãããšæ€èšŒããŒã¿ã»ãããçšæããããšãéèŠã§ãã ã¢ãã«ã¯ãã¬ãŒãã³ã° ã»ããã§ãã¬ãŒãã³ã°ãããŸãã èŠããªãããŒã¿ã«å¯Ÿããäºæž¬ãã©ã®çšåºŠé©åã«è¡ããããã¯ãæ€èšŒã»ããã«å¯Ÿããããã©ãŒãã³ã¹ã«ãã£ãŠæž¬å®ãããŸãã ãã®ããã©ãŒãã³ã¹ã®çµæã«åºã¥ããŠãã¢ãã«ã¯æ¹åã®ããã«åŠç¿ããå 容ã«èª¿æŽãå ããŸãã æ€èšŒã»ããã¯ãå ã®ããŒã¿ã»ãããåå²ãããããã®ç®çã®ããã«æ¢ã«ç¢ºä¿ãããŠããå¥ã®ãœãŒã¹ããååŸã§ããŸãã
ãã®ã³ãŒã ãµã³ãã«ã§ã¯ã2 ã€ã®åå²ãå®è¡ããŸãã ãŸããååŠçãããããŒã¿ãåå²ããã70% ããã¬ãŒãã³ã°ã«äœ¿çšãããæ®ãã® 30% ãæ€èšŒã«äœ¿çšãããŸãã æ¬¡ã«ã30% æ€èšŒã»ãããããã«æ€èšŒã»ããã«åå²ãã90% ãæ€èšŒã«äœ¿çšãã10 åã®% ããã¹ãã«äœ¿çšããŸãã
ãããã®ããŒã¿ ããŒãã£ã·ã§ã³ã®ç®çã«ã€ããŠèãã 1 ã€ã®æ¹æ³ã¯ã詊éšãåããããšã§ãã 詊éšãå匷ãããšãã¯ãããŒããæžç±ããŸãã¯ãã®ä»ã®ãªãœãŒã¹ã確èªããŠã詊éšã®æŠå¿µãææ¡ããŸãã ãããåè»ã»ããã®ç®çã§ãã ãã®åŸãç¥èãæ€èšŒããããã«ã¢ãã¯è©Šéšãåããå ŽåããããŸãã ããã§ãæ€èšŒã»ããã圹ç«ã¡ãŸãã å®éã®è©Šéšãåããåã«ãæŠå¿µãååã«ææ¡ããŠãããã©ããã確èªããå¿ èŠããããŸãã ãããã®çµæã«åºã¥ããŠãééã£ãããšãããçè§£ã§ããªãã£ãããšãã¡ã¢ããå®éã®è©ŠéšãèŠçŽãéã«å€æŽãçµã¿èŸŒã¿ãŸãã æåŸã«ã詊éšãåããŸãã ããããã¹ã ã»ããã®çšéã§ãã 詊éšäžã®è³ªåãèŠãããšããªãã®ã§ããã¬ãŒãã³ã°ãšæ€èšŒããåŠãã ããšã䜿çšããŠãç®ã®åã®ã¿ã¹ã¯ã«ç¥èãé©çšããŸãã
ãã¬ãŒãã³ã°ãæ€èšŒãããã³ãã¹ã ããŒã¿ã®ããããã®å€ãããŒãã£ã·ã§ã³ã«å²ãåœãŠãŸãã
ãã¬ãŒãã³ã° ãã€ãã©ã€ã³ãå®çŸ©ãã
ã¢ãã« ãã¬ãŒãã³ã°ã¯ã2 ã€ã®æé ã§æ§æãããŸãã ãŸããç»ååé¡ API ã䜿çšããŠã¢ãã«ããã¬ãŒãã³ã°ããŸãã æ¬¡ã«ã PredictedLabel åã®ãšã³ã³ãŒããããã©ãã«ã¯ã MapKeyToValue 倿ã䜿çšããŠå
ã®ã«ããŽãªå€ã«å€æãããŸãã
var classifierOptions = new ImageClassificationTrainer.Options()
{
FeatureColumnName = "Image",
LabelColumnName = "LabelAsKey",
ValidationSet = validationSet,
Arch = ImageClassificationTrainer.Architecture.ResnetV2101,
MetricsCallback = (metrics) => Console.WriteLine(metrics),
TestOnTrainSet = false,
ReuseTrainSetBottleneckCachedValues = true,
ReuseValidationSetBottleneckCachedValues = true
};
var trainingPipeline = mlContext.MulticlassClassification.Trainers.ImageClassification(classifierOptions)
.Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel"));
ITransformer trainedModel = trainingPipeline.Fit(trainSet);
åã®ã³ãŒã:
ImageClassificationTrainerã®å¿ é ãã©ã¡ãŒã¿ãŒãšçç¥å¯èœãªãã©ã¡ãŒã¿ãŒã®ã»ãããæ ŒçŽããæ°ãã倿°ãäœæããŸãã ImageClassificationTrainerã¯ãããã€ãã®çç¥å¯èœãªãã©ã¡ãŒã¿ãŒãåãåããŸãã
-
FeatureColumnNameã¯ãã¢ãã«ã®å ¥åãšããŠäœ¿çšãããåã§ãã -
LabelColumnNameã¯ãäºæž¬ããå€ã®åã§ãã -
ValidationSetã¯ãæ€èšŒããŒã¿ãå«ãIDataViewã§ãã -
Archã¯ã䜿çšããäºåãã¬ãŒãã³ã°æžã¿ã¢ãã« ã¢ãŒããã¯ãã£ãå®çŸ©ããŸãã ãã®ãã¥ãŒããªã¢ã«ã§ã¯ãResNetv2 ã¢ãã«ã® 101 å±€ããªã¢ã³ãã䜿çšããŸãã -
MetricsCallbackã¯ããã¬ãŒãã³ã°äžã®é²è¡ç¶æ³ã远跡ãã颿°ããã€ã³ãããŸãã -
TestOnTrainSetã¯ãæ€èšŒã»ãããååšããªãå Žåã«ãã¬ãŒãã³ã° ã»ããã«å¯Ÿããããã©ãŒãã³ã¹ã枬å®ããããã«ã¢ãã«ã«æç€ºããŸãã -
ReuseTrainSetBottleneckCachedValuesã¯ãåŸç¶ã®å®è¡ã§ããã«ããã¯ãã§ãŒãºãããã£ãã·ã¥ãããå€ã䜿çšãããã©ãããã¢ãã«ã«æç€ºããŸãã ããã«ããã¯ãã§ãŒãºã¯ 1 åéãã®ãã¹ã¹ã«ãŒèšç®ã§ãããååå®è¡æã«èšç®è² è·ãé«ããªããŸãã ãã¬ãŒãã³ã° ããŒã¿ãå€åãããç°ãªãæ°ã®ãšããã¯ãŸãã¯ããã ãµã€ãºã䜿çšããŠå®éšããå Žåããã£ãã·ã¥ãããå€ã䜿çšãããšãã¢ãã«ã®ãã¬ãŒãã³ã°ã«å¿ èŠãªæéãå€§å¹ ã«ççž®ãããŸãã -
ReuseValidationSetBottleneckCachedValuesã¯ReuseTrainSetBottleneckCachedValuesã«äŒŒãŠããŸããããã®å Žåã¯æ€èšŒããŒã¿ã»ããçšã§ãã
-
EstimatorChainãšmapLabelEstimatorã®äž¡æ¹ã§æ§æãããImageClassificationTrainerãã¬ãŒãã³ã° ãã€ãã©ã€ã³ãå®çŸ©ããŸããFitã¡ãœããã䜿çšããŠã¢ãã«ããã¬ãŒãã³ã°ããŸãã
ã¢ãã«ã䜿çšãã
ã¢ãã«ããã¬ãŒãã³ã°ããã®ã§ãããã䜿çšããŠç»åãåé¡ããŸãã
OutputPredictionãšããæ°ãããŠãŒãã£ãªã㣠ã¡ãœãããäœæããŠãäºæž¬æ
å ±ãã³ã³ãœãŒã«ã«è¡šç€ºããŸãã
static void OutputPrediction(ModelOutput prediction)
{
string? imageName = Path.GetFileName(prediction.ImagePath);
Console.WriteLine($"Image: {imageName} | Actual Value: {prediction.Label} | Predicted Value: {prediction.PredictedLabel}");
}
1 ã€ã®ç»åãåé¡ãã
ClassifySingleImageãšããã¡ãœãããäœæããŠãåäžã®ç»åäºæž¬ãäœæããŠåºåããŸããstatic void ClassifySingleImage(MLContext mlContext, IDataView data, ITransformer trainedModel) { PredictionEngine<ModelInput, ModelOutput> predictionEngine = mlContext.Model.CreatePredictionEngine<ModelInput, ModelOutput>(trainedModel); ModelInput image = mlContext.Data.CreateEnumerable<ModelInput>(data, reuseRowObject: true).First(); ModelOutput prediction = predictionEngine.Predict(image); Console.WriteLine("Classifying single image"); OutputPrediction(prediction); }ClassifySingleImageã¡ãœãã:-
PredictionEngineã¡ãœããå ã«ClassifySingleImageãäœæããŸããPredictionEngineã¯ãããŒã¿ã®åäžã€ã³ã¹ã¿ã³ã¹ã«æž¡ããŠäºæž¬ãå®è¡ã§ãã䟿å©ãª API ã§ãã - 1 ã€ã®
ModelInputã€ã³ã¹ã¿ã³ã¹ã«ã¢ã¯ã»ã¹ããã«ã¯ãdataã¡ãœããã䜿çšããŠIDataViewIEnumerableãCreateEnumerableã«å€æããæåã®èŠ³æž¬å€ãååŸããŸãã -
Predictã¡ãœããã䜿çšããŠç»åãåé¡ããŸãã -
OutputPredictionã¡ãœããã䜿çšããŠãäºæž¬ãã³ã³ãœãŒã«ã«åºåããŸãã
-
ã€ã¡ãŒãžã®ãã¹ã ã»ããã䜿çšããŠ
ClassifySingleImageã¡ãœãããåŒã³åºããåŸãFitãåŒã³åºããŸããClassifySingleImage(mlContext, testSet, trainedModel);
è€æ°ã®ç»åãåé¡ãã
ClassifyImagesãšããã¡ãœãããäœæããŠãè€æ°ã®ç»åäºæž¬ãäœæããŠåºåããŸããstatic void ClassifyImages(MLContext mlContext, IDataView data, ITransformer trainedModel) { IDataView predictionData = trainedModel.Transform(data); IEnumerable<ModelOutput> predictions = mlContext.Data.CreateEnumerable<ModelOutput>(predictionData, reuseRowObject: true).Take(10); Console.WriteLine("Classifying multiple images"); foreach (var prediction in predictions) { OutputPrediction(prediction); } }ClassifyImagesã¡ãœãã:-
IDataViewã¡ãœããã䜿çšããŠãäºæž¬ãå«ãTransformãäœæããŸãã - äºæž¬ãå埩åŠçããããã«ã
predictionDataã¡ãœããã䜿çšããŠIDataViewIEnumerableãCreateEnumerableã«å€æããæåã® 10 åã®èŠ³æž¬å€ãååŸããŸãã - äºæž¬ã®å ã®ã©ãã«ãšäºæž¬ãããã©ãã«ãå埩åŠçããŠåºåããŸãã
-
ã€ã¡ãŒãžã®ãã¹ã ã»ããã䜿çšããŠ
ClassifyImagesã¡ãœãããåŒã³åºããåŸãClassifySingleImage()ãåŒã³åºããŸããClassifyImages(mlContext, testSet, trainedModel);
ã¢ããªã±ãŒã·ã§ã³ãå®è¡ãã
ã³ã³ãœãŒã« ã¢ããªãå®è¡ããŸãã åºåã¯æ¬¡ã®åºåã®ããã«ãªããŸãã
泚
èŠåã衚瀺ãããããã¡ãã»ãŒãžãåŠçããããããããšããããŸãããããã®ã¡ãã»ãŒãžã¯ãããããããããããã«ã次ã®çµæããåé€ãããŠããŸãã ç°¡æœã«ããããã«ãåºåã¯åçž®ãããŠããŸãã
ããã«ããã¯ãã§ãŒãº
ã€ã¡ãŒãžã¯ byte[] ãšããŠèªã¿èŸŒãŸãããããã€ã¡ãŒãžåã®å€ã¯åºåãããŸããããã®ããã衚瀺ããã€ã¡ãŒãžåã¯ãããŸããã
Phase: Bottleneck Computation, Dataset used: Train, Image Index: 279
Phase: Bottleneck Computation, Dataset used: Train, Image Index: 280
Phase: Bottleneck Computation, Dataset used: Validation, Image Index: 1
Phase: Bottleneck Computation, Dataset used: Validation, Image Index: 2
ãã¬ãŒãã³ã° ãã§ãŒãº
Phase: Training, Dataset used: Validation, Batch Processed Count: 6, Epoch: 21, Accuracy: 0.6797619
Phase: Training, Dataset used: Validation, Batch Processed Count: 6, Epoch: 22, Accuracy: 0.7642857
Phase: Training, Dataset used: Validation, Batch Processed Count: 6, Epoch: 23, Accuracy: 0.7916667
ç»åã®åºåãåé¡ãã
Classifying single image
Image: 7001-220.jpg | Actual Value: UD | Predicted Value: UD
Classifying multiple images
Image: 7001-220.jpg | Actual Value: UD | Predicted Value: UD
Image: 7001-163.jpg | Actual Value: UD | Predicted Value: UD
Image: 7001-210.jpg | Actual Value: UD | Predicted Value: UD
7001-220.jpg ç»åã®æ€æ»æã«ãã¢ãã«ãäºæž¬ããããã«å²ããªãããšã確èªã§ããŸãã
ããã§ãšãããããŸã! ããã§ãç»åãåé¡ããããã®ãã£ãŒã ã©ãŒãã³ã° ã¢ãã«ãæ£åžžã«æ§ç¯ãããŸããã
ã¢ãã«ãæ¹åãã
ã¢ãã«ã®çµæã«æºè¶³ã§ããªãå Žåã¯ãæ¬¡ã®æ¹æ³ã詊ããŠããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸãã
- ãã®ä»ã®ããŒã¿: ã¢ãã«ãåŠç¿ããäŸãå€ãã»ã©ãããã©ãŒãã³ã¹ãåäžããŸãã å®å šãª SDNET2018 ããŒã¿ã»ãã ãããŠã³ããŒãããããã䜿çšããŠãã¬ãŒãã³ã°ããŸãã
- ããŒã¿ãæ¡åŒµãã: ããŒã¿ã«å€æ§æ§ã远å ããäžè¬çãªææ³ã¯ãç»åãååŸããããŸããŸãªå€æ (å転ãå転ãã·ãããããªãã³ã°) ãé©çšããŠããŒã¿ãæ¡åŒµããããšã§ãã ããã«ãããã¢ãã«ã®åŠç¿ã«ããŸããŸãªäŸã远å ãããŸãã
- ãã¬ãŒãã³ã°æéãé·ããã: ãã¬ãŒãã³ã°æéãé·ãã»ã©ãã¢ãã«ã®ãã¥ãŒãã³ã°ãå¢ããŸãã ãšããã¯ã®æ°ãå¢ãããšãã¢ãã«ã®ããã©ãŒãã³ã¹ãåäžããå¯èœæ§ããããŸãã
- ãã€ã㌠ãã©ã¡ãŒã¿ãŒã詊ã: ãã®ãã¥ãŒããªã¢ã«ã§äœ¿çšãããã©ã¡ãŒã¿ãŒã«å ããŠãä»ã®ãã©ã¡ãŒã¿ãŒã調æŽããŠããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸãã åŠç¿çã倿Žãããšãåãšããã¯ã®åŸã«ã¢ãã«ã«å¯ŸããŠè¡ãããæŽæ°ã®å€§ãããæ±ºãŸããããããã©ãŒãã³ã¹ãåäžããå¯èœæ§ããããŸãã
- å¥ã®ã¢ãã« ã¢ãŒããã¯ãã£ã䜿çšãã: ããŒã¿ã®å€èгã«ãã£ãŠã¯ããã®ç¹åŸŽãæãããåŠç¿ã§ããã¢ãã«ãç°ãªãå ŽåããããŸãã ã¢ãã«ã®ããã©ãŒãã³ã¹ã«æºè¶³ã§ããªãå Žåã¯ãã¢ãŒããã¯ãã£ã倿ŽããŠã¿ãŠãã ããã
次ã®ã¹ããã
ãã®ãã¥ãŒããªã¢ã«ã§ã¯ã転移åŠç¿ãäºåãã¬ãŒãã³ã°æžã¿ã®ç»ååé¡ TensorFlow ã¢ãã«ãããã³ ML.NET ç»ååé¡ API ã䜿çšããŠã«ã¹ã¿ã ãã£ãŒã ã©ãŒãã³ã° ã¢ãã«ãæ§ç¯ããã³ã³ã¯ãªãŒããµãŒãã§ã¹ã®ç»åãå²ããããŸãã¯å²ããŠããªããã®ãšããŠåé¡ããæ¹æ³ã«ã€ããŠèª¬æããŸããã
詳现ã«ã€ããŠã¯ã次ã®ãã¥ãŒããªã¢ã«ã«é²ãã§ãã ããã