From 2b9d4e62c8f221a4cd94192d0ac319a81e500492 Mon Sep 17 00:00:00 2001 From: Tristan Walter <twalter@orn.mpg.de> Date: Thu, 15 Oct 2020 01:59:26 +0200 Subject: [PATCH] * fixing some misc things * removing some references to temporary objects (bad bad) --- Application/CMakeLists.txt | 4 +- Application/src/tracker/gui/GUICache.h | 2 +- .../src/tracker/gui/RecognitionSummary.cpp | 10 +++-- Application/src/tracker/gui/gui.cpp | 8 ++-- .../src/tracker/tracking/Accumulation.cpp | 2 +- .../src/tracker/tracking/Individual.cpp | 4 +- Application/src/tracker/tracking/Individual.h | 2 +- .../src/tracker/tracking/Recognition.cpp | 12 +++-- .../src/tracker/tracking/Recognition.h | 8 ++-- Application/src/tracker/tracking/Tracker.cpp | 44 +++++++++---------- Application/src/tracker/tracking/Tracker.h | 2 +- .../src/tracker/tracking/TrainingData.cpp | 2 +- 12 files changed, 50 insertions(+), 50 deletions(-) diff --git a/Application/CMakeLists.txt b/Application/CMakeLists.txt index 56080dd..930489d 100644 --- a/Application/CMakeLists.txt +++ b/Application/CMakeLists.txt @@ -151,9 +151,9 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "^(Apple)?Clang$") set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -O3") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-c++98-compat-pedantic -fvisibility=hidden") - set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0 -g") + set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0") set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3") - set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -O3 -g") + set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -O3") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-c++98-compat-pedantic -fvisibility=hidden") message(STATUS "hidden visibility in main project ${CMAKE_CXX_FLAGS}") diff --git a/Application/src/tracker/gui/GUICache.h b/Application/src/tracker/gui/GUICache.h index 21a673e..8e565c1 100644 --- a/Application/src/tracker/gui/GUICache.h +++ b/Application/src/tracker/gui/GUICache.h @@ -83,7 +83,7 @@ namespace gui { std::set<idx_t> checked_probs; public: - std::map<Individual*, gui::Fish*> _fish_map; + std::map<Individual*, std::unique_ptr<gui::Fish>> _fish_map; std::map<long_t, track::Tracker::Statistics> _statistics; long_t connectivity_last_frame; diff --git a/Application/src/tracker/gui/RecognitionSummary.cpp b/Application/src/tracker/gui/RecognitionSummary.cpp index efc4778..f26a190 100644 --- a/Application/src/tracker/gui/RecognitionSummary.cpp +++ b/Application/src/tracker/gui/RecognitionSummary.cpp @@ -16,8 +16,9 @@ namespace gui { Font side_font(0.8 / interface_scale, Align::Right); Font bottom_font(0.8 / interface_scale, Align::Center); - std::set<idx_t> sorted(FAST_SETTINGS(manual_identities).begin(), FAST_SETTINGS(manual_identities).end()); - for(auto id : FAST_SETTINGS(manual_identities)) { + auto manual_identities = FAST_SETTINGS(manual_identities); + std::set<idx_t> sorted(manual_identities.begin(), manual_identities.end()); + for(auto id : manual_identities) { if(cache.individuals.find(id) == cache.individuals.end()) sorted.erase(id); } @@ -95,8 +96,9 @@ namespace gui { } auto pos = Vec2(margin + sidebar_width, margin + title_height); + auto bounds = Bounds(pos, image->bounds().size()); base.advance(new ExternalImage(std::move(image), pos)); - base.advance(new Rect(Bounds(pos, image->bounds().size()), Transparent, White.alpha(200))); + base.advance(new Rect(bounds, Transparent, White.alpha(200))); // draw vertical bar (active fish) pos = Vec2(margin) + Vec2(sidebar_width - 10 / interface_scale, bar_width * 0.5 - Base::default_line_spacing(font) * 0.5 + title_height); @@ -109,7 +111,7 @@ namespace gui { } // draw horizontal bar (matched fish from network) - pos = Vec2(margin) + Vec2(sidebar_width + bar_width * 0.5, image->bounds().height + margin + Base::default_line_spacing(font) * 0.5 + title_height); + pos = Vec2(margin) + Vec2(sidebar_width + bar_width * 0.5, bounds.height + margin + Base::default_line_spacing(font) * 0.5 + title_height); for(size_t idx = 0; idx < output_size; ++idx) { base.advance(new Text(Meta::toStr(idx), pos, White, bottom_font)); pos += Vec2(bar_width, 0); diff --git a/Application/src/tracker/gui/gui.cpp b/Application/src/tracker/gui/gui.cpp index a562ae6..97b040b 100644 --- a/Application/src/tracker/gui/gui.cpp +++ b/Application/src/tracker/gui/gui.cpp @@ -2037,8 +2037,8 @@ void GUI::draw_tracking(DrawStructure& base, long_t frameNr, bool draw_graph) { empty_map = NULL; if(_cache._fish_map.find(fish) == _cache._fish_map.end()) { - _cache._fish_map[fish] = new gui::Fish(*fish); - fish->register_delete_callback(_cache._fish_map[fish], [this](Individual *f) { + _cache._fish_map[fish] = std::make_unique<gui::Fish>(*fish); + fish->register_delete_callback(_cache._fish_map[fish].get(), [this](Individual *f) { //std::lock_guard<std::mutex> lock(_individuals_frame._mutex); if(!GUI::instance()) return; @@ -2047,7 +2047,6 @@ void GUI::draw_tracking(DrawStructure& base, long_t frameNr, bool draw_graph) { auto it = _cache._fish_map.find(f); if(it != _cache._fish_map.end()) { - delete it->second; _cache._fish_map.erase(f); } }); @@ -2105,8 +2104,7 @@ void GUI::draw_tracking(DrawStructure& base, long_t frameNr, bool draw_graph) { for(auto it = _cache._fish_map.cbegin(); it != _cache._fish_map.cend();) { if(!it->second->enabled()) { - it->first->unregister_delete_callback(it->second); - delete it->second; + it->first->unregister_delete_callback(it->second.get()); _cache._fish_map.erase(it++); } else it++; diff --git a/Application/src/tracker/tracking/Accumulation.cpp b/Application/src/tracker/tracking/Accumulation.cpp index eafcde5..c3dfcd4 100644 --- a/Application/src/tracker/tracking/Accumulation.cpp +++ b/Application/src/tracker/tracking/Accumulation.cpp @@ -1491,7 +1491,7 @@ bool Accumulation::start() { video_file.read_frame(video_frame.frame(), frame); Tracker::instance()->preprocess_frame(video_frame, active, NULL); - std::map<long_t, pv::BlobPtr> blob_to_id; + std::map<uint32_t, pv::BlobPtr> blob_to_id; for (auto b : video_frame.blobs) blob_to_id[b->blob_id()] = b; diff --git a/Application/src/tracker/tracking/Individual.cpp b/Application/src/tracker/tracking/Individual.cpp index 66e30a0..c0d24f1 100644 --- a/Application/src/tracker/tracking/Individual.cpp +++ b/Application/src/tracker/tracking/Individual.cpp @@ -2355,7 +2355,7 @@ std::unique_ptr<Image> Individual::calculate_normalized_diff_image(const gui::Tr return std::make_unique<Image>(padded); } -std::tuple<Image::Ptr, Vec2> Individual::calculate_diff_image(pv::BlobPtr blob, const Size2& output_size) { +std::tuple<std::unique_ptr<Image>, Vec2> Individual::calculate_diff_image(pv::BlobPtr blob, const Size2& output_size) { cv::Mat mask, image; cv::Mat padded; @@ -2421,7 +2421,7 @@ std::tuple<Image::Ptr, Vec2> Individual::calculate_diff_image(pv::BlobPtr blob, //Debug("Came in with %fx%f -> %fx%f", blob->bounds().pos().x, blob->bounds().pos().y, bounds.x, bounds.y); - return { std::make_shared<Image>(padded), bounds.pos() }; + return { std::make_unique<Image>(padded), bounds.pos() }; } bool Individual::evaluate_fitness() const { diff --git a/Application/src/tracker/tracking/Individual.h b/Application/src/tracker/tracking/Individual.h index 2530800..d4dc64f 100644 --- a/Application/src/tracker/tracking/Individual.h +++ b/Application/src/tracker/tracking/Individual.h @@ -463,7 +463,7 @@ namespace track { * @return an image pointer to a one-channel 8-bit greyscale image containing the difference image */ - static std::tuple<Image::Ptr, Vec2> calculate_diff_image(pv::BlobPtr blob, const Size2& output_size); + static std::tuple<std::unique_ptr<Image>, Vec2> calculate_diff_image(pv::BlobPtr blob, const Size2& output_size); static std::unique_ptr<Image> calculate_normalized_diff_image(const gui::Transform& midline_transform, const pv::BlobPtr& blob, float midline_length, const Size2& output_size, bool use_legacy); diff --git a/Application/src/tracker/tracking/Recognition.cpp b/Application/src/tracker/tracking/Recognition.cpp index 3d59694..cba8346 100644 --- a/Application/src/tracker/tracking/Recognition.cpp +++ b/Application/src/tracker/tracking/Recognition.cpp @@ -39,7 +39,7 @@ Recognition::FishInfo::operator MetaObject() const { return MetaObject("FishInfo<frame:"+Meta::toStr(last_frame)+" N:"+Meta::toStr(number_frames)+">", "FishInfo"); } -Image::Ptr Recognition::calculate_diff_image_with_settings(const default_config::recognition_normalization_t::Class &normalize, const pv::BlobPtr& blob, const Recognition::ImageData& data, const Size2& output_shape) { +std::unique_ptr<Image> Recognition::calculate_diff_image_with_settings(const default_config::recognition_normalization_t::Class &normalize, const pv::BlobPtr& blob, const Recognition::ImageData& data, const Size2& output_shape) { if(normalize == default_config::recognition_normalization_t::posture) return Individual::calculate_normalized_diff_image(data.midline_transform, blob, data.filters ? data.filters->median_midline_length_px : 0, output_shape, false); else if(normalize == default_config::recognition_normalization_t::legacy) @@ -57,7 +57,7 @@ Image::Ptr Recognition::calculate_diff_image_with_settings(const default_config: } else { auto && [img, pos] = Individual::calculate_diff_image(blob, output_shape); - return img; + return std::move(img); } } @@ -631,7 +631,9 @@ Image::Ptr Recognition::calculate_diff_image_with_settings(const default_config: if(!blob || ((normalize == default_config::recognition_normalization_t::posture || normalize == default_config::recognition_normalization_t::legacy) && !midline)) { +#ifndef NDEBUG Warning("Blob or midline of fish %d is nullptr, which is not supposed to happen.", fdx); +#endif continue; } @@ -921,7 +923,9 @@ Image::Ptr Recognition::calculate_diff_image_with_settings(const default_config: } } - std::map<long_t, pv::BlobPtr> blob_to_id; + std::map<uint32_t, pv::BlobPtr> blob_to_id; + for (auto b : frame.original_blobs) + blob_to_id[b->blob_id()] = b; for (auto b : frame.blobs) blob_to_id[b->blob_id()] = b; for (auto b : frame.filtered_out) @@ -965,7 +969,7 @@ Image::Ptr Recognition::calculate_diff_image_with_settings(const default_config: assert(blob->pixels()); e.filters = std::make_shared<TrainingFilterConstraints>(custom_len); e.image = calculate_diff_image_with_settings(normalize, blob, e, output_shape); - + if(e.image != nullptr) { _detail.add_frame(e.frame, e.fdx); waiting.push_back(e); diff --git a/Application/src/tracker/tracking/Recognition.h b/Application/src/tracker/tracking/Recognition.h index 224422d..cd58778 100644 --- a/Application/src/tracker/tracking/Recognition.h +++ b/Application/src/tracker/tracking/Recognition.h @@ -75,14 +75,14 @@ namespace track { public: struct ImageData { - Image::Ptr image; + std::shared_ptr<Image> image; std::shared_ptr<TrainingFilterConstraints> filters; //pv::BlobPtr blob; struct Blob { uint64_t num_pixels; uint32_t blob_id; - long_t org_id; - long_t parent_id; + int64_t org_id; + int64_t parent_id; Bounds bounds; } blob; long_t frame; @@ -216,7 +216,7 @@ namespace track { static bool python_available(); static void check_learning_module(bool force_reload_variables = false); - static Image::Ptr calculate_diff_image_with_settings(const default_config::recognition_normalization_t::Class &normalize, const pv::BlobPtr& blob, const Recognition::ImageData& data, const Size2& output_shape); + static std::unique_ptr<Image> calculate_diff_image_with_settings(const default_config::recognition_normalization_t::Class &normalize, const pv::BlobPtr& blob, const Recognition::ImageData& data, const Size2& output_shape); //float available_weights_accuracy(std::shared_ptr<TrainingData> data); void load_weights(std::string postfix = ""); diff --git a/Application/src/tracker/tracking/Tracker.cpp b/Application/src/tracker/tracking/Tracker.cpp index 3d1f784..eb50678 100644 --- a/Application/src/tracker/tracking/Tracker.cpp +++ b/Application/src/tracker/tracking/Tracker.cpp @@ -964,7 +964,7 @@ bool operator<(long_t frame, const FrameProperties& props) { static Timing timing("filter_blobs", 20); TakeTiming take(timing); - const BlobSizeRange& fish_size = FAST_SETTINGS(blob_size_ranges); + const BlobSizeRange fish_size = FAST_SETTINGS(blob_size_ranges); const uint32_t num_blobs = (uint32_t)frame.blobs.size(); const int threshold = FAST_SETTINGS(track_threshold); @@ -1033,7 +1033,7 @@ bool operator<(long_t frame, const FrameProperties& props) { { std::vector<pv::BlobPtr> result; const int threshold = FAST_SETTINGS(track_threshold); - const BlobSizeRange& fish_size = FAST_SETTINGS(blob_size_ranges); + const BlobSizeRange fish_size = FAST_SETTINGS(blob_size_ranges); const float cm_sq = SQR(FAST_SETTINGS(cm_per_pixel)); auto blacklist = FAST_SETTINGS(track_ignore); std::mutex _mutex; @@ -1832,7 +1832,7 @@ void Tracker::clear_properties() { std::unordered_map<Individual*, bool> fish_assigned; const uint32_t number_fish = (uint32_t)FAST_SETTINGS(track_max_individuals); - const BlobSizeRange& minmax = FAST_SETTINGS(blob_size_ranges); + const BlobSizeRange minmax = FAST_SETTINGS(blob_size_ranges); size_t assigned_count = 0; @@ -1910,17 +1910,11 @@ void Tracker::clear_properties() { static grid::ProximityGrid blob_grid(_average->bounds().size()); blob_grid.clear(); - const auto& manual_identities = FAST_SETTINGS(manual_identities); + const auto manual_identities = FAST_SETTINGS(manual_identities); if(!number_fish && !manual_identities.empty()) { SETTING(manual_identities) = Settings::manual_identities_t(); } - //std::set<idx_t> manual_identities(FAST_SETTINGS(manual_identities).begin(), FAST_SETTINGS(manual_identities).end()); - - //bool huge_jump = frameIndex != _startFrame && frame.time - properties(frameIndex-1).time >= FAST_SETTINGS(track_max_reassign_time); - //if(huge_jump) - // Warning("Huge tdelta in frame %d: %fs", frameIndex, frame.time - properties(frameIndex-1).time); - for(auto b : frame.blobs) { id_to_blob[b->blob_id()] = b; blob_grid.insert(b->bounds().x + b->bounds().width * 0.5, b->bounds().y + b->bounds().height * 0.5, b->blob_id()); @@ -3234,8 +3228,9 @@ void Tracker::update_iterator_maps(long_t frame, const Tracker::set_of_individua } if(!manual) {*/ + auto manual_identities = FAST_SETTINGS(manual_identities); for(auto fish : active) { - if(FAST_SETTINGS(manual_identities).empty() || FAST_SETTINGS(manual_identities).count(fish->identity().ID())) { + if(manual_identities.empty() || manual_identities.count(fish->identity().ID())) { if(!fish->has(frameIndex) /*|| fish->centroid_weighted(frameIndex)->speed() >= FAST_SETTINGS(track_max_speed) * 0.25*/) { all_good = false; break; @@ -3330,12 +3325,13 @@ void Tracker::update_iterator_maps(long_t frame, const Tracker::set_of_individua } } + auto manual_identities = FAST_SETTINGS(manual_identities); std::vector<idx_t> to_delete; std::vector<Individual*> ptrs; for(auto && [fdx, fish] : _individuals) { fish->remove_frame(frameIndex); - if(FAST_SETTINGS(track_max_individuals) == 0 || FAST_SETTINGS(manual_identities).find(fdx) == FAST_SETTINGS(manual_identities).end()) { + if(FAST_SETTINGS(track_max_individuals) == 0 || manual_identities.find(fdx) == manual_identities.end()) { if(fish->empty()) { to_delete.push_back(fdx); ptrs.push_back(fish); @@ -3467,7 +3463,8 @@ void Tracker::update_iterator_maps(long_t frame, const Tracker::set_of_individua LockGuard guard("Tracker::max_range()"); if(_global_segment_order.empty()) { std::set<Rangel> manuals; - for(auto && [from, to] : FAST_SETTINGS(manually_approved)) + auto manually_approved = FAST_SETTINGS(manually_approved); + for(auto && [from, to] : manually_approved) manuals.insert(Rangel(from, to)); std::set<Rangel, std::function<bool(Rangel, Rangel)>> ordered([&manuals](Rangel A, Rangel B) -> bool { @@ -3478,10 +3475,10 @@ void Tracker::update_iterator_maps(long_t frame, const Tracker::set_of_individua return (recognition() && recognition()->dataset_quality() ? ((recognition()->dataset_quality()->has(A) ? recognition()->dataset_quality()->quality(A) : DatasetQuality::Quality()) > (recognition()->dataset_quality()->has(B) ? recognition()->dataset_quality()->quality(B) : DatasetQuality::Quality())) : (A.length() > B.length())); }); - if(!FAST_SETTINGS(manually_approved).empty()) { - auto str = Meta::toStr(FAST_SETTINGS(manually_approved)); + if(!manually_approved.empty()) { + auto str = Meta::toStr(manually_approved); //Debug("Inserting %S", &str); - for(auto && [from, to] : FAST_SETTINGS(manually_approved)) { + for(auto && [from, to] : manually_approved) { ordered.insert(Rangel(from, to)); } } @@ -3587,8 +3584,7 @@ void Tracker::update_iterator_maps(long_t frame, const Tracker::set_of_individua LockGuard guard("check_segments_identities"); Debug("Updating automatic ranges starting from %d", after_frame == -1 ? 0 : after_frame); - const auto& manual_identities = FAST_SETTINGS(manual_identities); - //std::set<idx_t> manual_identities(FAST_SETTINGS(manual_identities).begin(), FAST_SETTINGS(manual_identities).end()); + const auto manual_identities = FAST_SETTINGS(manual_identities); size_t count=0; recognition_pool.wait(); @@ -3858,9 +3854,9 @@ void Tracker::update_iterator_maps(long_t frame, const Tracker::set_of_individua log(f, "----"); decltype(unassigned_ranges) still_unassigned; - + //auto manual_identities = FAST_SETTINGS(manual_identities); for(auto && [fdx, fish] : _individuals) { - if(!FAST_SETTINGS(manual_identities).count(fdx)) + if(!manual_identities.count(fdx)) continue; for(auto && [start, segment] : fish->recognition_segments()) { @@ -4090,16 +4086,16 @@ void Tracker::update_iterator_maps(long_t frame, const Tracker::set_of_individua fclose(f); } -pv::BlobPtr Tracker::find_blob_noisy(std::map<long_t, pv::BlobPtr>& blob_to_id, long_t bid, long_t pid, const Bounds& bounds, long_t frame) +pv::BlobPtr Tracker::find_blob_noisy(std::map<uint32_t, pv::BlobPtr>& blob_to_id, uint32_t bid, int64_t pid, const Bounds& bounds, long_t frame) { if(blob_to_id.count(bid) == 0) { if(pid != -1) { - if(blob_to_id.count(pid) != 0) { - auto b = blob_to_id.at(pid); + if(blob_to_id.count((uint32_t)pid) != 0) { + auto b = blob_to_id.at((uint32_t)pid); auto blobs = pixel::threshold_blob(b, FAST_SETTINGS(track_threshold), Tracker::instance()->background()); for(auto & sub : blobs) { - if((long_t)sub->blob_id() == bid) { + if(sub->blob_id() == bid) { //Debug("Found perfect match for %d in blob %d", bid, b->blob_id()); blob_to_id[bid] = sub; break; diff --git a/Application/src/tracker/tracking/Tracker.h b/Application/src/tracker/tracking/Tracker.h index b01b3da..b1447f6 100644 --- a/Application/src/tracker/tracking/Tracker.h +++ b/Application/src/tracker/tracking/Tracker.h @@ -271,7 +271,7 @@ CREATE_STRUCT(Settings, void prepare_shutdown(); void wait(); - static pv::BlobPtr find_blob_noisy(std::map<long_t, pv::BlobPtr>& blob_to_id, long_t bid, long_t pid, const Bounds& bounds, long_t frame); + static pv::BlobPtr find_blob_noisy(std::map<uint32_t, pv::BlobPtr>& blob_to_id, uint32_t bid, int64_t pid, const Bounds& bounds, long_t frame); //static bool generate_training_images(pv::File&, std::map<long_t, std::set<long_t>> individuals_per_frame, TrainingData&, const std::function<void(float)>& = [](float){}, const TrainingData* source = nullptr); //static bool generate_training_images(pv::File&, const std::set<long_t>& frames, TrainingData&, const std::function<void(float)>& = [](float){}); diff --git a/Application/src/tracker/tracking/TrainingData.cpp b/Application/src/tracker/tracking/TrainingData.cpp index 8b8544e..e8d8c9c 100644 --- a/Application/src/tracker/tracking/TrainingData.cpp +++ b/Application/src/tracker/tracking/TrainingData.cpp @@ -1099,7 +1099,7 @@ bool TrainingData::generate(const std::string& step_description, pv::File & vide video_file.read_frame(video_frame.frame(), frame); Tracker::instance()->preprocess_frame(video_frame, active, NULL); - std::map<long_t, pv::BlobPtr> blob_to_id; + std::map<uint32_t, pv::BlobPtr> blob_to_id; for (auto b : video_frame.blobs) blob_to_id[b->blob_id()] = b; -- GitLab