sound_saver.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 
3 from os import makedirs, listdir
4 from os import path as osp
5 from PIL import Image as Image_
6 
7 from cv_bridge import CvBridge
8 from sound_classification.msg import InSound
9 import message_filters
10 import numpy as np
11 import rospkg
12 import rospy
13 from sensor_msgs.msg import Image
14 
15 
16 class SoundSaver(object):
17  """
18  Collect spectrogram with sound class, only when the robot is in sound.
19  if save_when_sound is False, you can save spectrograms during no sound.
20  """
21 
22  def __init__(self):
23  # Config for saving spectrogram
24  self.target_class = rospy.get_param('~target_class')
25  self.save_raw_spectrogram = rospy.get_param('~save_raw_spectrogram')
26  rospack = rospkg.RosPack()
27  self.train_dir = osp.join(rospack.get_path(
28  'sound_classification'), 'train_data')
29  if not osp.exists(self.train_dir):
30  makedirs(self.train_dir)
31  self.image_save_dir = osp.join(
32  self.train_dir, 'original_spectrogram', self.target_class)
33  if not osp.exists(self.image_save_dir):
34  makedirs(self.image_save_dir)
35  self.raw_image_save_dir = osp.join(self.image_save_dir, 'raw')
36  if not osp.exists(self.raw_image_save_dir):
37  makedirs(self.raw_image_save_dir)
38  if osp.exists(osp.join(self.train_dir, 'noise.npy')):
39  noise = np.load(osp.join(self.train_dir, 'noise.npy'))
40  np.save(osp.join(self.image_save_dir, 'noise.npy'), noise)
41  else:
42  rospy.logerr("{} not found".format(osp.join(self.train_dir, 'noise.npy')))
43  # ROS
44  self.bridge = CvBridge()
45  self.save_data_rate = rospy.get_param('~save_data_rate')
46  self.save_when_sound = rospy.get_param('~save_when_sound')
47  self.in_sound = False
48  self.spectrogram_msg = None
49  self.spectrogram_raw_msg = None
50  in_sound_sub = message_filters.Subscriber('~in_sound', InSound)
51  img_sub = message_filters.Subscriber('~input', Image)
52  img_raw_sub = message_filters.Subscriber('~input_raw', Image)
53  subs = [in_sound_sub, img_sub]
54  if self.save_raw_spectrogram:
55  subs.append(img_raw_sub)
56  ts = message_filters.TimeSynchronizer(subs, 100000)
57  ts.registerCallback(self._cb)
58  rospy.Timer(rospy.Duration(1. / self.save_data_rate), self.timer_cb)
59 
60  def _cb(self, *args):
61  in_sound = args[0].in_sound
62  # rospy.logerr('in_sound: {}'.format(in_sound))
63  if self.save_when_sound is False:
64  in_sound = True
65  if in_sound:
66  self.spectrogram_msg = args[1]
67  if self.save_raw_spectrogram:
68  self.spectrogram_raw_msg = args[2]
69  else:
70  self.spectrogram_msg = None
71  if self.save_raw_spectrogram:
72  self.spectrogram_raw_msg = None
73 
74  def timer_cb(self, timer):
75  """
76  Main process of NoiseSaver class
77  Save spectrogram data at self.save_data_rate
78  """
79 
80  if self.spectrogram_msg is None or self.spectrogram_raw_msg is None:
81  return
82  else:
83  file_num = len(
84  listdir(self.image_save_dir)) + 1 # start from 00001.npy
85  file_name = osp.join(
86  self.image_save_dir, '{}_{:0=5d}.png'.format(
87  self.target_class, file_num))
88  mono_spectrogram = self.bridge.imgmsg_to_cv2(self.spectrogram_msg)
89  Image_.fromarray(mono_spectrogram).save(file_name)
90  # self.spectrogram_msg = None
91  rospy.loginfo('save spectrogram: ' + file_name)
92  if self.save_raw_spectrogram:
93  file_name_raw = osp.join(
94  self.raw_image_save_dir, '{}_{:0=5d}_raw.png'.format(
95  self.target_class, file_num))
96  try:
97  mono_spectrogram_raw = self.bridge.imgmsg_to_cv2(
98  self.spectrogram_raw_msg, desired_encoding='32FC1')
99  except AttributeError:
100  return
101  _max = mono_spectrogram_raw.max()
102  _min = mono_spectrogram_raw.min()
103  mono_spectrogram_raw = (mono_spectrogram_raw - _min) / (_max - _min) * 255.0
104  mono_spectrogram_raw = mono_spectrogram_raw.astype(np.uint8)
105  Image_.fromarray(mono_spectrogram_raw).save(file_name_raw)
106  # self.spectrogram_raw_msg = None
107  rospy.loginfo('save spectrogram: ' + file_name_raw)
108 
109 
110 if __name__ == '__main__':
111  rospy.init_node('sound_saver')
113  rospy.spin()
sound_saver.SoundSaver
Definition: sound_saver.py:16
sound_saver.SoundSaver.raw_image_save_dir
raw_image_save_dir
Definition: sound_saver.py:35
sound_saver.SoundSaver.in_sound
in_sound
Definition: sound_saver.py:47
sound_saver.SoundSaver.save_raw_spectrogram
save_raw_spectrogram
Definition: sound_saver.py:25
sound_saver.SoundSaver.timer_cb
def timer_cb(self, timer)
Definition: sound_saver.py:74
sound_saver.SoundSaver.train_dir
train_dir
Definition: sound_saver.py:27
sound_saver.SoundSaver.spectrogram_raw_msg
spectrogram_raw_msg
Definition: sound_saver.py:49
message_filters::Subscriber
sound_saver.SoundSaver.save_when_sound
save_when_sound
Definition: sound_saver.py:46
sound_saver.SoundSaver.target_class
target_class
Definition: sound_saver.py:24
sound_saver.SoundSaver.__init__
def __init__(self)
Definition: sound_saver.py:22
sound_saver.SoundSaver.bridge
bridge
Definition: sound_saver.py:44
sound_saver.SoundSaver.save_data_rate
save_data_rate
Definition: sound_saver.py:45
sound_saver.SoundSaver.spectrogram_msg
spectrogram_msg
Definition: sound_saver.py:48
sound_saver.SoundSaver._cb
def _cb(self, *args)
Definition: sound_saver.py:60
message_filters::TimeSynchronizer
sound_saver.SoundSaver.image_save_dir
image_save_dir
Definition: sound_saver.py:31


sound_classification
Author(s):
autogenerated on Fri May 16 2025 03:12:55