Приложение My android захватывает изображение и отправляет его на сервер python Flask, который выполняет обнаружение объектов и отправляет ответ пользователю.
Мой python код:
utils_ops.tf = tf.compat.v1
tf.gfile = tf.io.gfile
def load_model():
model_dir = "D:\\Models\\faster_rcnn_inception_resnet_v2_atrous_oid_v4_2018_12_12"
model_dir = pathlib.Path(model_dir)/"saved_model"
model = tf.saved_model.load(str(model_dir))
model = model.signatures['serving_default']
return model
PATH_TO_LABELS = 'D:\\TensorFlow\\models\\research\\object_detection\\data\\oid_v4_label_map.pbtxt'
category_index = label_map_util.create_category_index_from_labelmap(PATH_TO_LABELS, use_display_name=True)
def run_inference_for_single_image(model, image):
image = np.asarray(image)
# The input needs to be a tensor, convert it using `tf.convert_to_tensor`.
input_tensor = tf.convert_to_tensor(image)
# The model expects a batch of images, so add an axis with `tf.newaxis`.
input_tensor = input_tensor[tf.newaxis,...]
# Run inference
output_dict = model(input_tensor)
# All outputs are batches tensors.
# Convert to numpy arrays, and take index [0] to remove the batch dimension.
# We're only interested in the first num_detections.
num_detections = int(output_dict.pop('num_detections'))
output_dict = {key:value[0, :num_detections].numpy()
for key,value in output_dict.items()}
output_dict['num_detections'] = num_detections
# detection_classes should be ints.
output_dict['detection_classes'] = output_dict['detection_classes'].astype(np.int64)
# Handle models with masks:
if 'detection_masks' in output_dict:
# Reframe the the bbox mask to the image size.
detection_masks_reframed = utils_ops.reframe_box_masks_to_image_masks(
output_dict['detection_masks'], output_dict['detection_boxes'],
image.shape[0], image.shape[1])
detection_masks_reframed = tf.cast(detection_masks_reframed > 0.5,
tf.uint8)
output_dict['detection_masks_reframed'] = detection_masks_reframed.numpy()
return output_dict
def show_inference(model, image_path):
# the array based representation of the image will be used later in order to prepare the
# result image with boxes and labels on it.
image_np = np.array(Image.open(image_path))
# Actual detection.
output_dict = run_inference_for_single_image(model, image_np)
# Visualization of the results of a detection.
vis_util.visualize_boxes_and_labels_on_image_array(
image_np,
output_dict['detection_boxes'],
output_dict['detection_classes'],
output_dict['detection_scores'],
category_index,
instance_masks=output_dict.get('detection_masks_reframed', None),
use_normalized_coordinates=True,
line_thickness=8)
name = "Image" + ".jpg"
img = Image.fromarray(image_np)
plt.imsave(name,image_np)
############################################### End of object detection
app = flask.Flask(__name__)
@app.route('/', methods = ['GET', 'POST'])
def handle_request():
imagefile = flask.request.files['image']
filename = werkzeug.utils.secure_filename(imagefile.filename)
print("\nReceived image File name : " + imagefile.filename)
imagefile.save(filename)
model = load_model()
print(model.inputs)
model.output_dtypes
model.output_shapes
image_path = pathlib.Path('C:\\Users\\Bhavin\\Desktop\\results\\pic.jpg')
show_inference(model, image_path)
#object detection creates a file image.jpg, this checks if the file is created
#if it is created then the server returns a response
while True:
if os.path.isfile('image.jpg'):
return "completed this thing"
break
app.run(host="192.168.1.something", port=5000, debug=True)
Это вывод на консоли запуска android после отправки изображения:
D/NetworkSecurityConfig: No Network Security Config specified, using platform default
После этого сервер начинает обработку и выполняет обнаружение объекта, в то время как он это делает, Я получаю это в консоли запуска:
D/FAIL: timeout
Почему время ожидания сервера истекло? Я неправильно настроил сервер? или обработка занимает слишком много времени, чтобы сервер отправил ответ?
Когда я удалил весь код обнаружения объекта и сохранил только сервер, который принимает запрос и сохраняет изображение. В этом случае сервер может успешно отправить ответ.
Это код без обнаружения объекта, откуда я получаю ответ сервера:
import flask
import werkzeug
app = flask.Flask(__name__)
@app.route('/', methods = ['GET', 'POST'])
def handle_request():
imagefile = flask.request.files['image']
filename = werkzeug.utils.secure_filename(imagefile.filename)
print("\nReceived image File name : " + imagefile.filename)
imagefile.save(filename)
return "Image Uploaded & Processed Successfully"
app.run(host="192.168.1.something", port=5000, debug=True)