O script detection_reuse_control.sh localizado no diretório rdshare/detection invoca o arquivo detection_reuse.py.
O conteúdo do detection_reuse_control.sh é:
#!/bin/bash
# Invocando detection_bash, versão reutilizável que requer operações de banco de dados
for i in $(seq 370000 370001)
do
python detection_reuse.py --frame_num $i
done
View CodeA seguir, apresentamos o código original do detection_reuse.py entes de realizar modificações.
#!usr/bin/python
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot
from matplotlib import pyplot as plt
import os
import tensorflow as tf
from PIL import Image
from object_detection.utils import label_map_util
from object_detection.utils import visualization_utils as vis_util
import datetime
# Desativar avisos do tensorflow
import time
import MySQLdb
import argparse
import sys
reload(sys)
sys.setdefaultencoding('utf8')
os.environ['TF_CPP_MIN_LOG_LEVEL']='3'
detection_graph = tf.Graph()
# Inserir dados, principalmente para a coluna ssd_inception
def accuracy_test(frame_num, list):
print list
conn =MySQLdb.connect(user='root',passwd='TJU55b425',host='localhost',port=3306,db='rdshare',charset='utf8')
cursor = conn.cursor()
sql="INSERT INTO captain_america3_sd (is_detected, frame_num, ssd_inception) VALUES (1,'%s','%s')"%(frame_num, MySQLdb.escape_string(str(list)));
cursor.execute(sql)
sql="SELECT is_detected FROM captain_america3_sd WHERE frame_num ='%s' "% (frame_num);
cursor.execute(sql)
cursor.rowcount
conn.commit()
cursor.close()
# Carregar dados do modelo-------------------------------------------------------------------------------------------------------
def loading(model_name):
with detection_graph.as_default():
od_graph_def = tf.GraphDef()
PATH_TO_CKPT = '/home/yanjieliu/models/models/research/object_detection/pretrained_models/'+model_name + '/frozen_inference_graph.pb'
with tf.gfile.GFile(PATH_TO_CKPT, 'rb') as fid:
serialized_graph = fid.read()
od_graph_def.ParseFromString(serialized_graph)
tf.import_graph_def(od_graph_def, name='')
return detection_graph
# Detecção-------------------------------------------------------------------------------------------------------
def load_image_into_numpy_array(image):
(im_width, im_height) = image.size
return np.array(image.getdata()).reshape(
(im_height, im_width, 3)).astype(np.uint8)
# Lista das strings usadas para adicionar rótulos corretos para cada caixa.
PATH_TO_LABELS = os.path.join('/home/yanjieliu/models/models/research/object_detection/data', 'mscoco_label_map.pbtxt')
label_map = label_map_util.load_labelmap(PATH_TO_LABELS)
categories = label_map_util.convert_label_map_to_categories(label_map, max_num_classes=90, use_display_name=True)
category_index = label_map_util.create_category_index(categories)
def Detection(args, frame_num):
image_path=args.image_path
loading(args.model_name)
#start = time.time()
with detection_graph.as_default():
with tf.Session(graph=detection_graph) as sess:
# for image_path in TEST_IMAGE_PATHS:
image = Image.open('%simage-%s.jpeg'%(image_path, frame_num))
# A representação baseada em array da imagem será usada posteriormente para preparar
# a imagem resultante com caixas e rótulos.
image_np = load_image_into_numpy_array(image)
# Expande dimensões já que o modelo espera imagens com forma: [1, None, None, 3]
image_np_expanded = np.expand_dims(image_np, axis=0)
image_tensor = detection_graph.get_tensor_by_name('image_tensor:0')
# Cada caixa representa uma parte da imagem onde um objeto específico foi detectado.
boxes = detection_graph.get_tensor_by_name('detection_boxes:0')
# Cada pontuação representa o nível de confiança para cada objeto.
# A pontuação é mostrada na imagem resultante, junto com o rótulo da classe.
scores = detection_graph.get_tensor_by_name('detection_scores:0')
classes = detection_graph.get_tensor_by_name('detection_classes:0')
num_detections = detection_graph.get_tensor_by_name('num_detections:0')
# Detecção real.
(boxes, scores, classes, num_detections) = sess.run(
[boxes, scores, classes, num_detections],
feed_dict={image_tensor: image_np_expanded})
# Visualização dos resultados de detecção. Marca os resultados na imagem
vis_util.visualize_boxes_and_labels_on_image_array(
image_np,
np.squeeze(boxes),
np.squeeze(classes).astype(np.int32),
np.squeeze(scores),
category_index,
use_normalized_coordinates=True,
line_thickness=8)
# Saída dos resultados
list = []
for i in range(3):
if classes[0][i] in category_index.keys():
class_name = category_index[classes[0][i]]['name']
#detection_to_database(class_name, frame_num)
else:
class_name = 'N/A'
print("objeto:%s confiança:%s" % (class_name, scores[0][i]))
#print(boxes)
if(float(scores[0][i])>0.5):
list.append(class_name.encode('utf-8'))
accuracy_test(frame_num, list)
#accuracy_test_frcnn(frame_num, list)
# matplotlib exibe a imagem
# Tamanho, em polegadas, das imagens de saída.
IMAGE_SIZE = (20, 12)
plt.figure(figsize=IMAGE_SIZE)
plt.imshow(image_np)
plt.show()
plt.close('all')
def parse_args():
'''parse args'''
parser = argparse.ArgumentParser()
parser.add_argument('--image_path', default='/home/yanjieliu/my_opt/data_for_yolo/CAall/')
parser.add_argument('--frame_num', default='370272')
parser.add_argument('--model_name',
default='ssd_inception_v2_coco_2018_01_28')
return parser.parse_args()
if __name__ == '__main__':
# Executar
args=parse_args()
start = time.time()
#frame_num=int(36000)
Detection(args, args.frame_num)
end = time.time()
print('tempo:\n')
print str(end-start)
# Escrever tempo em arquivo para estatísticas
# with open('./outputs/1to10test_outputs.txt', 'a') as f:
# f.write('\n')
# f.write(str(end-start))
View CodeCódigo de detecção de similaridade original
#!/usr/bin/python
# -*- coding: utf-8 -*-
import Image
import datetime
import time
import argparse
def make_regalur_image(img, size = (256, 256)):
return img.resize(size).convert('RGB')
def split_image(img, part_size = (64, 64)):
w, h = img.size
pw, ph = part_size
assert w % pw == h % ph == 0
return [img.crop((i, j, i+pw, j+ph)).copy() \
for i in xrange(0, w, pw) \
for j in xrange(0, h, ph)]
def hist_similar(lh, rh):
assert len(lh) == len(rh)
return sum(1 - (0 if l == r else float(abs(l - r))/max(l, r)) for l, r in zip(lh, rh))/len(lh)
def calc_similar(li, ri):
# return hist_similar(li.histogram(), ri.histogram())
return sum(hist_similar(l.histogram(), r.histogram()) for l, r in zip(split_image(li), split_image(ri))) / 16.0
def calc_similar_by_path(lf, rf):
li, ri = make_regalur_image(Image.open(lf)), make_regalur_image(Image.open(rf))
return calc_similar(li, ri)
def make_doc_data(lf, rf):
li, ri = make_regalur_image(Image.open(lf)), make_regalur_image(Image.open(rf))
li.save(lf + '_regalur.png')
ri.save(rf + '_regalur.png')
fd = open('stat.csv', 'w')
fd.write('\n'.join(l + ',' + r for l, r in zip(map(str, li.histogram()), map(str, ri.histogram()))))
# print >>fd, '\n'
# fd.write(','.join(map(str, ri.histogram())))
fd.close()
import ImageDraw
li = li.convert('RGB')
draw = ImageDraw.Draw(li)
for i in xrange(0, 256, 64):
draw.line((0, i, 256, i), fill = '#ff0000')
draw.line((i, 0, i, 256), fill = '#ff0000')
li.save(lf + '_lines.png')
def parse_args():
'''parse args'''
parser = argparse.ArgumentParser()
parser.add_argument('--image_path', default='/home/yanjieliu/my_opt/data_for_yolo/CAall/')
parser.add_argument('--frame_num', default='370001')
return parser.parse_args()
if __name__ == '__main__':
#path = r'test/TEST%d/%d.JPG'
args=parse_args()
print('%simage-%s.jpeg'%(args.image_path, args.frame_num))
start = time.time()
#for i in xrange(1, 2):
# print 'test_case_%d: %.3f%%'%(i, \
# calc_similar_by_path('test/TEST%d/%d.JPG'%(i, 1), 'test/TEST%d/%d.JPG'%(i, 2))*100)
print 'test_case: %.3f'%( \
calc_similar_by_path('%simage-%d.jpeg'%(args.image_path, int(args.frame_num)-1), '%simage-%s.jpeg'%(args.image_path, args.frame_num)))
endtime = time.time()
print('tempo:\n')
print str(endtime-start)
# make_doc_data('test/TEST4/1.JPG', 'test/TEST4/2.JPG')
View CodeExecutar o script usendo time python histsimilar.py >& logfile e armazenar os resultados no arquivo logfile
Primeira modificação: salvar os resultados de detecção (objetos, caixas) no banco de dados
#!usr/bin/python
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot
from matplotlib import pyplot as plt
import os
import tensorflow as tf
from PIL import Image
from object_detection.utils import label_map_util
from object_detection.utils import visualization_utils as vis_util
import datetime
# Desativar avisos do tensorflow
import time
import MySQLdb
import argparse
import sys
reload(sys)
sys.setdefaultencoding('utf8')
os.environ['TF_CPP_MIN_LOG_LEVEL']='3'
detection_graph = tf.Graph()
def todatabase(frame_num, list, boxes):
conn=MySQLdb.connect(user='aiya',passwd='wWpPtKkp86CjfYit',host='47.93.20.233',port=3306,db='aiya',charset='utf8')
cursor = conn.cursor()
sql="INSERT INTO ca3_yolo (frame_no, objects, json_yolo) VALUES ('%d','%s','%s')"%(int(frame_num), MySQLdb.escape_string(str(list)),MySQLdb.escape_string(str(boxes)));
cursor.execute(sql)
#sql="SELECT is_detected FROM captain_america3_sd WHERE frame_num ='%s' "% (frame_num);
#cursor.execute(sql)
cursor.rowcount
conn.commit()
cursor.close()
# Inserir dados, principalmente para a coluna ssd_inception
def accuracy_test(frame_num, list):
print list
conn =MySQLdb.connect(user='root',passwd='TJU55b425',host='localhost',port=3306,db='rdshare',charset='utf8')
cursor = conn.cursor()
sql="INSERT INTO captain_america3_sd (is_detected, frame_num, ssd_inception) VALUES (1,'%s','%s')"%(frame_num, MySQLdb.escape_string(str(list)));
cursor.execute(sql)
sql="SELECT is_detected FROM captain_america3_sd WHERE frame_num ='%s' "% (frame_num);
cursor.execute(sql)
cursor.rowcount
conn.commit()
cursor.close()
# Carregar dados do modelo-------------------------------------------------------------------------------------------------------
def loading(model_name):
with detection_graph.as_default():
od_graph_def = tf.GraphDef()
PATH_TO_CKPT = '/home/yanjieliu/models/models/research/object_detection/pretrained_models/'+model_name + '/frozen_inference_graph.pb'
with tf.gfile.GFile(PATH_TO_CKPT, 'rb') as fid:
serialized_graph = fid.read()
od_graph_def.ParseFromString(serialized_graph)
tf.import_graph_def(od_graph_def, name='')
return detection_graph
# Detecção-------------------------------------------------------------------------------------------------------
def load_image_into_numpy_array(image):
(im_width, im_height) = image.size
return np.array(image.getdata()).reshape(
(im_height, im_width, 3)).astype(np.uint8)
# Lista das strings usadas para adicionar rótulos corretos para cada caixa.
PATH_TO_LABELS = os.path.join('/home/yanjieliu/models/models/research/object_detection/data', 'mscoco_label_map.pbtxt')
label_map = label_map_util.load_labelmap(PATH_TO_LABELS)
categories = label_map_util.convert_label_map_to_categories(label_map, max_num_classes=90, use_display_name=True)
category_index = label_map_util.create_category_index(categories)
def Detection(args, frame_num):
image_path=args.image_path
loading(args.model_name)
#start = time.time()
with detection_graph.as_default():
with tf.Session(graph=detection_graph) as sess:
# for image_path in TEST_IMAGE_PATHS:
image = Image.open('%simage-%s.jpeg'%(image_path, frame_num))
# A representação baseada em array da imagem será usada posteriormente para preparar
# a imagem resultante com caixas e rótulos.
image_np = load_image_into_numpy_array(image)
# Expande dimensões já que o modelo espera imagens com forma: [1, None, None, 3]
image_np_expanded = np.expand_dims(image_np, axis=0)
image_tensor = detection_graph.get_tensor_by_name('image_tensor:0')
# Cada caixa representa uma parte da imagem onde um objeto específico foi detectado.
boxes = detection_graph.get_tensor_by_name('detection_boxes:0')
# Cada pontuação representa o nível de confiança para cada objeto.
# A pontuação é mostrada na imagem resultante, junto com o rótulo da classe.
scores = detection_graph.get_tensor_by_name('detection_scores:0')
classes = detection_graph.get_tensor_by_name('detection_classes:0')
num_detections = detection_graph.get_tensor_by_name('num_detections:0')
# Detecção real.
(boxes, scores, classes, num_detections) = sess.run(
[boxes, scores, classes, num_detections],
feed_dict={image_tensor: image_np_expanded})
# Visualização dos resultados de detecção. Marca os resultados na imagem
vis_util.visualize_boxes_and_labels_on_image_array(
image_np,
np.squeeze(boxes),
np.squeeze(classes).astype(np.int32),
np.squeeze(scores),
category_index,
use_normalized_coordinates=True,
line_thickness=8)
# Saída dos resultados
list = []
for i in range(3):
if classes[0][i] in category_index.keys():
class_name = category_index[classes[0][i]]['name']
#detection_to_database(class_name, frame_num)
else:
class_name = 'N/A'
print("objeto:%s confiança:%s" % (class_name, scores[0][i]))
#print(boxes)
if(float(scores[0][i])>0.5):
list.append(class_name.encode('utf-8'))
todatabase(frame_num, list, boxes)
#accuracy_test(frame_num, list)
#accuracy_test_frcnn(frame_num, list)
# matplotlib exibe a imagem
# Tamanho, em polegadas, das imagens de saída.
IMAGE_SIZE = (20, 12)
plt.figure(figsize=IMAGE_SIZE)
plt.imshow(image_np)
plt.show()
plt.close('all')
def parse_args():
'''parse args'''
parser = argparse.ArgumentParser()
parser.add_argument('--image_path', default='/home/yanjieliu/my_opt/data_for_yolo/CAall/')
parser.add_argument('--frame_num', default='370272')
parser.add_argument('--model_name',
default='ssd_inception_v2_coco_2018_01_28')
return parser.parse_args()
if __name__ == '__main__':
# Executar
args=parse_args()
start = time.time()
#frame_num=int(36000)
Detection(args, args.frame_num)
end = time.time()
print('tempo:\n')
print str(end-start)
# Escrever tempo em arquivo para estatísticas
# with open('./outputs/1to10test_outputs.txt', 'a') as f:
# f.write('\n')
# f.write(str(end-start))
View CodeDados armazenados são referentes ao filme "Capitão América 3" entre os frames 370000 e 371000
Em seguida, modificamos o código de detecção de diferenças atualizando o valor de difference_score
#!/usr/bin/python
# -*- coding: utf-8 -*-
import Image
import datetime
import time
import argparse
import MySQLdb
def ds_to_database(difference_score, frame_num):
# Armazenar difference_score no banco de dados
conn=MySQLdb.connect(user='aiya',passwd='wWpPtKkp86CjfYit',host='47.93.20.233',port=3306,db='aiya',charset='utf8')
cursor = conn.cursor()
sql="UPDATE ca3_yolo SET difference_score =%f WHERE frame_no = %d " %(float(difference_score), int(frame_num));
cursor.execute(sql)
#sql="SELECT is_detected FROM captain_america3_sd WHERE frame_num ='%s' "% (frame_num);
#cursor.execute(sql)
cursor.rowcount
conn.commit()
cursor.close()
def make_regalur_image(img, size = (256, 256)):
return img.resize(size).convert('RGB')
def split_image(img, part_size = (64, 64)):
w, h = img.size
pw, ph = part_size
assert w % pw == h % ph == 0
return [img.crop((i, j, i+pw, j+ph)).copy() \
for i in xrange(0, w, pw) \
for j in xrange(0, h, ph)]
def hist_similar(lh, rh):
assert len(lh) == len(rh)
return sum(1 - (0 if l == r else float(abs(l - r))/max(l, r)) for l, r in zip(lh, rh))/len(lh)
def calc_similar(li, ri):
# return hist_similar(li.histogram(), ri.histogram())
return sum(hist_similar(l.histogram(), r.histogram()) for l, r in zip(split_image(li), split_image(ri))) / 16.0
def calc_similar_by_path(lf, rf, frame_num):
li, ri = make_regalur_image(Image.open(lf)), make_regalur_image(Image.open(rf))
difference_score = calc_similar(li, ri)
ds_to_database(difference_score, frame_num)
return difference_score
def make_doc_data(lf, rf):
li, ri = make_regalur_image(Image.open(lf)), make_regalur_image(Image.open(rf))
li.save(lf + '_regalur.png')
ri.save(rf + '_regalur.png')
fd = open('stat.csv', 'w')
fd.write('\n'.join(l + ',' + r for l, r in zip(map(str, li.histogram()), map(str, ri.histogram()))))
# print >>fd, '\n'
# fd.write(','.join(map(str, ri.histogram())))
fd.close()
import ImageDraw
li = li.convert('RGB')
draw = ImageDraw.Draw(li)
for i in xrange(0, 256, 64):
draw.line((0, i, 256, i), fill = '#ff0000')
draw.line((i, 0, i, 256), fill = '#ff0000')
li.save(lf + '_lines.png')
def parse_args():
'''parse args'''
parser = argparse.ArgumentParser()
parser.add_argument('--image_path', default='/home/yanjieliu/my_opt/data_for_yolo/CAall/')
parser.add_argument('--frame_num', default='370001')
return parser.parse_args()
if __name__ == '__main__':
#path = r'test/TEST%d/%d.JPG'
args=parse_args()
print('%simage-%s.jpeg'%(args.image_path, args.frame_num))
start = time.time()
for i in xrange(int(args.frame_num)+1, int(args.frame_num)+1000):
print 'test_case: %.3f'%( \
calc_similar_by_path('%simage-%d.jpeg'%(args.image_path, i-1), '%simage-%s.jpeg'%(args.image_path, i), i))
#print 'test_case: %.3f'%( \
# calc_similar_by_path('%simage-%d.jpeg'%(args.image_path, int(args.frame_num)-1), '%simage-%s.jpeg'%(args.image_path, args.frame_num), args.frame_num))
endtime = time.time()
print('tempo:\n')
print str(endtime-start)
# make_doc_data('test/TEST4/1.JPG', 'test/TEST4/2.JPG')
View CodeDetecção da diferença entre 1000 frames, levou 293.609838009 segundos.