{"id":4910,"date":"2018-02-20T08:11:22","date_gmt":"2018-02-20T07:11:22","guid":{"rendered":"https:\/\/qdraw.nl\/blog\/?p=4910"},"modified":"2025-05-28T07:54:39","modified_gmt":"2025-05-28T06:54:39","slug":"hoe-werkt-tensorflow-samen-met-microsoft-technologie","status":"publish","type":"post","link":"https:\/\/qdraw.nl\/blog\/design\/hoe-werkt-tensorflow-samen-met-microsoft-technologie\/","title":{"rendered":"Tensorflow objectherkenning en Microsoft .NET Core"},"content":{"rendered":"<p>Met Tensorflow en Artificial Intelligence het is mogelijk om afbeeldingen realtime te analyseren. In deze blogpost ga ik objecten detecteren in afbeeldingen met Tensorflow en C#. TensorFlow is een open source library voor wiskundige berekeningen. Door gebruik te maken van TensorFlow, het meest populaire deep learning framework, is het mogelijk om dit framework in te zetten voor verschillende doeleinden. In dit voorbeeld gebruik ik Tensorflow in combinatie met <em>.NET Core 2<\/em>\n<\/p>\n<p><a href=\"https:\/\/media.qdraw.nl\/log\/\/hoe-werkt-tensorflow-samen-met-microsoft-technologie\/1000\/001_20180219-demo-object-detection-city_kl1k.jpg\" class=\"lightbox[blog]\" title=\"Hoe werkt Tensorflow samen met Microsoft Technologie Detecteer twee auto\u2019s en een persoon | foto 1\" data-gps=\"0,0\" data-heightratio=\"0.7\"><br \/>\n    <noscript><img decoding=\"async\" src=\"https:\/\/media.qdraw.nl\/log\/\/hoe-werkt-tensorflow-samen-met-microsoft-technologie\/500\/001_20180219-demo-object-detection-city_kl.jpg\" alt=\"Hoe werkt Tensorflow samen met Microsoft Technologie\" \/><\/noscript><br \/>\n    <img decoding=\"async\" src=\"data:image\/jpeg;base64,\/9j\/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj\/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj\/wAARCAAHAAoDASIAAhEBAxEB\/8QAFgABAQEAAAAAAAAAAAAAAAAAAAUG\/8QAIhAAAQMDAwUAAAAAAAAAAAAAAgEDBAAFMQYhIhESFDJR\/8QAFQEBAQAAAAAAAAAAAAAAAAAAAgP\/xAAXEQADAQAAAAAAAAAAAAAAAAAAAQIR\/9oADAMBAAIRAxEAPwCPbNVToQ3ONcrO1LcRDCO8rvIS7\/YuW+yrn4lYZ97UTjzhhInAJEqoPl4TrjNKVSVgGf\/Z\" title=\"Hoe werkt Tensorflow samen met Microsoft Technologie Detecteer twee auto\u2019s en een persoon | foto 1\" alt=\"Hoe werkt Tensorflow samen met Microsoft Technologie Detecteer twee auto\u2019s en een persoon; Detecteer twee auto\u2019s en een persoon\" \/><br \/>\n<\/a><\/p>\n<h2>Een Artificial Intelligence project<\/h2>\n<p>\nIn Theiacore gebruik ik twee Visual Studio projecten in \u00e9\u00e9n solution. Theiacore wordt gebruikt voor het genereren van webpagina\u2019s. Ik heb gebruik het MVC Framework voor het genereren van webpagina\u2019s. ObjectDetect wordt gebruikt voor het Artificial Intelligence gedeelte. Voor Tensorflow zijn er bindings (een koppeling tussen twee frameworks) beschikbaar voor verschillende programmeertalen. Python is de meest populaire binding en hiervoor zijn de meeste online voorbeelden beschikbaar. Voor de programmeertaal C# is er <a href=\"https:\/\/github.com\/migueldeicaza\/TensorFlowSharp\" rel=\"nofollow noopener\" target=\"_blank\">TensorflowSharp<\/a>, dit is een onoffici\u00eble binding die goed werkt voor object detection. In dit voorbeeld focus ik mij op het gebruiken van een Machine learning model voor object herkenning. Dit model is getraind op Microsoft COCO. Deze dataset wordt gebruikt voor het herkennen van objecten in 90 verschillende categorie\u00ebn.\n<\/p>\n<h2>ObjectDetect-project<\/h2>\n<p><p>Ik gebruik het ObjectDetect-project om door middel van Artificial Intelligence data te verzamelen over de afbeeldingen. In de volgende code snippets zal ik toelichten hoe dit werkt.<\/p>\n<p>Laten we beginnen met een blank canvas. In Tensorflow is dit een leeg <code>TFGraph()<\/code>. In een <code>TFGraph()<\/code> worden er twee dingen opgeslagen. Het eerste item is een structuur en het tweede is de graph zelf. Een graph zijn de learnings van het deeplearing framework. In <a href=\"https:\/\/qdraw.nl\/blog\/design\/train-een-tensorflow-gezicht-object-detectie-model\/\">Train een tensorflow gezicht object detectie model<\/a> ligt ik toe hoe het beste zelf een model kunt trainen en deze kan opslaan als frozen-model. Dit model wordt geladen in de graph. De graph is het geheugen van je computer.<\/p>\n<pre><code class=\"language-cs\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> ImageHolder <span class=\"hljs-title\">GetJsonFormat<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> input<\/span>) <\/span>{\r\n\r\n    <span class=\"hljs-keyword\">var<\/span> list = <span class=\"hljs-keyword\">new<\/span> List&lt;<span class=\"hljs-keyword\">string<\/span>&gt;();\r\n<\/code><\/pre>\n<p>Een Catalog is een geindexeerd bestand waarin de namen van de objecten staan uitgeschreven. Het bestand heet: <code>mscoco_label_map.pbtxt<\/code><\/p>\n<pre><code class=\"language-cs\">    _catalog = CatalogUtil.ReadCatalogItems(_catalogPath);\r\n    <span class=\"hljs-keyword\">string<\/span> modelFile = _modelPath;\r\n\r\n    <span class=\"hljs-keyword\">using<\/span> (<span class=\"hljs-keyword\">var<\/span> graph = <span class=\"hljs-keyword\">new<\/span> TFGraph()) {\r\n<\/code><\/pre>\n<p>Het frozen model wordt ingeladen in het geheugen. Ik gebruik <code>TFGraph()<\/code> om de data en de metadata van het model in het geheugen te laden.<\/p>\n<pre><code class=\"language-cs\">        <span class=\"hljs-keyword\">var<\/span> model = File.ReadAllBytes(modelFile);\r\n        graph.Import(<span class=\"hljs-keyword\">new<\/span> TFBuffer(model));\r\n<\/code><\/pre>\n<p>Start een nieuwe sessie om de wiskundige berekeningen uit te voeren. In deze sessie worden de objecten herkenend.<\/p>\n<pre><code class=\"language-cs\">        <span class=\"hljs-keyword\">using<\/span> (<span class=\"hljs-keyword\">var<\/span> session = <span class=\"hljs-keyword\">new<\/span> TFSession(graph)) {\r\n<\/code><\/pre>\n<p>De variable <code>input<\/code> in een string met de locatie van de afbeelding<br \/> Deze wordt ge\u00efmporteerd als multidimensionale array, wat ook wel een Tensor wordt genoemd.<\/p>\n<pre><code class=\"language-cs\">            <span class=\"hljs-keyword\">var<\/span> tensor = ImageUtil.CreateTensorFromImageFile(input, TFDataType.UInt8);\r\n<\/code><\/pre>\n<p>Met de <code>runner<\/code> wordt het mogelijk om het algoritme te tweaken. Zo is het mogelijk om de inputs, outputs en te configureren.<\/p>\n<pre><code class=\"language-cs\">            <span class=\"hljs-keyword\">var<\/span> runner = session.GetRunner();\r\n            runner\r\n                .AddInput(graph[<span class=\"hljs-string\">\"image_tensor\"<\/span>][<span class=\"hljs-number\">0<\/span>], tensor)\r\n                .Fetch(\r\n                    graph[<span class=\"hljs-string\">\"detection_boxes\"<\/span>][<span class=\"hljs-number\">0<\/span>],\r\n                    graph[<span class=\"hljs-string\">\"detection_scores\"<\/span>][<span class=\"hljs-number\">0<\/span>],\r\n                    graph[<span class=\"hljs-string\">\"detection_classes\"<\/span>][<span class=\"hljs-number\">0<\/span>],\r\n                    graph[<span class=\"hljs-string\">\"num_detections\"<\/span>][<span class=\"hljs-number\">0<\/span>]);\r\n            <span class=\"hljs-keyword\">var<\/span> output = runner.Run();\r\n\r\n            <span class=\"hljs-keyword\">var<\/span> boxes = (<span class=\"hljs-keyword\">float<\/span>[,,])output[<span class=\"hljs-number\">0<\/span>].GetValue(jagged: <span class=\"hljs-keyword\">false<\/span>);\r\n            <span class=\"hljs-keyword\">var<\/span> scores = (<span class=\"hljs-keyword\">float<\/span>[,])output[<span class=\"hljs-number\">1<\/span>].GetValue(jagged: <span class=\"hljs-keyword\">false<\/span>);\r\n            <span class=\"hljs-keyword\">var<\/span> classes = (<span class=\"hljs-keyword\">float<\/span>[,])output[<span class=\"hljs-number\">2<\/span>].GetValue(jagged: <span class=\"hljs-keyword\">false<\/span>);\r\n            <span class=\"hljs-keyword\">var<\/span> num = (<span class=\"hljs-keyword\">float<\/span>[])output[<span class=\"hljs-number\">3<\/span>].GetValue(jagged: <span class=\"hljs-keyword\">false<\/span>);\r\n<\/code><\/pre>\n<p>De <code>boxes<\/code>, <code>scores<\/code> and <code>classes<\/code> zijn arrays en ik gebruik <code>GetBoxes<\/code> om de waardes over de objecten uit deze arrays te krijgen.<\/p>\n<pre><code class=\"language-cs\">            <span class=\"hljs-keyword\">var<\/span> getBoxes = GetBoxes(boxes, scores, classes, input, <span class=\"hljs-number\">0.5<\/span>);\r\n            <span class=\"hljs-keyword\">return<\/span> getBoxes;\r\n        }\r\n    }\r\n}\r\n<\/code><\/pre>\n<p>&nbsp;<\/p>\n<h2><a id=\"krijg_de_complete_solution_werkend\"><\/a>Krijg de complete solution werkend.<\/h2>\n<p>De broncode van het complete project is publiek beschikbaar, zo kun je exact zien hoe ik het opgelost heb. De volgende stappen ben je nodig om dit project werkend te krijgen. <em> De tekst gaat verder na de afbeelding<\/em><\/p>\n<p>&nbsp;<\/p>\n<p><video loop autoplay muted controls preload=\"auto\" style=\"width:100%; height:100%\" poster=\"https:\/\/media.qdraw.nl\/log\/hoe-werkt-tensorflow-samen-met-microsoft-technologie\/embed\/002_20180219-demo-object-detection-train.jpg\"><source src=\"https:\/\/media.qdraw.nl\/log\/hoe-werkt-tensorflow-samen-met-microsoft-technologie\/embed\/002_20180219-demo-object-detection-train.mp4\" type=\"video\/mp4\">Your browser does not support the video tag.<\/video><\/p>\n<p><em>Whoop, whoop, dit is het resultaat<\/em><\/p>\n<h2><a id=\"Installation_steps_76\"><\/a>Installation steps<\/h2>\n<p>Tensorflow vereist dat je een <em>x64 runtime<\/em> gebruikt. De NET Core SDK is standaard x64. Wanneer je een x86 (32-bits) version gebruikt switch s.v.p. eerst naar een 64-bits versie. Als je van plan bent om Azure webapps te gebruiken, deze zijn bij default 32-bits.<\/p>\n<p>&nbsp;<\/p>\n<h3><a id=\"1_Clone_repository_79\"><\/a>1. Clone repository<\/h3>\n<p>De eerste stap om de repository te downloaden vanuit GitHub.<\/p>\n<pre><code class=\"language-sh\">$ git <span class=\"hljs-built_in\">clone<\/span> <span class=\"hljs-string\">\"https:\/\/github.com\/qdraw\/theiacore\"<\/span>\r\n<\/code><\/pre>\n<p>&nbsp;<\/p>\n<h3><a id=\"2_Download_de_Pretrained_Tensorflow_Model_en_labels_84\"><\/a>2. Download de Pretrained Tensorflow Model en labels<\/h3>\n<p>De frozen-models zijn niet ingesloten in de Github repository. Download en plaats deze bestanden in de map:  <code>theiacore\/ObjectDetect<\/code>:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/qdraw\/theiacore\/releases\/download\/0.1\/mscoco_label_map.pbtxt\" rel=\"nofollow\">mscoco_label_map.pbtxt<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/qdraw\/theiacore\/releases\/download\/0.1\/mscoco_label_map_nl.pbtxt\" rel=\"nofollow\">mscoco_label_map_nl.pbtxt<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/qdraw\/theiacore\/releases\/download\/0.1\/ssd_mobilenet_v1_coco_2017_11_17.pb\" rel=\"nofollow\">ssd_mobilenet_v1_coco_2017_11_17.pb<\/a><\/li>\n<\/ul>\n<p>En kopieer deze bestanden naar de map: <code>theiacore\/ObjectDetect<\/code><\/p>\n<p>&nbsp;<\/p>\n<h3><a id=\"3_Download__Reference_assemblies__92\"><\/a>3. Download <em>Reference assemblies<\/em><\/h3>\n<p>De Libtensorflow is platform afhankelijk en voor het draaien op bijvoorbeeld een Azure is het nodig dat deze assemblies los worden toegevoegd in de map: <code>theiacore\/theiacore<\/code><\/p>\n<p><strong>Een overzicht van url&#8217;s:<\/strong><\/p>\n<ul>\n<li><em>Windows:<\/em>\n<ul>\n<li><a href=\"https:\/\/github.com\/qdraw\/theiacore\/releases\/download\/0.1\/libtensorflow.dll\" rel=\"nofollow\">libtensorflow.dll<\/a><\/li>\n<\/ul>\n<\/li>\n<li><em>Mac OS:<\/em>\n<ul>\n<li><a href=\"https:\/\/github.com\/qdraw\/theiacore\/releases\/download\/0.1\/libtensorflow.dylib\" rel=\"nofollow\">libtensorflow.dylib<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/qdraw\/theiacore\/releases\/download\/0.1\/libtensorflow_framework.dylib\" rel=\"nofollow\">libtensorflow_framework.dylib<\/a><\/li>\n<\/ul>\n<\/li>\n<li><em>Linux:<\/em>\n<ul>\n<li><a href=\"https:\/\/github.com\/qdraw\/theiacore\/releases\/download\/0.1\/libtensorflow.so\" rel=\"nofollow\">libtensorflow.so<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/qdraw\/theiacore\/releases\/download\/0.1\/libtensorflow_framework.so\" rel=\"nofollow\">libtensorflow_framework.so<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h4><a id=\"Azure_webapp\"><\/a>Azure web&nbsp;apps<\/h4>\n<p>Als je van plan bent om dit project binnen een Azure webapp te gebruiken. Azure webapp draaien .Net Core standaard in x86 mode. In de repository is <code>build-for-azure-x64.sh<\/code> te vinden. Draai het buildscript en de truck is om de bestanden binnen <code>\/theiacore\/theiacore\/theiacore\/bin\/release\/netcoreapp2.0\/win-x64\/publish<\/code> te kopieren naar de <code>wwwroot<\/code> binnen de Azure webapp.<\/p>\n<p>&nbsp;<\/p>\n<h3><a id=\"4_Start_Theiacore_109\"><\/a>4. Start Theiacore<\/h3>\n<pre><code class=\"language-sh\">$ <span class=\"hljs-built_in\">cd<\/span> theiacore\/theiacore\r\n$ dotnet run\r\nNow listening on: http:\/\/localhost:<span class=\"hljs-number\">63884<\/span>\r\n<\/code><\/pre>\n<p>Mocht de wereld van Computer Vision je interesse hebben gewekt, maar weet je nog niet hoe je dit kunt toepassen en heb je de nodige vragen? <a href=\"https:\/\/qdraw.nl\/contact.html\">Stuur mij dan een mailtje dan kunnen we een kopje koffie drinken.<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"Met Tensorflow en Artificial Intelligence het is mogelijk om afbeeldingen realtime te analyseren. In deze blogpost ga ik objecten detecteren in afbeeldingen met Tensorflow en C#. TensorFlow is een open source library voor wiskundige berekeningen. Door gebruik te maken van TensorFlow, het meest populaire deep learning framework, is het mogelijk om dit framework in te&#8230; <a class=\"view-article\" href=\"https:\/\/qdraw.nl\/blog\/design\/hoe-werkt-tensorflow-samen-met-microsoft-technologie\/\">Bekijk artikel<\/a>","protected":false},"author":2,"featured_media":4933,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2136],"tags":[2841,2718,2761,2708,2725],"content_hub":[],"class_list":["post-4910","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-design","tag-net","tag-artificial-intelligence","tag-code","tag-machine-learning","tag-tensorflow"],"_links":{"self":[{"href":"https:\/\/qdraw.nl\/blog\/wp-json\/wp\/v2\/posts\/4910","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/qdraw.nl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/qdraw.nl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/qdraw.nl\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/qdraw.nl\/blog\/wp-json\/wp\/v2\/comments?post=4910"}],"version-history":[{"count":0,"href":"https:\/\/qdraw.nl\/blog\/wp-json\/wp\/v2\/posts\/4910\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/qdraw.nl\/blog\/wp-json\/wp\/v2\/media\/4933"}],"wp:attachment":[{"href":"https:\/\/qdraw.nl\/blog\/wp-json\/wp\/v2\/media?parent=4910"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/qdraw.nl\/blog\/wp-json\/wp\/v2\/categories?post=4910"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/qdraw.nl\/blog\/wp-json\/wp\/v2\/tags?post=4910"},{"taxonomy":"content_hub","embeddable":true,"href":"https:\/\/qdraw.nl\/blog\/wp-json\/wp\/v2\/content_hub?post=4910"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}