| @@ -183,13 +183,12 @@ class Attack: | |||
| best_position = check_numpy_param('best_position', best_position) | |||
| x_ori, best_position = check_equal_shape('x_ori', x_ori, 'best_position', best_position) | |||
| _, original_num = self._detection_scores((best_position,) + auxiliary_inputs, gt_boxes, gt_labels, model) | |||
| # pylint: disable=invalid-name | |||
| REDUCTION_ITERS = 6 # recover 10% difference each time and recover 60% totally. | |||
| for _ in range(REDUCTION_ITERS): | |||
| BLOCK_NUM = 30 # divide the image into 30 segments | |||
| block_width = best_position.shape[0] // BLOCK_NUM | |||
| reduction_iters = 6 # recover 10% difference each time and recover 60% totally. | |||
| for _ in range(reduction_iters): | |||
| block_num = 30 # divide the image into 30 segments | |||
| block_width = best_position.shape[0] // block_num | |||
| if block_width > 0: | |||
| for i in range(BLOCK_NUM): | |||
| for i in range(block_num): | |||
| diff = x_ori[i*block_width: (i+1)*block_width, :, :]\ | |||
| - best_position[i*block_width:(i+1)*block_width, :, :] | |||
| if np.max(np.abs(diff)) >= 0.1*(self._bounds[1] - self._bounds[0]): | |||
| @@ -107,8 +107,8 @@ def is_normalized(img): | |||
| """ | |||
| if is_numpy(img): | |||
| minimal = np.min(img) | |||
| maximun = np.max(img) | |||
| if minimal >= 0 and maximun <= 1: | |||
| maximum = np.max(img) | |||
| if minimal >= 0 and maximum <= 1: | |||
| return True | |||
| return False | |||
| raise TypeError('img should be Numpy array. Got {}'.format(type(img))) | |||
| @@ -359,9 +359,9 @@ class Translate(ImageTransform): | |||
| Translate an image. | |||
| Args: | |||
| x_bias (Union[int, float]): X-direction translation, x = x + x_bias*image_length. | |||
| x_bias (Union[int, float]): X-direction translation: x + x_bias*image_length. | |||
| Default: 0. | |||
| y_bias (Union[int, float]): Y-direction translation, y = y + y_bias*image_wide. | |||
| y_bias (Union[int, float]): Y-direction translation: y + y_bias*image_wide. | |||
| Default: 0. | |||
| """ | |||
| @@ -347,9 +347,8 @@ class RDPMonitor(Callback): | |||
| Returns: | |||
| float, delta budget. | |||
| """ | |||
| orders = np.atleast_1d(self._orders) | |||
| rdps = np.atleast_1d(rdp) | |||
| deltas = np.exp((rdps - self._target_eps)*(orders - 1)) | |||
| deltas = np.exp((rdps - self._target_eps)*(np.atleast_1d(self._orders) - 1)) | |||
| min_delta = np.min(deltas) | |||
| return np.min([min_delta, 1.]) | |||
| @@ -363,9 +362,8 @@ class RDPMonitor(Callback): | |||
| Returns: | |||
| float, eps budget. | |||
| """ | |||
| orders = np.atleast_1d(self._orders) | |||
| rdps = np.atleast_1d(rdp) | |||
| eps = rdps - np.log(self._target_delta) / (orders - 1) | |||
| eps = rdps - np.log(self._target_delta) / (np.atleast_1d(self._orders) - 1) | |||
| return np.min(eps) | |||
| @@ -26,7 +26,7 @@ TAG = 'suppress masker' | |||
| class SuppressMasker(Callback): | |||
| """ | |||
| Args: | |||
| model (SuppressModel): SuppressModel instance. | |||
| model (SuppressModel): SuppressModel instance. | |||
| suppress_ctrl (SuppressCtrl): SuppressCtrl instance. | |||
| Examples: | |||
| @@ -225,7 +225,6 @@ class _TupleMul(nn.Cell): | |||
| def construct(self, input1, input2): | |||
| """Add two tuple of data.""" | |||
| out = self.hyper_map(self.mul, input1, input2) | |||
| #print(out) | |||
| return out | |||
| # come from nn.cell_wrapper.TrainOneStepCell | |||
| @@ -11,20 +11,22 @@ | |||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| # See the License for the specific language governing permissions and | |||
| # limitations under the License. | |||
| # ============================================================================ | |||
| """ | |||
| Out-of-Distribution detection for images. | |||
| """ | |||
| import heapq | |||
| from abc import abstractmethod | |||
| import numpy as np | |||
| from mindspore import Tensor | |||
| from sklearn.cluster import KMeans | |||
| from mindarmour.utils._check_param import check_param_type, check_param_in_range | |||
| from mindspore.train.summary.summary_record import _get_summary_tensor_data | |||
| from mindspore.train.summary.summary_record import _get_summary_tensor_data | |||
| from mindspore import Tensor | |||
| from mindarmour.utils._check_param import check_param_type, check_param_in_range | |||
| from mindarmour.utils.logger import LogUtil | |||
| """ | |||
| Out-of-Distribution detection for images. | |||
| """ | |||
| LOGGER = LogUtil.get_instance() | |||
| TAG = 'concept drift detection' | |||
| class OodDetector: | |||
| @@ -56,6 +58,7 @@ class OodDetector: | |||
| layer_out = _get_summary_tensor_data() | |||
| return layer_out[layer].asnumpy() | |||
| @abstractmethod | |||
| def get_optimal_threshold(self, label, ds_eval): | |||
| """ | |||
| Get the optimal threshold. | |||
| @@ -67,8 +70,12 @@ class OodDetector: | |||
| Returns: | |||
| - float, the optimal threshold. | |||
| """ | |||
| pass | |||
| msg = 'The function generate() is an abstract function in class ' \ | |||
| '`OodDetector` and should be implemented in child class.' | |||
| LOGGER.error(TAG, msg) | |||
| raise NotImplementedError(msg) | |||
| @abstractmethod | |||
| def ood_predict(self, threshold, ds_test): | |||
| """ | |||
| The out-of-distribution detection. | |||
| @@ -81,7 +88,10 @@ class OodDetector: | |||
| Returns: | |||
| - numpy.ndarray, the detection result. 0 means the data is not ood, 1 means the data is ood. | |||
| """ | |||
| pass | |||
| msg = 'The function generate() is an abstract function in class ' \ | |||
| '`OodDetector` and should be implemented in child class.' | |||
| LOGGER.error(TAG, msg) | |||
| raise NotImplementedError(msg) | |||
| class OodDetectorFeatureCluster(OodDetector): | |||
| @@ -103,6 +113,7 @@ class OodDetectorFeatureCluster(OodDetector): | |||
| """ | |||
| def __init__(self, model, ds_train, n_cluster, layer): | |||
| super().__init__(model, ds_train) | |||
| self.model = model | |||
| self.ds_train = check_param_type('ds_train', ds_train, np.ndarray) | |||
| self.n_cluster = check_param_type('n_cluster', n_cluster, int) | |||
| @@ -173,7 +184,7 @@ class OodDetectorFeatureCluster(OodDetector): | |||
| threshold.append(threshold_change) | |||
| acc = np.array(acc) | |||
| threshold = np.array(threshold) | |||
| optimal_threshold = threshold[np.where(acc==np.max(acc))[0]][0] | |||
| optimal_threshold = threshold[np.where(acc == np.max(acc))[0]][0] | |||
| return optimal_threshold | |||
| def ood_predict(self, threshold, ds_test): | |||
| @@ -9,7 +9,6 @@ | |||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| # See the License for the specific language governing permissions and | |||
| # limitations under the License. | |||
| # ============================================================================ | |||
| """ | |||
| Concpt drift module | |||
| @@ -72,8 +71,7 @@ class ConceptDriftCheckTimeSeries: | |||
| >>> w, x = ConceptDriftCheckTimeSeries._reservoir_model_feature(window_data) | |||
| """ | |||
| # Initialize weights | |||
| res_size = self._res_size | |||
| x_state = _w_generate(res_size, len(window_data), window_data) | |||
| x_state = _w_generate(self._res_size, len(window_data), window_data) | |||
| x_state_t = x_state.T | |||
| # Data reshape | |||
| data_channel = None | |||
| @@ -85,7 +83,7 @@ class ConceptDriftCheckTimeSeries: | |||
| reg = 1e-8 | |||
| # Calculate w_out | |||
| w_out = np.dot(np.dot(y_t, x_state_t), | |||
| np.linalg.inv(np.dot(x_state, x_state_t) + reg*np.eye(res_size))) | |||
| np.linalg.inv(np.dot(x_state, x_state_t) + reg*np.eye(self._res_size))) | |||
| return w_out, x_state | |||
| def _concept_distance(self, data_x, data_y): | |||
| @@ -391,11 +389,11 @@ def _cal_threshold(distance, threshold_index): | |||
| Returns: | |||
| - float, [0, 1]. | |||
| """ | |||
| distance = distance[distance > 0] | |||
| pos_distance = distance[distance > 0] | |||
| # Threshold calculation | |||
| if distance.size > 0: | |||
| q_1 = np.percentile(distance, 25) | |||
| q_3 = np.percentile(distance, 75) | |||
| if pos_distance.size > 0: | |||
| q_1 = np.percentile(pos_distance, 25) | |||
| q_3 = np.percentile(pos_distance, 75) | |||
| q_diff = q_3 - q_1 | |||
| threshold = np.clip(0.1 + threshold_index*q_diff, 0, 1) | |||
| else: | |||
| @@ -8,7 +8,6 @@ | |||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| # See the License for the specific language governing permissions and | |||
| # limitations under the License. | |||
| # ============================================================================ | |||
| """ | |||
| This module provides model fault injection to evaluate the reliability of given model. | |||
| """ | |||
| @@ -8,7 +8,6 @@ | |||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| # See the License for the specific language governing permissions and | |||
| # limitations under the License. | |||
| # ============================================================================ | |||
| """ | |||
| Fault injection module | |||
| @@ -8,7 +8,6 @@ | |||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| # See the License for the specific language governing permissions and | |||
| # limitations under the License. | |||
| # ============================================================================ | |||
| """ | |||
| Fault type module | |||