Psycle
153 rue Robert Schuman
60610 Lacroix-Saint-Ouen

Fermer

La suite logicielle pour développer et déployer vos applications de vision industrielle

Depuis que je travaille avec Psycle, je suis impressionné par les progrès que nous avons accomplis dans notre projet. Alors que nous n’avions même pas réussi à démarrer avec deux autres entreprises spécialisées dans l’IA, Psycle nous a aidés à mettre en ligne un prototype de préproduction en quelques semaines seulement. Leur SDK et tous leurs outils sont bien conçus, bien documentés et prêts à l’emploi. Tout cela est complété par un support technique hors pair. Je recommande vivement de travailler avec Psycle pour votre prochain projet de vision par l’IA.

Dr Russell Sion – Directeur Général, Jenton Dimaco

Notre SDK permet aux Data Scientists de se concentrer sur l’essentiel : la donnée et les algorithmes de Deep Learning. Plus de perte de temps avec l’IHM ou les protocoles de communication, on bénéficie d’outils performants et prêts pour la production.

Océane Durand – Directrice du département Projets Psycle

L’expérience utilisateur de cette plateforme est réellement de très bon niveau, et la qualité de la documentation, combinée à un support réactif, permet un déploiement et une mise en service rapides et fluides.
Le principal facteur de différenciation de cet outil réside dans son intégration directe et fiable avec les caméras industrielles des lignes de production, une fonctionnalité encore rare dans de nombreuses solutions de labellisation et d’entraînement de modèles.
Cette approche permet de réduire efficacement la distance entre l’entraînement des modèles et l’inspection opérationnelle, faisant de la plateforme une solution pertinente et réellement exploitable en environnement industriel.

Mahdiyé Seyedian – Ingénieure IA, Groupe WE

Repsycle

Flux de contrôle vision personnalisable

Adaptez le flux applicatif par défaut à vos besoins spécifiques.

Modifiez facilement les éléments transmis à chaque étape du flux pour répondre aux exigences uniques de vos projets.

Bénéficiez d'une flexibilité inégalée, soit en remplaçant l’entièreté du flux par le vôtre, soit en vous branchant aux hooks pré-définis pour limiter les développements.

def _before_cycle_starting(self) -> None:
    """ Check that all cameras are connected """
    super()._before_cycle_starting()

    nb_connected_cams = len(self.get_connected_cameras())
    if nb_connected_cams != 6:
        self.message(
            fr=f"{nb_connected_cams} caméras sont connectées, mais 6 sont attendues",
            en=f"{nb_connected_cams} cameras are connected, but 6 were expected",
            level=MessageLevel.IMPORTANT,
            msg_type=MessageType.ERROR,
        )
        raise CycleStartingException

    log.info("All checks _before_cycle_starting OK")

 

def _prepare_stream(self, trig: Trig) -> np.ndarray:
    """ Custom override: add rectangle on stream to indicate product conformity """
    stream: np.ndarray = self._prepare_stream(trig)

    border: int = self.get_config_value("border", 40)
    color_bgr = (0, 0, 255) if trig.metadata.is_conform else (0, 255, 0)
    stream = add_border_on_image(
        image_to_stream,
        border,
        color_bgr,
    )

    return stream


 

def _after_save_trig(self, trig: Trig) -> None:
    """
    Custom override: always save locally data not already uploaded to PAQ
    """
    super()._after_save_trig(trig)

    for datum in trig.data:
        if datum.is_saved():
            continue

        image_destination_path = get_image_path(
            root_storage_path=TMP_STORAGE_PATH, 
            datum_id=datum.id,
        )

        self.queue_data_to_local_save(
            data=datum, 
            image_path=image_destination_path,
        )

 

Repsycle

Interactions avec les utilisateurs finaux

Intégrez des bouts de code spécifique à vos applications pour permettre aux utilisateurs de lancer des actions à tout moment.

Rendez vos opérateurs de production autonomes vis-à-vis des actions à mener suite à des règles pré-définies.

Tirez parti de l'IHM pour communiquer avec les opérateurs.

@declare_command(
    "test_rising_edge",
    [
        TypedConfigVarFactory(
            "pin",
            "int",
            default=0,
            nullable=False,
            mini=0,
            maxi=7,
            metadata={
                "label_en": "PIN",
            },
        ),
    ],
    command_metadata=CallableMetadata(
        show_on_pap=True,
        label_en="Try rising an edge during 1 second",
    ),
)
@synchronized
def _test_rising_edge(
    self, pin: int,
) -> None:
    dio = self.get_dio()
    if dio is None or not dio.is_connected():
        self.message(
            en="No DIO configured, impossible to rise an adge",
            level=MessageLevel.NORMAL,
            type=MessageType.ERROR,
        )
        return
    dio.set_output(pin=pin, state=1, rollback_after=1)
    self.message(
        en=f"Edge risen on pin {pin}",
        level=MessageLevel.NORMAL,
        type=MessageType.INFO,
    )


 

@declare_custom_rule(
    "check_if_prediction",
    custom_rule_metadata=CallableMetadata(
        show_on_actions=True,
        label_fr="Une prédiction a été faite",
        label_en="At least one prediction was made",
    ),
)
def _check_if_prediction(self, trig: Trig) -> bool:
    """
    :return: True if at least one prediction has been made, False otherwise
    """
    assert len(trig.data) == 1
    return len(trig.data[0].predictions) > 0

 

self.message(
    fr="Démarrage de la calibration, attendre avant de lancer un cycle...",
    en="Starting calibration, wait before starting a cycle...",
    level=MessageLevel.NORMAL,
    type=MessageType.INFO,
)

 

Repsycle

Ajout de composants custom

Créez vos propres types de matériel et exposez-les sur l'IHM

Adaptez les modèles IA existants ou ajoutez les vôtres

Intégrez des protocoles de communication custom

def _prepare_devices_configurations(self, devices_configurations: list[DeviceConfiguration]) -> None: 
    super()._prepare_devices_configurations(devices_configurations)
    log.info("Override of _prepare_devices_configurations method (create custom datamatrix reader)") 

    if len([conf for conf in devices_configurations if conf.device_type == DeviceType.code_reader]) == 0 :
        # Automatically create a datamatrix reader device for it to be accessible to operators from PAP
        scanner_conf = DeviceConfiguration(
        label="Datamatrix reader (custom)", 
        device_type=DeviceType.code_reader, 
        device_model="custom", 
        config=TypedConfig.from_dict({
            "id_vendor": {
                "type": "str", 
                "value": "1234"
            }, 
            "id_product": {
                "type": "str", 
                "value": "5678"
            }, 
            "timeout": {
                "type": "float", 
                "value": 1
            }, 
        }),
        )
    devices_configurations.append(scanner_conf) 

    log.info("Created scanner automatically")

 

class InstancesCounter(DetectionModel):
    """ Adapted version of a detection model to only count instances, for very quick applications with high number of instances """

    def __init__(
        self,
        weights: pathlib.Path,
        preprocess: Optional[PreprocessingT],
        img_size: int = 256,
        force_cpu: bool = False
    ):
        super().__init__(
            weights=weights,
            preprocess=preprocess,
            img_size=img_size,
            force_cpu=force_cpu,
        )

    @torch.inference_mode()
    def infer_get_count_only(self, images_original: np.ndarray, conf_thresh: float = 0.1, iou_thresh: float = 0.5) -> List[int]:
        # If batch dimension not present
        if len(images_original.shape) == 3:
            images_original = np.expand_dims(images_original, 0)

        images = self.preprocess(images_original)
        preds = self.model(images, augment=False)
        preds = non_max_suppression(preds, conf_thresh, iou_thresh)

        nb_instances: List[int] = [0] * len(preds)  # number of instances for each image
        for i, det in enumerate(preds):  # detections per image
            if det is not None and len(det):
                nb_instances[i] = len(det)

        return nb_instances

 

def _after_application_apply(self) -> None:
    super()._after_application_apply()
    self.stop_stream()

    # Start socket manager
    if (
        self.get_config_value("sockets_enabled", True) is True
        and self.socket_manager is None
    ):
        self.socket_manager = SocketManager(
            trig=self._command_trig,
            expose_params=self._expose_params,
            get_param=self._get_param,
            request_stream=self._request_stream,
            tcp_ip=self.get_config_value("tcp_ip"),
            tcp_port=self.get_config_value("tcp_port"),
            frame_suffix="\r\n",
        )
        log.info("starting sockets")
        self.socket_manager.start()
    else:
        log.info("sockets not enabled")








 

Repsycle

Nos offres

Repsycle

Offre
autonomie


  • Licence SDK pour 1 utilisateur
  • Documentation technique de développement
  • Documentation d’installation (conteneurisation)
  • Déploiement hors-ligne illimité sur des PC de production de l’entreprise
  • Licence PAQ (base de données images & apprentissages) pour la machine de développement
  • Support distant

Repsycle

Offre
accompagnement


Offre autonomie

Offre plus
  • 3 licences PAQ pour des machines de production
  • Fourniture d’un PC industriel pour entraînements et inférence, provisionné avec l’application vision aux standards Psycle
  • Formation de 3 jours sur site & peer-coding d’une première application spécifique

Repsycle

Offre
infrastructure


Offre accompagnement

Offre plus
  • Installation de PAQ On-Premises (dans l’infrastructure IT de l’entreprise)
  • Licences SDK pour plusieurs utilisateurs
  • Formation annuelle de 3 jours sur site (initiation des nouveaux utilisateurs, changelog des nouveautés &peer-coding de migrations)
  • Etudes de l’infrastructure réseau pour la supervision multi-lignes
  • Mise en place de la pipeline de construction & déploiement d’applications sans connexion externe
  • Opérations de maintenance sur site
équipe de développement SDK Psycle

Accélérez et fiabilisez vos développements
vision dès maintenant !