{"id":1726,"date":"2025-07-02T15:53:57","date_gmt":"2025-07-02T13:53:57","guid":{"rendered":"https:\/\/psycle.fr\/sdk-developpement-applications-vision-industrielle\/"},"modified":"2026-05-25T09:39:10","modified_gmt":"2026-05-25T07:39:10","slug":"python-machine-vision-sdk","status":"publish","type":"page","link":"https:\/\/psycle.fr\/en\/python-machine-vision-sdk\/","title":{"rendered":"The software suite for developing and deploying your machine vision applications"},"content":{"rendered":"\n<div style=\"height:80px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-group alignwide\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-video aligncenter is-style-video-arrondis\"><video height=\"540\" style=\"aspect-ratio: 960 \/ 540;\" width=\"960\" controls poster=\"https:\/\/psycle.fr\/wp-content\/uploads\/2025\/09\/Bandeau-SDK-full.png\" src=\"https:\/\/psycle.fr\/wp-content\/uploads\/2025\/09\/SDK-demo-3.mp4\"><\/video><\/figure>\n\n\n\n<div style=\"height:80px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"lazyblock-slider-temoignages-sdk-Z14zSI8 alignwide wp-block-lazyblock-slider-temoignages-sdk\"><div class=\"tem-slider-sdk\">\n  <div class=\"swiper-button-next\"><\/div>\n<div class=\"slider-tem-sdk swiper\">\n  <div class=\"swiper-wrapper\">\n         <div class=\"swiper-slide slide-sdk\">\n      <div class=\"photo-tem-sdk\" style=\"background-image: url(https:\/\/psycle.fr\/wp-content\/uploads\/2025\/09\/jenton-dimaco.jpg)\"><\/div>\n      <p class=\"big-texte\">Since working with Psycle I am amazed at the progress we have made on our project.  Having failed to even get started with 2 previous AI companies, <strong>Psycle have helped us get a pre-production prototype on line<\/strong> in a matter of a few weeks.  Their SDK and all their tools are well written, well documented and ready to use.  This is then backed up <strong>with support that is second to none<\/strong>.  I would thoroughly recommend working with them on your next AI vision project.<\/p>\n       <p><span>Dr Russell Sion<\/span> &#8211; \n       Managing Director, Jenton Dimaco<\/p>\n    <\/div>\n          <div class=\"swiper-slide slide-sdk\">\n      <div class=\"photo-tem-sdk\" style=\"background-image: url(https:\/\/psycle.fr\/wp-content\/uploads\/2025\/09\/portrait-oceane-departement-projet.jpg)\"><\/div>\n      <p class=\"big-texte\">Our SDK allows data scientists <strong>to focus on what matters most<\/strong>: data and deep learning algorithms. No more wasting time with user interfaces or communication protocols\u2014you get powerful tools that are ready for production.<\/p>\n       <p><span>Oc\u00e9ane Durand<\/span> &#8211; \n       Directrice du d\u00e9partement Projets Psycle<\/p>\n    <\/div>\n          <div class=\"swiper-slide slide-sdk\">\n      <div class=\"photo-tem-sdk\" style=\"background-image: url(https:\/\/psycle.fr\/wp-content\/uploads\/2026\/01\/groupe_we.webp)\"><\/div>\n      <p class=\"big-texte\">The user experience on this platform is truly excellent, and the quality of the documentation, combined with responsive support, enables <strong>rapid and smooth deployment and commissioning<\/strong>. The main differentiating factor of this tool is its direct and reliable integration with industrial cameras on production lines, a feature that is still rare in many labelling and model training solutions. This approach effectively <strong>reduces the distance between model training and operational inspection<\/strong>, making the platform a relevant and truly usable solution in an industrial environment.<\/p>\n       <p><span>Mahdiy\u00e9 Seyedian<\/span> &#8211; \n       AI Engineer, Groupe WE<\/p>\n    <\/div>\n        <\/div>\n<\/div>\n<div class=\"swiper-button-prev\"><\/div>\n<\/div><\/div>\n\n\n<div style=\"height:70px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group alignfull has-blanc-color has-anthracite-background-color has-text-color has-background has-link-color wp-elements-27e855053de5c8e0a7080d0127ed01ec\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-columns is-style-col-max-1120 is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:50%\">\n<div class=\"wp-block-group is-style-marge-gauche-160px\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<p class=\"is-style-sur-titre-fond-jaune wp-block-paragraph\">Vision<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-72-px-font-size\" style=\"font-style:normal;font-weight:500\">Machine vision <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-jaune-color\"><em>in production<\/em><\/mark><\/h2>\n<\/div><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:50%\">\n<p class=\"has-26-px-font-size wp-block-paragraph\" style=\"font-style:normal;font-weight:600\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-jaune-color\">The Psycle SDK is the result of years of development and continuous improvement,<\/mark> <br>originally designed for internal purposes.<\/p>\n\n\n\n<p class=\"has-26-px-font-size wp-block-paragraph\" style=\"font-style:normal;font-weight:600\">Tried and tested in every project carried out by Psycle, the software suite has evolved into a robust and reliable solution, ready to transform your machine vision applications.<\/p>\n<\/div>\n<\/div>\n\n\n\n<div style=\"height:90px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-columns is-style-col-max-1120 is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-vertically-aligned-stretch space-between is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/psycle.fr\/wp-content\/uploads\/2025\/07\/api-psycle-user.svg\" alt=\"d\u00e9veloppeur, data scientist ou ing\u00e9nieur\" class=\"wp-image-1536\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading has-jaune-color has-text-color has-link-color has-28-px-font-size wp-elements-eac38d2c858f352ddc5fd87f5da258a2\">An SDK for developers and data scientists<\/h3>\n\n\n\n<p class=\"has-20-px-font-size wp-block-paragraph\" style=\"font-style:normal;font-weight:300\">You are a developer, data scientist, or machine vision engineer? Deploy your vision applications on a large scale while keeping your specific expertise in-house. With the Psycle SDK, reduce development costs and increase your efficiency today.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/psycle.fr\/en\/contact\/\">contact Psycle<\/a><\/div>\n<\/div>\n<\/div><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-stretch space-between is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/psycle.fr\/wp-content\/uploads\/2025\/07\/api-psycle-cas-usage.svg\" alt=\"SDK Cas d\u2019usage\" class=\"wp-image-1526\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading has-jaune-color has-text-color has-link-color has-28-px-font-size wp-elements-1d3c0147c8db77de8a11478546918d9b\">Deploy your AI models <br>in production<\/h3>\n\n\n\n<p class=\"has-20-px-font-size wp-block-paragraph\" style=\"font-style:normal;font-weight:300\">Our software is currently deployed in production in various sectors such as agri-food, nuclear power and cosmetics, mainly for quality control (2D &amp; high speed) and robot guidance (3D &amp; PLC control) applications.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"#plans\">learn more<\/a><\/div>\n<\/div>\n<\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<div style=\"height:80px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group alignfull has-anthracite-background-color has-background\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image size-full is-style-img-float-droite\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1095\" src=\"https:\/\/psycle.fr\/wp-content\/uploads\/2026\/05\/Bandeau-SDK-scaled.webp\" alt=\"\" class=\"wp-image-2723\" srcset=\"https:\/\/psycle.fr\/wp-content\/uploads\/2026\/05\/Bandeau-SDK-scaled.webp 2560w, https:\/\/psycle.fr\/wp-content\/uploads\/2026\/05\/Bandeau-SDK-800x342.webp 800w, https:\/\/psycle.fr\/wp-content\/uploads\/2026\/05\/Bandeau-SDK-1260x539.webp 1260w, https:\/\/psycle.fr\/wp-content\/uploads\/2026\/05\/Bandeau-SDK-768x328.webp 768w, https:\/\/psycle.fr\/wp-content\/uploads\/2026\/05\/Bandeau-SDK-1536x657.webp 1536w, https:\/\/psycle.fr\/wp-content\/uploads\/2026\/05\/Bandeau-SDK-2048x876.webp 2048w, https:\/\/psycle.fr\/wp-content\/uploads\/2026\/05\/Bandeau-SDK-450x192.webp 450w, https:\/\/psycle.fr\/wp-content\/uploads\/2026\/05\/Bandeau-SDK-1403x600.webp 1403w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><\/figure>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group alignfull is-style-group-centre-cols has-blanc-color has-anthracite-background-color has-text-color has-background has-link-color wp-elements-dca41e74e3aaf74d1ab74ef19673ab0d\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<div style=\"height:80px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-text-align-center is-style-sur-titre-fond-jaune wp-block-paragraph\" id=\"pointsforts\">Vision<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-center has-72-px-font-size\" style=\"font-style:normal;font-weight:500\">Machine vision &amp; AI:<br><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-jaune-color\">a powerful tool<\/mark><\/h2>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-columns is-style-col-max-1120 is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/psycle.fr\/wp-content\/uploads\/2025\/07\/api-psycle-developpements-vison.svg\" alt=\"SDK \/ API D\u00e9veloppements vision acc\u00e9l\u00e9r\u00e9s\" class=\"wp-image-1528\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading has-jaune-color has-text-color has-link-color has-28-px-font-size wp-elements-009b8b88b57b9714db0d828a3b33877d\" style=\"font-style:normal;font-weight:600\">Accelerate your vision developments<\/h3>\n\n\n\n<p class=\"has-20-px-font-size wp-block-paragraph\" style=\"font-style:normal;font-weight:300\">Create machine vision applications in record time (Python library), thanks to intuitive tools, a library designed for customisation, and constant support from the Psycle teams.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-gris-sombre-color has-alpha-channel-opacity has-gris-sombre-background-color has-background\"\/>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/psycle.fr\/wp-content\/uploads\/2025\/07\/api-psycle-supervision-centralisee.svg\" alt=\"Supervision centralis\u00e9e - SDK\" class=\"wp-image-1534\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading has-jaune-color has-text-color has-link-color has-28-px-font-size wp-elements-831a5996795a1f0709bd30f1c36791d8\" style=\"font-style:normal;font-weight:600\">Centralised supervision<\/h3>\n\n\n\n<p class=\"has-20-px-font-size wp-block-paragraph\" style=\"font-style:normal;font-weight:300\">Monitor the performance of your vision machines remotely and simplify the maintenance of your vision fleet by connecting your production applications to a central server (hosted in the cloud or directly in your IT infrastructure).<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/psycle.fr\/wp-content\/uploads\/2025\/07\/api-psycle-IHM.svg\" alt=\"SDK - IHM ergonomique pour la production\" class=\"wp-image-1530\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading has-jaune-color has-text-color has-link-color has-28-px-font-size wp-elements-708b972fa5199e1f8c144f5265352f20\" style=\"font-style:normal;font-weight:600\">Customize you production HMI<\/h3>\n\n\n\n<p class=\"has-20-px-font-size wp-block-paragraph\" style=\"font-style:normal;font-weight:300\">Enjoy an interactive and user-friendly human-machine interface designed to be used without any vision knowledge. Your production operators will quickly become self-sufficient.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-gris-sombre-color has-alpha-channel-opacity has-gris-sombre-background-color has-background\"\/>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/psycle.fr\/wp-content\/uploads\/2025\/07\/api-psycle-innovation-amelioration-continue.svg\" alt=\"Innovation &amp; Am\u00e9lioration continue\" class=\"wp-image-1532\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading has-jaune-color has-text-color has-link-color has-28-px-font-size wp-elements-bcf673d376bef68e2fef817322c97117\" style=\"font-style:normal;font-weight:600\">Artificial Intelligence  in production<\/h3>\n\n\n\n<p class=\"has-20-px-font-size wp-block-paragraph\" style=\"font-style:normal;font-weight:300\">Benefit from the latest innovations in artificial intelligence for increasingly powerful applications tailored to your specific needs. Consult our development forecast and regular updates to stay informed about the latest improvements.<\/p>\n<\/div>\n<\/div>\n\n\n\n<div style=\"height:120px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group alignwide is-style-group-centre-cols\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<div style=\"height:80px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n<\/div><\/div>\n\n\n<div class=\"lazyblock-slider-exemple-code-1MdDwj alignwide wp-block-lazyblock-slider-exemple-code\"><div class=\"wrapper-slider-ex-code\">\n\n  <div class=\"contenu-code droite\">\n  <div class=\"legende\">\n      <div class=\"titre\">\n    <p>Vision<\/p>\n    <h3>Customisable vision control flow<\/h3>\n  <\/div>\n  <div class=\"pagination-paragraphes pagi-code-a\">\n        <p class=\"swiper-pagination-bullet\" tabindex=\"0\">\n      Adapt the default application flow to your specific requirements.      <\/p>\n         <p class=\"swiper-pagination-bullet\" tabindex=\"1\">\n      Easily modify the elements transmitted at each stage of the workflow to meet the unique requirements of your projects.      <\/p>\n         <p class=\"swiper-pagination-bullet\" tabindex=\"2\">\n      Enjoy unrivalled flexibility, either by replacing the entire flow with your own, or by connecting to predefined hooks to limit development.      <\/p>\n          <\/div>\n  <\/div>\n  \n  \n  <div class=\"photo\">\n  <div class=\"slider-ex-code slider-code-a swiper\">\n     <div class=\"swiper-wrapper\">\n               <div class=\"swiper-slide\">\n   <div class=\"code-python\">\n        <pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">def _before_cycle_starting(self) -&gt; None:\n    \"\"\" Check that all cameras are connected \"\"\"\n    super()._before_cycle_starting()\n\n    nb_connected_cams = len(self.get_connected_cameras())\n    if nb_connected_cams != 6:\n        self.message(\n            fr=f\"{nb_connected_cams} cam\u00e9ras sont connect\u00e9es, mais 6 sont attendues\",\n            en=f\"{nb_connected_cams} cameras are connected, but 6 were expected\",\n            level=MessageLevel.IMPORTANT,\n            msg_type=MessageType.ERROR,\n        )\n        raise CycleStartingException\n\n    log.info(\"All checks _before_cycle_starting OK\")<\/pre>\n<p>&nbsp;<\/p>   <\/div>\n         <\/div>\n                   <div class=\"swiper-slide\">\n   <div class=\"code-python\">\n        <pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">def _prepare_stream(self, trig: Trig) -&gt; np.ndarray:\n    \"\"\" Custom override: add rectangle on stream to indicate product conformity \"\"\"\n    stream: np.ndarray = self._prepare_stream(trig)\n\n    border: int = self.get_config_value(\"border\", 40)\n    color_bgr = (0, 0, 255) if trig.metadata.is_conform else (0, 255, 0)\n    stream = add_border_on_image(\n        image_to_stream,\n        border,\n        color_bgr,\n    )\n\n    return stream\n\n\n<\/pre>\n<p>&nbsp;<\/p>   <\/div>\n         <\/div>\n                   <div class=\"swiper-slide\">\n   <div class=\"code-python\">\n        <pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">def _after_save_trig(self, trig: Trig) -&gt; None:\n    \"\"\"\n    Custom override: always save locally data not already uploaded to PAQ\n    \"\"\"\n    super()._after_save_trig(trig)\n\n    for datum in trig.data:\n        if datum.is_saved():\n            continue\n\n        image_destination_path = get_image_path(\n            root_storage_path=TMP_STORAGE_PATH, \n            datum_id=datum.id,\n        )\n\n        self.queue_data_to_local_save(\n            data=datum, \n            image_path=image_destination_path,\n        )\n<\/pre>\n<p>&nbsp;<\/p>   <\/div>\n         <\/div>\n                  <\/div>\n    \n  <\/div>\n  <\/div>\n  <\/div>\n<\/div>\n<script>\n        var tabloa = [\"Adapt the default application flow to your specific requirements.\",\"Easily modify the elements transmitted at each stage of the workflow to meet the unique requirements of your projects.\",\"Enjoy unrivalled flexibility, either by replacing the entire flow with your own, or by connecting to predefined hooks to limit development.\"];\n<\/script>\n\n\n\n<\/div>\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"lazyblock-slider-exemple-code-1rnt55 alignwide wp-block-lazyblock-slider-exemple-code\"><div class=\"wrapper-slider-ex-code\">\n\n  <div class=\"contenu-code gauche\">\n  <div class=\"legende\">\n      <div class=\"titre\">\n    <p>Vision<\/p>\n    <h3>Interactions with end users<\/h3>\n  <\/div>\n  <div class=\"pagination-paragraphes pagi-code-b\">\n        <p class=\"swiper-pagination-bullet\" tabindex=\"0\">\n      Integrate specific code snippets into your applications to enable users to initiate actions at any time.      <\/p>\n         <p class=\"swiper-pagination-bullet\" tabindex=\"1\">\n      Empower your production operators to act autonomously based on predefined rules.      <\/p>\n         <p class=\"swiper-pagination-bullet\" tabindex=\"2\">\n      Use the HMI to communicate with operators.      <\/p>\n          <\/div>\n  <\/div>\n  \n  \n  <div class=\"photo\">\n  <div class=\"slider-ex-code slider-code-b swiper\">\n     <div class=\"swiper-wrapper\">\n               <div class=\"swiper-slide\">\n   <div class=\"code-python\">\n        <pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">@declare_command(\n    \"test_rising_edge\",\n    [\n        TypedConfigVarFactory(\n            \"pin\",\n            \"int\",\n            default=0,\n            nullable=False,\n            mini=0,\n            maxi=7,\n            metadata={\n                \"label_en\": \"PIN\",\n            },\n        ),\n    ],\n    command_metadata=CallableMetadata(\n        show_on_pap=True,\n        label_en=\"Try rising an edge during 1 second\",\n    ),\n)\n@synchronized\ndef _test_rising_edge(\n    self, pin: int,\n) -&gt; None:\n    dio = self.get_dio()\n    if dio is None or not dio.is_connected():\n        self.message(\n            en=\"No DIO configured, impossible to rise an adge\",\n            level=MessageLevel.NORMAL,\n            type=MessageType.ERROR,\n        )\n        return\n    dio.set_output(pin=pin, state=1, rollback_after=1)\n    self.message(\n        en=f\"Edge risen on pin {pin}\",\n        level=MessageLevel.NORMAL,\n        type=MessageType.INFO,\n    )\n\n\n<\/pre>\n<p>&nbsp;<\/p>   <\/div>\n         <\/div>\n                   <div class=\"swiper-slide\">\n   <div class=\"code-python\">\n        <pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">@declare_custom_rule(\n    \"check_if_prediction\",\n    custom_rule_metadata=CallableMetadata(\n        show_on_actions=True,\n        label_fr=\"Une pr\u00e9diction a \u00e9t\u00e9 faite\",\n        label_en=\"At least one prediction was made\",\n    ),\n)\ndef _check_if_prediction(self, trig: Trig) -&gt; bool:\n    \"\"\"\n    :return: True if at least one prediction has been made, False otherwise\n    \"\"\"\n    assert len(trig.data) == 1\n    return len(trig.data[0].predictions) &gt; 0<\/pre>\n<p>&nbsp;<\/p>   <\/div>\n         <\/div>\n                   <div class=\"swiper-slide\">\n   <div class=\"code-python\">\n        <pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">self.message(\n    fr=\"D\u00e9marrage de la calibration, attendre avant de lancer un cycle...\",\n    en=\"Starting calibration, wait before starting a cycle...\",\n    level=MessageLevel.NORMAL,\n    type=MessageType.INFO,\n)<\/pre>\n<p>&nbsp;<\/p>   <\/div>\n         <\/div>\n                  <\/div>\n    \n  <\/div>\n  <\/div>\n  <\/div>\n<\/div>\n<script>\n        var tablob = [\"Integrate specific code snippets into your applications to enable users to initiate actions at any time.\",\"Empower your production operators to act autonomously based on predefined rules.\",\"Use the HMI to communicate with operators.\"];\n<\/script>\n\n\n\n<\/div>\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"lazyblock-slider-exemple-code-2mIjCD alignwide wp-block-lazyblock-slider-exemple-code\"><div class=\"wrapper-slider-ex-code\">\n\n  <div class=\"contenu-code droite\">\n  <div class=\"legende\">\n      <div class=\"titre\">\n    <p>Vision<\/p>\n    <h3>Adding custom components<\/h3>\n  <\/div>\n  <div class=\"pagination-paragraphes pagi-code-c\">\n        <p class=\"swiper-pagination-bullet\" tabindex=\"0\">\n      Create your own types of equipment and display them on the HMI      <\/p>\n         <p class=\"swiper-pagination-bullet\" tabindex=\"1\">\n      Adapt existing AI models or add your own      <\/p>\n         <p class=\"swiper-pagination-bullet\" tabindex=\"2\">\n      Integrate custom communication protocols      <\/p>\n          <\/div>\n  <\/div>\n  \n  \n  <div class=\"photo\">\n  <div class=\"slider-ex-code slider-code-c swiper\">\n     <div class=\"swiper-wrapper\">\n               <div class=\"swiper-slide\">\n   <div class=\"code-python\">\n        <pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">def _prepare_devices_configurations(self, devices_configurations: list[DeviceConfiguration]) -&gt; None: \n    super()._prepare_devices_configurations(devices_configurations)\n    log.info(\"Override of _prepare_devices_configurations method (create custom datamatrix reader)\") \n\n    if len([conf for conf in devices_configurations if conf.device_type == DeviceType.code_reader]) == 0 :\n        # Automatically create a datamatrix reader device for it to be accessible to operators from PAP\n        scanner_conf = DeviceConfiguration(\n        label=\"Datamatrix reader (custom)\", \n        device_type=DeviceType.code_reader, \n        device_model=\"custom\", \n        config=TypedConfig.from_dict({\n            \"id_vendor\": {\n                \"type\": \"str\", \n                \"value\": \"1234\"\n            }, \n            \"id_product\": {\n                \"type\": \"str\", \n                \"value\": \"5678\"\n            }, \n            \"timeout\": {\n                \"type\": \"float\", \n                \"value\": 1\n            }, \n        }),\n        )\n    devices_configurations.append(scanner_conf) \n\n    log.info(\"Created scanner automatically\")<\/pre>\n<p>&nbsp;<\/p>   <\/div>\n         <\/div>\n                   <div class=\"swiper-slide\">\n   <div class=\"code-python\">\n        <pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">class InstancesCounter(DetectionModel):\n    \"\"\" Adapted version of a detection model to only count instances, for very quick applications with high number of instances \"\"\"\n\n    def __init__(\n        self,\n        weights: pathlib.Path,\n        preprocess: Optional[PreprocessingT],\n        img_size: int = 256,\n        force_cpu: bool = False\n    ):\n        super().__init__(\n            weights=weights,\n            preprocess=preprocess,\n            img_size=img_size,\n            force_cpu=force_cpu,\n        )\n\n    @torch.inference_mode()\n    def infer_get_count_only(self, images_original: np.ndarray, conf_thresh: float = 0.1, iou_thresh: float = 0.5) -&gt; List[int]:\n        # If batch dimension not present\n        if len(images_original.shape) == 3:\n            images_original = np.expand_dims(images_original, 0)\n\n        images = self.preprocess(images_original)\n        preds = self.model(images, augment=False)\n        preds = non_max_suppression(preds, conf_thresh, iou_thresh)\n\n        nb_instances: List[int] = [0] * len(preds)  # number of instances for each image\n        for i, det in enumerate(preds):  # detections per image\n            if det is not None and len(det):\n                nb_instances[i] = len(det)\n\n        return nb_instances<\/pre>\n<p>&nbsp;<\/p>   <\/div>\n         <\/div>\n                   <div class=\"swiper-slide\">\n   <div class=\"code-python\">\n        <pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">def _after_application_apply(self) -&gt; None:\n    super()._after_application_apply()\n    self.stop_stream()\n\n    # Start socket manager\n    if (\n        self.get_config_value(\"sockets_enabled\", True) is True\n        and self.socket_manager is None\n    ):\n        self.socket_manager = SocketManager(\n            trig=self._command_trig,\n            expose_params=self._expose_params,\n            get_param=self._get_param,\n            request_stream=self._request_stream,\n            tcp_ip=self.get_config_value(\"tcp_ip\"),\n            tcp_port=self.get_config_value(\"tcp_port\"),\n            frame_suffix=\"\\r\\n\",\n        )\n        log.info(\"starting sockets\")\n        self.socket_manager.start()\n    else:\n        log.info(\"sockets not enabled\")\n\n\n\n\n\n\n\n\n<\/pre>\n<p>&nbsp;<\/p>   <\/div>\n         <\/div>\n                  <\/div>\n    \n  <\/div>\n  <\/div>\n  <\/div>\n<\/div>\n<script>\n        var tabloc = [\"Create your own types of equipment and display them on the HMI\",\"Adapt existing AI models or add your own\",\"Integrate custom communication protocols\"];\n<\/script>\n\n\n\n<\/div>\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-group alignfull has-gris-clair-background-color has-background\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<div style=\"height:70px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-group alignwide\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<p class=\"has-text-align-center is-style-sur-titre-fond-jaune wp-block-paragraph\">Vision<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-center has-72-px-font-size\" id=\"plans\" style=\"font-style:normal;font-weight:500\">Plans<\/h2>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-vertically-aligned-stretch is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-group is-style-group-bords-arrondis contenu-haut-bas has-blanc-background-color has-background\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h3 class=\"wp-block-heading has-text-align-center has-32-px-font-size\" style=\"font-style:normal;font-weight:600\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-noir-color\">Autonomy<\/mark><br><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-jaune-color\">mode<\/mark><\/h3>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-gris-neutre-color has-alpha-channel-opacity has-gris-neutre-background-color has-background\"\/>\n\n\n\n<ul class=\"wp-block-list is-style-liste-puce-coche\">\n<li>SDK licence for 1 user<\/li>\n\n\n\n<li>Technical development <br>documentation<\/li>\n\n\n\n<li>Installation documentation (containerisation)<\/li>\n\n\n\n<li><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-jaune-color\">Unlimited<\/mark> offline deployment on company production PCs<\/li>\n\n\n\n<li>PAQ licence (image database &amp; trainings) for the development machine<\/li>\n\n\n\n<li>Remote support<\/li>\n<\/ul>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-gris-neutre-color has-alpha-channel-opacity has-gris-neutre-background-color has-background\"\/>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-fe48e5de wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button has-custom-width wp-block-button__width-100\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/psycle.fr\/en\/contact\/?title=I'm interested in Psycle's software suite (autonomy mode).#contactform\">I choose this offer<\/a><\/div>\n<\/div>\n<\/div><\/div>\n<\/div><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-stretch is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-group is-style-group-bords-arrondis contenu-haut-bas has-blanc-background-color has-background\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h3 class=\"wp-block-heading has-text-align-center has-32-px-font-size\" style=\"font-style:normal;font-weight:600\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-noir-color\">Support<\/mark><br><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-jaune-color\">mode<\/mark><\/h3>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-gris-neutre-color has-alpha-channel-opacity has-gris-neutre-background-color has-background\"\/>\n\n\n\n<h4 class=\"wp-block-heading has-text-align-center is-style-titre-offre has-22-px-font-size\" style=\"font-style:normal;font-weight:600\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-noir-color\">Autonomy<\/mark><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-jaune-color\"> mode<\/mark><\/h4>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/psycle.fr\/wp-content\/uploads\/2025\/07\/rond-plus.svg\" alt=\"Offre plus\" class=\"wp-image-1538\"\/><\/figure>\n<\/div>\n\n\n<ul class=\"wp-block-list is-style-liste-puce-coche\">\n<li>3 PAQ licences for production machines<\/li>\n\n\n\n<li>Supply of an industrial PC for training and inference, provisioned with the Psycle standards vision application<\/li>\n\n\n\n<li>3-day on-site training course &amp; peer coding of an initial specific application<\/li>\n<\/ul>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-gris-neutre-color has-alpha-channel-opacity has-gris-neutre-background-color has-background\"\/>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-fe48e5de wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button has-custom-width wp-block-button__width-100\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/psycle.fr\/en\/contact\/?title=I'm interested in Psycle's software suite (support mode).#contactform\">I choose this offer<\/a><\/div>\n<\/div>\n<\/div><\/div>\n<\/div><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-stretch is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-group is-style-group-bords-arrondis contenu-haut-bas has-blanc-background-color has-background\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h3 class=\"wp-block-heading has-text-align-center has-32-px-font-size\" style=\"font-style:normal;font-weight:600\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-noir-color\">Infrastructure<\/mark><br><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-jaune-color\">mode<\/mark><\/h3>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-gris-neutre-color has-alpha-channel-opacity has-gris-neutre-background-color has-background\"\/>\n\n\n\n<h4 class=\"wp-block-heading has-text-align-center is-style-titre-offre has-22-px-font-size\" style=\"font-style:normal;font-weight:600\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-noir-color\">Autonomy<\/mark><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-jaune-color\"> mode<\/mark><\/h4>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/psycle.fr\/wp-content\/uploads\/2025\/07\/rond-plus.svg\" alt=\"Offre plus\" class=\"wp-image-1538\"\/><\/figure>\n<\/div>\n\n\n<ul class=\"wp-block-list is-style-liste-puce-coche\">\n<li>Installation of PAQ On-Premises (within the company&#8217;s IT infrastructure)<\/li>\n\n\n\n<li>SDK licences for multiple users<\/li>\n\n\n\n<li>Annual 3-day on-site training (introduction for new users, changelog of new features &amp; peer coding of migrations)<\/li>\n\n\n\n<li>Network infrastructure studies for multi-line monitoring<\/li>\n\n\n\n<li>Implementation of the application build and deployment pipeline without external connection<\/li>\n\n\n\n<li>On-site maintenance operations<\/li>\n<\/ul>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-gris-neutre-color has-alpha-channel-opacity has-gris-neutre-background-color has-background\"\/>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-fe48e5de wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button has-custom-width wp-block-button__width-100\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/psycle.fr\/en\/contact\/?title=I'm interested in Psycle's software suite (infrastructure mode).#contactform\">I choose this offer<\/a><\/div>\n<\/div>\n<\/div><\/div>\n<\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group alignwide has-blanc-background-color has-background\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<div style=\"height:80px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"145\" height=\"60\" src=\"https:\/\/psycle.fr\/wp-content\/uploads\/2025\/07\/equipe-psycle.webp\" alt=\"\u00e9quipe de d\u00e9veloppement SDK Psycle\" class=\"wp-image-1554\"\/><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading has-text-align-center alignwide has-48-px-font-size\" style=\"font-style:normal;font-weight:600\">Take your machine vision projects in production to the next level with the Psycle SDK:&nbsp;<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-jaune-color\">a comprehensive, flexible Python framework designed for deep learning.<\/mark><\/h3>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-fe48e5de wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/psycle.fr\/en\/contact\/?title=I would like to try the SDK.#contactform\">I want a demo of the SDK<\/a><\/div>\n<\/div>\n\n\n\n<div style=\"height:120px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Vision Machine vision in production The Psycle SDK is the result of years of development and continuous improvement, originally designed for internal purposes. Tried and tested in every project carried out by Psycle, the software suite has evolved into a robust and reliable solution, ready to transform your machine vision applications. An SDK for developers [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-sdk.php","meta":{"footnotes":""},"class_list":["post-1726","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/psycle.fr\/en\/wp-json\/wp\/v2\/pages\/1726","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/psycle.fr\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/psycle.fr\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/psycle.fr\/en\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/psycle.fr\/en\/wp-json\/wp\/v2\/comments?post=1726"}],"version-history":[{"count":3,"href":"https:\/\/psycle.fr\/en\/wp-json\/wp\/v2\/pages\/1726\/revisions"}],"predecessor-version":[{"id":2725,"href":"https:\/\/psycle.fr\/en\/wp-json\/wp\/v2\/pages\/1726\/revisions\/2725"}],"wp:attachment":[{"href":"https:\/\/psycle.fr\/en\/wp-json\/wp\/v2\/media?parent=1726"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}