Ejemplo n.º 1
0
def predictImageClasse():

    model = MobileNet()

    img = np.asarray(Image.open('./image.jpg'))
    img = resize(img, [224, 224])
    imshow(img)
    X = np.reshape(img, [1, 224, 224, 3])

    preds = model.predict(X)

    #The 5 most likely between 1000 image net classes
    print(tabulate(decode_predictions(preds, top=5)[0], headers=['Name', 'Probability']))

    return decode_predictions(preds, top=5)[0]
Ejemplo n.º 2
0
 def predict(self, images, top=None):
     if top is None:
         top = self.num_classes
     images = preprocess_input(images)
     predictions = self.model.predict(images)
     labels = decode_predictions(predictions, top=top)
     return labels
Ejemplo n.º 3
0
def predict():

    # POST
    if request.method == 'POST':

        # ファイルが読み込まれていない場合は'/predict'に戻る
        if 'file' not in request.files:
            flash('No file.')
            return redirect(url_for('predict'))

        # ファイルが読み込まれている場合はそのファイルを読み込む
        file = request.files['file']
        if file.filename == '':
            flash('No file.')
            return redirect(url_for('predict'))

        # 読み込んだファイルを処理する
        if file and is_allowed_file(file.filename):

            # 安全なファイル名を作成して画像ファイルを保存
            filename = secure_filename(file.filename)
            #filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)
            filepath = filename
            file.save(filepath)

            # 学習済みのMobileNetをロード
            # 構造とともに学習済みの重みも読み込まれる
            model = MobileNet(weights='imagenet')
            # model.summary()

            # 引数で指定した画像ファイルを読み込む
            # サイズはVGG16のデフォルトである224x224にリサイズされる
            img = image.load_img(filepath, target_size=(224, 224))

            # 画像ファイルをサーバから削除
            os.remove(filepath)

            # 読み込んだPIL形式の画像をarrayに変換
            x = image.img_to_array(img)

            # 3次元テンソル(rows, cols, channels) を
            # 4次元テンソル (samples, rows, cols, channels) に変換
            # 入力画像は1枚なのでsamples=1でよい
            x = np.expand_dims(x, axis=0)

            # Top-5のクラスを予測する
            # VGG16の1000クラスはdecode_predictions()で文字列に変換される
            pred = model.predict(preprocess_input(x))
            top = decode_predictions(pred, top=5)[0]
            scores = pred[0]

            # 予測結果をリストに格納する
            results = []
            for i in range(5):
                score_rounddown = int(top[i][2]*1000000) / 10000.0
                results.append([top[i][1], score_rounddown])

            return render_template('result.html', results=results)

    return render_template('predict.html')
Ejemplo n.º 4
0
def predict():
    # initialize the data dictionary that will be returned from the
    # view
    data = {"success": False}
    # ensure an image was properly uploaded to our endpoint
    if flask.request.method == "POST":
        if flask.request.files.get("image"):
            # read the image in PIL format
            image = flask.request.files["image"].read()
            image = Image.open(io.BytesIO(image))

            # preprocess the image and prepare it for classification
            image = prepare_image(image, target=(224, 224))

            # classify the input image and then initialize the list
            # of predictions to return to the client
            preds = model.predict(image)
            results = decode_predictions(preds)
            data["predictions"] = []

            # loop over the results and add them to the list of
            # returned predictions
            for (imagenetID, label, prob) in results[0]:
                r = {"label": label, "probability": float(prob)}
                data["predictions"].append(r)

            # indicate that the request was a success
            data["success"] = True

    # return the data dictionary as a JSON response
    return flask.jsonify(data)
Ejemplo n.º 5
0
def label_image(image, model, verbose=False):
    # Reference: https://github.com/glouppe/blackbelt/

    # convert the image pixels to a numpy array
    image = img_to_array(image)

    # reshape data for the model
    image = np.expand_dims(image, axis=0)

    # prepare the image for the VGG model
    image = preprocess_input(image)

    # predict the probability across all output classes
    yhat = model.predict(image)

    if verbose and model.output_names[0] == 'predictions':
        # convert the probabilities to class labels
        labels = decode_predictions(yhat)

        # retrieve the most likely result, e.g. highest probability
        label = labels[0][0]

        # print the classification
        print('%s (%.2f%%)' % (label[1], label[2] * 100))

    return yhat
Ejemplo n.º 6
0
def bionic_visual_cortex():
    data = {"success": False}
    if request.method == 'POST':
        if request.files.get('file'):
            # read the file
            file = request.files['file']
            filename = file.filename
            filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)
            file.save(filepath)

            #format image for processing
            image_size = (224, 224)
            im = keras.preprocessing.image.load_img(filepath,
                                                    target_size=image_size,
                                                    grayscale=False)
            image = prepare_image(im)

            #classify image with accuracy predictions
            global graph
            with graph.as_default():
                preds = model.predict(image)
                results = decode_predictions(preds)
                print(results)

                data["predictions"] = []
                for (imagenetID, label, prob) in results[0]:
                    r = {"label": label, "probability": float(prob)}
                    data["predictions"].append(r)
                data["success"] = True

        return jsonify(data)

    return '''
Ejemplo n.º 7
0
def predict(image):
    model = MobileNet()

    pred = model.predict(image)
    decoded_predictions = decode_predictions(pred, top=10)
    response = 'MobileNet predictions:   ' + str(decoded_predictions[0][0:5])
    print(response)
    np.argmax(pred[0])
    return response
def predict(image):
    image = image.resize((224, 224), Image.ANTIALIAS)
    image = img_to_array(image)
    image = image.reshape((1, image.shape[0], image.shape[1], image.shape[2]))
    image = preprocess_input(image)
    yhat = model.predict(image)
    label = decode_predictions(yhat)
    label = label[0][0]
    return label[1].replace("_", " ")
Ejemplo n.º 9
0
 def predict(self, img):
     img = image.load_img(img, target_size=(128, 128))
     img = image.img_to_array(img).reshape(1, 128, 128, 3)
     pred = self.model.predict(preprocess_input(img))
     top = decode_predictions(pred, top=5)
     desc = []
     score = []
     for i in range(5):
         desc.append(top[0][i][1])
         score.append(top[0][i][2] * 100)
     return desc, score
Ejemplo n.º 10
0
    def classify(self, url):
        original = self.load_resize_img(url)
        numpy_image = img_to_array(original)
        image_batch = np.expand_dims(numpy_image, axis=0)

        processed_image = preprocess_input(image_batch.copy())
        labels = []
        with self.graph.as_default():
            with self.session.as_default():
                predictions = self.model.predict(processed_image)
                labels = decode_predictions(predictions, top=5)
        return labels[0]
Ejemplo n.º 11
0
def heatmap_for_top_pred(img_path, model, figsizeX):
    img = image.load_img(img_path, target_size=(224, 224))
    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)
    x = preprocess_input(x)

    conv_out, preds = model.predict(x)
    decode_preds = decode_predictions(preds, top=13)

    analysed_preds = 0
    top13_preds = preds[0].argsort()[-13:][::-1]
    analyzed_class = top13_preds[analysed_preds]

    top_class_output = model.output[1][:, analyzed_class]
    last_conv_layer = model.get_layer('conv_pw_13')

    grads = K.gradients(top_class_output, last_conv_layer.output)[0]
    pooled_grads = K.mean(grads, axis=(0, 1, 2))
    iterate = K.function([model.input],
                         [pooled_grads, last_conv_layer.output[0]])
    pooled_grads_value, conv_layer_output_value = iterate([x])

    for i in range(1024):
        conv_layer_output_value[:, :, i] *= pooled_grads_value[i]

    heatmap = np.mean(conv_layer_output_value, axis=-1)

    heatmap = np.maximum(heatmap, 0)
    heatmap /= np.max(heatmap)

    heatmap = cv2.resize(heatmap, (224, 224))
    heatmap = np.uint8(255 * heatmap)

    left, up, down, right = get_bounds(heatmap, percentile=95)

    rect = patches.Rectangle((left, up), (right - left), (down - up),
                             linewidth=1,
                             edgecolor='r',
                             facecolor='none')

    fig, axes = plt.subplots(nrows=1, ncols=1, figsize=(figsizeX, figsizeX))
    axes.imshow(img, alpha=0.7)
    axes.imshow(heatmap, cmap='jet', alpha=0.3)
    left, up, down, right = get_bounds(heatmap, percentile=95)
    rect = patches.Rectangle((left, up), (right - left), (down - up),
                             linewidth=1,
                             edgecolor='r',
                             facecolor='none')
    axes.add_patch(rect)
    axes.set_title('Heat map and bounding box for prediction: ' +
                   str(decode_preds[0][analysed_preds][1]))

    return None
Ejemplo n.º 12
0
def getPrediction(filename):

    model = MobileNet()
    image = load_img('images/' + filename, target_size=(224, 224))
    image = img_to_array(image)
    image = image.reshape((1, image.shape[0], image.shape[1], image.shape[2]))
    image = preprocess_input(image)
    yhat = model.predict(image)
    label = decode_predictions(yhat)
    label = label[0][0]
    print('%s (%.2f%%)' % (label[1], label[2] * 100))
    return label[1], label[2] * 100
Ejemplo n.º 13
0
    def mbn(self, name):
        img_path = name
        img = image.load_img(img_path, target_size=(224, 224))
        x = image.img_to_array(img)
        x = np.expand_dims(x, axis=0)

        x = preprocess_input(x)
        features = model.predict(x)
        preds = decode_predictions(features, top=1)[0]
        english_prediction = preds[0][1]

        return dictionary[english_prediction]
Ejemplo n.º 14
0
    def run(self):
        global not_exist
        global camera
        global rawCapture
        global graph

        with graph.as_default():
            # allow the camera to warmup
            time.sleep(0.1)

            # capture frames from camera
            for frame in camera.capture_continuous(rawCapture,
                                                   format="bgr",
                                                   use_video_port=True):
                print("read a frame")
                # grab the raw NumPy array representing the image, then initialize the timestamp
                # and occupied/unoccupied text
                image = frame.array
                # machine learning
                # resize to mobile size(224, 224)
                img = Image.fromarray(np.uint8(image))
                img = img.resize((224, 224))
                x = img
                pred_data = np.expand_dims(x, axis=0)
                preds = model.predict(preprocess_input(pred_data))
                results = decode_predictions(preds, top=1)[0]
                item = ''
                for result in results:
                    # print(result)
                    label = result[1]
                    item = label
                    accu = str(result[2])
                # gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

                # show the frame
                new_label = label + accu
                image = cv2.putText(image, new_label, (10, 25),
                                    cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0),
                                    2)

                cv2.imshow("Frame", image)
                key = cv2.waitKey(1) & 0xFF
                # 止まるように
                if item == stop_item:
                    not_exist = False
                # clear the stream in preparation for the next frame
                rawCapture.truncate(0)

                # if the `q` key was pressed, break from the loop
                if key == ord("q"):
                    break
def predict(filepath):
    #read image
    #img = cv2.imread(filepath)
    #resize image
    #img_resize = cv2.resize(img, (224,224))

    img = image.load_img(filepath, target_size=(224, 224))
    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)
    x = preprocess_input(x)
    preds = loaded_model.predict(x)
    preds = decode_predictions(preds, top=3)[0]
    os.remove(filepath)
    return preds
Ejemplo n.º 16
0
def image_classification(paths):
    classification_dict = {}
    model = MobileNet(input_shape=None, alpha=1.0, depth_multiplier=1, include_top=True, weights='imagenet', input_tensor=None, pooling=None, classes=1000)
    for path in paths:
        image = mnetv2_loadimage(path)
        preds = model.predict(image)
        prediction = decode_predictions(preds, top=1)[0][0]
        img_class = prediction[1]
        img_confidence = prediction[2]
        if img_class in classification_dict:
            classification_dict[img_class].append((path, img_confidence))
        else:
            classification_dict[img_class] = [(path, img_confidence)]
    return classification_dict
Ejemplo n.º 17
0
def mbn(name):
    print('requesting MBN...')
    dictionary = pickle.load(open('dict.p', 'rb'))
    img_path = name
    img = image.load_img(img_path, target_size=(224, 224))
    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)

    x = preprocess_input(x)
    features = model.predict(x)
    preds = decode_predictions(features, top=1)[0]
    english_prediction = preds[0][1]

    return dictionary[english_prediction]
Ejemplo n.º 18
0
    def classify(self):
        self.write(
            "------------------------------------------------------------")

        self.write("classify start")
        self.write(self.filename)

        input = np.stack([self.image])

        predictions = self.model.predict(input)
        results = decode_predictions(predictions, top=5)[0]
        for result in results:
            self.write(str(result))

        self.write("classify end")
Ejemplo n.º 19
0
def main(_):

    host, port = FLAGS.server.split(':')
    channel = implementations.insecure_channel(host, int(port))
    stub = prediction_service_pb2.beta_create_PredictionService_stub(channel)

    # Send request
    #with open(FLAGS.image, 'rb') as f:
    # See prediction_service.proto for gRPC request/response details.

    img = read_image_as_nparr_RGB(FLAGS.image, shape=(224, 224))
    img = preprocess_input(img)
    img = np.expand_dims(img, axis=0)

    for _ in range(5):
        s = time.time()

        request = predict_pb2.PredictRequest()
        request.model_spec.name = 'mobilenet-classify'
        request.model_spec.signature_name = 'predict'
        request.inputs['images'].CopyFrom(
            tf.make_tensor_proto(img, shape=img.shape)
        )

        result = stub.Predict(request, 20.0)  # 10 secs timeout
        #print result.ListFields()
        #print tf.contrib.util.make_ndarray(result.ListFields()[0][1].get('scores'))
        #print tf.contrib.util.make_ndarray(result.ListFields()[0][1].get('features')).shape
        sh = decode_predictions( np.array([result.outputs['features'].float_val]) )

        #print(result)
        print 'Total Run Time:', time.time() - s, sh


    for _ in range(5):
        s = time.time()

        request = predict_pb2.PredictRequest()
        request.model_spec.name = 'mobilenet-alpha-1-228-bottleneck'
        request.model_spec.signature_name = 'predict'
        request.inputs['images'].CopyFrom(
            tf.make_tensor_proto(img, shape=img.shape)
        )

        result = stub.Predict(request, 20.0)  # 10 secs timeout
        sh = np.array( result.outputs['features'].float_val ).shape
        #print(result)
        print 'Total Run Time:', time.time() - s, sh
Ejemplo n.º 20
0
def upload():
    if request.method == 'POST':
        # Get the file from post request
        f = request.files['file']

        # Save the file to ./uploads
        basepath = os.path.dirname(__file__)
        file_path = os.path.join(basepath, 'uploads',
                                 secure_filename(f.filename))
        f.save(file_path)

        # Make prediction
        preds = model_predict(file_path, model)

        pred_class = decode_predictions(preds, top=5)  # ImageNet Decode
        result = str(pred_class[0][0][1])  # Convert to string
        return 'The model MobileNet predicts this image as : ' + result
    return None
Ejemplo n.º 21
0
def graph_reco(path):
    model = MobileNet(weights='imagenet')

    img_path = path
    img = image.load_img(img_path, target_size=(224, 224))
    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)
    x = preprocess_input(x)

    preds = model.predict(x)
    predict_list = decode_predictions(preds, top=3)[0]
    to_trans = []
    for i in predict_list:
        to_trans.append(' '.join(str(i[1]).split('_')))
    translator = tr.Youdao_translate()
    res = []
    for i in to_trans:
        res.append(translator.get_translation(i))

    return res
Ejemplo n.º 22
0
def img_pred(image):

    # 読み込んだ画像を行列に変換
    img_array = img_to_array(image)

    # 3次元を4次元に変換
    img_dims = np.expand_dims(img_array, axis=0)

    # Top3のクラスの予測
    with graph.as_default():
        preds = model.predict(preprocess_input(img_dims))

    # imagenet_class_index.json をダウンロードし、その中から認識結果を表示
    results = decode_predictions(preds, top=3)[0]

    # resultsを整形
    result = [
        result[1] + " : " + "{:.2%}".format(result[2]) for result in results
    ]
    return result
Ejemplo n.º 23
0
def upload():
    if request.method == 'POST':
        # Get the file from post request
        f = request.files['image']

        # Save the file to ./uploads
        basepath = os.path.dirname(__file__)
        file_path = os.path.join(
            basepath, 'uploads', secure_filename(f.filename))
        f.save(file_path)

        # Make prediction
        preds = model_predict(file_path, model)

        # Process your result for human
        # pred_class = preds.argmax(axis=-1)            # Simple argmax
        pred_class = decode_predictions(preds, top=1)   # ImageNet Decode
        result = str(pred_class[0][0][1])               # Convert to string
        return result
    return None
Ejemplo n.º 24
0
def is_dog(img_path):
    """Predicts if image contains a dog
    
    Args:
        img_path (str): String containing path to image for inference
    
    Returns:
        bool: Returns whether the image contains a dog according to model
    """
    K.clear_session()
    img = image.load_img(img_path, target_size=(224, 224))
    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)
    x = preprocess_input(x)
    model = MobileNet(weights='imagenet')

    preds = model.predict(x)
    preds = decode_predictions(preds, top=1)[0][0]
    print(preds)
    label = int(preds[0][2:])

    return 2085620 <= label and label <= 2113978
Ejemplo n.º 25
0
def camera():
    global does_exist
    for frame in my_camera.capture_continuous(rawCapture,
                                              format="bgr",
                                              use_video_port=True):
        # grab the raw NumPy array representing the image, then initialize the timestamp
        # and occupied/unoccupied text
        image = frame.array

        # machine learning
        # resize to mobile net size(224, 224)
        img = Image.fromarray(np.uint8(image))
        img = img.resize((224, 224))
        x = img
        pred_data = np.expand_dims(x, axis=0)
        with graph.as_default():
            preds = model.predict(preprocess_input(pred_data))
            results = decode_predictions(preds, top=1)[0]
            for result in results:
                # print(result)
                label = result[1]
                accu = str(result[2])
            # gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

            # show the frame
            new_label = label + accu
            image = cv2.putText(image, new_label, (10, 25),
                                cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)

        cv2.imshow("Frame", image)
        key = cv2.waitKey(1) & 0xFF

        if label == stop_item:
            does_exist = True

        rawCapture.truncate(0)
        time.sleep(video_frame_step)
        if key == ord("q"):
            break
def eval_boxes(input_image,images,coord_ini,coord_fin,N,model,model_input_shape,threshold=0.5,dic=None):
   "paso las imágenes cortadas y evaluo prob, si tiene mayor que threshold guardo coordenadas, label y prob"
   good_crops=[]
   coord=[]
   probs=[]
   time_to_resize=0
   time_to_predict=0
   time_to_preprocess=0
   time_to_decodepreds=0
   time_appending=0
   for i in range(N):
        time_1=datetime.datetime.now()
        imag_rsz = cv2.resize(images[i], (model_input_shape, model_input_shape)) #no hace big copy
        time_2=datetime.datetime.now()
        to_pred = np.expand_dims(imag_rsz, axis=0)
        to_pred = preprocess_input(to_pred)
        time_3=datetime.datetime.now()
        preds = model.predict(to_pred)
        time_4=datetime.datetime.now()
        cod,name,max_prob = decode_predictions(preds, top=1)[0][0]
        time_5=datetime.datetime.now()
        if max_prob>threshold:
            good_crops.append(images[i])
            coord.append((coord_ini[i],coord_fin[i]))
            probs.append((name,max_prob))
        time_6=datetime.datetime.now()
        time_to_resize+=(time_2-time_1).total_seconds()
        time_to_preprocess+=(time_3-time_2).total_seconds()
        time_to_predict+=(time_4-time_3).total_seconds()
        time_to_decodepreds+=(time_5-time_4).total_seconds()
        time_appending+=(time_6-time_5).total_seconds()
  # print(len(probs),'shapeprob')
   print('time resizing: ',time_to_resize)
   print('time preprocesing: ',time_to_preprocess)
   print('time predicting: ', time_to_predict)
   print('time decoding preds: ', time_to_decodepreds)
   print('time appending', time_appending)
   draw_boxes(input_image,coord,probs)
   return good_crops,coord,probs
def lambda_handler(event, context):

    try:
        bucket_name = event['Records'][0]['s3']['bucket']['name']
        file_key = event['Records'][0]['s3']['object']['key']

        print('Reading {} from S3 bucket {}'.format(file_key, bucket_name))
        obj = s3.get_object(Bucket=bucket_name, Key=file_key)

        s3Img = obj['Body'].read()
        img = image.load_img(BytesIO(s3Img), target_size=(224, 224))
        img = image.img_to_array(img)
        img = np.expand_dims(img, axis=0)
        pImg = preprocess_input(img)

        preds = model.predict(pImg)
        prediction = decode_predictions(preds, top=1)[0][0]
        print(prediction)

        result = {
            "status": "ok",
            "name": file_key,
            "result": str(prediction[1]),
            "confidence": float(prediction[2])
        }

        snsTopicArn = os.environ["snsTopicArn"]
        response = sns.publish(TargetArn=snsTopicArn,
                               Message=json.dumps(
                                   {'default': json.dumps(result)}),
                               MessageStructure='json')

        print(response)
    except Exception as e:
        print(e)
        raise e
def transform_predictions_to_api_response(predictions, model_name):
    """ Transform predictions into readable response
    Args:
        predictions: prediction object from tensorflow
        model_name: name of the model used for this predictions
    Returns:
        transformed result object as array
    """
    decoded_predictions = {}
    if model_name == 'inception_v3':
        decoded_predictions = inception_v3.decode_predictions(
            np.array(predictions['predictions']))[0]
    elif model_name == 'mobilenet':
        decoded_predictions = mobilenet.decode_predictions(
            np.array(predictions['predictions']))[0]
    elif model_name == 'mobilenet_v2':
        decoded_predictions = mobilenet_v2.decode_predictions(
            np.array(predictions['predictions']))[0]

    result = []
    for prediction in decoded_predictions:
        result.append({'label': prediction[1], 'score': prediction[2]})

    return result
Ejemplo n.º 29
0
    def _predict_image(self, img_list, top=10):
        """
        画像判定モデルを用いて、何が写っているか判定する。
        :param img_list: 判定画像のリスト
        :param top: 上位何位まで判定するか
        :return: 検知結果 (単語ID, 名称, 判定スコア)のタプルがtopで指定された数のリストになる。
        """
        # 判定画像を配列化する。
        img_array_list = []
        for img in img_list:
            resized = img.resize((224, 224))
            img_array = image.img_to_array(resized)
            img_array = preprocess_input(img_array)
            img_array_list.append(img_array)

        # バッチサイズ分ずつ取り出し、判定にかける。
        ret = []
        for index in range(0, len(img_array_list), BATCH):
            x = np.array(img_array_list[index:index + BATCH])
            preds = self._model.predict(x)
            decoded = decode_predictions(preds, top=top)
            ret.extend(decoded)

        return ret
Ejemplo n.º 30
0
def get_predictions(model, image):
    preds = model.predict(image)
    dec_preds = decode_predictions(preds)[0]
    _, label1, conf1 = decode_predictions(preds)[0][0]
    return label1, conf1, dec_preds
Ejemplo n.º 31
0
rawCapture = PiRGBArray(camera, size=(640, 480))

# allow the camera to warmup
time.sleep(0.1)

for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
    # frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    img = Image.fromarray(np.uint8(frame))
    img = img.resize((224, 224))

    img = image.img_to_array(img)

    image = np.expand_dims(image, axis=0)

    preds = model.predict(preprocess_input(image))
    results = decode_predictions(preds, top=1)[0]
    for result in results:
        # print(result)
        label = result[1]
        prob = round(result[2] * 100, 2)
    frame = cv2.putText(frame, label, (10, 25), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)



    # show the frame
    cv2.imshow("Frame", image)
    key = cv2.waitKey(1) & 0xFF

    # clear the stream in preparation for the next frame
    rawCapture.truncate(0)