示例#1
0
class MainView(ZApplicationView):
    class BinarizedImageView(ZOpenCVImageView):
        def __init__(self, parent):
            ZOpenCVImageView.__init__(self, parent)

    # Constructor
    def __init__(self, title, x, y, width, height):
        super(MainView, self).__init__(title, x, y, width, height)

        self.raw_video_queue = mp.Queue()
        self.to_binarize_video_queue = mp.Queue()
        self.binarized_video_queue = mp.Queue()

        # Binarize initial settings
        #self.block_size         = 11
        #self.adaptive_method_id = 0;
        #self.threshold_type_id  = 0;

        self.binarize_video_settings_queue = mp.Queue()
        #binarize_video_settings_queue.put_nowait((self.block_size, \
        #                                          self.adaptive_method_id, \
        #                                          self.threshold_type_id))

        self.time_snapshot_seconds = None  # initialized to None . Used for rate limiting processing pipelines
        self.processing_rate_limit_hz = 20  # 30 Hz seems to be about the maximum if this camera

        self.raw_image_view = ZOpenCVImageView(self)
        self.binarized_image_view = self.BinarizedImageView(self)

        self.add(self.raw_image_view)
        self.add(self.binarized_image_view)

        title = name
        self.setWindowTitle(title)

        self.show()

    def add_control_pane(self, fixed_width=220):
        # Control pane widget
        self.vpane = ZVerticalPane(self, fixed_width)

        #"""
        self.block_size = 11
        self.adaptive_method_id = 0
        self.threshold_type_id = 0
        #"""

        self.methods = {
            "ADAPTIVE_THRESH_MEAN_C": cv2.ADAPTIVE_THRESH_MEAN_C,
            "ADAPTIVE_THRESH_GAUSSIAN_C": cv2.ADAPTIVE_THRESH_GAUSSIAN_C
        }
        self.types = {
            "THRESH_BINARY": cv2.THRESH_BINARY,
            "THRESH_BINARY_INV": cv2.THRESH_BINARY_INV
        }

        self.adaptive_method = ZLabeledComboBox(self.vpane, "AdaptiveMethod")
        self.adaptive_method.add_items(list(self.methods.keys()))
        self.adaptive_method.add_activated_callback(
            self.adaptive_method_activated)

        self.threshold_type = ZLabeledComboBox(self.vpane, "ThresholdType")
        self.threshold_type.add_items(list(self.types.keys()))
        self.threshold_type.add_activated_callback(
            self.threshold_type_activated)

        self.labeled_slider = ZLabeledSlider(self.vpane,
                                             "BlockSize",
                                             take_odd=True,
                                             minimum=3,
                                             maximum=43,
                                             value=self.block_size,
                                             fixed_width=200)
        self.labeled_slider.add_value_changed_callback(
            self.slider_value_changed)

        self.vpane.add(self.adaptive_method)
        self.vpane.add(self.threshold_type)
        self.vpane.add(self.labeled_slider)

        self.set_right_dock(self.vpane)

    def slider_value_changed(self, value):
        self.block_size = int(value)
        if self.block_size % 2 == 0:
            # Block size should be odd.
            self.block_size = int((self.block_size * 2) / 2 + 1)
        #print("slider_value_changed:{}".format(block_size))

        #self.binarized_image_view.binarize(self.adaptive_method_id, self.threshold_type_id, self.block_size)

        settings = (self.adaptive_method_id, self.threshold_type_id,
                    self.block_size)
        self.binarize_video_settings_queue.put_nowait(settings)

    def adaptive_method_activated(self, text):
        #print("adaptive_method_activated:{}".format(text))
        self.adaptive_method_id = self.methods[text]

        #self.binarized_image_view.binarize(self.adaptive_method_id, self.threshold_type_id, self.block_size)

        settings = (self.adaptive_method_id, self.threshold_type_id,
                    self.block_size)
        self.binarize_video_settings_queue.put_nowait(settings)

    def threshold_type_activated(self, text):
        #print("threshold_type_activated:{}".format(text))
        self.threshold_type_id = self.types[text]

        #self.binarized_image_view.binarize(self.adaptive_method_id, self.threshold_type_id, self.block_size)

        settings = (self.adaptive_method_id, self.threshold_type_id,
                    self.block_size)
        self.binarize_video_settings_queue.put_nowait(settings)

    # Read a frame from a video buffer of the video capture, and set it the image view to draw it on the imag view
    def render(self):

        return_true = False
        #return_true = True
        #"""
        if not self.raw_video_queue.empty():
            raw_frame = self.raw_video_queue.get_nowait()

            if raw_frame.any() != None:
                self.raw_image_view.set_opencv_image(raw_frame)
                self.raw_image_view.update()

                # Send frame to processing queue
                # rate limited
                current_time_seconds = time()

                if self.time_snapshot_seconds == None:
                    self.time_snapshot_seconds = current_time_seconds

                if current_time_seconds > self.time_snapshot_seconds:  # Avoid dividing by zero

                    #print(1/(current_time_seconds-self.time_snapshot_seconds))

                    if ((1 /
                         (current_time_seconds - self.time_snapshot_seconds))
                            <= self.processing_rate_limit_hz):  # Rate limit

                        #print("Sending raw frame for further processing!")

                        self.to_binarize_video_queue.put_nowait(raw_frame)

                        self.time_snapshot_seconds = current_time_seconds

                return_true = True

        if not self.binarized_video_queue.empty():
            binarized_frame = self.binarized_video_queue.get_nowait()

            if binarized_frame.any() != None:
                self.binarized_image_view.set_opencv_image(binarized_frame)
                self.binarized_image_view.update()

                return_true = True
        #"""
        if return_true:
            return True
        else:
            return False

    def file_quit(self):
        self.terminated = True

    def closeEvent(self, ce):
        self.terminated = True
示例#2
0
class MainView(ZApplicationView):
    # Class variables

    # ClassifierView Constructor
    def __init__(self, title, x, y, width, height):
        super(MainView, self).__init__(title, x, y, width, height)
        self.font = QFont("Arial", 10)
        self.setFont(self.font)

        # 1 Add a labeled combobox to top dock area
        self.add_datasets_combobox()

        # 2 Add a textedit to the left pane of the center area.
        self.text_editor = QTextEdit()
        self.text_editor.setLineWrapColumnOrWidth(600)
        self.text_editor.setLineWrapMode(QTextEdit.FixedPixelWidth)

        # 3 Add a description to display dataset.DESCR.
        self.description = QTextEdit()
        self.description.setLineWrapColumnOrWidth(600)
        self.description.setLineWrapMode(QTextEdit.FixedPixelWidth)

        # 4 Add a tabbed_window to the tabbed_window.
        self.tabbed_window = ZTabbedWindow(self, 0, 0, width / 2, height)

        # 5 Add a figure_view to the tabbed_window.
        self.figure_view = ZScalableScrolledFigureView(self, 0, 0, width / 2,
                                                       height)

        self.add(self.text_editor)
        self.add(self.tabbed_window)

        self.tabbed_window.add("Description", self.description)
        self.tabbed_window.add("ConfusionMatrix", self.figure_view)
        self.figure_view.hide()

        self.show()

    def add_datasets_combobox(self):
        self.dataset_id = Iris
        self.datasets_combobox = ZLabeledComboBox(self, "Datasets",
                                                  Qt.Horizontal)

        # We use the following datasets of sklearn to test XGBClassifier.
        self.datasets = {
            "Iris": Iris,
            "Digits": Digits,
            "Wine": Wine,
            "BreastCancer": BreastCancer
        }
        title = self.get_title()
        self.setWindowTitle("Iris" + " - " + title)

        self.datasets_combobox.add_items(self.datasets.keys())
        self.datasets_combobox.add_activated_callback(self.datasets_activated)
        self.datasets_combobox.set_current_text(self.dataset_id)

        self.start_button = ZPushButton("Start", self)
        self.clear_button = ZPushButton("Clear", self)

        self.start_button.add_activated_callback(self.start_button_activated)
        self.clear_button.add_activated_callback(self.clear_button_activated)

        self.datasets_combobox.add(self.start_button)
        self.datasets_combobox.add(self.clear_button)

        self.set_top_dock(self.datasets_combobox)

    def write(self, text):
        self.text_editor.append(text)
        self.text_editor.repaint()

    def datasets_activated(self, text):
        self.dataset_id = self.datasets[text]
        title = self.get_title()
        self.setWindowTitle(text + " - " + title)

    def start_button_activated(self, text):
        self.model = LightGBMClassifierModel(self.dataset_id, self)
        self.start_button.setEnabled(False)
        self.clear_button.setEnabled(False)
        try:
            self.model.run()
        except:
            pass
        self.start_button.setEnabled(True)
        self.clear_button.setEnabled(True)

    def clear_button_activated(self, text):
        self.text_editor.setText("")
        self.description.setText("")
        self.figure_view.hide()
        plt.close()

    def visualize(self, cmatrix):
        self.figure_view.show()

        plt.close()

        sns.set()
        df = pd.DataFrame(cmatrix)
        sns.heatmap(df, annot=True, fmt="d")
        # Set a new figure to the figure_view.
        self.figure_view.set_figure(plt)
示例#3
0
class ZImageClassifierView(ZApplicationView):  
  # Class variables

  # ClassifierView Constructor
  def __init__(self, title, x, y, width, height, datasets={"ImageModel": 0}):
    super(ZImageClassifierView, self).__init__(title, x, y, width, height)
    self.font        = QFont("Arial", 10)
    self.setFont(self.font)
    
    self.datasets = datasets
    
    self.model_loaded = False
    
    self.class_names_set = [None, None]

    # Image filename to be classified
    self.filename     = None
    
    # Target image to be classified
    self.image       = None

    # 1 Add a labeled combobox to top dock area
    self.add_datasets_combobox()
    
    # 2 Add a textedit to the left pane of the center area.
    self.text_editor = QTextEdit()
    self.text_editor.setLineWrapColumnOrWidth(600)
    self.text_editor.setLineWrapMode(QTextEdit.FixedPixelWidth)
    self.text_editor.setGeometry(0, 0, width/2, height)
    
    # 3 Add a tabbed_window the rigth pane of the center area.
    self.tabbed_window = ZTabbedWindow(self, 0, 0, width/2, height)
    
    # 4 Add a imageview to the tabbed_window.
    self.image_view = ZScalableScrolledImageView(self, 0, 0, width/3, height/3)   
    self.tabbed_window.add("SourceImage", self.image_view)
    
    # 5 Add a test_imageview to the right pane of the center area.
    self.test_image_view = ZScalableScrolledImageView(self, 0, 0, width/3, height/3)   
    self.tabbed_window.add("TestImage", self.test_image_view)

    self.add(self.text_editor)
    self.add(self.tabbed_window)
    

  def add_datasets_combobox(self):
    datasetkey = list(self.datasets.keys())[0]
    self.dataset_id = self.datasets[datasetkey]
    print("Current combobox item {} {}".format(datasetkey, self.dataset_id))
    
    self.datasets_combobox = ZLabeledComboBox(self, "Datasets", Qt.Horizontal)
    self.datasets_combobox.setFont(self.font)
    
    title = self.get_title()
    
    self.setWindowTitle(self.__class__.__name__ + " - " + title)
    
    self.datasets_combobox.add_items(self.datasets.keys())
    self.datasets_combobox.add_activated_callback(self.datasets_activated)
    self.datasets_combobox.set_current_text(self.dataset_id)

    self.classifier_button = ZPushButton("Classify", self)
    self.classifier_button.setEnabled(False)

    self.clear_button = ZPushButton("Clear", self)
    
    self.classifier_button.add_activated_callback(self.classifier_button_activated)
    self.clear_button.add_activated_callback(self.clear_button_activated)

    self.datasets_combobox.add(self.classifier_button)
    self.datasets_combobox.add(self.clear_button)
    
    self.set_top_dock(self.datasets_combobox)


  def write(self, text):
    self.text_editor.append(text)
    self.text_editor.repaint()


  def datasets_activated(self, text):
    pass


  # Show FileOpenDialog and select an image file.
  def file_open(self):
    if self.model_loaded:
      options = QFileDialog.Options()
      filename, _ = QFileDialog.getOpenFileName(self,"FileOpenDialog", "",
                     "All Files (*);;Image Files (*.png;*jpg;*.jpeg)", options=options)
      if filename:
        self.filename = filename
        self.load_file(filename)
        self.classifier_button.setEnabled(True)
    else:
      QMessageBox.warning(self, "ImageClassifier: Weight File Missing", 
           "Please run: python RoadSignsModel.py " + str(self.dataset_id))


  def remove_alpha_channel(self, array):
    shape = array.shape
    if len(shape) ==3:
      w, h, c = shape
      if c == 4:
        #(w, h, 4) -> (w, h, 3)  
        #print("Remove the alpha channel of array")
        array = array[:,:,:3]
    return array
    

  def load_file(self, filename):
    from keras.preprocessing.image import load_img, img_to_array

    try:
      image_cropper = ZPILImageCropper(filename)
     
      # 1 Crop larget_central square region from an image of filename.
      cropped_image = image_cropper.crop_largest_central_square_region()
      
      # 2 Load an image from the cropped_fle.
      self.image_view.set_image(img_to_array(cropped_image)) 
      self.image_view.update_scale()
      self.set_filenamed_title(filename)
      
      # 3 Resize the cropped_image  
      self.image = cropped_image.resize(self.image_size)
      
      # 4 Convert the self.image to numpy ndarray and remove alpha channel.
      self.image = self.remove_alpha_channel(img_to_array(self.image))

      # 5 Set self.nadarryy to the test_image_view.
      self.test_image_view.set_image(self.image)

      # 6 Convert self.image in range[0-1.0]
      self.image = self.image.astype('float32')/255.0
      
      # 7 Expand the dimension of the self.image 
      self.image = np.expand_dims(self.image, axis=0) 
      
      #print(self.image.shape)
      
    except:
      self.write(formatted_traceback())


  def classifier_button_activated(self, text):
    self.classifier_button.setEnabled(False)    
    self.clear_button.setEnabled(False)
    try:
      self.classify()
    except:
      self.write(formatted_traceback())
      
    self.classifier_button.setEnabled(True)
    self.clear_button.setEnabled(True)


  def get_top_five(self, predictions, classes, K=5):
    pred = predictions[0]
    indices = np.argpartition(pred, -K)[-K:]
    results = []
    for i in indices:    
      results.append([pred[i], classes[i]])
    results = sorted(results, reverse=True)
    return results


  def get_class_names(self, path="./class_names.txt"):
    classes = []
    with open(path, "r") as file:
      classes = [s.strip() for s in file.readlines()]
    return classes
 

  def classify(self):
    self.write("------------------------------------------------------------")
    self.write("classify start")
    self.write(self.filename)
    prediction = self.model.predict(self.image)
    
    pred = np.argmax(prediction, axis=1)
    #self.write("Prediction: index " + str(pred))
    class_names = self.model.classes

    if pred >0 or pred <len(class_names):
      self.write("Prediction:" + class_names[int(pred)])

    self.write("classify end")


  def clear_button_activated(self, text):
    self.text_editor.setText("")
    pass
示例#4
0
class MainView(ZApplicationView):  

  # MainView Constructor
  def __init__(self, title, x, y, width, height):
    super(MainView, self).__init__(title, x, y, width, height)
    self.font        = QFont("Arial", 10)
    self.setFont(self.font)
    
    # 1 Add a labeled combobox to top dock area
    self.add_datasets_combobox()
    
    # 2 Add a textedit to the left pane of the center area.
    self.text_editor = QTextEdit()
    self.text_editor.setFont(self.font)
    self.text_editor.setLineWrapColumnOrWidth(600)
    self.text_editor.setLineWrapMode(QTextEdit.FixedPixelWidth)

    self.description = QTextEdit()
    self.description.setFont(self.font)
    self.description.setLineWrapColumnOrWidth(600)
    self.description.setLineWrapMode(QTextEdit.FixedPixelWidth)

    # 3 Add a tabbled_window to the right pane of the center area.
    self.tabbed_window = ZTabbedWindow(self, 0, 0, width/2, height)
    
    # 4 Add a figure_view to the tabbed_window
    self.figure_view = ZScalableScrolledFigureView(self, 0, 0, width/2, height)

    self.add(self.text_editor)
    self.add(self.tabbed_window)
    
    self.tabbed_window.add("Description", self.description)
    self.tabbed_window.add("Importances", self.figure_view)  
    self.figure_view.hide()

    self.show()


  def add_datasets_combobox(self):
    self.dataset_id = Boston
    self.datasets_combobox = ZLabeledComboBox(self, "Datasets", Qt.Horizontal)
    
    # We use the following datasets of sklearn to test RandomForestRegressor.
    self.datasets = {"Boston": Boston, "Diabetes": Diabetes}
    title = self.get_title()
    self.setWindowTitle( "Boston" + " - " + title)

    self.datasets_combobox.add_items(self.datasets.keys())
    self.datasets_combobox.add_activated_callback(self.datasets_activated)
    self.datasets_combobox.set_current_text(self.dataset_id)

    self.start_button = ZPushButton("Start", self)
    self.clear_button = ZPushButton("Clear", self)

    self.start_button.add_activated_callback(self.start_button_activated)
    self.clear_button.add_activated_callback(self.clear_button_activated)

    self.datasets_combobox.add(self.start_button)
    self.datasets_combobox.add(self.clear_button)

    self.set_top_dock(self.datasets_combobox)
  

  def write(self, text):
    self.text_editor.append(text)
    self.text_editor.repaint()
    
  def datasets_activated(self, text):
    self.dataset_id = self.datasets[text]
    title = self.get_title()
    self.setWindowTitle(text + " - " + title)
    
  def start_button_activated(self, text):
    self.model = RandomForestRegressorModel(self.dataset_id, self)
    self.start_button.setEnabled(False)    
    self.clear_button.setEnabled(False)
    try:
      self.model.run()
    except:
      pass
    self.start_button.setEnabled(True)
    self.clear_button.setEnabled(True)
    
    
  def file_new(self):
    self.text_editor.setText("")
    self.description.setText("")
    self.figure_view.hide()
    plt.close()
  
  def clear_button_activated(self, text):
    self.file_new()

  def visualize(self, importances):
    self.figure_view.show()
    plt.close()

    plt.title("Importances in Regression Model")
    importances.plot(kind = "barh")
    self.figure_view.set_figure( plt)
class MainView(ZApplicationView):
  
  class BinarizedImageView(ZOpenCVImageView):
    def __init__(self, parent):
      ZOpenCVImageView.__init__(self, parent)
      
    def load_source_image(self, source_image):
      image =  cv2.GaussianBlur(source_image, (3,3), 0, 0, borderType = cv2.BORDER_DEFAULT );
      #image =  cv2.GaussianBlur(source_image, (3,3), 0, 0)

      self.gray_image = cv2.cvtColor(source_image, cv2.COLOR_RGB2GRAY)
             
    def binarize(self, adaptive_method_id, threshold_type_id, block_size):
      MAX_PIXEL_VALUE = 255
      C               = 9.0
    
      binarized_image = cv2.adaptiveThreshold(self.gray_image,  MAX_PIXEL_VALUE, 
          adaptive_method_id, threshold_type_id, block_size,  C);
          
      #return binarized_image
      self.set_opencv_image(binarized_image)
      self.update()
  
  # Constructor
  def __init__(self, title, x, y, width, height):
    super(MainView, self).__init__(title, x, y, width, height)
    
    self.raw_video_queue = mp.Queue()
    
    self.raw_image_view  = ZOpenCVImageView(self)
    self.binarized_image_view = self.BinarizedImageView(self)

    self.add(self.raw_image_view)
    self.add(self.binarized_image_view)

    title = name
    self.setWindowTitle(title)
    
    self.show()
  
  def add_control_pane(self, fixed_width=220):
    # Control pane widget
    self.vpane = ZVerticalPane(self, fixed_width)
    
    self.block_size         = 11
    self.adaptive_method_id = 0;
    self.threshold_type_id  = 0;

    
    self.methods = {"ADAPTIVE_THRESH_MEAN_C": cv2.ADAPTIVE_THRESH_MEAN_C, 
                    "ADAPTIVE_THRESH_GAUSSIAN_C": cv2.ADAPTIVE_THRESH_GAUSSIAN_C}
    self.types   = {"THRESH_BINARY":  cv2.THRESH_BINARY  , 
                    "THRESH_BINARY_INV": cv2.THRESH_BINARY_INV }
    
    self.adaptive_method = ZLabeledComboBox(self.vpane, "AdaptiveMethod")
    self.adaptive_method.add_items(list(self.methods.keys() ))
    self.adaptive_method.add_activated_callback(self.adaptive_method_activated)
    
    self.threshold_type  = ZLabeledComboBox(self.vpane, "ThresholdType")
    self.threshold_type.add_items(list(self.types.keys()) )
    self.threshold_type.add_activated_callback(self.threshold_type_activated)
    
    self.labeled_slider = ZLabeledSlider(self.vpane, "BlockSize", take_odd =True,  
              minimum=3, maximum=43, value=self.block_size, fixed_width=200)
    self.labeled_slider.add_value_changed_callback(self.slider_value_changed)
    
    self.vpane.add(self.adaptive_method)
    self.vpane.add(self.threshold_type)    
    self.vpane.add(self.labeled_slider)

    self.set_right_dock(self.vpane)

  def slider_value_changed(self, value):
    self.block_size = int(value)
    if self.block_size % 2 == 0:
      # Block size should be odd.
      self.block_size = int((self.block_size * 2)/2 + 1)
    #print("slider_value_changed:{}".format(block_size))
    self.binarized_image_view.binarize(self.adaptive_method_id, self.threshold_type_id, self.block_size)
    
  def adaptive_method_activated(self, text):
    #print("adaptive_method_activated:{}".format(text))
    self.adaptive_method_id = self.methods[text]
    
    self.binarized_image_view.binarize(self.adaptive_method_id, self.threshold_type_id, self.block_size)
     
  def threshold_type_activated(self, text):
    #print("threshold_type_activated:{}".format(text))
    self.threshold_type_id = self.types[text]
    self.binarized_image_view.binarize(self.adaptive_method_id, self.threshold_type_id, self.block_size)
    
  # Read a frame from a video buffer of the video capture, and set it the image view to draw it on the imag view     
  def render(self):
    
    #return_true = False
    
    if not self.raw_video_queue.empty():
      raw_frame = self.raw_video_queue.get_nowait()
      
      if raw_frame.any() != None:
        self.raw_image_view.set_opencv_image(raw_frame)
        self.raw_image_view.update()
        
        
        self.binarized_image_view.load_source_image(raw_frame)
        self.binarized_image_view.binarize(self.adaptive_method_id, self.threshold_type_id, self.block_size)
        
        
        return True
      
    """
      
    if not self.binarized_video_queue.empty():
      binarized_frame = self.binarized_video_queue.get_notwait()
      if binarized_frame.any() != None:
        self.binarized_image_view.set_opencv_image(binarized_frame)
        self.binarized_image_view.update()
        return_true = True
    
    if return_true:
      return True
    else:
      return False
    """
    return False
    
  """
  def load_file(self, filename):
    self.image_view_3.load(filename)
    self.set_filenamed_title(filename)
 """
  
  def file_quit(self):
    self.terminated = True
    
  def closeEvent(self, ce):
    self.terminated = True